Cross-bitness in VTable Calls (dotnet/coreclr#20137)
authorEgor Chesakov <Egor.Chesakov@microsoft.com>
Thu, 27 Sep 2018 02:47:18 +0000 (19:47 -0700)
committerGitHub <noreply@github.com>
Thu, 27 Sep 2018 02:47:18 +0000 (19:47 -0700)
* Use TARGET_POINTER_SIZE in CEEInfo::getMethodVTableOffset in src/vm/jitinterface.cpp
* Use SIZEOF__MethodTable_ in src/vm/methodtable.h

Commit migrated from https://github.com/dotnet/coreclr/commit/be18f2b4a7e0a4f7257df048e92d64a73035ed92

src/coreclr/src/vm/jitinterface.cpp
src/coreclr/src/vm/methodtable.h

index 4bb52a7..6412608 100644 (file)
@@ -8768,8 +8768,8 @@ void CEEInfo::getMethodVTableOffset (CORINFO_METHOD_HANDLE methodHnd,
     // better be in the vtable
     _ASSERTE(method->GetSlot() < method->GetMethodTable()->GetNumVirtuals());
 
-    *pOffsetOfIndirection = MethodTable::GetVtableOffset() + MethodTable::GetIndexOfVtableIndirection(method->GetSlot()) * sizeof(MethodTable::VTableIndir_t);
-    *pOffsetAfterIndirection = MethodTable::GetIndexAfterVtableIndirection(method->GetSlot()) * sizeof(MethodTable::VTableIndir2_t);
+    *pOffsetOfIndirection = MethodTable::GetVtableOffset() + MethodTable::GetIndexOfVtableIndirection(method->GetSlot()) * TARGET_POINTER_SIZE /* sizeof(MethodTable::VTableIndir_t) */;
+    *pOffsetAfterIndirection = MethodTable::GetIndexAfterVtableIndirection(method->GetSlot()) * TARGET_POINTER_SIZE /* sizeof(MethodTable::VTableIndir2_t) */;
     *isRelative = MethodTable::VTableIndir_t::isRelative ? 1 : 0;
     _ASSERTE(MethodTable::VTableIndir_t::isRelative == MethodTable::VTableIndir2_t::isRelative);
 
index 38ce20e..2e92412 100644 (file)
@@ -33,6 +33,7 @@
 #include "contractimpl.h"
 #include "generics.h"
 #include "fixuppointer.h"
+#include "gcinfotypes.h"
 
 /*
  * Forward Declarations
@@ -1802,11 +1803,13 @@ public:
         return pMTParent == NULL ? 0 : pMTParent->GetNumVirtuals();
     }
 
+    #define SIZEOF__MethodTable_ (0x10 + (6 INDEBUG(+1)) * TARGET_POINTER_SIZE)
+
     static inline DWORD GetVtableOffset()
     {
         LIMITED_METHOD_DAC_CONTRACT;
 
-        return (sizeof(MethodTable));
+        return SIZEOF__MethodTable_;
     }
 
     // Return total methods: virtual, static, and instance method slots.
@@ -4430,6 +4433,9 @@ public:
 
 };  // class MethodTable
 
+#ifndef CROSSBITNESS_COMPILE
+static_assert_no_msg(sizeof(MethodTable) == SIZEOF__MethodTable_);
+#endif
 #if defined(FEATURE_COMINTEROP) && !defined(DACCESS_COMPILE)
 WORD GetEquivalentMethodSlot(MethodTable * pOldMT, MethodTable * pNewMT, WORD wMTslot, BOOL *pfFound);
 #endif // defined(FEATURE_COMINTEROP) && !defined(DACCESS_COMPILE)