diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index d65bf19a222eee..867962d22b131b 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -2078,7 +2078,8 @@ class ICorStaticInfo // This method is used to fetch data needed to inline functions virtual bool getMethodInfo ( CORINFO_METHOD_HANDLE ftn, /* IN */ - CORINFO_METHOD_INFO* info /* OUT */ + CORINFO_METHOD_INFO* info, /* OUT */ + CORINFO_CONTEXT_HANDLE context = NULL /* IN */ ) = 0; // Decides if you have any limitations for inlining. If everything's OK, it will return diff --git a/src/coreclr/inc/icorjitinfoimpl_generated.h b/src/coreclr/inc/icorjitinfoimpl_generated.h index 9df17c66747182..20ee55464b3c46 100644 --- a/src/coreclr/inc/icorjitinfoimpl_generated.h +++ b/src/coreclr/inc/icorjitinfoimpl_generated.h @@ -38,7 +38,8 @@ void getMethodSig( bool getMethodInfo( CORINFO_METHOD_HANDLE ftn, - CORINFO_METHOD_INFO* info) override; + CORINFO_METHOD_INFO* info, + CORINFO_CONTEXT_HANDLE context) override; CorInfoInline canInline( CORINFO_METHOD_HANDLE callerHnd, diff --git a/src/coreclr/inc/jiteeversionguid.h b/src/coreclr/inc/jiteeversionguid.h index bdc9c7be36cf0c..1585cfdabc435e 100644 --- a/src/coreclr/inc/jiteeversionguid.h +++ b/src/coreclr/inc/jiteeversionguid.h @@ -43,11 +43,11 @@ typedef const GUID *LPCGUID; #define GUID_DEFINED #endif // !GUID_DEFINED -constexpr GUID JITEEVersionIdentifier = { /* 878d63a7-ffc9-421f-81f7-db4729f0ed5c */ - 0x878d63a7, - 0xffc9, - 0x421f, - {0x81, 0xf7, 0xdb, 0x47, 0x29, 0xf0, 0xed, 0x5c} +constexpr GUID JITEEVersionIdentifier = { /* 2335da47-1d6c-4844-96b6-025558a525ba */ + 0x2335da47, + 0x1d6c, + 0x4844, + {0x96, 0xb6, 0x02, 0x55, 0x58, 0xa5, 0x25, 0xba} }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp index 8fa67226763bae..ae0b25b0a63cc5 100644 --- a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp +++ b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp @@ -51,10 +51,11 @@ void WrapICorJitInfo::getMethodSig( bool WrapICorJitInfo::getMethodInfo( CORINFO_METHOD_HANDLE ftn, - CORINFO_METHOD_INFO* info) + CORINFO_METHOD_INFO* info, + CORINFO_CONTEXT_HANDLE context) { API_ENTER(getMethodInfo); - bool temp = wrapHnd->getMethodInfo(ftn, info); + bool temp = wrapHnd->getMethodInfo(ftn, info, context); API_LEAVE(getMethodInfo); return temp; } diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index 4ba9d9b342d79e..3db96d4c9ee8c2 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -7775,11 +7775,35 @@ void Compiler::impCheckCanInline(GenTreeCall* call, return; } #endif + JITDUMP("\nCheckCanInline: fetching method info for inline candidate %s -- context %p\n", + compiler->eeGetMethodName(ftn), pParam->exactContextHnd); + + if (pParam->exactContextHnd == nullptr) + { + JITDUMP("NULL context\n"); + } + else if (pParam->exactContextHnd == METHOD_BEING_COMPILED_CONTEXT()) + { + JITDUMP("Current method context\n"); + } + else if ((((size_t)pParam->exactContextHnd & CORINFO_CONTEXTFLAGS_MASK) == CORINFO_CONTEXTFLAGS_METHOD)) + { + JITDUMP("Method context: %s\n", + compiler->eeGetMethodName((CORINFO_METHOD_HANDLE)pParam->exactContextHnd)); + } + else + { + JITDUMP("Class context: %s\n", compiler->eeGetClassName((CORINFO_CLASS_HANDLE)( + (size_t)pParam->exactContextHnd & ~CORINFO_CONTEXTFLAGS_MASK))); + } + + const bool isGdv = pParam->call->IsGuardedDevirtualizationCandidate(); // Fetch method info. This may fail, if the method doesn't have IL. + // NOTE: For GDV we're expected to use a different context (per candidate) // CORINFO_METHOD_INFO methInfo; - if (!compCompHnd->getMethodInfo(ftn, &methInfo)) + if (!compCompHnd->getMethodInfo(ftn, &methInfo, isGdv ? nullptr : pParam->exactContextHnd)) { inlineResult->NoteFatal(InlineObservation::CALLEE_NO_METHOD_INFO); return; diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 3bd5c2d110e371..10749a4cc101c2 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -1179,9 +1179,29 @@ private void getMethodSig(CORINFO_METHOD_STRUCT_* ftn, CORINFO_SIG_INFO* sig, CO Get_CORINFO_SIG_INFO(method, sig: sig, scope: null); } - private bool getMethodInfo(CORINFO_METHOD_STRUCT_* ftn, CORINFO_METHOD_INFO* info) + private bool getMethodInfo(CORINFO_METHOD_STRUCT_* ftn, CORINFO_METHOD_INFO* info, CORINFO_CONTEXT_STRUCT* context) { MethodDesc method = HandleToObject(ftn); + + if (context != null && method.IsSharedByGenericInstantiations) + { + TypeSystemEntity ctx = entityFromContext(context); + if (ctx is MethodDesc methodFromCtx && context != contextFromMethodBeingCompiled()) + { + Debug.Assert(method.GetTypicalMethodDefinition() == methodFromCtx.GetTypicalMethodDefinition()); + method = methodFromCtx; + } + else if (ctx is InstantiatedType instantiatedCtxType) + { + MethodDesc instantiatedMethod = _compilation.TypeSystemContext.GetMethodForInstantiatedType(method.GetTypicalMethodDefinition(), instantiatedCtxType); + if (method.HasInstantiation) + { + instantiatedMethod = _compilation.TypeSystemContext.GetInstantiatedMethod(instantiatedMethod, method.Instantiation); + } + method = instantiatedMethod; + } + } + #if READYTORUN // Add an early CanInline check to see if referring to the IL of the target methods is // permitted from within this MethodBeingCompiled, the full CanInline check will be performed diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs index fccfdce9b83d01..51d3f1ba7fb658 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs @@ -71,12 +71,12 @@ private static void _getMethodSig(IntPtr thisHandle, IntPtr* ppException, CORINF } [UnmanagedCallersOnly] - private static byte _getMethodInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_METHOD_STRUCT_* ftn, CORINFO_METHOD_INFO* info) + private static byte _getMethodInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_METHOD_STRUCT_* ftn, CORINFO_METHOD_INFO* info, CORINFO_CONTEXT_STRUCT* context) { var _this = GetThis(thisHandle); try { - return _this.getMethodInfo(ftn, info) ? (byte)1 : (byte)0; + return _this.getMethodInfo(ftn, info, context) ? (byte)1 : (byte)0; } catch (Exception ex) { @@ -2513,7 +2513,7 @@ private static IntPtr GetUnmanagedCallbacks() callbacks[1] = (delegate* unmanaged)&_getMethodAttribs; callbacks[2] = (delegate* unmanaged)&_setMethodAttribs; callbacks[3] = (delegate* unmanaged)&_getMethodSig; - callbacks[4] = (delegate* unmanaged)&_getMethodInfo; + callbacks[4] = (delegate* unmanaged)&_getMethodInfo; callbacks[5] = (delegate* unmanaged)&_canInline; callbacks[6] = (delegate* unmanaged)&_beginInlining; callbacks[7] = (delegate* unmanaged)&_reportInliningDecision; diff --git a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt index 5067102b6d17e1..e6892816cf410b 100644 --- a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt +++ b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt @@ -165,7 +165,7 @@ FUNCTIONS uint32_t getMethodAttribs( CORINFO_METHOD_HANDLE ftn ); void setMethodAttribs( CORINFO_METHOD_HANDLE ftn, CorInfoMethodRuntimeFlags attribs ); void getMethodSig( CORINFO_METHOD_HANDLE ftn, CORINFO_SIG_INFO *sig, CORINFO_CLASS_HANDLE memberParent ); - bool getMethodInfo( CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info ); + bool getMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, CORINFO_CONTEXT_HANDLE context); CorInfoInline canInline( CORINFO_METHOD_HANDLE callerHnd, CORINFO_METHOD_HANDLE calleeHnd); void beginInlining(CORINFO_METHOD_HANDLE inlinerHnd, CORINFO_METHOD_HANDLE inlineeHnd); void reportInliningDecision(CORINFO_METHOD_HANDLE inlinerHnd, CORINFO_METHOD_HANDLE inlineeHnd, CorInfoInline inlineResult, const char * reason); diff --git a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h index 38083a09be9747..1fb8df9f2e0eb7 100644 --- a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h +++ b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h @@ -15,7 +15,7 @@ struct JitInterfaceCallbacks uint32_t (* getMethodAttribs)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn); void (* setMethodAttribs)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, CorInfoMethodRuntimeFlags attribs); void (* getMethodSig)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, CORINFO_SIG_INFO* sig, CORINFO_CLASS_HANDLE memberParent); - bool (* getMethodInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info); + bool (* getMethodInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, CORINFO_CONTEXT_HANDLE context); CorInfoInline (* canInline)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE callerHnd, CORINFO_METHOD_HANDLE calleeHnd); void (* beginInlining)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE inlinerHnd, CORINFO_METHOD_HANDLE inlineeHnd); void (* reportInliningDecision)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE inlinerHnd, CORINFO_METHOD_HANDLE inlineeHnd, CorInfoInline inlineResult, const char* reason); @@ -234,10 +234,11 @@ class JitInterfaceWrapper : public ICorJitInfo virtual bool getMethodInfo( CORINFO_METHOD_HANDLE ftn, - CORINFO_METHOD_INFO* info) + CORINFO_METHOD_INFO* info, + CORINFO_CONTEXT_HANDLE context) { CorInfoExceptionClass* pException = nullptr; - bool temp = _callbacks->getMethodInfo(_thisHandle, &pException, ftn, info); + bool temp = _callbacks->getMethodInfo(_thisHandle, &pException, ftn, info, context); if (pException != nullptr) throw pException; return temp; } diff --git a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h index 0d5af3e388270b..6c6bbed9bd9650 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h @@ -106,7 +106,7 @@ LWM(GetAssemblyName, DWORDLONG, DWORD) LWM(GetMethodClass, DWORDLONG, DWORDLONG) LWM(GetMethodDefFromMethod, DWORDLONG, DWORD) LWM(GetMethodHash, DWORDLONG, DWORD) -LWM(GetMethodInfo, DWORDLONG, Agnostic_GetMethodInfo) +LWM(GetMethodInfo, DLDL, Agnostic_GetMethodInfo) LWM(GetMethodNameFromMetadata, Agnostic_CORINFO_METHODNAME_TOKENin, Agnostic_CORINFO_METHODNAME_TOKENout) LWM(GetMethodSig, DLDL, Agnostic_CORINFO_SIG_INFO) LWM(GetMethodSync, DWORDLONG, DLDL) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index b5ba78ef623b2a..1c4264df6b9ce1 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -2939,13 +2939,14 @@ CorInfoHFAElemType MethodContext::repGetHFAType(CORINFO_CLASS_HANDLE clsHnd) return (CorInfoHFAElemType)value; } -void MethodContext::recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, - CORINFO_METHOD_INFO* info, - bool result, - DWORD exceptionCode) +void MethodContext::recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, + CORINFO_METHOD_INFO* info, + CORINFO_CONTEXT_HANDLE context, + bool result, + DWORD exceptionCode) { if (GetMethodInfo == nullptr) - GetMethodInfo = new LightWeightMap(); + GetMethodInfo = new LightWeightMap(); Agnostic_GetMethodInfo value; ZeroMemory(&value, sizeof(value)); @@ -2967,16 +2968,18 @@ void MethodContext::recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, value.result = result; value.exceptionCode = (DWORD)exceptionCode; - DWORDLONG key = CastHandle(ftn); + DLDL key; + key.A = CastHandle(ftn); + key.B = CastHandle(context); GetMethodInfo->Add(key, value); DEBUG_REC(dmpGetMethodInfo(key, value)); } -void MethodContext::dmpGetMethodInfo(DWORDLONG key, const Agnostic_GetMethodInfo& value) +void MethodContext::dmpGetMethodInfo(DLDL key, const Agnostic_GetMethodInfo& value) { if (value.result) { - printf("GetMethodInfo key ftn-%016" PRIX64 ", value res-%u ftn-%016" PRIX64 " scp-%016" PRIX64 " ilo-%u ils-%u ms-%u ehc-%u opt-%08X rk-%u args-%s locals-%s excp-%08X", - key, value.result, value.info.ftn, value.info.scope, value.info.ILCode_offset, value.info.ILCodeSize, + printf("GetMethodInfo key ftn-%016" PRIX64 " ctx-%016" PRIX64 ", value res-%u ftn-%016" PRIX64 " scp-%016" PRIX64 " ilo-%u ils-%u ms-%u ehc-%u opt-%08X rk-%u args-%s locals-%s excp-%08X", + key.A, key.B, value.result, value.info.ftn, value.info.scope, value.info.ILCode_offset, value.info.ILCodeSize, value.info.maxStack, value.info.EHcount, value.info.options, value.info.regionKind, SpmiDumpHelper::DumpAgnostic_CORINFO_SIG_INFO(value.info.args, GetMethodInfo, SigInstHandleMap).c_str(), SpmiDumpHelper::DumpAgnostic_CORINFO_SIG_INFO(value.info.locals, GetMethodInfo, SigInstHandleMap).c_str(), @@ -2984,14 +2987,16 @@ void MethodContext::dmpGetMethodInfo(DWORDLONG key, const Agnostic_GetMethodInfo } else { - printf("GetMethodInfo key ftn-%016" PRIX64 ", value res-%u excp-%08X", - key, value.result, value.exceptionCode); + printf("GetMethodInfo key ftn-%016" PRIX64 " ctx-%016" PRIX64 ", value res-%u excp-%08X", + key.A, key.B, value.result, value.exceptionCode); } } -bool MethodContext::repGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, DWORD* exceptionCode) +bool MethodContext::repGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, CORINFO_CONTEXT_HANDLE context, DWORD* exceptionCode) { - DWORDLONG key = CastHandle(ftn); - Agnostic_GetMethodInfo value = LookupByKeyOrMiss(GetMethodInfo, key, ": key %016" PRIX64 "", key); + DLDL key; + key.A = CastHandle(ftn); + key.B = CastHandle(context); + Agnostic_GetMethodInfo value = LookupByKeyOrMiss(GetMethodInfo, key, ": key %016" PRIX64 "", key.A); DEBUG_REP(dmpGetMethodInfo(key, value)); diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h index 4ac4554ea36968..63c2f0191c3d99 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h @@ -402,9 +402,9 @@ class MethodContext void dmpGetHFAType(DWORDLONG key, DWORD value); CorInfoHFAElemType repGetHFAType(CORINFO_CLASS_HANDLE clsHnd); - void recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, bool result, DWORD exceptionCode); - void dmpGetMethodInfo(DWORDLONG key, const Agnostic_GetMethodInfo& value); - bool repGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, DWORD* exceptionCode); + void recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, CORINFO_CONTEXT_HANDLE context, bool result, DWORD exceptionCode); + void dmpGetMethodInfo(DLDL key, const Agnostic_GetMethodInfo& value); + bool repGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, CORINFO_CONTEXT_HANDLE context, DWORD* exceptionCode); void recGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 73ac91637d51ad..48790166a53ebc 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -68,8 +68,9 @@ void interceptor_ICJI::getMethodSig(CORINFO_METHOD_HANDLE ftn, /* IN */ // return information about a method private to the implementation // returns false if method is not IL, or is otherwise unavailable. // This method is used to fetch data needed to inline functions -bool interceptor_ICJI::getMethodInfo(CORINFO_METHOD_HANDLE ftn, /* IN */ - CORINFO_METHOD_INFO* info /* OUT */ +bool interceptor_ICJI::getMethodInfo(CORINFO_METHOD_HANDLE ftn, /* IN */ + CORINFO_METHOD_INFO* info, /* OUT */ + CORINFO_CONTEXT_HANDLE context /* IN */ ) { bool temp = false; @@ -78,11 +79,11 @@ bool interceptor_ICJI::getMethodInfo(CORINFO_METHOD_HANDLE ftn, /* IN */ [&]() { mc->cr->AddCall("getMethodInfo"); - temp = original_ICorJitInfo->getMethodInfo(ftn, info); + temp = original_ICorJitInfo->getMethodInfo(ftn, info, context); }, [&](DWORD exceptionCode) { - this->mc->recGetMethodInfo(ftn, info, temp, exceptionCode); + this->mc->recGetMethodInfo(ftn, info, context, temp, exceptionCode); }); return temp; diff --git a/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp b/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp index 2740cce346a24f..bc95548b696a5b 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp @@ -45,10 +45,11 @@ void interceptor_ICJI::getMethodSig( bool interceptor_ICJI::getMethodInfo( CORINFO_METHOD_HANDLE ftn, - CORINFO_METHOD_INFO* info) + CORINFO_METHOD_INFO* info, + CORINFO_CONTEXT_HANDLE context) { mcs->AddCall("getMethodInfo"); - return original_ICorJitInfo->getMethodInfo(ftn, info); + return original_ICorJitInfo->getMethodInfo(ftn, info, context); } CorInfoInline interceptor_ICJI::canInline( diff --git a/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp b/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp index 357f2b7b9c9455..1ec24e309490b3 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp @@ -41,9 +41,10 @@ void interceptor_ICJI::getMethodSig( bool interceptor_ICJI::getMethodInfo( CORINFO_METHOD_HANDLE ftn, - CORINFO_METHOD_INFO* info) + CORINFO_METHOD_INFO* info, + CORINFO_CONTEXT_HANDLE context) { - return original_ICorJitInfo->getMethodInfo(ftn, info); + return original_ICorJitInfo->getMethodInfo(ftn, info, context); } CorInfoInline interceptor_ICJI::canInline( diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index 271af591c9bd46..f8f84b24cd6cd0 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -68,13 +68,14 @@ void MyICJI::getMethodSig(CORINFO_METHOD_HANDLE ftn, /* IN */ // return information about a method private to the implementation // returns false if method is not IL, or is otherwise unavailable. // This method is used to fetch data needed to inline functions -bool MyICJI::getMethodInfo(CORINFO_METHOD_HANDLE ftn, /* IN */ - CORINFO_METHOD_INFO* info /* OUT */ +bool MyICJI::getMethodInfo(CORINFO_METHOD_HANDLE ftn, /* IN */ + CORINFO_METHOD_INFO* info, /* OUT */ + CORINFO_CONTEXT_HANDLE context /* IN */ ) { jitInstance->mc->cr->AddCall("getMethodInfo"); DWORD exceptionCode = 0; - bool value = jitInstance->mc->repGetMethodInfo(ftn, info, &exceptionCode); + bool value = jitInstance->mc->repGetMethodInfo(ftn, info, context, &exceptionCode); if (exceptionCode != 0) ThrowException(exceptionCode); return value; diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 39a7f65fe0271d..c040d83304ec63 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -7503,7 +7503,8 @@ class MethodInfoHelperContext final static void getMethodInfoHelper( MethodInfoHelperContext& cxt, - CORINFO_METHOD_INFO* methInfo) + CORINFO_METHOD_INFO* methInfo, + CORINFO_CONTEXT_HANDLE exactContext = NULL) { STANDARD_VM_CONTRACT; _ASSERTE(methInfo != NULL); @@ -7623,7 +7624,23 @@ static void getMethodInfoHelper( DWORD cbSig = 0; ftn->GetSig(&pSig, &cbSig); - SigTypeContext context(ftn); + SigTypeContext context; + + if (exactContext == NULL || exactContext == METHOD_BEING_COMPILED_CONTEXT()) + { + SigTypeContext::InitTypeContext(ftn, &context); + } + else if (((size_t)exactContext & CORINFO_CONTEXTFLAGS_MASK) == CORINFO_CONTEXTFLAGS_METHOD) + { + MethodDesc* contextMD = (MethodDesc*)((size_t)exactContext & ~CORINFO_CONTEXTFLAGS_MASK); + SigTypeContext::InitTypeContext(contextMD, &context); + } + else + { + _ASSERT(((size_t)exactContext & CORINFO_CONTEXTFLAGS_MASK) == CORINFO_CONTEXTFLAGS_CLASS); + TypeHandle th = TypeHandle((CORINFO_CLASS_HANDLE)((size_t)exactContext & ~CORINFO_CONTEXTFLAGS_MASK)); + SigTypeContext::InitTypeContext(th, &context); + } /* Fetch the method signature */ // Type parameters in the signature should be instantiated according to the @@ -7662,7 +7679,8 @@ static void getMethodInfoHelper( bool CEEInfo::getMethodInfo( CORINFO_METHOD_HANDLE ftnHnd, - CORINFO_METHOD_INFO * methInfo) + CORINFO_METHOD_INFO * methInfo, + CORINFO_CONTEXT_HANDLE context) { CONTRACTL { THROWS; @@ -7680,14 +7698,14 @@ CEEInfo::getMethodInfo( MethodInfoHelperContext cxt{ ftn }; if (ftn->IsDynamicMethod()) { - getMethodInfoHelper(cxt, methInfo); + getMethodInfoHelper(cxt, methInfo, context); result = true; } else if (!ftn->IsWrapperStub() && ftn->HasILHeader()) { COR_ILMETHOD_DECODER header(ftn->GetILHeader(TRUE), ftn->GetMDImport(), NULL); cxt.Header = &header; - getMethodInfoHelper(cxt, methInfo); + getMethodInfoHelper(cxt, methInfo, context); result = true; } else if (ftn->IsIL() && ftn->GetRVA() == 0)