diff options
-rw-r--r-- | src/vm/appdomain.hpp | 6 | ||||
-rw-r--r-- | src/vm/ceeload.cpp | 22 | ||||
-rw-r--r-- | src/vm/methodtablebuilder.cpp | 4 | ||||
-rw-r--r-- | src/vm/threadstatics.h | 6 |
4 files changed, 34 insertions, 4 deletions
diff --git a/src/vm/appdomain.hpp b/src/vm/appdomain.hpp index 501e2151e4..dabe46bc38 100644 --- a/src/vm/appdomain.hpp +++ b/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/vm/ceeload.cpp b/src/vm/ceeload.cpp index 6ab01ede03..5c4df90a80 100644 --- a/src/vm/ceeload.cpp +++ b/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/vm/methodtablebuilder.cpp b/src/vm/methodtablebuilder.cpp index bae784fc4f..e45b2b9175 100644 --- a/src/vm/methodtablebuilder.cpp +++ b/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/vm/threadstatics.h b/src/vm/threadstatics.h index 970f730234..3e61049f59 100644 --- a/src/vm/threadstatics.h +++ b/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; |