diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index d337a9c54361d8..6c487fbd5c5283 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -3258,13 +3258,6 @@ class ICorDynamicInfo : public ICorStaticInfo void **ppIndirection = NULL ) = 0; - // Adds an active dependency from the context method's module to the given module - // This is internal callback for the EE. JIT should not call it directly. - virtual void addActiveDependency( - CORINFO_MODULE_HANDLE moduleFrom, - CORINFO_MODULE_HANDLE moduleTo - ) = 0; - virtual CORINFO_METHOD_HANDLE GetDelegateCtor( CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, diff --git a/src/coreclr/inc/icorjitinfoimpl_generated.h b/src/coreclr/inc/icorjitinfoimpl_generated.h index 1d7f394dd16589..c90bb1521f61f6 100644 --- a/src/coreclr/inc/icorjitinfoimpl_generated.h +++ b/src/coreclr/inc/icorjitinfoimpl_generated.h @@ -647,10 +647,6 @@ uint32_t getFieldThreadLocalStoreID( CORINFO_FIELD_HANDLE field, void** ppIndirection) override; -void addActiveDependency( - CORINFO_MODULE_HANDLE moduleFrom, - CORINFO_MODULE_HANDLE moduleTo) override; - CORINFO_METHOD_HANDLE GetDelegateCtor( CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, diff --git a/src/coreclr/inc/jiteeversionguid.h b/src/coreclr/inc/jiteeversionguid.h index 00fc20a46e1f67..5adc16d558fc4c 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 = { /* fd13d4e1-9815-4336-8232-b27878b9ebd4 */ - 0xfd13d4e1, - 0x9815, - 0x4336, - {0x82, 0x32, 0xb2, 0x78, 0x78, 0xb9, 0xeb, 0xd4} +constexpr GUID JITEEVersionIdentifier = { /* 9c013880-b9b8-4f91-bea4-d4dd4368ab93 */ + 0x9c013880, + 0xb9b8, + 0x4f91, + {0xbe, 0xa4, 0xd4, 0xdd, 0x43, 0x68, 0xab, 0x93} }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/coreclr/jit/ICorJitInfo_names_generated.h b/src/coreclr/jit/ICorJitInfo_names_generated.h index dcdb90d6f3117e..57725f7b7b12ed 100644 --- a/src/coreclr/jit/ICorJitInfo_names_generated.h +++ b/src/coreclr/jit/ICorJitInfo_names_generated.h @@ -161,7 +161,6 @@ DEF_CLR_API(canGetVarArgsHandle) DEF_CLR_API(constructStringLiteral) DEF_CLR_API(emptyStringLiteral) DEF_CLR_API(getFieldThreadLocalStoreID) -DEF_CLR_API(addActiveDependency) DEF_CLR_API(GetDelegateCtor) DEF_CLR_API(MethodCompileComplete) DEF_CLR_API(getTailCallHelpers) diff --git a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp index 3494d49102994c..941df4ff2099ea 100644 --- a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp +++ b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp @@ -1546,15 +1546,6 @@ uint32_t WrapICorJitInfo::getFieldThreadLocalStoreID( return temp; } -void WrapICorJitInfo::addActiveDependency( - CORINFO_MODULE_HANDLE moduleFrom, - CORINFO_MODULE_HANDLE moduleTo) -{ - API_ENTER(addActiveDependency); - wrapHnd->addActiveDependency(moduleFrom, moduleTo); - API_LEAVE(addActiveDependency); -} - CORINFO_METHOD_HANDLE WrapICorJitInfo::GetDelegateCtor( CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 376019c4adc5f0..f321d7c9191fc9 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -3389,8 +3389,6 @@ private InfoAccessType emptyStringLiteral(ref void* ppValue) private uint getFieldThreadLocalStoreID(CORINFO_FIELD_STRUCT_* field, ref void* ppIndirection) { throw new NotImplementedException("getFieldThreadLocalStoreID"); } - private void addActiveDependency(CORINFO_MODULE_STRUCT_* moduleFrom, CORINFO_MODULE_STRUCT_* moduleTo) - { throw new NotImplementedException("addActiveDependency"); } private CORINFO_METHOD_STRUCT_* GetDelegateCtor(CORINFO_METHOD_STRUCT_* methHnd, CORINFO_CLASS_STRUCT_* clsHnd, CORINFO_METHOD_STRUCT_* targetMethodHnd, ref DelegateCtorArgs pCtorData) { throw new NotImplementedException("GetDelegateCtor"); } private void MethodCompileComplete(CORINFO_METHOD_STRUCT_* methHnd) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs index 584e0df9e54828..1d0e85e9cdb432 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs @@ -2333,20 +2333,6 @@ private static uint _getFieldThreadLocalStoreID(IntPtr thisHandle, IntPtr* ppExc } } - [UnmanagedCallersOnly] - private static void _addActiveDependency(IntPtr thisHandle, IntPtr* ppException, CORINFO_MODULE_STRUCT_* moduleFrom, CORINFO_MODULE_STRUCT_* moduleTo) - { - var _this = GetThis(thisHandle); - try - { - _this.addActiveDependency(moduleFrom, moduleTo); - } - catch (Exception ex) - { - *ppException = _this.AllocException(ex); - } - } - [UnmanagedCallersOnly] private static CORINFO_METHOD_STRUCT_* _GetDelegateCtor(IntPtr thisHandle, IntPtr* ppException, CORINFO_METHOD_STRUCT_* methHnd, CORINFO_CLASS_STRUCT_* clsHnd, CORINFO_METHOD_STRUCT_* targetMethodHnd, DelegateCtorArgs* pCtorData) { @@ -2670,7 +2656,7 @@ private static uint _getJitFlags(IntPtr thisHandle, IntPtr* ppException, CORJIT_ private static IntPtr GetUnmanagedCallbacks() { - void** callbacks = (void**)Marshal.AllocCoTaskMem(sizeof(IntPtr) * 180); + void** callbacks = (void**)Marshal.AllocCoTaskMem(sizeof(IntPtr) * 179); callbacks[0] = (delegate* unmanaged)&_isIntrinsic; callbacks[1] = (delegate* unmanaged)&_getMethodAttribs; @@ -2829,29 +2815,28 @@ private static IntPtr GetUnmanagedCallbacks() callbacks[154] = (delegate* unmanaged)&_constructStringLiteral; callbacks[155] = (delegate* unmanaged)&_emptyStringLiteral; callbacks[156] = (delegate* unmanaged)&_getFieldThreadLocalStoreID; - callbacks[157] = (delegate* unmanaged)&_addActiveDependency; - callbacks[158] = (delegate* unmanaged)&_GetDelegateCtor; - callbacks[159] = (delegate* unmanaged)&_MethodCompileComplete; - callbacks[160] = (delegate* unmanaged)&_getTailCallHelpers; - callbacks[161] = (delegate* unmanaged)&_convertPInvokeCalliToCall; - callbacks[162] = (delegate* unmanaged)&_notifyInstructionSetUsage; - callbacks[163] = (delegate* unmanaged)&_updateEntryPointForTailCall; - callbacks[164] = (delegate* unmanaged)&_allocMem; - callbacks[165] = (delegate* unmanaged)&_reserveUnwindInfo; - callbacks[166] = (delegate* unmanaged)&_allocUnwindInfo; - callbacks[167] = (delegate* unmanaged)&_allocGCInfo; - callbacks[168] = (delegate* unmanaged)&_setEHcount; - callbacks[169] = (delegate* unmanaged)&_setEHinfo; - callbacks[170] = (delegate* unmanaged)&_logMsg; - callbacks[171] = (delegate* unmanaged)&_doAssert; - callbacks[172] = (delegate* unmanaged)&_reportFatalError; - callbacks[173] = (delegate* unmanaged)&_getPgoInstrumentationResults; - callbacks[174] = (delegate* unmanaged)&_allocPgoInstrumentationBySchema; - callbacks[175] = (delegate* unmanaged)&_recordCallSite; - callbacks[176] = (delegate* unmanaged)&_recordRelocation; - callbacks[177] = (delegate* unmanaged)&_getRelocTypeHint; - callbacks[178] = (delegate* unmanaged)&_getExpectedTargetArchitecture; - callbacks[179] = (delegate* unmanaged)&_getJitFlags; + callbacks[157] = (delegate* unmanaged)&_GetDelegateCtor; + callbacks[158] = (delegate* unmanaged)&_MethodCompileComplete; + callbacks[159] = (delegate* unmanaged)&_getTailCallHelpers; + callbacks[160] = (delegate* unmanaged)&_convertPInvokeCalliToCall; + callbacks[161] = (delegate* unmanaged)&_notifyInstructionSetUsage; + callbacks[162] = (delegate* unmanaged)&_updateEntryPointForTailCall; + callbacks[163] = (delegate* unmanaged)&_allocMem; + callbacks[164] = (delegate* unmanaged)&_reserveUnwindInfo; + callbacks[165] = (delegate* unmanaged)&_allocUnwindInfo; + callbacks[166] = (delegate* unmanaged)&_allocGCInfo; + callbacks[167] = (delegate* unmanaged)&_setEHcount; + callbacks[168] = (delegate* unmanaged)&_setEHinfo; + callbacks[169] = (delegate* unmanaged)&_logMsg; + callbacks[170] = (delegate* unmanaged)&_doAssert; + callbacks[171] = (delegate* unmanaged)&_reportFatalError; + callbacks[172] = (delegate* unmanaged)&_getPgoInstrumentationResults; + callbacks[173] = (delegate* unmanaged)&_allocPgoInstrumentationBySchema; + callbacks[174] = (delegate* unmanaged)&_recordCallSite; + callbacks[175] = (delegate* unmanaged)&_recordRelocation; + callbacks[176] = (delegate* unmanaged)&_getRelocTypeHint; + callbacks[177] = (delegate* unmanaged)&_getExpectedTargetArchitecture; + callbacks[178] = (delegate* unmanaged)&_getJitFlags; return (IntPtr)callbacks; } diff --git a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt index c8c3dab00b6432..96875280c0800c 100644 --- a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt +++ b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt @@ -314,7 +314,6 @@ FUNCTIONS InfoAccessType constructStringLiteral(CORINFO_MODULE_HANDLE module, mdToken metaTok, void **ppValue); InfoAccessType emptyStringLiteral(void **ppValue); uint32_t getFieldThreadLocalStoreID (CORINFO_FIELD_HANDLE field, void **ppIndirection); - void addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom, CORINFO_MODULE_HANDLE moduleTo); CORINFO_METHOD_HANDLE GetDelegateCtor(CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, CORINFO_METHOD_HANDLE targetMethodHnd, DelegateCtorArgs * pCtorData); void MethodCompileComplete(CORINFO_METHOD_HANDLE methHnd); bool getTailCallHelpers(CORINFO_RESOLVED_TOKEN* callToken, CORINFO_SIG_INFO* sig, CORINFO_GET_TAILCALL_HELPERS_FLAGS flags, CORINFO_TAILCALL_HELPERS* pResult); diff --git a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h index 07789969b0fa19..2b416b5fccf09a 100644 --- a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h +++ b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h @@ -168,7 +168,6 @@ struct JitInterfaceCallbacks InfoAccessType (* constructStringLiteral)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_MODULE_HANDLE module, unsigned int metaTok, void** ppValue); InfoAccessType (* emptyStringLiteral)(void * thisHandle, CorInfoExceptionClass** ppException, void** ppValue); uint32_t (* getFieldThreadLocalStoreID)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field, void** ppIndirection); - void (* addActiveDependency)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_MODULE_HANDLE moduleFrom, CORINFO_MODULE_HANDLE moduleTo); CORINFO_METHOD_HANDLE (* GetDelegateCtor)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, CORINFO_METHOD_HANDLE targetMethodHnd, DelegateCtorArgs* pCtorData); void (* MethodCompileComplete)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE methHnd); bool (* getTailCallHelpers)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_RESOLVED_TOKEN* callToken, CORINFO_SIG_INFO* sig, CORINFO_GET_TAILCALL_HELPERS_FLAGS flags, CORINFO_TAILCALL_HELPERS* pResult); @@ -1722,15 +1721,6 @@ class JitInterfaceWrapper : public ICorJitInfo return temp; } - virtual void addActiveDependency( - CORINFO_MODULE_HANDLE moduleFrom, - CORINFO_MODULE_HANDLE moduleTo) -{ - CorInfoExceptionClass* pException = nullptr; - _callbacks->addActiveDependency(_thisHandle, &pException, moduleFrom, moduleTo); - if (pException != nullptr) throw pException; -} - virtual CORINFO_METHOD_HANDLE GetDelegateCtor( CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 0beba3442cad23..02f70a5ed9861e 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -1772,14 +1772,6 @@ uint32_t interceptor_ICJI::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE field return temp; } -// Adds an active dependency from the context method's module to the given module -// This is internal callback for the EE. JIT should not call it directly. -void interceptor_ICJI::addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom, CORINFO_MODULE_HANDLE moduleTo) -{ - mc->cr->AddCall("addActiveDependency"); - original_ICorJitInfo->addActiveDependency(moduleFrom, moduleTo); -} - CORINFO_METHOD_HANDLE interceptor_ICJI::GetDelegateCtor(CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, CORINFO_METHOD_HANDLE targetMethodHnd, 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 1c35b1a78cdf39..9a30ebd097346d 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp @@ -1266,14 +1266,6 @@ uint32_t interceptor_ICJI::getFieldThreadLocalStoreID( return original_ICorJitInfo->getFieldThreadLocalStoreID(field, ppIndirection); } -void interceptor_ICJI::addActiveDependency( - CORINFO_MODULE_HANDLE moduleFrom, - CORINFO_MODULE_HANDLE moduleTo) -{ - mcs->AddCall("addActiveDependency"); - original_ICorJitInfo->addActiveDependency(moduleFrom, moduleTo); -} - CORINFO_METHOD_HANDLE interceptor_ICJI::GetDelegateCtor( CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, 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 ae2629141d8709..5c81284fc94105 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp @@ -1109,13 +1109,6 @@ uint32_t interceptor_ICJI::getFieldThreadLocalStoreID( return original_ICorJitInfo->getFieldThreadLocalStoreID(field, ppIndirection); } -void interceptor_ICJI::addActiveDependency( - CORINFO_MODULE_HANDLE moduleFrom, - CORINFO_MODULE_HANDLE moduleTo) -{ - original_ICorJitInfo->addActiveDependency(moduleFrom, moduleTo); -} - CORINFO_METHOD_HANDLE interceptor_ICJI::GetDelegateCtor( CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index fb0ed8f01b6b2d..074e1f2457aed2 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -1531,15 +1531,6 @@ uint32_t MyICJI::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE field, void** p return jitInstance->mc->repGetFieldThreadLocalStoreID(field, ppIndirection); } -// Adds an active dependency from the context method's module to the given module -// This is internal callback for the EE. JIT should not call it directly. -void MyICJI::addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom, CORINFO_MODULE_HANDLE moduleTo) -{ - jitInstance->mc->cr->AddCall("addActiveDependency"); - LogError("Hit unimplemented addActiveDependency"); - DebugBreakorAV(116); -} - CORINFO_METHOD_HANDLE MyICJI::GetDelegateCtor(CORINFO_METHOD_HANDLE methHnd, CORINFO_CLASS_HANDLE clsHnd, CORINFO_METHOD_HANDLE targetMethodHnd, diff --git a/src/coreclr/vm/ceeload.cpp b/src/coreclr/vm/ceeload.cpp index 9399e7bd7b627c..4ad463cec74a25 100644 --- a/src/coreclr/vm/ceeload.cpp +++ b/src/coreclr/vm/ceeload.cpp @@ -2906,23 +2906,6 @@ BYTE *Module::GetProfilerBase() } } -void Module::AddActiveDependency(Module *pModule, BOOL unconditional) -{ - CONTRACT_VOID - { - THROWS; - GC_TRIGGERS; - PRECONDITION(CheckPointer(pModule)); - PRECONDITION(pModule != this); - PRECONDITION(!IsSystem()); - // Postcondition about activation - } - CONTRACT_END; - - pModule->EnsureActive(); - RETURN; -} - #endif //!DACCESS_COMPILE Assembly * diff --git a/src/coreclr/vm/ceeload.h b/src/coreclr/vm/ceeload.h index 6be9a6038154e9..6f950c58aa0948 100644 --- a/src/coreclr/vm/ceeload.h +++ b/src/coreclr/vm/ceeload.h @@ -1532,33 +1532,6 @@ class Module : public ModuleBase BYTE *GetProfilerBase(); - - // Active transition path management - // - // This list keeps track of module which we have active transition - // paths to. An active transition path is where we move from - // active execution in one module to another module without - // involving triggering the file loader to ensure that the - // destination module is active. We must explicitly list these - // relationships so the loader can ensure that the activation - // constraints are a priori satisfied. - // - // Conditional vs. Unconditional describes how we deal with - // activation failure of a dependency. In the unconditional case, - // we propagate the activation failure to the depending module. - // In the conditional case, we activate a "trigger" in the active - // transition path which will cause the path to fail in particular - // app domains where the destination module failed to activate. - // (This trigger in the path typically has a perf cost even in the - // nonfailing case.) - // - // In either case we must try to perform the activation eagerly - - // even in the conditional case we have to know whether to turn on - // the trigger or not before we let the active transition path - // execute. - - void AddActiveDependency(Module *pModule, BOOL unconditional); - BYTE* GetNativeFixupBlobData(RVA fixup); IMDInternalImport *GetNativeAssemblyImport(BOOL loadAllowed = TRUE); diff --git a/src/coreclr/vm/interpreter.h b/src/coreclr/vm/interpreter.h index 1a37803f7d1de9..c76c4160c80cd4 100644 --- a/src/coreclr/vm/interpreter.h +++ b/src/coreclr/vm/interpreter.h @@ -723,14 +723,6 @@ class InterpreterCEEInfo: public CEEInfo CEEJitInfo m_jitInfo; public: InterpreterCEEInfo(CORINFO_METHOD_HANDLE meth): CEEInfo((MethodDesc*)meth), m_jitInfo((MethodDesc*)meth, NULL, NULL, CORJIT_FLAGS::CORJIT_FLAG_SPEED_OPT) { } - - // Certain methods are unimplemented by CEEInfo (they hit an assert). They are implemented by CEEJitInfo, yet - // don't seem to require any of the CEEJitInfo state we can't provide. For those case, delegate to the "partial" - // CEEJitInfo m_jitInfo. - void addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom,CORINFO_MODULE_HANDLE moduleTo) - { - m_jitInfo.addActiveDependency(moduleFrom, moduleTo); - } }; extern INT64 F_CALL_CONV InterpretMethod(InterpreterMethodInfo* methInfo, BYTE* ilArgs, void* stubContext); diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 1b1fceb334b88c..149a8ff1e87290 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -256,21 +256,6 @@ void CEEInfo::GetTypeContext(CORINFO_CONTEXT_HANDLE context, SigTypeContext *pTy } } -// Returns true if context is providing any generic variables -BOOL CEEInfo::ContextIsInstantiated(CORINFO_CONTEXT_HANDLE context) -{ - LIMITED_METHOD_CONTRACT; - MethodDesc* pMD = GetMethodFromContext(context); - if (pMD != NULL) - { - return pMD->HasClassOrMethodInstantiation(); - } - else - { - return GetTypeFromContext(context).HasInstantiation(); - } -} - /*********************************************************************/ // This normalizes EE type information into the form expected by the JIT. // @@ -969,7 +954,7 @@ void CEEInfo::resolveToken(/* IN, OUT */ CORINFO_RESOLVED_TOKEN * pResolvedToken // Activate target if required if (tokenType != CORINFO_TOKENKIND_Ldtoken) { - ScanTokenForDynamicScope(pResolvedToken, th, pMD); + EnsureActive(th, pMD); } } else @@ -984,7 +969,7 @@ void CEEInfo::resolveToken(/* IN, OUT */ CORINFO_RESOLVED_TOKEN * pResolvedToken if (pFD->IsStatic() && (tokenType != CORINFO_TOKENKIND_Ldtoken)) { - ScanTokenForDynamicScope(pResolvedToken, th); + EnsureActive(th); } } else @@ -998,7 +983,7 @@ void CEEInfo::resolveToken(/* IN, OUT */ CORINFO_RESOLVED_TOKEN * pResolvedToken if (tokenType == CORINFO_TOKENKIND_Box || tokenType == CORINFO_TOKENKIND_Constrained) { - ScanTokenForDynamicScope(pResolvedToken, th); + EnsureActive(th); } } @@ -1119,23 +1104,26 @@ void CEEInfo::resolveToken(/* IN, OUT */ CORINFO_RESOLVED_TOKEN * pResolvedToken } // - // Module dependency tracking + // Module activation tracking // - if (pMD != NULL) + if (!pModule->IsSystem()) { - ScanToken(pModule, pResolvedToken, th, pMD); - } - else - if (pFD != NULL) - { - if (pFD->IsStatic()) - ScanToken(pModule, pResolvedToken, th); - } - else - { - // It should not be required to trigger the modules cctors for ldtoken, it is done for backward compatibility only. - if (tokenType == CORINFO_TOKENKIND_Box || tokenType == CORINFO_TOKENKIND_Constrained || tokenType == CORINFO_TOKENKIND_Ldtoken) - ScanToken(pModule, pResolvedToken, th); + if (pMD != NULL) + { + EnsureActive(th, pMD); + } + else + if (pFD != NULL) + { + if (pFD->IsStatic()) + EnsureActive(th); + } + else + { + // It should not be required to trigger the modules cctors for ldtoken, it is done for backward compatibility only. + if (tokenType == CORINFO_TOKENKIND_Box || tokenType == CORINFO_TOKENKIND_Constrained || tokenType == CORINFO_TOKENKIND_Ldtoken) + EnsureActive(th); + } } } @@ -2672,142 +2660,11 @@ void CEEInfo::embedGenericHandle( EE_TO_JIT_TRANSITION(); } -void CEEInfo::ScanForModuleDependencies(Module* pModule, SigPointer psig) -{ - STANDARD_VM_CONTRACT; - - _ASSERTE(pModule && !pModule->IsSystem()); - - CorElementType eType; - IfFailThrow(psig.GetElemType(&eType)); - - switch (eType) - { - case ELEMENT_TYPE_GENERICINST: - { - ScanForModuleDependencies(pModule,psig); - IfFailThrow(psig.SkipExactlyOne()); - - uint32_t ntypars; - IfFailThrow(psig.GetData(&ntypars)); - for (uint32_t i = 0; i < ntypars; i++) - { - ScanForModuleDependencies(pModule,psig); - IfFailThrow(psig.SkipExactlyOne()); - } - break; - } - - case ELEMENT_TYPE_VALUETYPE: - case ELEMENT_TYPE_CLASS: - { - mdToken tk; - IfFailThrow(psig.GetToken(&tk)); - if (TypeFromToken(tk) == mdtTypeRef) - { - Module * pTypeDefModule; - mdToken tkTypeDef; - - if (ClassLoader::ResolveTokenToTypeDefThrowing(pModule, tk, &pTypeDefModule, &tkTypeDef)) - break; - - if (!pTypeDefModule->IsSystem() && (pModule != pTypeDefModule)) - { - addActiveDependency((CORINFO_MODULE_HANDLE)pModule, (CORINFO_MODULE_HANDLE)pTypeDefModule); - } - } - break; - } - - default: - break; - } -} - -void CEEInfo::ScanMethodSpec(Module * pModule, PCCOR_SIGNATURE pMethodSpec, ULONG cbMethodSpec) -{ - STANDARD_VM_CONTRACT; - - SigPointer sp(pMethodSpec, cbMethodSpec); - - BYTE etype; - IfFailThrow(sp.GetByte(&etype)); - - _ASSERT(etype == (BYTE)IMAGE_CEE_CS_CALLCONV_GENERICINST); - - uint32_t nGenericMethodArgs; - IfFailThrow(sp.GetData(&nGenericMethodArgs)); - - for (uint32_t i = 0; i < nGenericMethodArgs; i++) - { - ScanForModuleDependencies(pModule,sp); - IfFailThrow(sp.SkipExactlyOne()); - } -} - -bool CEEInfo::ScanTypeSpec(Module * pModule, PCCOR_SIGNATURE pTypeSpec, ULONG cbTypeSpec) -{ - STANDARD_VM_CONTRACT; - - SigPointer sp(pTypeSpec, cbTypeSpec); - - CorElementType eType; - IfFailThrow(sp.GetElemType(&eType)); - - // Filter out non-instantiated types and typedescs (typevars, arrays, ...) - if (eType != ELEMENT_TYPE_GENERICINST) - { - // Scanning of the parent chain is required for reference types only. - // Note that the parent chain MUST NOT be scanned for instantiated - // generic variables because of they are not a real dependencies. - return (eType == ELEMENT_TYPE_CLASS); - } - - IfFailThrow(sp.SkipExactlyOne()); - - uint32_t ntypars; - IfFailThrow(sp.GetData(&ntypars)); - - for (uint32_t i = 0; i < ntypars; i++) - { - ScanForModuleDependencies(pModule,sp); - IfFailThrow(sp.SkipExactlyOne()); - } - - return true; -} - -void CEEInfo::ScanInstantiation(Module * pModule, Instantiation inst) -{ - STANDARD_VM_CONTRACT; - - for (DWORD i = 0; i < inst.GetNumArgs(); i++) - { - TypeHandle th = inst[i]; - if (th.IsTypeDesc()) - continue; - - MethodTable * pMT = th.AsMethodTable(); - - Module * pDefModule = pMT->GetModule(); - - if (!pDefModule->IsSystem() && (pModule != pDefModule)) - { - addActiveDependency((CORINFO_MODULE_HANDLE)pModule, (CORINFO_MODULE_HANDLE)pDefModule); - } - - if (pMT->HasInstantiation()) - { - ScanInstantiation(pModule, pMT->GetInstantiation()); - } - } -} - // -// ScanToken is used to track triggers for creation of per-AppDomain state instead, including allocations required for statics and +// EnsureActive is used to track triggers for creation of per-AppDomain state instead, including allocations required for statics and // triggering of module cctors. // -// The basic rule is: There should be no possibility of a shared module that is "active" to have a direct call into a module that +// The basic rule is: There should be no possibility of a module that is "active" to have a direct call into a module that // is not "active". And we don't want to intercept every call during runtime, so during compile time we track static calls and // everything that can result in new virtual calls. // @@ -2815,108 +2672,14 @@ void CEEInfo::ScanInstantiation(Module * pModule, Instantiation inst) // One could come up with a more efficient algorithm that still maintains the invariant, but it may introduce backward compatibility // issues. // -// For efficiency, the implementation leverages the loaded types as much as possible. Unfortunately, we still have to go back to -// metadata when the generic variables could have been substituted via generic context. -// -void CEEInfo::ScanToken(Module * pModule, CORINFO_RESOLVED_TOKEN * pResolvedToken, TypeHandle th, MethodDesc * pMD) -{ - STANDARD_VM_CONTRACT; - - if (pModule->IsSystem()) - return; - - // - // Scan method instantiation - // - if (pMD != NULL && pResolvedToken->pMethodSpec != NULL) - { - if (ContextIsInstantiated(pResolvedToken->tokenContext)) - { - ScanMethodSpec(pModule, pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec); - } - else - { - ScanInstantiation(pModule, pMD->GetMethodInstantiation()); - } - } - - if (th.IsTypeDesc()) - return; - - MethodTable * pMT = th.AsMethodTable(); - - // - // Scan type instantiation - // - if (pResolvedToken->pTypeSpec != NULL) - { - if (ContextIsInstantiated(pResolvedToken->tokenContext)) - { - if (!ScanTypeSpec(pModule, pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec)) - return; - } - else - { - ScanInstantiation(pModule, pMT->GetInstantiation()); - } - } - - // - // Scan chain of parent types - // - while (true) - { - Module * pDefModule = pMT->GetModule(); - if (pDefModule->IsSystem()) - break; - - if (pModule != pDefModule) - { - addActiveDependency((CORINFO_MODULE_HANDLE)pModule, (CORINFO_MODULE_HANDLE)pDefModule); - } - - MethodTable * pParentMT = pMT->GetParentMethodTable(); - if (pParentMT == NULL) - break; - - if (pParentMT->HasInstantiation()) - { - IMDInternalImport* pInternalImport = pDefModule->GetMDImport(); - - mdToken tkParent; - IfFailThrow(pInternalImport->GetTypeDefProps(pMT->GetCl(), NULL, &tkParent)); - - if (TypeFromToken(tkParent) == mdtTypeSpec) - { - PCCOR_SIGNATURE pTypeSpec; - ULONG cbTypeSpec; - IfFailThrow(pInternalImport->GetTypeSpecFromToken(tkParent, &pTypeSpec, &cbTypeSpec)); - - ScanTypeSpec(pDefModule, pTypeSpec, cbTypeSpec); - } - } - - pMT = pParentMT; - } -} - -void CEEInfo::ScanTokenForDynamicScope(CORINFO_RESOLVED_TOKEN * pResolvedToken, TypeHandle th, MethodDesc * pMD) +void CEEInfo::EnsureActive(TypeHandle th, MethodDesc * pMD) { STANDARD_VM_CONTRACT; - if (m_pMethodBeingCompiled->IsLCGMethod()) - { - // The dependency tracking for LCG is irrelevant. Perform immediate activation. - if (pMD != NULL && pMD->HasMethodInstantiation()) - pMD->EnsureActive(); - if (!th.IsTypeDesc()) - th.AsMethodTable()->EnsureInstanceActive(); - return; - } - - // Stubs-as-IL have to do regular dependency tracking because they can be shared cross-domain. - Module * pModule = GetDynamicResolver(pResolvedToken->tokenScope)->GetDynamicMethod()->GetModule(); - ScanToken(pModule, pResolvedToken, th, pMD); + if (pMD != NULL && pMD->HasMethodInstantiation()) + pMD->EnsureActive(); + if (!th.IsTypeDesc()) + th.AsMethodTable()->EnsureInstanceActive(); } CORINFO_OBJECT_HANDLE CEEInfo::getJitHandleForObject(OBJECTREF objref, bool knownFrozen) @@ -11007,31 +10770,6 @@ PCODE CEEJitInfo::getHelperFtnStatic(CorInfoHelpFunc ftnNum) return GetEEFuncEntryPoint(pfnHelper); } -void CEEJitInfo::addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom,CORINFO_MODULE_HANDLE moduleTo) -{ - CONTRACTL - { - STANDARD_VM_CHECK; - PRECONDITION(CheckPointer(moduleFrom)); - PRECONDITION(!IsDynamicScope(moduleFrom)); - PRECONDITION(CheckPointer(moduleTo)); - PRECONDITION(!IsDynamicScope(moduleTo)); - PRECONDITION(moduleFrom != moduleTo); - } - CONTRACTL_END; - - // This is only called internaly. JIT-EE transition is not needed. - // JIT_TO_EE_TRANSITION(); - - Module *dependency = (Module *)moduleTo; - _ASSERTE(!dependency->IsSystem()); - - dependency->EnsureActive(); - - // EE_TO_JIT_TRANSITION(); -} - - // Wrapper around CEEInfo::GetProfilingHandle. The first time this is called for a // method desc, it calls through to EEToProfInterfaceImpl::EEFunctionIDMappe and caches the // result in CEEJitInfo::GetProfilingHandleCache. Thereafter, this wrapper regurgitates the cached values @@ -14623,13 +14361,6 @@ void* CEEInfo::getHelperFtn(CorInfoHelpFunc ftnNum, /* IN */ UNREACHABLE(); // only called on derived class. } -// Active dependency helpers -void CEEInfo::addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom,CORINFO_MODULE_HANDLE moduleTo) -{ - LIMITED_METHOD_CONTRACT; - UNREACHABLE(); // only called on derived class. -} - void CEEInfo::GetProfilingHandle(bool *pbHookFunction, void **pProfilerHandle, bool *pbIndirectedHandles) diff --git a/src/coreclr/vm/jitinterface.h b/src/coreclr/vm/jitinterface.h index 4460c413b76e66..71d8e672144b5e 100644 --- a/src/coreclr/vm/jitinterface.h +++ b/src/coreclr/vm/jitinterface.h @@ -418,7 +418,6 @@ class CEEInfo : public ICorJitInfo MethodDesc* GetMethodFromContext(CORINFO_CONTEXT_HANDLE context); TypeHandle GetTypeFromContext(CORINFO_CONTEXT_HANDLE context); void GetTypeContext(CORINFO_CONTEXT_HANDLE context, SigTypeContext* pTypeContext); - BOOL ContextIsInstantiated(CORINFO_CONTEXT_HANDLE context); void HandleException(struct _EXCEPTION_POINTERS* pExceptionPointers); public: @@ -609,18 +608,7 @@ class CEEInfo : public ICorJitInfo bool m_allowInlining; - // Tracking of module activation dependencies. We have two flavors: - // - Fast one that gathers generic arguments from EE handles, but does not work inside generic context. - // - Slow one that operates on typespec and methodspecs from metadata. - void ScanForModuleDependencies(Module* pModule, SigPointer psig); - void ScanMethodSpec(Module * pModule, PCCOR_SIGNATURE pMethodSpec, ULONG cbMethodSpec); - // Returns true if it is ok to proceed with scan of parent chain - bool ScanTypeSpec(Module * pModule, PCCOR_SIGNATURE pTypeSpec, ULONG cbTypeSpec); - void ScanInstantiation(Module * pModule, Instantiation inst); - - // The main entrypoints for module activation tracking - void ScanToken(Module * pModule, CORINFO_RESOLVED_TOKEN * pResolvedToken, TypeHandle th, MethodDesc * pMD = NULL); - void ScanTokenForDynamicScope(CORINFO_RESOLVED_TOKEN * pResolvedToken, TypeHandle th, MethodDesc * pMD = NULL); + void EnsureActive(TypeHandle th, MethodDesc * pMD = NULL); }; @@ -928,9 +916,6 @@ class CEEJitInfo : public CEEInfo void ** ppIndirection) override final; /* OUT */ static PCODE getHelperFtnStatic(CorInfoHelpFunc ftnNum); - // Override active dependency to talk to loader - void addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom, CORINFO_MODULE_HANDLE moduleTo) override final; - // Override of CEEInfo::GetProfilingHandle. The first time this is called for a // method desc, it calls through to CEEInfo::GetProfilingHandle and caches the // result in CEEJitInfo::GetProfilingHandleCache. Thereafter, this wrapper regurgitates the cached values