void ZapImage::OutputDebugInfoForReadyToRun() { NativeWriter writer; NativeSection * pSection = writer.NewSection(); VertexArray vertexArray(pSection); pSection->Place(&vertexArray); bool fEmpty = true; SHash< NoRemoveSHashTraits < BlobVertexSHashTraits > > debugInfoBlobs; COUNT_T nCount = m_MethodCompilationOrder.GetCount(); for (COUNT_T i = 0; i < nCount; i++) { ZapMethodHeader * pMethod = m_MethodCompilationOrder[i]; ZapBlob * pDebugInfo = pMethod->GetDebugInfo(); if (pDebugInfo == NULL) continue; DWORD cbBlob = pDebugInfo->GetBlobSize(); PVOID pBlob = pDebugInfo->GetData(); BlobVertex * pDebugInfoBlob = debugInfoBlobs.Lookup(BlobVertexKey(pBlob, cbBlob)); if (pDebugInfoBlob == NULL) { void * pMemory = new (GetHeap()) BYTE[sizeof(BlobVertex) + cbBlob]; pDebugInfoBlob = new (pMemory) BlobVertex(cbBlob); memcpy(pDebugInfoBlob->GetData(), pBlob, cbBlob); debugInfoBlobs.Add(pDebugInfoBlob); } vertexArray.Set(pMethod->GetMethodIndex(), new (GetHeap()) DebugInfoVertex(pDebugInfoBlob)); fEmpty = false; } if (fEmpty) return; vertexArray.ExpandLayout(); vector<byte>& blob = writer.Save(); ZapNode * pBlob = ZapBlob::NewBlob(this, &blob[0], blob.size()); m_pDebugSection->Place(pBlob); GetReadyToRunHeader()->RegisterSection(READYTORUN_SECTION_DEBUG_INFO, pBlob); }
void ZapImage::OutputTypesTableForReadyToRun(IMDInternalImport * pMDImport) { NativeWriter writer; VertexHashtable typesHashtable; NativeSection * pSection = writer.NewSection(); pSection->Place(&typesHashtable); // Note on duplicate types with same name: there is not need to perform that check when building // the hashtable. If such types were encountered, the R2R compilation would fail before reaching here. LPCUTF8 pszName; LPCUTF8 pszNameSpace; // Save the TypeDefs to the hashtable { HENUMInternalHolder hEnum(pMDImport); hEnum.EnumAllInit(mdtTypeDef); mdToken mdTypeToken; while (pMDImport->EnumNext(&hEnum, &mdTypeToken)) { mdTypeDef mdCurrentToken = mdTypeToken; DWORD dwHash = GetCompileInfo()->GetVersionResilientTypeHashCode(GetModuleHandle(), mdTypeToken); typesHashtable.Append(dwHash, pSection->Place(new UnsignedConstant(RidFromToken(mdTypeToken) << 1))); } } // Save the ExportedTypes to the hashtable { HENUMInternalHolder hEnum(pMDImport); hEnum.EnumInit(mdtExportedType, mdTokenNil); mdToken mdTypeToken; while (pMDImport->EnumNext(&hEnum, &mdTypeToken)) { DWORD dwHash = GetCompileInfo()->GetVersionResilientTypeHashCode(GetModuleHandle(), mdTypeToken); typesHashtable.Append(dwHash, pSection->Place(new UnsignedConstant((RidFromToken(mdTypeToken) << 1) | 1))); } } vector<byte>& blob = writer.Save(); ZapNode * pBlob = ZapBlob::NewBlob(this, &blob[0], blob.size()); _ASSERTE(m_pAvailableTypesSection); m_pAvailableTypesSection->Place(pBlob); GetReadyToRunHeader()->RegisterSection(READYTORUN_SECTION_AVAILABLE_TYPES, pBlob); }
void ZapImage::OutputEntrypointsTableForReadyToRun() { BeginRegion(CORINFO_REGION_COLD); NativeWriter arrayWriter; NativeWriter hashtableWriter; NativeSection * pArraySection = arrayWriter.NewSection(); NativeSection * pHashtableSection = hashtableWriter.NewSection(); VertexArray vertexArray(pArraySection); pArraySection->Place(&vertexArray); VertexHashtable vertexHashtable; pHashtableSection->Place(&vertexHashtable); bool fEmpty = true; SHash< NoRemoveSHashTraits < BlobVertexSHashTraits > > fixupBlobs; COUNT_T nCount = m_MethodCompilationOrder.GetCount(); for (COUNT_T i = 0; i < nCount; i++) { ZapMethodHeader * pMethod = m_MethodCompilationOrder[i]; mdMethodDef token = GetJitInfo()->getMethodDefFromMethod(pMethod->GetHandle()); CORINFO_SIG_INFO sig; GetJitInfo()->getMethodSig(pMethod->GetHandle(), &sig); int rid = RidFromToken(token); _ASSERTE(rid != 0); BlobVertex * pFixupBlob = NULL; if (pMethod->m_pFixupList != NULL) { NibbleWriter writer; m_pImportTable->PlaceFixups(pMethod->m_pFixupList, writer); DWORD cbBlob; PVOID pBlob = writer.GetBlob(&cbBlob); pFixupBlob = fixupBlobs.Lookup(BlobVertexKey(pBlob, cbBlob)); if (pFixupBlob == NULL) { void * pMemory = new (GetHeap()) BYTE[sizeof(BlobVertex) + cbBlob]; pFixupBlob = new (pMemory) BlobVertex(cbBlob); memcpy(pFixupBlob->GetData(), pBlob, cbBlob); fixupBlobs.Add(pFixupBlob); } } if (sig.sigInst.classInstCount > 0 || sig.sigInst.methInstCount > 0) { CORINFO_MODULE_HANDLE module = GetJitInfo()->getClassModule(pMethod->GetClassHandle()); _ASSERTE(GetCompileInfo()->IsInCurrentVersionBubble(module)); SigBuilder sigBuilder; CORINFO_RESOLVED_TOKEN resolvedToken = {}; resolvedToken.tokenScope = module; resolvedToken.token = token; resolvedToken.hClass = pMethod->GetClassHandle(); resolvedToken.hMethod = pMethod->GetHandle(); GetCompileInfo()->EncodeMethod(module, pMethod->GetHandle(), &sigBuilder, NULL, NULL, &resolvedToken); DWORD cbBlob; PVOID pBlob = sigBuilder.GetSignature(&cbBlob); void * pMemory = new (GetHeap()) BYTE[sizeof(BlobVertex) + cbBlob]; BlobVertex * pSigBlob = new (pMemory) BlobVertex(cbBlob); memcpy(pSigBlob->GetData(), pBlob, cbBlob); int dwHash = GetCompileInfo()->GetVersionResilientMethodHashCode(pMethod->GetHandle()); vertexHashtable.Append(dwHash, pHashtableSection->Place(new (GetHeap()) EntryPointWithBlobVertex(pMethod->GetMethodIndex(), pFixupBlob, pSigBlob))); } else { vertexArray.Set(rid - 1, new (GetHeap()) EntryPointVertex(pMethod->GetMethodIndex(), pFixupBlob)); } fEmpty = false; } if (fEmpty) return; vertexArray.ExpandLayout(); vector<byte>& arrayBlob = arrayWriter.Save(); ZapNode * pArrayBlob = ZapBlob::NewBlob(this, &arrayBlob[0], arrayBlob.size()); m_pCodeMethodDescsSection->Place(pArrayBlob); vector<byte>& hashtableBlob = hashtableWriter.Save(); ZapNode * pHashtableBlob = ZapBlob::NewBlob(this, &hashtableBlob[0], hashtableBlob.size()); m_pCodeMethodDescsSection->Place(pHashtableBlob); ZapReadyToRunHeader * pReadyToRunHeader = GetReadyToRunHeader(); pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_METHODDEF_ENTRYPOINTS, pArrayBlob); pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_INSTANCE_METHOD_ENTRYPOINTS, pHashtableBlob); pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_RUNTIME_FUNCTIONS, m_pRuntimeFunctionSection); if (m_pLazyMethodCallHelperSection->GetNodeCount() != 0) pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_DELAYLOAD_METHODCALL_THUNKS, m_pLazyMethodCallHelperSection); if (m_pExceptionInfoLookupTable->GetSize() != 0) pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_EXCEPTION_INFO, m_pExceptionInfoLookupTable); EndRegion(CORINFO_REGION_COLD); }
void ZapImage::OutputEntrypointsTableForReadyToRun() { BeginRegion(CORINFO_REGION_COLD); NativeWriter writer; NativeSection * pSection = writer.NewSection(); VertexArray vertexArray(pSection); pSection->Place(&vertexArray); bool fEmpty = true; SHash< NoRemoveSHashTraits < BlobVertexSHashTraits > > fixupBlobs; COUNT_T nCount = m_MethodCompilationOrder.GetCount(); for (COUNT_T i = 0; i < nCount; i++) { ZapMethodHeader * pMethod = m_MethodCompilationOrder[i]; mdMethodDef token = GetJitInfo()->getMethodDefFromMethod(pMethod->GetHandle()); int rid = RidFromToken(token); _ASSERTE(rid != 0); BlobVertex * pFixupBlob = NULL; if (pMethod->m_pFixupList != NULL) { NibbleWriter writer; m_pImportTable->PlaceFixups(pMethod->m_pFixupList, writer); DWORD cbBlob; PVOID pBlob = writer.GetBlob(&cbBlob); pFixupBlob = fixupBlobs.Lookup(BlobVertexKey(pBlob, cbBlob)); if (pFixupBlob == NULL) { void * pMemory = new (GetHeap()) BYTE[sizeof(BlobVertex) + cbBlob]; pFixupBlob = new (pMemory) BlobVertex(cbBlob); memcpy(pFixupBlob->GetData(), pBlob, cbBlob); fixupBlobs.Add(pFixupBlob); } } vertexArray.Set(rid - 1, new (GetHeap()) EntryPointVertex(pMethod->GetMethodIndex(), pFixupBlob)); fEmpty = false; } if (fEmpty) return; vertexArray.ExpandLayout(); vector<byte>& blob = writer.Save(); ZapNode * pBlob = ZapBlob::NewBlob(this, &blob[0], blob.size()); m_pCodeMethodDescsSection->Place(pBlob); ZapReadyToRunHeader * pReadyToRunHeader = GetReadyToRunHeader(); pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_METHODDEF_ENTRYPOINTS, pBlob); pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_RUNTIME_FUNCTIONS, m_pRuntimeFunctionSection); if (m_pImportSectionsTable->GetSize() != 0) pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_IMPORT_SECTIONS, m_pImportSectionsTable); if (m_pLazyMethodCallHelperSection->GetNodeCount() != 0) pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_DELAYLOAD_METHODCALL_THUNKS, m_pLazyMethodCallHelperSection); if (m_pExceptionInfoLookupTable->GetSize() != 0) pReadyToRunHeader->RegisterSection(READYTORUN_SECTION_EXCEPTION_INFO, m_pExceptionInfoLookupTable); EndRegion(CORINFO_REGION_COLD); }