summaryrefslogtreecommitdiff
path: root/src/zap
diff options
context:
space:
mode:
authorAndon Andonov <anandono@microsoft.com>2019-01-14 19:59:12 -0800
committerGitHub <noreply@github.com>2019-01-14 19:59:12 -0800
commit9fe3286e3810298934315e999580edd78c3322c2 (patch)
tree79258a0ed5b043cc7a0ecac0131a77e58753e436 /src/zap
parentdbdae9cc324a97ebc9199b973abe9a21b1177f01 (diff)
downloadcoreclr-9fe3286e3810298934315e999580edd78c3322c2.tar.gz
coreclr-9fe3286e3810298934315e999580edd78c3322c2.tar.bz2
coreclr-9fe3286e3810298934315e999580edd78c3322c2.zip
Large version bubble Support (#21727)
* Preliminary Changes * Module Index Resolution * Change infoModule encoding * Change referencing module in R2R * Pre-condition Check * Virtual Method Module Resolution * Remove Workarounds and add conditional import loading * Add signature kind module override * Add ELEMENT_TYPE_MODULE_ZAPSIG * Add switch to enable large version bubble * Cleanup * Change Native header check * Add large version bubble test * Add Large Version Bubble Checks * Cleanup * Revert unnecessary check * Change EncodeMethod Version Bubble Condition * Add Large Version Bubble asserts * Cleanup * Add default argument to runtests.py * Change test PreCommands * Revert whitespace changes * Change breaking conditional check * Streamline Version Bubble test * Address PR Feedback * Address PR Feedback #2 * Remove dead code * Add crossgen-time ifdef
Diffstat (limited to 'src/zap')
-rw-r--r--src/zap/zapimage.cpp6
-rw-r--r--src/zap/zapimage.h2
-rw-r--r--src/zap/zapimport.cpp13
-rw-r--r--src/zap/zapper.cpp2
-rw-r--r--src/zap/zapreadytorun.cpp20
-rw-r--r--src/zap/zapreadytorun.h2
6 files changed, 37 insertions, 8 deletions
diff --git a/src/zap/zapimage.cpp b/src/zap/zapimage.cpp
index 7dce3af285..3fa607333d 100644
--- a/src/zap/zapimage.cpp
+++ b/src/zap/zapimage.cpp
@@ -1082,7 +1082,7 @@ HANDLE ZapImage::GenerateFile(LPCWSTR wszOutputFileName, CORCOMPILE_NGEN_SIGNATU
HANDLE ZapImage::SaveImage(LPCWSTR wszOutputFileName, LPCWSTR wszDllPath, CORCOMPILE_NGEN_SIGNATURE * pNativeImageSig)
{
- if (!IsReadyToRunCompilation())
+ if(!IsReadyToRunCompilation() || IsLargeVersionBubbleEnabled())
{
OutputManifestMetadata();
}
@@ -1835,6 +1835,10 @@ void ZapImage::Compile()
OutputTypesTableForReadyToRun(m_pMDImport);
OutputInliningTableForReadyToRun();
OutputProfileDataForReadyToRun();
+ if (IsLargeVersionBubbleEnabled())
+ {
+ OutputManifestMetadataForReadyToRun();
+ }
}
else
#endif
diff --git a/src/zap/zapimage.h b/src/zap/zapimage.h
index 36266d3370..832f2b198e 100644
--- a/src/zap/zapimage.h
+++ b/src/zap/zapimage.h
@@ -596,6 +596,7 @@ private:
void OutputTypesTableForReadyToRun(IMDInternalImport * pMDImport);
void OutputInliningTableForReadyToRun();
void OutputProfileDataForReadyToRun();
+ void OutputManifestMetadataForReadyToRun();
void CopyDebugDirEntry();
void CopyWin32VersionResource();
@@ -691,6 +692,7 @@ public:
}
static void __stdcall TryCompileMethodStub(LPVOID pContext, CORINFO_METHOD_HANDLE hStub, CORJIT_FLAGS jitFlags);
+ static DWORD EncodeModuleHelper(LPVOID compileContext, CORINFO_MODULE_HANDLE referencedModule);
BOOL IsVTableGapMethod(mdMethodDef md);
diff --git a/src/zap/zapimport.cpp b/src/zap/zapimport.cpp
index d3010af30f..9d8eec16e2 100644
--- a/src/zap/zapimport.cpp
+++ b/src/zap/zapimport.cpp
@@ -329,6 +329,7 @@ ZapGenericSignature * ZapImportTable::GetGenericSignature(PVOID signature, BOOL
/*static*/ DWORD ZapImportTable::EncodeModuleHelper( LPVOID compileContext,
CORINFO_MODULE_HANDLE referencedModule)
{
+ _ASSERTE(!IsReadyToRunCompilation() || IsLargeVersionBubbleEnabled());
ZapImportTable * pTable = (ZapImportTable *)compileContext;
return pTable->GetIndexOfModule(referencedModule);
}
@@ -952,6 +953,7 @@ void ZapImportTable::EncodeModule(CORCOMPILE_FIXUP_BLOB_KIND kind, CORINFO_MODUL
{
if (module != GetImage()->GetModuleHandle())
{
+ _ASSERTE(!IsReadyToRunCompilation() || IsLargeVersionBubbleEnabled());
pSigBuilder->AppendByte(kind | ENCODE_MODULE_OVERRIDE);
pSigBuilder->AppendData(GetIndexOfModule(module));
}
@@ -1635,7 +1637,7 @@ ZapImport * ZapImportTable::GetExternalMethodCell(CORINFO_METHOD_HANDLE handle,
}
else
{
- EncodeMethod(ENCODE_METHOD_ENTRY, handle, &sigBuilder, pResolvedToken, pConstrainedResolvedToken);
+ EncodeMethod(ENCODE_METHOD_ENTRY, handle, &sigBuilder, pResolvedToken, pConstrainedResolvedToken, false);
}
return GetImportForSignature<ZapExternalMethodCell, ZapNodeType_ExternalMethodCell>((PVOID)handle, &sigBuilder);
@@ -1777,7 +1779,7 @@ ZapImport * ZapImportTable::GetDictionaryLookupCell(CORCOMPILE_FIXUP_BLOB_KIND k
if ((kind & ~CORINFO_HELP_READYTORUN_ATYPICAL_CALLSITE) == ENCODE_DICTIONARY_LOOKUP_THISOBJ)
{
CORINFO_CLASS_HANDLE hClassContext = GetJitInfo()->getMethodClass(pResolvedToken->tokenContext);
- GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), hClassContext, &sigBuilder, NULL, NULL);
+ GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), hClassContext, &sigBuilder, this, EncodeModuleHelper);
}
switch (pLookup->runtimeLookupFlags)
@@ -1795,7 +1797,7 @@ ZapImport * ZapImportTable::GetDictionaryLookupCell(CORCOMPILE_FIXUP_BLOB_KIND k
{
_ASSERTE(pLookup->runtimeLookupArgs != NULL);
sigBuilder.AppendData(ENCODE_DECLARINGTYPE_HANDLE);
- GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), (CORINFO_CLASS_HANDLE)pLookup->runtimeLookupArgs, &sigBuilder, NULL, NULL);
+ GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), (CORINFO_CLASS_HANDLE)pLookup->runtimeLookupArgs, &sigBuilder, this, EncodeModuleHelper);
}
else
{
@@ -1844,8 +1846,7 @@ ZapImport * ZapImportTable::GetDynamicHelperCell(CORCOMPILE_FIXUP_BLOB_KIND kind
sigBuilder.AppendData(kind & ~CORINFO_HELP_READYTORUN_ATYPICAL_CALLSITE);
- GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), handle, &sigBuilder, NULL, NULL);
-
+ GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), handle, &sigBuilder, this, EncodeModuleHelper);
pImport->SetBlob(GetBlob(&sigBuilder));
}
@@ -1863,7 +1864,7 @@ ZapImport * ZapImportTable::GetDynamicHelperCell(CORCOMPILE_FIXUP_BLOB_KIND kind
if (delegateType != NULL)
{
_ASSERTE((CORCOMPILE_FIXUP_BLOB_KIND)(kind & ~CORINFO_HELP_READYTORUN_ATYPICAL_CALLSITE) == ENCODE_DELEGATE_CTOR);
- GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), delegateType, &sigBuilder, NULL, NULL);
+ GetCompileInfo()->EncodeClass(m_pImage->GetModuleHandle(), delegateType, &sigBuilder, this, EncodeModuleHelper);
}
return GetImportForSignature<ZapDynamicHelperCell, ZapNodeType_DynamicHelperCell>((void *)(uintptr_t)((kind << 1) | 1), &sigBuilder);
diff --git a/src/zap/zapper.cpp b/src/zap/zapper.cpp
index 6d1cbd99d1..f4ddb92011 100644
--- a/src/zap/zapper.cpp
+++ b/src/zap/zapper.cpp
@@ -21,6 +21,7 @@ bool g_fNGenWinMDResilient;
#ifdef FEATURE_READYTORUN_COMPILER
bool g_fReadyToRunCompilation;
+bool g_fLargeVersionBubble;
#endif
static bool s_fNGenNoMetaData;
@@ -110,6 +111,7 @@ STDAPI NGenWorker(LPCWSTR pwzFilename, DWORD dwFlags, LPCWSTR pwzPlatformAssembl
#ifdef FEATURE_READYTORUN_COMPILER
g_fReadyToRunCompilation = !!(dwFlags & NGENWORKER_FLAGS_READYTORUN);
+ g_fLargeVersionBubble = !!(dwFlags & NGENWORKER_FLAGS_LARGEVERSIONBUBBLE);
#endif
if (pLogger != NULL)
diff --git a/src/zap/zapreadytorun.cpp b/src/zap/zapreadytorun.cpp
index 099ef41c2c..7e26411cf4 100644
--- a/src/zap/zapreadytorun.cpp
+++ b/src/zap/zapreadytorun.cpp
@@ -254,7 +254,7 @@ void ZapImage::OutputEntrypointsTableForReadyToRun()
resolvedToken.token = token;
resolvedToken.hClass = pMethod->GetClassHandle();
resolvedToken.hMethod = pMethod->GetHandle();
- GetCompileInfo()->EncodeMethod(module, pMethod->GetHandle(), &sigBuilder, NULL, NULL, &resolvedToken);
+ GetCompileInfo()->EncodeMethod(module, pMethod->GetHandle(), &sigBuilder, m_pImportTable, EncodeModuleHelper, &resolvedToken);
DWORD cbBlob;
PVOID pBlob = sigBuilder.GetSignature(&cbBlob);
@@ -326,6 +326,16 @@ public:
}
}
};
+// At ngen time Zapper::CompileModule PlaceFixups called from
+// code:ZapSig.GetSignatureForTypeHandle
+//
+/*static*/ DWORD ZapImage::EncodeModuleHelper(LPVOID compileContext,
+ CORINFO_MODULE_HANDLE referencedModule)
+{
+ _ASSERTE(!IsReadyToRunCompilation() || IsLargeVersionBubbleEnabled());
+ ZapImportTable * pTable = (ZapImportTable *)compileContext;
+ return pTable->GetIndexOfModule(referencedModule);
+}
void ZapImage::OutputDebugInfoForReadyToRun()
{
@@ -397,6 +407,14 @@ void ZapImage::OutputProfileDataForReadyToRun()
}
}
+void ZapImage::OutputManifestMetadataForReadyToRun()
+{
+ if (m_pMetaDataSection != nullptr)
+ {
+ GetReadyToRunHeader()->RegisterSection(READYTORUN_SECTION_MANIFEST_METADATA, m_pMetaDataSection);
+ }
+}
+
void ZapImage::OutputTypesTableForReadyToRun(IMDInternalImport * pMDImport)
{
NativeWriter writer;
diff --git a/src/zap/zapreadytorun.h b/src/zap/zapreadytorun.h
index cf7ad0677b..d9409e9b62 100644
--- a/src/zap/zapreadytorun.h
+++ b/src/zap/zapreadytorun.h
@@ -59,6 +59,8 @@ public:
}
virtual void Save(ZapWriter * pZapWriter);
+
+ DWORD EncodeModuleHelper(LPVOID compileContext, CORINFO_MODULE_HANDLE referencedModule);
};
#endif // __ZAPREADYTORUN_H__