summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEgor Chesakov <Egor.Chesakov@microsoft.com>2018-06-06 23:49:48 -0700
committerJan Kotas <jkotas@microsoft.com>2018-06-06 23:49:48 -0700
commitef5b997e4649599e6ed678bba451a08a68c9ae04 (patch)
treeede15f5dce22c591ead811d981e017dc79c66041 /src
parent4cdb8103d1d3dbc68577f22c73b1d8112e9706bc (diff)
downloadcoreclr-ef5b997e4649599e6ed678bba451a08a68c9ae04.tar.gz
coreclr-ef5b997e4649599e6ed678bba451a08a68c9ae04.tar.bz2
coreclr-ef5b997e4649599e6ed678bba451a08a68c9ae04.zip
Cross-bitness support in JitInterface (#18329)
* Replace sizeof(tailCallType) / sizeof(tailCallType[0]) with _countof(tailCallType) * Remove TransparentProxyObject and RealProxyObject * InlinedCallFrame::GetEEInfo should not be used for R2R compilation * Hardcode constants used in CEEInfo::getEEInfo * Thread fields should not be used for R2R compilation * Zero pEEInfoOut->inlinedCallFrameInfo when compiling R2R code * Rename OFFSETOF__PtrArray__m_Array to avoid compilation conflicts with asmconstants * Add assertions enabled in every non-crossbitness scenario * Define and use CROSSBITNESS_COMPILE macro
Diffstat (limited to 'src')
-rw-r--r--src/inc/crosscomp.h4
-rw-r--r--src/vm/jitinterface.cpp41
-rw-r--r--src/vm/object.h151
-rw-r--r--src/vm/vars.hpp2
4 files changed, 40 insertions, 158 deletions
diff --git a/src/inc/crosscomp.h b/src/inc/crosscomp.h
index 200c343a45..14768952d8 100644
--- a/src/inc/crosscomp.h
+++ b/src/inc/crosscomp.h
@@ -8,6 +8,10 @@
#pragma once
+#if (!defined(_WIN64) && defined(_TARGET_64BIT_)) || (defined(_WIN64) && !defined(_TARGET_64BIT_))
+#define CROSSBITNESS_COMPILE
+#endif
+
#if defined(_X86_) && defined(_TARGET_ARM_) // Host X86 managing ARM related code
#ifndef CROSS_COMPILE
diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp
index 71e944a785..ff8a89d26f 100644
--- a/src/vm/jitinterface.cpp
+++ b/src/vm/jitinterface.cpp
@@ -8331,7 +8331,7 @@ void CEEInfo::reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd,
static const char * const tailCallType[] = {
"optimized tail call", "recursive loop", "helper assisted tailcall"
};
- _ASSERTE(tailCallResult >= 0 && (size_t)tailCallResult < sizeof(tailCallType) / sizeof(tailCallType[0]));
+ _ASSERTE(tailCallResult >= 0 && (size_t)tailCallResult < _countof(tailCallType));
LOG((LF_JIT, LL_INFO100000,
"While compiling '%S', %Splicit tail call from '%S' to '%S' generated as a %s.\n",
currentMethodName.GetUnicode(), fIsTailPrefix ? W("ex") : W("im"),
@@ -10090,24 +10090,43 @@ void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut)
JIT_TO_EE_TRANSITION();
- InlinedCallFrame::GetEEInfo(&pEEInfoOut->inlinedCallFrameInfo);
+ if (!IsReadyToRunCompilation())
+ {
+ InlinedCallFrame::GetEEInfo(&pEEInfoOut->inlinedCallFrameInfo);
+
+ // Offsets into the Thread structure
+ pEEInfoOut->offsetOfThreadFrame = Thread::GetOffsetOfCurrentFrame();
+ pEEInfoOut->offsetOfGCState = Thread::GetOffsetOfGCFlag();
+ }
+ else
+ {
+ // inlinedCallFrameInfo is not used for R2R compilation
+ ZeroMemory(&pEEInfoOut->inlinedCallFrameInfo, sizeof(pEEInfoOut->inlinedCallFrameInfo));
+
+ pEEInfoOut->offsetOfThreadFrame = (DWORD)-1;
+ pEEInfoOut->offsetOfGCState = (DWORD)-1;
+ }
- // Offsets into the Thread structure
- pEEInfoOut->offsetOfThreadFrame = Thread::GetOffsetOfCurrentFrame();
- pEEInfoOut->offsetOfGCState = Thread::GetOffsetOfGCFlag();
+#ifndef CROSSBITNESS_COMPILE
+ // The assertions must hold in every non-crossbitness scenario
+ _ASSERTE(OFFSETOF__DelegateObject__target == DelegateObject::GetOffsetOfTarget());
+ _ASSERTE(OFFSETOF__DelegateObject__methodPtr == DelegateObject::GetOffsetOfMethodPtr());
+ _ASSERTE(OFFSETOF__DelegateObject__methodPtrAux == DelegateObject::GetOffsetOfMethodPtrAux());
+ _ASSERTE(OFFSETOF__PtrArray__m_Array_ == PtrArray::GetDataOffset());
+#endif
// Delegate offsets
- pEEInfoOut->offsetOfDelegateInstance = DelegateObject::GetOffsetOfTarget();
- pEEInfoOut->offsetOfDelegateFirstTarget = DelegateObject::GetOffsetOfMethodPtr();
+ pEEInfoOut->offsetOfDelegateInstance = OFFSETOF__DelegateObject__target;
+ pEEInfoOut->offsetOfDelegateFirstTarget = OFFSETOF__DelegateObject__methodPtr;
// Secure delegate offsets
- pEEInfoOut->offsetOfSecureDelegateIndirectCell = DelegateObject::GetOffsetOfMethodPtrAux();
+ pEEInfoOut->offsetOfSecureDelegateIndirectCell = OFFSETOF__DelegateObject__methodPtrAux;
// Remoting offsets
- pEEInfoOut->offsetOfTransparentProxyRP = TransparentProxyObject::GetOffsetOfRP();
- pEEInfoOut->offsetOfRealProxyServer = RealProxyObject::GetOffsetOfServerObject();
+ pEEInfoOut->offsetOfTransparentProxyRP = (DWORD)-1;
+ pEEInfoOut->offsetOfRealProxyServer = (DWORD)-1;
- pEEInfoOut->offsetOfObjArrayData = (DWORD)PtrArray::GetDataOffset();
+ pEEInfoOut->offsetOfObjArrayData = OFFSETOF__PtrArray__m_Array_;
pEEInfoOut->sizeOfReversePInvokeFrame = (DWORD)-1;
diff --git a/src/vm/object.h b/src/vm/object.h
index 184f636e7d..29a53e1ff7 100644
--- a/src/vm/object.h
+++ b/src/vm/object.h
@@ -841,6 +841,8 @@ public:
OBJECTREF m_Array[1];
};
+#define OFFSETOF__PtrArray__m_Array_ ARRAYBASE_SIZE
+
/* a TypedByRef is a structure that is used to implement VB's BYREF variants.
it is basically a tuple of an address of some data along with a TypeHandle
that indicates the type of the address */
@@ -2111,151 +2113,6 @@ typedef WeakReferenceObject* WEAKREFERENCEREF;
STRINGREF AllocateString(SString sstr);
CHARARRAYREF AllocateCharArray(DWORD dwArrayLength);
-
-class TransparentProxyObject : public Object
-{
- friend class MscorlibBinder;
- friend class CheckAsmOffsets;
-
-public:
- MethodTable * GetMethodTableBeingProxied()
- {
- LIMITED_METHOD_CONTRACT;
- return _pMT;
- }
- void SetMethodTableBeingProxied(MethodTable * pMT)
- {
- LIMITED_METHOD_CONTRACT;
- _pMT = pMT;
- }
-
- MethodTable * GetInterfaceMethodTable()
- {
- LIMITED_METHOD_CONTRACT;
- return _pInterfaceMT;
- }
- void SetInterfaceMethodTable(MethodTable * pInterfaceMT)
- {
- LIMITED_METHOD_CONTRACT;
- _pInterfaceMT = pInterfaceMT;
- }
-
- void * GetStub()
- {
- LIMITED_METHOD_CONTRACT;
- return _stub;
- }
- void SetStub(void * pStub)
- {
- LIMITED_METHOD_CONTRACT;
- _stub = pStub;
- }
-
- OBJECTREF GetStubData()
- {
- LIMITED_METHOD_CONTRACT;
- return _stubData;
- }
- void SetStubData(OBJECTREF stubData)
- {
- LIMITED_METHOD_CONTRACT;
- SetObjectReference(&_stubData, stubData, GetAppDomain());
- }
-
- OBJECTREF GetRealProxy()
- {
- LIMITED_METHOD_CONTRACT;
- return _rp;
- }
- void SetRealProxy(OBJECTREF realProxy)
- {
- LIMITED_METHOD_CONTRACT;
- SetObjectReference(&_rp, realProxy, GetAppDomain());
- }
-
- static int GetOffsetOfRP() { LIMITED_METHOD_CONTRACT; return offsetof(TransparentProxyObject, _rp); }
-
-protected:
- TransparentProxyObject()
- {LIMITED_METHOD_CONTRACT;}; // don't instantiate this class directly
- ~TransparentProxyObject(){LIMITED_METHOD_CONTRACT;};
-
-private:
- OBJECTREF _rp;
- OBJECTREF _stubData;
- MethodTable* _pMT;
- MethodTable* _pInterfaceMT;
- void* _stub;
-};
-
-#ifdef USE_CHECKED_OBJECTREFS
-typedef REF<TransparentProxyObject> TRANSPARENTPROXYREF;
-#else
-typedef TransparentProxyObject* TRANSPARENTPROXYREF;
-#endif
-
-
-class RealProxyObject : public Object
-{
- friend class MscorlibBinder;
-
-public:
- DWORD GetOptFlags()
- {
- LIMITED_METHOD_CONTRACT;
- return _optFlags;
- }
- VOID SetOptFlags(DWORD flags)
- {
- LIMITED_METHOD_CONTRACT;
- _optFlags = flags;
- }
-
- DWORD GetDomainID()
- {
- LIMITED_METHOD_CONTRACT;
- return _domainID;
- }
-
- TRANSPARENTPROXYREF GetTransparentProxy()
- {
- LIMITED_METHOD_CONTRACT;
- return (TRANSPARENTPROXYREF&)_tp;
- }
- void SetTransparentProxy(TRANSPARENTPROXYREF tp)
- {
- LIMITED_METHOD_CONTRACT;
- SetObjectReference(&_tp, (OBJECTREF)tp, GetAppDomain());
- }
-
- static int GetOffsetOfIdentity() { LIMITED_METHOD_CONTRACT; return offsetof(RealProxyObject, _identity); }
- static int GetOffsetOfServerObject() { LIMITED_METHOD_CONTRACT; return offsetof(RealProxyObject, _serverObject); }
- static int GetOffsetOfServerIdentity() { LIMITED_METHOD_CONTRACT; return offsetof(RealProxyObject, _srvIdentity); }
-
-protected:
- RealProxyObject()
- {
- LIMITED_METHOD_CONTRACT;
- }; // don't instantiate this class directly
- ~RealProxyObject(){ LIMITED_METHOD_CONTRACT; };
-
-private:
- OBJECTREF _tp;
- OBJECTREF _identity;
- OBJECTREF _serverObject;
- DWORD _flags;
- DWORD _optFlags;
- DWORD _domainID;
- OBJECTHANDLE _srvIdentity;
-};
-
-#ifdef USE_CHECKED_OBJECTREFS
-typedef REF<RealProxyObject> REALPROXYREF;
-#else
-typedef RealProxyObject* REALPROXYREF;
-#endif
-
-
#ifdef FEATURE_COMINTEROP
//-------------------------------------------------------------
@@ -2715,6 +2572,10 @@ private:
INT_PTR _invocationCount;
};
+#define OFFSETOF__DelegateObject__target OBJECT_SIZE /* m_pMethTab */
+#define OFFSETOF__DelegateObject__methodPtr (OFFSETOF__DelegateObject__target + TARGET_POINTER_SIZE /* _target */ + TARGET_POINTER_SIZE /* _methodBase */)
+#define OFFSETOF__DelegateObject__methodPtrAux (OFFSETOF__DelegateObject__methodPtr + TARGET_POINTER_SIZE /* _methodPtr */)
+
#ifdef USE_CHECKED_OBJECTREFS
typedef REF<DelegateObject> DELEGATEREF;
#else // USE_CHECKED_OBJECTREFS
diff --git a/src/vm/vars.hpp b/src/vm/vars.hpp
index 50fbac0f07..b6da9c5a71 100644
--- a/src/vm/vars.hpp
+++ b/src/vm/vars.hpp
@@ -79,7 +79,6 @@ class LoaderHeap;
class IGCHeap;
class Object;
class StringObject;
-class TransparentProxyObject;
class ArrayClass;
class MethodTable;
class MethodDesc;
@@ -158,7 +157,6 @@ class OBJECTREF {
class ArrayBase* m_asArray;
class PtrArray* m_asPtrArray;
class DelegateObject* m_asDelegate;
- class TransparentProxyObject* m_asTP;
class ReflectClassBaseObject* m_asReflectClass;
class ExecutionContextObject* m_asExecutionContext;