From 466513449069d2a7d11fb25986707af05bfbf26d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tom=C3=A1=C5=A1=20Rylek?= Date: Thu, 14 May 2020 08:24:22 +0200 Subject: [PATCH] Fix execution of large version bubble composite images (#36373) Large-bubble composite images are special in having more entries in the manifest metadata than in the component assembly table: When the build starts, all component assemblies get hard-injected into the manifest metadata and subsequently we lazily add those additional reference assemblies (within the same version bubble) as we need for encoding signatures. Thanks Tomas --- src/coreclr/src/vm/ceeload.cpp | 2 +- src/coreclr/src/vm/nativeimage.cpp | 13 +++++++++---- src/coreclr/src/vm/nativeimage.h | 4 +++- src/coreclr/src/vm/zapsig.cpp | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/coreclr/src/vm/ceeload.cpp b/src/coreclr/src/vm/ceeload.cpp index 9b9c594..30f6eee 100644 --- a/src/coreclr/src/vm/ceeload.cpp +++ b/src/coreclr/src/vm/ceeload.cpp @@ -503,7 +503,7 @@ uint32_t Module::GetNativeMetadataAssemblyCount() NativeImage *compositeImage = GetCompositeNativeImage(); if (compositeImage != NULL) { - return compositeImage->GetComponentAssemblyCount(); + return compositeImage->GetManifestAssemblyCount(); } else { diff --git a/src/coreclr/src/vm/nativeimage.cpp b/src/coreclr/src/vm/nativeimage.cpp index 7cda619..70ad31f 100644 --- a/src/coreclr/src/vm/nativeimage.cpp +++ b/src/coreclr/src/vm/nativeimage.cpp @@ -61,14 +61,19 @@ void NativeImage::Initialize(READYTORUN_HEADER *pHeader, LoaderAllocator *pLoade HENUMInternal assemblyEnum; HRESULT hr = m_pManifestMetadata->EnumAllInit(mdtAssemblyRef, &assemblyEnum); mdAssemblyRef assemblyRef; - int assemblyIndex = 0; + m_manifestAssemblyCount = 0; while (m_pManifestMetadata->EnumNext(&assemblyEnum, &assemblyRef)) { LPCSTR assemblyName; hr = m_pManifestMetadata->GetAssemblyRefProps(assemblyRef, NULL, NULL, &assemblyName, NULL, NULL, NULL, NULL); - m_assemblySimpleNameToIndexMap.Add(AssemblyNameIndex(assemblyName, assemblyIndex)); - assemblyIndex++; + m_assemblySimpleNameToIndexMap.Add(AssemblyNameIndex(assemblyName, m_manifestAssemblyCount)); + m_manifestAssemblyCount++; } + + // When a composite image contributes to a larger version bubble, its manifest assembly + // count may exceed its component assembly count as it may contain references to + // assemblies outside of the composite image that are part of its version bubble. + _ASSERTE(m_manifestAssemblyCount >= m_componentAssemblyCount); } NativeImage::~NativeImage() @@ -115,7 +120,7 @@ NativeImage *NativeImage::Open( #endif #ifndef DACCESS_COMPILE -Assembly *NativeImage::LoadComponentAssembly(uint32_t rowid) +Assembly *NativeImage::LoadManifestAssembly(uint32_t rowid) { STANDARD_VM_CONTRACT; diff --git a/src/coreclr/src/vm/nativeimage.h b/src/coreclr/src/vm/nativeimage.h index 2c3f538..64cbf54 100644 --- a/src/coreclr/src/vm/nativeimage.h +++ b/src/coreclr/src/vm/nativeimage.h @@ -65,6 +65,7 @@ private: IMAGE_DATA_DIRECTORY *m_pComponentAssemblies; uint32_t m_componentAssemblyCount; + uint32_t m_manifestAssemblyCount; SHash m_assemblySimpleNameToIndexMap; Crst m_eagerFixupsLock; @@ -93,8 +94,9 @@ public: uint32_t GetComponentAssemblyCount() const { return m_componentAssemblyCount; } ReadyToRunInfo *GetReadyToRunInfo() const { return m_pReadyToRunInfo; } IMDInternalImport *GetManifestMetadata() const { return m_pManifestMetadata; } + uint32_t GetManifestAssemblyCount() const { return m_manifestAssemblyCount; } - Assembly *LoadComponentAssembly(uint32_t rowid); + Assembly *LoadManifestAssembly(uint32_t rowid); PTR_READYTORUN_CORE_HEADER GetComponentAssemblyHeader(LPCUTF8 assemblySimpleName); diff --git a/src/coreclr/src/vm/zapsig.cpp b/src/coreclr/src/vm/zapsig.cpp index f0b8361..515ea2f 100644 --- a/src/coreclr/src/vm/zapsig.cpp +++ b/src/coreclr/src/vm/zapsig.cpp @@ -650,7 +650,7 @@ Module *ZapSig::DecodeModuleFromIndex(Module *fromModule, { if (nativeImage != NULL) { - pAssembly = nativeImage->LoadComponentAssembly(index); + pAssembly = nativeImage->LoadManifestAssembly(index); } else { -- 2.7.4