summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/vm/appdomain.hpp6
-rw-r--r--src/vm/ceeload.cpp22
-rw-r--r--src/vm/methodtablebuilder.cpp4
-rw-r--r--src/vm/threadstatics.h6
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;