From e06914c2de5f51ab809e854b73bf915ed8b65bf6 Mon Sep 17 00:00:00 2001 From: Egor Chesakov Date: Mon, 25 Jun 2018 12:25:49 -0700 Subject: [PATCH] Cross-bitness regular and thread static fields offsets (dotnet/coreclr#18636) * Define OFFSETOF__DomainLocalModule__m_pDataBlob_ OFFSETOF__DomainLocalModule__NormalDynamicEntry__m_pDataBlob in src/vm/appdomain.hpp * Define OFFSETOF__ThreadLocalModule__m_pDataBlob OFFSETOF__ThreadLocalModule__DynamicEntry__m_pDataBlob in src/vm/threadstatics.h * Add assertions and offsets for dynamically allocated statics * Compensate OffsetOfDataBlob difference * Check target specific offsets in assertions in src/vm/methodtablebuilder.cpp Commit migrated from https://github.com/dotnet/coreclr/commit/030a3ea9b8dbeae89c90d34441d4d9a1cf4a7de6 --- src/coreclr/src/vm/appdomain.hpp | 6 ++++++ src/coreclr/src/vm/ceeload.cpp | 22 ++++++++++++++++++++-- src/coreclr/src/vm/methodtablebuilder.cpp | 4 ++-- src/coreclr/src/vm/threadstatics.h | 6 ++++++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/coreclr/src/vm/appdomain.hpp b/src/coreclr/src/vm/appdomain.hpp index 501e215..dabe46b 100644 --- a/src/coreclr/src/vm/appdomain.hpp +++ b/src/coreclr/src/vm/appdomain.hpp @@ -497,6 +497,12 @@ public: }; // struct DomainLocalModule +#define OFFSETOF__DomainLocalModule__m_pDataBlob_ (6 * TARGET_POINTER_SIZE) +#ifdef FEATURE_64BIT_ALIGNMENT +#define OFFSETOF__DomainLocalModule__NormalDynamicEntry__m_pDataBlob (TARGET_POINTER_SIZE /* m_pGCStatics */ + TARGET_POINTER_SIZE /* m_padding */) +#else +#define OFFSETOF__DomainLocalModule__NormalDynamicEntry__m_pDataBlob TARGET_POINTER_SIZE /* m_pGCStatics */ +#endif typedef DPTR(class DomainLocalBlock) PTR_DomainLocalBlock; class DomainLocalBlock diff --git a/src/coreclr/src/vm/ceeload.cpp b/src/coreclr/src/vm/ceeload.cpp index 6ab01ed..5c4df90 100644 --- a/src/coreclr/src/vm/ceeload.cpp +++ b/src/coreclr/src/vm/ceeload.cpp @@ -2017,6 +2017,12 @@ void Module::BuildStaticsOffsets(AllocMemTracker *pamTracker) // | Class Data (one byte per class) | pointer to gc statics | primitive type statics | // // +#ifndef CROSSBITNESS_COMPILE + // The assertions must hold in every non-crossbitness scenario + _ASSERTE(OFFSETOF__DomainLocalModule__m_pDataBlob_ == DomainLocalModule::OffsetOfDataBlob()); + _ASSERTE(OFFSETOF__ThreadLocalModule__m_pDataBlob == ThreadLocalModule::OffsetOfDataBlob()); +#endif + DWORD dwNonGCBytes[2] = { DomainLocalModule::OffsetOfDataBlob() + sizeof(BYTE)*dwNumTypes, ThreadLocalModule::OffsetOfDataBlob() + sizeof(BYTE)*dwNumTypes @@ -2233,11 +2239,14 @@ void Module::GetOffsetsForRegularStaticData( return; } +#ifndef CROSSBITNESS_COMPILE + _ASSERTE(OFFSETOF__DomainLocalModule__NormalDynamicEntry__m_pDataBlob == DomainLocalModule::DynamicEntry::GetOffsetOfDataBlob()); +#endif // Statics for instantiated types are allocated dynamically per-instantiation if (bDynamic) { // Non GC statics are embedded in the Dynamic Entry. - *pOutNonGCStaticOffset = DomainLocalModule::DynamicEntry::GetOffsetOfDataBlob(); + *pOutNonGCStaticOffset = OFFSETOF__DomainLocalModule__NormalDynamicEntry__m_pDataBlob; return; } @@ -2253,6 +2262,9 @@ void Module::GetOffsetsForRegularStaticData( *pOutStaticHandleOffset = m_pRegularStaticOffsets[index*2]; *pOutNonGCStaticOffset = m_pRegularStaticOffsets[index*2 + 1]; +#ifdef CROSSBITNESS_COMPILE + *pOutNonGCStaticOffset += OFFSETOF__DomainLocalModule__m_pDataBlob_ - DomainLocalModule::OffsetOfDataBlob(); +#endif // Check we didnt go out of what we predicted we would need for the class if (*pOutStaticHandleOffset + TARGET_POINTER_SIZE*dwGCStaticHandles > @@ -2291,11 +2303,14 @@ void Module::GetOffsetsForThreadStaticData( return; } +#ifndef CROSSBITNESS_COMPILE + _ASSERTE(OFFSETOF__ThreadLocalModule__DynamicEntry__m_pDataBlob == ThreadLocalModule::DynamicEntry::GetOffsetOfDataBlob()); +#endif // Statics for instantiated types are allocated dynamically per-instantiation if (bDynamic) { // Non GC thread statics are embedded in the Dynamic Entry. - *pOutNonGCStaticOffset = ThreadLocalModule::DynamicEntry::GetOffsetOfDataBlob(); + *pOutNonGCStaticOffset = OFFSETOF__ThreadLocalModule__DynamicEntry__m_pDataBlob; return; } @@ -2311,6 +2326,9 @@ void Module::GetOffsetsForThreadStaticData( *pOutStaticHandleOffset = m_pThreadStaticOffsets[index*2]; *pOutNonGCStaticOffset = m_pThreadStaticOffsets[index*2 + 1]; +#ifdef CROSSBITNESS_COMPILE + *pOutNonGCStaticOffset += OFFSETOF__ThreadLocalModule__m_pDataBlob - ThreadLocalModule::GetOffsetOfDataBlob(); +#endif // Check we didnt go out of what we predicted we would need for the class if (*pOutStaticHandleOffset + TARGET_POINTER_SIZE*dwGCStaticHandles > diff --git a/src/coreclr/src/vm/methodtablebuilder.cpp b/src/coreclr/src/vm/methodtablebuilder.cpp index bae784f..e45b2b9 100644 --- a/src/coreclr/src/vm/methodtablebuilder.cpp +++ b/src/coreclr/src/vm/methodtablebuilder.cpp @@ -7719,7 +7719,7 @@ VOID MethodTableBuilder::PlaceRegularStaticFields() if (bmtProp->fDynamicStatics) { _ASSERTE(dwNonGCOffset == 0 || // no statics at all - dwNonGCOffset == DomainLocalModule::DynamicEntry::GetOffsetOfDataBlob()); // We need space to point to the GC statics + dwNonGCOffset == OFFSETOF__DomainLocalModule__NormalDynamicEntry__m_pDataBlob); // We need space to point to the GC statics bmtProp->dwNonGCRegularStaticFieldBytes = dwCumulativeStaticFieldPos; } else @@ -7841,7 +7841,7 @@ VOID MethodTableBuilder::PlaceThreadStaticFields() if (bmtProp->fDynamicStatics) { _ASSERTE(dwNonGCOffset == 0 || // no thread statics at all - dwNonGCOffset == ThreadLocalModule::DynamicEntry::GetOffsetOfDataBlob()); // We need space to point to the GC statics + dwNonGCOffset == OFFSETOF__ThreadLocalModule__DynamicEntry__m_pDataBlob); // We need space to point to the GC statics bmtProp->dwNonGCThreadStaticFieldBytes = dwCumulativeStaticFieldPos; } else diff --git a/src/coreclr/src/vm/threadstatics.h b/src/coreclr/src/vm/threadstatics.h index 970f730..3e61049 100644 --- a/src/coreclr/src/vm/threadstatics.h +++ b/src/coreclr/src/vm/threadstatics.h @@ -440,6 +440,12 @@ public: }; // struct ThreadLocalModule +#define OFFSETOF__ThreadLocalModule__m_pDataBlob (3 * TARGET_POINTER_SIZE /* m_pDynamicClassTable + m_aDynamicEntries + m_pGCStatics */) +#ifdef FEATURE_64BIT_ALIGNMENT +#define OFFSETOF__ThreadLocalModule__DynamicEntry__m_pDataBlob (TARGET_POINTER_SIZE /* m_pGCStatics */ + TARGET_POINTER_SIZE /* m_padding */) +#else +#define OFFSETOF__ThreadLocalModule__DynamicEntry__m_pDataBlob TARGET_POINTER_SIZE /* m_pGCStatics */ +#endif typedef DPTR(struct TLMTableEntry) PTR_TLMTableEntry; -- 2.7.4