From 01af65bd21865e85f2e995e47803a9b95ea0cd91 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 19 Apr 2023 22:46:14 -0700 Subject: [PATCH 01/21] Add CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED --- src/coreclr/inc/corinfo.h | 3 +- src/coreclr/inc/jithelpers.h | 3 +- src/coreclr/jit/compiler.hpp | 1 + src/coreclr/jit/flowgraph.cpp | 7 ++- src/coreclr/jit/helperexpansion.cpp | 8 ++- src/coreclr/jit/utils.cpp | 1 + src/coreclr/jit/valuenum.cpp | 3 + src/coreclr/jit/valuenumfuncs.h | 1 + .../Common/JitInterface/CorInfoHelpFunc.cs | 1 + src/coreclr/vm/jithelpers.cpp | 61 +++++++++++++++++++ src/coreclr/vm/jitinterface.cpp | 17 ++++-- 11 files changed, 95 insertions(+), 11 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index 0b50a047b3f66..21cdb58bdc52b 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -544,8 +544,9 @@ enum CorInfoHelpFunc CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE, CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR, - CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, + CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_DYNAMICCLASS, + CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, /* Debugger */ diff --git a/src/coreclr/inc/jithelpers.h b/src/coreclr/inc/jithelpers.h index 7193c124d602e..27ab139ffbad8 100644 --- a/src/coreclr/inc/jithelpers.h +++ b/src/coreclr/inc/jithelpers.h @@ -201,8 +201,9 @@ JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE, JIT_GetSharedNonGCThreadStaticBase, CORINFO_HELP_SIG_REG_ONLY) JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR, JIT_GetSharedGCThreadStaticBase, CORINFO_HELP_SIG_REG_ONLY) JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR, JIT_GetSharedNonGCThreadStaticBase, CORINFO_HELP_SIG_REG_ONLY) - JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, JIT_GetSharedGCThreadStaticBaseDynamicClass, CORINFO_HELP_SIG_REG_ONLY) + JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, JIT_GetSharedGCThreadStaticBaseDynamicClass, CORINFO_HELP_SIG_REG_ONLY) JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_DYNAMICCLASS, JIT_GetSharedNonGCThreadStaticBaseDynamicClass, CORINFO_HELP_SIG_REG_ONLY) + JITHELPER(CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, JIT_GetSharedGCThreadStaticBaseOptimized, CORINFO_HELP_SIG_REG_ONLY) JITHELPER(CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, JIT_GetSharedNonGCThreadStaticBaseOptimized, CORINFO_HELP_SIG_REG_ONLY) // Debugger diff --git a/src/coreclr/jit/compiler.hpp b/src/coreclr/jit/compiler.hpp index 992b1750d131a..158dc7fcefc42 100644 --- a/src/coreclr/jit/compiler.hpp +++ b/src/coreclr/jit/compiler.hpp @@ -3520,6 +3520,7 @@ inline bool Compiler::IsSharedStaticHelper(GenTree* tree) helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE || helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE || helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR || + helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED || helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR || helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED || helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS || diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 38b5e3bd82133..c02413d1dc726 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -701,7 +701,8 @@ bool Compiler::fgIsCommaThrow(GenTree* tree, bool forFolding /* = false */) // cls - The class handle // helper - The helper function // typeIndex - The static block type index. Used only for -// CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED to cache +// CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED or +// CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED to cache // the static block in an array at index typeIndex. // // Return Value: @@ -722,6 +723,7 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo FALLTHROUGH; case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR: + case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: callFlags |= GTF_CALL_HOISTABLE; FALLTHROUGH; @@ -798,7 +800,8 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo result = gtNewHelperCallNode(helper, type, opModuleIDArg, opClassIDArg); } - else if (helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) + else if ((helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) || + (helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED)) { result = gtNewHelperCallNode(helper, type, gtNewIconNode(typeIndex)); result->SetExpTLSFieldAccess(); diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index 2f03327a8eeb3..9f5a9fe829747 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -396,7 +396,8 @@ bool Compiler::fgExpandRuntimeLookupsForCall(BasicBlock* block, Statement* stmt, //------------------------------------------------------------------------------ // fgExpandThreadLocalAccess: Inline the CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED -// helper. See fgExpandThreadLocalAccessForCall for details. +// or CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED helper. See +// fgExpandThreadLocalAccessForCall for details. // // Returns: // PhaseStatus indicating what, if anything, was changed. @@ -432,7 +433,7 @@ PhaseStatus Compiler::fgExpandThreadLocalAccess() //------------------------------------------------------------------------------ // fgExpandThreadLocalAccessForCall : Expand the CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED -// that access fields marked with [ThreadLocal]. +// or CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, that access fields marked with [ThreadLocal]. // // Arguments: // block - Block containing the helper call to expand @@ -476,7 +477,8 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock* block, Statement* st JITDUMP("offsetOfThreadStaticBlocks= %u\n", threadStaticBlocksInfo.offsetOfThreadStaticBlocks); assert(threadStaticBlocksInfo.tlsIndex.accessType == IAT_VALUE); - assert(eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED); + assert((eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) || + (eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED)); JITDUMP("Expanding thread static local access for [%06d] in " FMT_BB ":\n", dspTreeID(call), block->bbNum); DISPTREE(call); diff --git a/src/coreclr/jit/utils.cpp b/src/coreclr/jit/utils.cpp index 5dcb315af0a35..86e3bdd6b9a9e 100644 --- a/src/coreclr/jit/utils.cpp +++ b/src/coreclr/jit/utils.cpp @@ -1462,6 +1462,7 @@ void HelperCallProperties::init() case CORINFO_HELP_GETSHARED_GCSTATIC_BASE_NOCTOR: case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR: case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR: + case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: case CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR: case CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp index 18c4d946c2736..780c0dae09015 100644 --- a/src/coreclr/jit/valuenum.cpp +++ b/src/coreclr/jit/valuenum.cpp @@ -12134,6 +12134,9 @@ VNFunc Compiler::fgValueNumberJitHelperMethodVNFunc(CorInfoHelpFunc helpFunc) case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR: vnf = VNF_GetsharedGcthreadstaticBaseNoctor; break; + case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: + vnf = VNF_GetsharedGcthreadstaticBaseNoctorOptimized; + break; case CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR: vnf = VNF_GetsharedNongcthreadstaticBaseNoctor; break; diff --git a/src/coreclr/jit/valuenumfuncs.h b/src/coreclr/jit/valuenumfuncs.h index 6551be8772a2a..fd93c9fab25a2 100644 --- a/src/coreclr/jit/valuenumfuncs.h +++ b/src/coreclr/jit/valuenumfuncs.h @@ -127,6 +127,7 @@ ValueNumFuncDef(GetgenericsNongcthreadstaticBase, 1, false, true, true) ValueNumFuncDef(GetsharedGcthreadstaticBase, 2, false, true, true) ValueNumFuncDef(GetsharedNongcthreadstaticBase, 2, false, true, true) ValueNumFuncDef(GetsharedGcthreadstaticBaseNoctor, 2, false, true, true) +ValueNumFuncDef(GetsharedGcthreadstaticBaseNoctorOptimized, 1, false, true, true) ValueNumFuncDef(GetsharedNongcthreadstaticBaseNoctor, 2, false, true, true) ValueNumFuncDef(GetsharedNongcthreadstaticBaseNoctorOptimized, 1, false, true, true) ValueNumFuncDef(GetsharedGcthreadstaticBaseDynamicclass, 2, false, true, true) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs b/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs index e4cc6a13c3e17..37b8c4c14e998 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs @@ -185,6 +185,7 @@ which is the right helper to use to allocate an object of a given type. */ CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE, CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR, + CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index c36e50d77d2fd..f3d4f152818a7 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -1902,6 +1902,67 @@ HCIMPL2(void*, JIT_GetSharedGCThreadStaticBase, DomainLocalModule *pDomainLocalM HCIMPLEND #include +// *** This helper corresponds CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED. +// Even though we always check if the class constructor has been run, we have a separate +// helper ID for the "no ctor" version because it allows the JIT to do some reordering that +// otherwise wouldn't be possible. +HCIMPL1(void*, JIT_GetSharedGCThreadStaticBaseOptimized, UINT32 staticBlockIndex) +{ + void* staticBlock = nullptr; + +#ifdef HOST_WINDOWS + FCALL_CONTRACT; + + HELPER_METHOD_FRAME_BEGIN_RET_0(); // Set up a frame + + MethodTable * pMT = AppDomain::GetCurrentDomain()->LookupThreadStaticBlockType(staticBlockIndex); + _ASSERTE(!pMT->HasGenericsStaticsInfo()); + + // Get the TLM + ThreadLocalModule * pThreadLocalModule = ThreadStatics::GetTLM(pMT); + _ASSERTE(pThreadLocalModule != NULL); + + // Check if the class constructor needs to be run + pThreadLocalModule->CheckRunClassInitThrowing(pMT); + + // Lookup the non-GC statics base pointer + staticBlock = (void*) pMT->GetGCThreadStaticsBasePointer(); + CONSISTENCY_CHECK(staticBlock != NULL); + + if (t_threadStaticBlocksSize <= staticBlockIndex) + { + UINT32 newThreadStaticBlocksSize = max(2 * t_threadStaticBlocksSize, staticBlockIndex + 1); + void** newThreadStaticBlocks = (void**) new PTR_BYTE[newThreadStaticBlocksSize * sizeof(PTR_BYTE)]; + memset(newThreadStaticBlocks + t_threadStaticBlocksSize, 0, (newThreadStaticBlocksSize - t_threadStaticBlocksSize) * sizeof(PTR_BYTE)); + + if (t_threadStaticBlocksSize > 0) + { + memcpy(newThreadStaticBlocks, t_threadStaticBlocks, t_threadStaticBlocksSize * sizeof(PTR_BYTE)); + delete t_threadStaticBlocks; + } + + t_threadStaticBlocksSize = newThreadStaticBlocksSize; + t_threadStaticBlocks = newThreadStaticBlocks; + } + + void* currentEntry = t_threadStaticBlocks[staticBlockIndex]; + // We could be coming here 2nd time after running the ctor when we try to get the static block. + // In such case, just avoid adding the same entry. + if (currentEntry != staticBlock) + { + _ASSERTE(currentEntry == nullptr); + t_threadStaticBlocks[staticBlockIndex] = staticBlock; + t_maxThreadStaticBlocks = max(t_maxThreadStaticBlocks, staticBlockIndex); + } + HELPER_METHOD_FRAME_END(); +#else + _ASSERTE(!"JIT_GetSharedNonGCThreadStaticBaseOptimized not supported on non-windows."); +#endif // HOST_WINDOWS + + return staticBlock; +} +HCIMPLEND + // *** This helper corresponds to CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_DYNAMICCLASS #include diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 32d338a0da6b4..696e1ebf5098f 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1562,16 +1562,25 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, #ifdef HOST_WINDOWS #ifndef TARGET_ARM - bool canOptimizeHelper = (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || - (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE); + bool canOptimizeHelper = + (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE) || + (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE); // For windows, we convert the TLS access to the optimized helper where we will store // the static blocks in TLS directly and access them via inline code. - if (canOptimizeHelper && ((pField->GetFieldType() >= ELEMENT_TYPE_BOOLEAN) && (pField->GetFieldType() < ELEMENT_TYPE_STRING))) + if ((pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE)) { fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; - pResult->helper = CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; } + else if ((pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE)) + { + fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; + pResult->helper = CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; + } #endif // !TARGET_ARM #endif // HOST_WINDOWS } From abbfe77f6b735c299ad62e6177c02c0b15025650 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 1 May 2023 12:27:51 -0700 Subject: [PATCH 02/21] Working prototype --- src/coreclr/jit/flowgraph.cpp | 7 ++----- src/coreclr/jit/helperexpansion.cpp | 10 ++++++++++ src/coreclr/vm/jithelpers.cpp | 7 +++++-- src/coreclr/vm/methodtable.h | 1 + src/coreclr/vm/methodtable.inl | 26 ++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index d824613f61efe..045d5f6d5bf59 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -719,11 +719,6 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo bNeedClassID = false; FALLTHROUGH; - case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR: - case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: - callFlags |= GTF_CALL_HOISTABLE; - FALLTHROUGH; - case CORINFO_HELP_GETSHARED_GCSTATIC_BASE: case CORINFO_HELP_GETSHARED_GCSTATIC_BASE_DYNAMICCLASS: case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_DYNAMICCLASS: @@ -735,6 +730,8 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo case CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR: + case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR: + case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: bNeedClassID = false; FALLTHROUGH; diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index c47bad4bb6207..d57e799832a14 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -598,6 +598,16 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* gtNewOperNode(GT_ADD, TYP_I_IMPL, threadStaticBlocksValue, typeThreadStaticBlockIndexValue); GenTree* typeThreadStaticBlockValue = gtNewIndir(TYP_I_IMPL, typeThreadStaticBlockRef, GTF_IND_NONFAULTING); + if (eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) + { + // Need to add extra indirection to access the data pointer. + // TODO: Get the offsetOfDataPtr() from runtime. + + typeThreadStaticBlockValue = gtNewIndir(TYP_I_IMPL, typeThreadStaticBlockValue, GTF_IND_NONFAULTING); + typeThreadStaticBlockValue = + gtNewOperNode(GT_ADD, TYP_I_IMPL, typeThreadStaticBlockValue, gtNewIconNode(16, TYP_I_IMPL)); + } + // Cache the threadStaticBlock value unsigned threadStaticBlockBaseLclNum = lvaGrabTemp(true DEBUGARG("ThreadStaticBlockBase access")); lvaTable[threadStaticBlockBaseLclNum].lvType = TYP_I_IMPL; diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index c2e1035fe332f..cb81aaf9dd6bd 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -1943,8 +1943,8 @@ HCIMPL1(void*, JIT_GetSharedGCThreadStaticBaseOptimized, UINT32 staticBlockIndex // Check if the class constructor needs to be run pThreadLocalModule->CheckRunClassInitThrowing(pMT); - // Lookup the non-GC statics base pointer - staticBlock = (void*) pMT->GetGCThreadStaticsBasePointer(); + // Lookup the GC statics base handle and cache it + staticBlock = (void*) pMT->GetGCThreadStaticsBaseHandle(); CONSISTENCY_CHECK(staticBlock != NULL); if (t_threadStaticBlocksSize <= staticBlockIndex) @@ -1972,6 +1972,9 @@ HCIMPL1(void*, JIT_GetSharedGCThreadStaticBaseOptimized, UINT32 staticBlockIndex t_threadStaticBlocks[staticBlockIndex] = staticBlock; t_maxThreadStaticBlocks = max(t_maxThreadStaticBlocks, staticBlockIndex); } + + staticBlock = (void*) pMT->GetGCThreadStaticsBasePointer(); + HELPER_METHOD_FRAME_END(); #else _ASSERTE(!"JIT_GetSharedNonGCThreadStaticBaseOptimized not supported on non-windows."); diff --git a/src/coreclr/vm/methodtable.h b/src/coreclr/vm/methodtable.h index acffd1b6141c7..634e05177c8a3 100644 --- a/src/coreclr/vm/methodtable.h +++ b/src/coreclr/vm/methodtable.h @@ -2285,6 +2285,7 @@ class MethodTable inline PTR_BYTE GetGCStaticsBasePointer(); inline PTR_BYTE GetNonGCThreadStaticsBasePointer(); inline PTR_BYTE GetGCThreadStaticsBasePointer(); + inline PTR_BYTE GetGCThreadStaticsBaseHandle(); #endif //!DACCESS_COMPILE inline PTR_BYTE GetNonGCThreadStaticsBasePointer(PTR_Thread pThread); diff --git a/src/coreclr/vm/methodtable.inl b/src/coreclr/vm/methodtable.inl index 55d0015f86790..3a11158e097d0 100644 --- a/src/coreclr/vm/methodtable.inl +++ b/src/coreclr/vm/methodtable.inl @@ -1157,6 +1157,32 @@ inline PTR_BYTE MethodTable::GetNonGCThreadStaticsBasePointer() return pTLM->GetNonGCStaticsBasePointer(this); } +//========================================================================================== +inline PTR_BYTE MethodTable::GetGCThreadStaticsBaseHandle() +{ + CONTRACTL + { + NOTHROW; + GC_NOTRIGGER; + MODE_COOPERATIVE; + } + CONTRACTL_END; + + // Get the current thread + PTR_Thread pThread = dac_cast(GetThread()); + + // Get the current module's ModuleIndex + ModuleIndex index = GetModuleForStatics()->GetModuleIndex(); + + PTR_ThreadLocalBlock pTLB = ThreadStatics::GetCurrentTLB(pThread); + + PTR_ThreadLocalModule pTLM = pTLB->GetTLMIfExists(index); + if (pTLM == NULL) + return NULL; + + return dac_cast(pTLM->GetPrecomputedGCStaticsBaseHandle()); +} + //========================================================================================== inline PTR_BYTE MethodTable::GetGCThreadStaticsBasePointer() { From 743420e72fabf381f20a9a90d3bd24c9037688f6 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 1 May 2023 13:30:19 -0700 Subject: [PATCH 03/21] Rename ThreadStaticBlock to NonGCThreadStaticBlock --- src/coreclr/inc/corinfo.h | 4 +-- src/coreclr/jit/helperexpansion.cpp | 12 +++---- .../tools/Common/JitInterface/CorInfoTypes.cs | 4 +-- .../tools/superpmi/superpmi-shared/agnostic.h | 4 +-- .../superpmi-shared/methodcontext.cpp | 16 ++++----- src/coreclr/vm/appdomain.hpp | 1 + src/coreclr/vm/jithelpers.cpp | 34 +++++++++---------- src/coreclr/vm/jitinterface.cpp | 8 ++--- 8 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index e8af9d76fd596..65d5c29e79891 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -1736,8 +1736,8 @@ struct CORINFO_THREAD_STATIC_BLOCKS_INFO { CORINFO_CONST_LOOKUP tlsIndex; uint32_t offsetOfThreadLocalStoragePointer; - uint32_t offsetOfMaxThreadStaticBlocks; - uint32_t offsetOfThreadStaticBlocks; + uint32_t offsetOfNonGCMaxThreadStaticBlocks; + uint32_t offsetOfNonGCThreadStaticBlocks; }; //---------------------------------------------------------------------------- diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index d57e799832a14..102c0214c64f1 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -493,9 +493,9 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* info.compCompHnd->getThreadLocalStaticBlocksInfo(&threadStaticBlocksInfo); JITDUMP("getThreadLocalStaticBlocksInfo\n:"); JITDUMP("tlsIndex= %u\n", (ssize_t)threadStaticBlocksInfo.tlsIndex.addr); - JITDUMP("offsetOfMaxThreadStaticBlocks= %u\n", threadStaticBlocksInfo.offsetOfMaxThreadStaticBlocks); + JITDUMP("offsetOfNonGCMaxThreadStaticBlocks= %u\n", threadStaticBlocksInfo.offsetOfNonGCMaxThreadStaticBlocks); JITDUMP("offsetOfThreadLocalStoragePointer= %u\n", threadStaticBlocksInfo.offsetOfThreadLocalStoragePointer); - JITDUMP("offsetOfThreadStaticBlocks= %u\n", threadStaticBlocksInfo.offsetOfThreadStaticBlocks); + JITDUMP("offsetOfNonGCThreadStaticBlocks= %u\n", threadStaticBlocksInfo.offsetOfNonGCThreadStaticBlocks); assert(threadStaticBlocksInfo.tlsIndex.accessType == IAT_VALUE); assert((eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) || @@ -571,9 +571,9 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* GenTree* useTlsLclValue = gtCloneExpr(defTlsLclValue); // Create a use for tlsLclValue GenTree* asgTlsValue = gtNewAssignNode(defTlsLclValue, tlsValue); - // Create tree for "maxThreadStaticBlocks = tls[offsetOfMaxThreadStaticBlocks]" + // Create tree for "maxThreadStaticBlocks = tls[offsetOfNonGCMaxThreadStaticBlocks]" GenTree* offsetOfMaxThreadStaticBlocks = - gtNewIconNode(threadStaticBlocksInfo.offsetOfMaxThreadStaticBlocks, TYP_I_IMPL); + gtNewIconNode(threadStaticBlocksInfo.offsetOfNonGCMaxThreadStaticBlocks, TYP_I_IMPL); GenTree* maxThreadStaticBlocksRef = gtNewOperNode(GT_ADD, TYP_I_IMPL, gtCloneExpr(useTlsLclValue), offsetOfMaxThreadStaticBlocks); GenTree* maxThreadStaticBlocksValue = @@ -584,8 +584,8 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* gtNewOperNode(GT_LT, TYP_INT, maxThreadStaticBlocksValue, gtCloneExpr(typeThreadStaticBlockIndexValue)); maxThreadStaticBlocksCond = gtNewOperNode(GT_JTRUE, TYP_VOID, maxThreadStaticBlocksCond); - // Create tree for "threadStaticBlockBase = tls[offsetOfThreadStaticBlocks]" - GenTree* offsetOfThreadStaticBlocks = gtNewIconNode(threadStaticBlocksInfo.offsetOfThreadStaticBlocks, TYP_I_IMPL); + // Create tree for "threadStaticBlockBase = tls[offsetOfNonGCThreadStaticBlocks]" + GenTree* offsetOfThreadStaticBlocks = gtNewIconNode(threadStaticBlocksInfo.offsetOfNonGCThreadStaticBlocks, TYP_I_IMPL); GenTree* threadStaticBlocksRef = gtNewOperNode(GT_ADD, TYP_I_IMPL, gtCloneExpr(useTlsLclValue), offsetOfThreadStaticBlocks); GenTree* threadStaticBlocksValue = diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 68895109bb56d..6b08319629b38 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1158,8 +1158,8 @@ public unsafe struct CORINFO_THREAD_STATIC_BLOCKS_INFO { public CORINFO_CONST_LOOKUP tlsIndex; public uint offsetOfThreadLocalStoragePointer; - public CORINFO_CONST_LOOKUP offsetOfMaxThreadStaticBlocks; - public CORINFO_CONST_LOOKUP offsetOfThreadStaticBlocks; + public CORINFO_CONST_LOOKUP offsetOfNonGCMaxThreadStaticBlocks; + public CORINFO_CONST_LOOKUP offsetOfNonGCThreadStaticBlocks; }; // System V struct passing diff --git a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h index 61f81c83e0d51..ae72ae5c69b02 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h @@ -522,8 +522,8 @@ struct Agnostic_GetThreadLocalStaticBlocksInfo { Agnostic_CORINFO_CONST_LOOKUP tlsIndex; UINT offsetOfThreadLocalStoragePointer; - UINT offsetOfMaxThreadStaticBlocks; - UINT offsetOfThreadStaticBlocks; + UINT offsetOfNonGCMaxThreadStaticBlocks; + UINT offsetOfNonGCThreadStaticBlocks; }; struct Agnostic_GetThreadLocalFieldInfo diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 43032b7616103..048379e25f035 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3663,9 +3663,9 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC value.tlsIndex.handle = CastHandle(pInfo->tlsIndex.addr); value.tlsIndex.accessType = pInfo->tlsIndex.accessType; - value.offsetOfMaxThreadStaticBlocks = pInfo->offsetOfMaxThreadStaticBlocks; - value.offsetOfThreadLocalStoragePointer = pInfo->offsetOfThreadLocalStoragePointer; - value.offsetOfThreadStaticBlocks = pInfo->offsetOfThreadStaticBlocks; + value.offsetOfNonGCMaxThreadStaticBlocks = pInfo->offsetOfNonGCMaxThreadStaticBlocks; + value.offsetOfThreadLocalStoragePointer = pInfo->offsetOfThreadLocalStoragePointer; + value.offsetOfNonGCThreadStaticBlocks = pInfo->offsetOfNonGCThreadStaticBlocks; // This data is same for entire process, so just add it against key '0'. GetThreadLocalStaticBlocksInfo->Add(0, value); @@ -3675,9 +3675,9 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC void MethodContext::dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value) { printf("GetThreadLocalStaticBlocksInfo key 0, value tlsIndex-%016" PRIX64 - ", offsetOfMaxThreadStaticBlocks-%u, offsetOfThreadLocalStoragePointer-%u, offsetOfThreadStaticBlocks-%u", - value.tlsIndex.handle, value.offsetOfMaxThreadStaticBlocks, value.offsetOfThreadLocalStoragePointer, - value.offsetOfThreadStaticBlocks); + ", offsetOfNonGCMaxThreadStaticBlocks-%u, offsetOfThreadLocalStoragePointer-%u, offsetOfNonGCThreadStaticBlocks-%u", + value.tlsIndex.handle, value.offsetOfNonGCMaxThreadStaticBlocks, value.offsetOfThreadLocalStoragePointer, + value.offsetOfNonGCThreadStaticBlocks); } void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) @@ -3688,9 +3688,9 @@ void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC pInfo->tlsIndex.accessType = (InfoAccessType)value.tlsIndex.accessType; pInfo->tlsIndex.addr = (void*)value.tlsIndex.handle; - pInfo->offsetOfMaxThreadStaticBlocks = value.offsetOfMaxThreadStaticBlocks; + pInfo->offsetOfNonGCMaxThreadStaticBlocks = value.offsetOfNonGCMaxThreadStaticBlocks; pInfo->offsetOfThreadLocalStoragePointer = value.offsetOfThreadLocalStoragePointer; - pInfo->offsetOfThreadStaticBlocks = value.offsetOfThreadStaticBlocks; + pInfo->offsetOfNonGCThreadStaticBlocks = value.offsetOfNonGCThreadStaticBlocks; } void MethodContext::recEmbedMethodHandle(CORINFO_METHOD_HANDLE handle, diff --git a/src/coreclr/vm/appdomain.hpp b/src/coreclr/vm/appdomain.hpp index 349ac09a4b449..475968698f17b 100644 --- a/src/coreclr/vm/appdomain.hpp +++ b/src/coreclr/vm/appdomain.hpp @@ -1225,6 +1225,7 @@ class BaseDomain // MethodTable to `typeIndex` map. `typeIndex` is embedded in the code during codegen. // During execution corresponding thread static data blocks are stored in `t_threadStaticBlocks` // array at the `typeIndex`. + // During execution corresponding thread static data blocks are stored in `t_NonGCThreadStaticBlocks` TypeIDMap m_threadStaticBlockTypeIDMap; #endif // HOST_WINDOWS diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index cb81aaf9dd6bd..927b8d907edca 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -1779,13 +1779,13 @@ HCIMPLEND #ifdef _MSC_VER -__declspec(selectany) __declspec(thread) uint32_t t_maxThreadStaticBlocks; -__declspec(selectany) __declspec(thread) uint32_t t_threadStaticBlocksSize; -__declspec(selectany) __declspec(thread) void** t_threadStaticBlocks; +__declspec(selectany) __declspec(thread) uint32_t t_NonGCMaxThreadStaticBlocks; +__declspec(selectany) __declspec(thread) uint32_t t_NonGCThreadStaticBlocksSize; +__declspec(selectany) __declspec(thread) void** t_NonGCThreadStaticBlocks; #else -EXTERN_C __thread uint32_t t_maxThreadStaticBlocks; -EXTERN_C __thread uint32_t t_threadStaticBlocksSize; -EXTERN_C __thread void** t_threadStaticBlocks; +EXTERN_C __thread uint32_t t_NonGCMaxThreadStaticBlocks; +EXTERN_C __thread uint32_t t_NonGCThreadStaticBlocksSize; +EXTERN_C __thread void** t_NonGCThreadStaticBlocks; #endif // *** This helper corresponds to both CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE and @@ -1849,30 +1849,30 @@ HCIMPL1(void*, JIT_GetSharedNonGCThreadStaticBaseOptimized, UINT32 staticBlockIn staticBlock = (void*) pMT->GetNonGCThreadStaticsBasePointer(); CONSISTENCY_CHECK(staticBlock != NULL); - if (t_threadStaticBlocksSize <= staticBlockIndex) + if (t_NonGCThreadStaticBlocksSize <= staticBlockIndex) { - UINT32 newThreadStaticBlocksSize = max(2 * t_threadStaticBlocksSize, staticBlockIndex + 1); + UINT32 newThreadStaticBlocksSize = max(2 * t_NonGCThreadStaticBlocksSize, staticBlockIndex + 1); void** newThreadStaticBlocks = (void**) new PTR_BYTE[newThreadStaticBlocksSize * sizeof(PTR_BYTE)]; - memset(newThreadStaticBlocks + t_threadStaticBlocksSize, 0, (newThreadStaticBlocksSize - t_threadStaticBlocksSize) * sizeof(PTR_BYTE)); + memset(newThreadStaticBlocks + t_NonGCThreadStaticBlocksSize, 0, (newThreadStaticBlocksSize - t_NonGCThreadStaticBlocksSize) * sizeof(PTR_BYTE)); - if (t_threadStaticBlocksSize > 0) + if (t_NonGCThreadStaticBlocksSize > 0) { - memcpy(newThreadStaticBlocks, t_threadStaticBlocks, t_threadStaticBlocksSize * sizeof(PTR_BYTE)); - delete t_threadStaticBlocks; + memcpy(newThreadStaticBlocks, t_NonGCThreadStaticBlocks, t_NonGCThreadStaticBlocksSize * sizeof(PTR_BYTE)); + delete t_NonGCThreadStaticBlocks; } - t_threadStaticBlocksSize = newThreadStaticBlocksSize; - t_threadStaticBlocks = newThreadStaticBlocks; + t_NonGCThreadStaticBlocksSize = newThreadStaticBlocksSize; + t_NonGCThreadStaticBlocks = newThreadStaticBlocks; } - void* currentEntry = t_threadStaticBlocks[staticBlockIndex]; + void* currentEntry = t_NonGCThreadStaticBlocks[staticBlockIndex]; // We could be coming here 2nd time after running the ctor when we try to get the static block. // In such case, just avoid adding the same entry. if (currentEntry != staticBlock) { _ASSERTE(currentEntry == nullptr); - t_threadStaticBlocks[staticBlockIndex] = staticBlock; - t_maxThreadStaticBlocks = max(t_maxThreadStaticBlocks, staticBlockIndex); + t_NonGCThreadStaticBlocks[staticBlockIndex] = staticBlock; + t_NonGCMaxThreadStaticBlocks = max(t_NonGCMaxThreadStaticBlocks, staticBlockIndex); } HELPER_METHOD_FRAME_END(); #else diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 5d159dc794d2a..e8d63e5f69b9d 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -70,8 +70,8 @@ EXTERN_C uint32_t _tls_index; #endif #ifdef _MSC_VER -__declspec(selectany) __declspec(thread) uint32_t t_maxThreadStaticBlocks; -__declspec(selectany) __declspec(thread) void** t_threadStaticBlocks; +__declspec(selectany) __declspec(thread) uint32_t t_NonGCMaxThreadStaticBlocks; +__declspec(selectany) __declspec(thread) void** t_NonGCThreadStaticBlocks; #else EXTERN_C __thread uint32_t t_maxThreadStaticBlocks; EXTERN_C __thread void** t_threadStaticBlocks; @@ -1815,8 +1815,8 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo->tlsIndex.accessType = IAT_VALUE; pInfo->offsetOfThreadLocalStoragePointer = offsetof(_TEB, ThreadLocalStoragePointer); - pInfo->offsetOfThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_threadStaticBlocks); - pInfo->offsetOfMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_maxThreadStaticBlocks); + pInfo->offsetOfNonGCThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCThreadStaticBlocks); + pInfo->offsetOfNonGCMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCMaxThreadStaticBlocks); JIT_TO_EE_TRANSITION_LEAF(); } From be1914edbbdf94085c9e1b7a319655eb11d2c972 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 1 May 2023 16:10:51 -0700 Subject: [PATCH 04/21] Add GCThreadStaticBlock --- src/coreclr/inc/corinfo.h | 4 +- src/coreclr/jit/helperexpansion.cpp | 42 +++++++++++++------ .../tools/Common/JitInterface/CorInfoTypes.cs | 2 + .../tools/superpmi/superpmi-shared/agnostic.h | 2 + .../superpmi-shared/methodcontext.cpp | 13 ++++-- src/coreclr/vm/appdomain.hpp | 3 +- src/coreclr/vm/jithelpers.cpp | 35 ++++++++++------ src/coreclr/vm/jitinterface.cpp | 5 +++ 8 files changed, 74 insertions(+), 32 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index 65d5c29e79891..175351b2fa62a 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -544,7 +544,7 @@ enum CorInfoHelpFunc CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE, CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR, - CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, + CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_DYNAMICCLASS, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_DYNAMICCLASS, CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED, @@ -1737,7 +1737,9 @@ struct CORINFO_THREAD_STATIC_BLOCKS_INFO CORINFO_CONST_LOOKUP tlsIndex; uint32_t offsetOfThreadLocalStoragePointer; uint32_t offsetOfNonGCMaxThreadStaticBlocks; + uint32_t offsetOfGCMaxThreadStaticBlocks; uint32_t offsetOfNonGCThreadStaticBlocks; + uint32_t offsetOfGCThreadStaticBlocks; }; //---------------------------------------------------------------------------- diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index 102c0214c64f1..b60ae9a9b8257 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -489,22 +489,39 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* assert(!"Unsupported scenario of optimizing TLS access on Arm32"); #endif + JITDUMP("Expanding thread static local access for [%06d] in " FMT_BB ":\n", dspTreeID(call), block->bbNum); + DISPTREE(call); + JITDUMP("\n"); + bool isGCThreadStatic = + eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; + CORINFO_THREAD_STATIC_BLOCKS_INFO threadStaticBlocksInfo; info.compCompHnd->getThreadLocalStaticBlocksInfo(&threadStaticBlocksInfo); - JITDUMP("getThreadLocalStaticBlocksInfo\n:"); + + uint32_t offsetOfMaxThreadStaticBlocksVal = 0; + uint32_t offsetOfThreadStaticBlocksVal = 0; + if (isGCThreadStatic) + { + JITDUMP("getThreadLocalStaticBlocksInfo (GC)\n:"); + offsetOfMaxThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfGCMaxThreadStaticBlocks; + offsetOfThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfGCThreadStaticBlocks; + } + else + { + JITDUMP("getThreadLocalStaticBlocksInfo (NonGC)\n:"); + offsetOfMaxThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfNonGCMaxThreadStaticBlocks; + offsetOfThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfNonGCThreadStaticBlocks; + } + JITDUMP("tlsIndex= %u\n", (ssize_t)threadStaticBlocksInfo.tlsIndex.addr); - JITDUMP("offsetOfNonGCMaxThreadStaticBlocks= %u\n", threadStaticBlocksInfo.offsetOfNonGCMaxThreadStaticBlocks); JITDUMP("offsetOfThreadLocalStoragePointer= %u\n", threadStaticBlocksInfo.offsetOfThreadLocalStoragePointer); - JITDUMP("offsetOfNonGCThreadStaticBlocks= %u\n", threadStaticBlocksInfo.offsetOfNonGCThreadStaticBlocks); + JITDUMP("offsetOfMaxThreadStaticBlocks= %u\n", offsetOfMaxThreadStaticBlocksVal); + JITDUMP("offsetOfThreadStaticBlocks= %u\n", offsetOfThreadStaticBlocksVal); assert(threadStaticBlocksInfo.tlsIndex.accessType == IAT_VALUE); assert((eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) || (eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED)); - JITDUMP("Expanding thread static local access for [%06d] in " FMT_BB ":\n", dspTreeID(call), block->bbNum); - DISPTREE(call); - JITDUMP("\n"); - call->ClearExpTLSFieldAccess(); assert(call->gtArgs.CountArgs() == 1); @@ -571,9 +588,8 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* GenTree* useTlsLclValue = gtCloneExpr(defTlsLclValue); // Create a use for tlsLclValue GenTree* asgTlsValue = gtNewAssignNode(defTlsLclValue, tlsValue); - // Create tree for "maxThreadStaticBlocks = tls[offsetOfNonGCMaxThreadStaticBlocks]" - GenTree* offsetOfMaxThreadStaticBlocks = - gtNewIconNode(threadStaticBlocksInfo.offsetOfNonGCMaxThreadStaticBlocks, TYP_I_IMPL); + // Create tree for "maxThreadStaticBlocks = tls[offsetOfMaxThreadStaticBlocks]" + GenTree* offsetOfMaxThreadStaticBlocks = gtNewIconNode(offsetOfMaxThreadStaticBlocksVal, TYP_I_IMPL); GenTree* maxThreadStaticBlocksRef = gtNewOperNode(GT_ADD, TYP_I_IMPL, gtCloneExpr(useTlsLclValue), offsetOfMaxThreadStaticBlocks); GenTree* maxThreadStaticBlocksValue = @@ -584,8 +600,8 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* gtNewOperNode(GT_LT, TYP_INT, maxThreadStaticBlocksValue, gtCloneExpr(typeThreadStaticBlockIndexValue)); maxThreadStaticBlocksCond = gtNewOperNode(GT_JTRUE, TYP_VOID, maxThreadStaticBlocksCond); - // Create tree for "threadStaticBlockBase = tls[offsetOfNonGCThreadStaticBlocks]" - GenTree* offsetOfThreadStaticBlocks = gtNewIconNode(threadStaticBlocksInfo.offsetOfNonGCThreadStaticBlocks, TYP_I_IMPL); + // Create tree for "threadStaticBlockBase = tls[offsetOfThreadStaticBlocks]" + GenTree* offsetOfThreadStaticBlocks = gtNewIconNode(offsetOfThreadStaticBlocksVal, TYP_I_IMPL); GenTree* threadStaticBlocksRef = gtNewOperNode(GT_ADD, TYP_I_IMPL, gtCloneExpr(useTlsLclValue), offsetOfThreadStaticBlocks); GenTree* threadStaticBlocksValue = @@ -602,7 +618,7 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* { // Need to add extra indirection to access the data pointer. // TODO: Get the offsetOfDataPtr() from runtime. - + typeThreadStaticBlockValue = gtNewIndir(TYP_I_IMPL, typeThreadStaticBlockValue, GTF_IND_NONFAULTING); typeThreadStaticBlockValue = gtNewOperNode(GT_ADD, TYP_I_IMPL, typeThreadStaticBlockValue, gtNewIconNode(16, TYP_I_IMPL)); diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 6b08319629b38..f3cbee0196fb6 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1159,7 +1159,9 @@ public unsafe struct CORINFO_THREAD_STATIC_BLOCKS_INFO public CORINFO_CONST_LOOKUP tlsIndex; public uint offsetOfThreadLocalStoragePointer; public CORINFO_CONST_LOOKUP offsetOfNonGCMaxThreadStaticBlocks; + public CORINFO_CONST_LOOKUP offsetOfGCMaxThreadStaticBlocks; public CORINFO_CONST_LOOKUP offsetOfNonGCThreadStaticBlocks; + public CORINFO_CONST_LOOKUP offsetOfGCThreadStaticBlocks; }; // System V struct passing diff --git a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h index ae72ae5c69b02..5f4d81c6398f2 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h @@ -523,7 +523,9 @@ struct Agnostic_GetThreadLocalStaticBlocksInfo Agnostic_CORINFO_CONST_LOOKUP tlsIndex; UINT offsetOfThreadLocalStoragePointer; UINT offsetOfNonGCMaxThreadStaticBlocks; + UINT offsetOfGCMaxThreadStaticBlocks; UINT offsetOfNonGCThreadStaticBlocks; + UINT offsetOfGCThreadStaticBlocks; }; struct Agnostic_GetThreadLocalFieldInfo diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 048379e25f035..6036d83def609 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3664,8 +3664,10 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC value.tlsIndex.handle = CastHandle(pInfo->tlsIndex.addr); value.tlsIndex.accessType = pInfo->tlsIndex.accessType; value.offsetOfNonGCMaxThreadStaticBlocks = pInfo->offsetOfNonGCMaxThreadStaticBlocks; + value.offsetOfGCMaxThreadStaticBlocks = pInfo->offsetOfGCMaxThreadStaticBlocks; value.offsetOfThreadLocalStoragePointer = pInfo->offsetOfThreadLocalStoragePointer; value.offsetOfNonGCThreadStaticBlocks = pInfo->offsetOfNonGCThreadStaticBlocks; + value.offsetOfGCThreadStaticBlocks = pInfo->offsetOfGCThreadStaticBlocks; // This data is same for entire process, so just add it against key '0'. GetThreadLocalStaticBlocksInfo->Add(0, value); @@ -3675,9 +3677,10 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC void MethodContext::dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value) { printf("GetThreadLocalStaticBlocksInfo key 0, value tlsIndex-%016" PRIX64 - ", offsetOfNonGCMaxThreadStaticBlocks-%u, offsetOfThreadLocalStoragePointer-%u, offsetOfNonGCThreadStaticBlocks-%u", + ", offsetOfNonGCMaxThreadStaticBlocks-%u, offsetOfThreadLocalStoragePointer-%u, offsetOfNonGCThreadStaticBlocks-%u," + ", offsetOfGCMaxThreadStaticBlocks-%u, offsetOfGCThreadStaticBlocks-%u", value.tlsIndex.handle, value.offsetOfNonGCMaxThreadStaticBlocks, value.offsetOfThreadLocalStoragePointer, - value.offsetOfNonGCThreadStaticBlocks); + value.offsetOfNonGCThreadStaticBlocks, value.offsetOfGCMaxThreadStaticBlocks, value.offsetOfGCThreadStaticBlocks); } void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) @@ -3689,8 +3692,10 @@ void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC pInfo->tlsIndex.accessType = (InfoAccessType)value.tlsIndex.accessType; pInfo->tlsIndex.addr = (void*)value.tlsIndex.handle; pInfo->offsetOfNonGCMaxThreadStaticBlocks = value.offsetOfNonGCMaxThreadStaticBlocks; - pInfo->offsetOfThreadLocalStoragePointer = value.offsetOfThreadLocalStoragePointer; - pInfo->offsetOfNonGCThreadStaticBlocks = value.offsetOfNonGCThreadStaticBlocks; + pInfo->offsetOfGCMaxThreadStaticBlocks = value.offsetOfGCMaxThreadStaticBlocks; + pInfo->offsetOfThreadLocalStoragePointer = value.offsetOfThreadLocalStoragePointer; + pInfo->offsetOfNonGCThreadStaticBlocks = value.offsetOfNonGCThreadStaticBlocks; + pInfo->offsetOfGCThreadStaticBlocks = value.offsetOfGCThreadStaticBlocks; } void MethodContext::recEmbedMethodHandle(CORINFO_METHOD_HANDLE handle, diff --git a/src/coreclr/vm/appdomain.hpp b/src/coreclr/vm/appdomain.hpp index 475968698f17b..e18666c9312f3 100644 --- a/src/coreclr/vm/appdomain.hpp +++ b/src/coreclr/vm/appdomain.hpp @@ -1223,9 +1223,8 @@ class BaseDomain #ifdef HOST_WINDOWS // MethodTable to `typeIndex` map. `typeIndex` is embedded in the code during codegen. - // During execution corresponding thread static data blocks are stored in `t_threadStaticBlocks` - // array at the `typeIndex`. // During execution corresponding thread static data blocks are stored in `t_NonGCThreadStaticBlocks` + // and `t_GCThreadStaticBlocks` array at the `typeIndex`. TypeIDMap m_threadStaticBlockTypeIDMap; #endif // HOST_WINDOWS diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index 927b8d907edca..3c519b2087566 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -1780,12 +1780,22 @@ HCIMPLEND #ifdef _MSC_VER __declspec(selectany) __declspec(thread) uint32_t t_NonGCMaxThreadStaticBlocks; +__declspec(selectany) __declspec(thread) uint32_t t_GCMaxThreadStaticBlocks; + __declspec(selectany) __declspec(thread) uint32_t t_NonGCThreadStaticBlocksSize; +__declspec(selectany) __declspec(thread) uint32_t t_GCThreadStaticBlocksSize; + __declspec(selectany) __declspec(thread) void** t_NonGCThreadStaticBlocks; +__declspec(selectany) __declspec(thread) void** t_GCThreadStaticBlocks; #else EXTERN_C __thread uint32_t t_NonGCMaxThreadStaticBlocks; +EXTERN_C __thread uint32_t t_GCMaxThreadStaticBlocks; + EXTERN_C __thread uint32_t t_NonGCThreadStaticBlocksSize; +EXTERN_C __thread uint32_t t_GCThreadStaticBlocksSize; + EXTERN_C __thread void** t_NonGCThreadStaticBlocks; +EXTERN_C __thread void** t_GCThreadStaticBlocks; #endif // *** This helper corresponds to both CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE and @@ -1947,37 +1957,38 @@ HCIMPL1(void*, JIT_GetSharedGCThreadStaticBaseOptimized, UINT32 staticBlockIndex staticBlock = (void*) pMT->GetGCThreadStaticsBaseHandle(); CONSISTENCY_CHECK(staticBlock != NULL); - if (t_threadStaticBlocksSize <= staticBlockIndex) + if (t_GCThreadStaticBlocksSize <= staticBlockIndex) { - UINT32 newThreadStaticBlocksSize = max(2 * t_threadStaticBlocksSize, staticBlockIndex + 1); + UINT32 newThreadStaticBlocksSize = max(2 * t_GCThreadStaticBlocksSize, staticBlockIndex + 1); void** newThreadStaticBlocks = (void**) new PTR_BYTE[newThreadStaticBlocksSize * sizeof(PTR_BYTE)]; - memset(newThreadStaticBlocks + t_threadStaticBlocksSize, 0, (newThreadStaticBlocksSize - t_threadStaticBlocksSize) * sizeof(PTR_BYTE)); + memset(newThreadStaticBlocks + t_GCThreadStaticBlocksSize, 0, (newThreadStaticBlocksSize - t_GCThreadStaticBlocksSize) * sizeof(PTR_BYTE)); - if (t_threadStaticBlocksSize > 0) + if (t_GCThreadStaticBlocksSize > 0) { - memcpy(newThreadStaticBlocks, t_threadStaticBlocks, t_threadStaticBlocksSize * sizeof(PTR_BYTE)); - delete t_threadStaticBlocks; + memcpy(newThreadStaticBlocks, t_GCThreadStaticBlocks, t_GCThreadStaticBlocksSize * sizeof(PTR_BYTE)); + delete t_GCThreadStaticBlocks; } - t_threadStaticBlocksSize = newThreadStaticBlocksSize; - t_threadStaticBlocks = newThreadStaticBlocks; + t_GCThreadStaticBlocksSize = newThreadStaticBlocksSize; + t_GCThreadStaticBlocks = newThreadStaticBlocks; } - void* currentEntry = t_threadStaticBlocks[staticBlockIndex]; + void* currentEntry = t_GCThreadStaticBlocks[staticBlockIndex]; // We could be coming here 2nd time after running the ctor when we try to get the static block. // In such case, just avoid adding the same entry. if (currentEntry != staticBlock) { _ASSERTE(currentEntry == nullptr); - t_threadStaticBlocks[staticBlockIndex] = staticBlock; - t_maxThreadStaticBlocks = max(t_maxThreadStaticBlocks, staticBlockIndex); + t_GCThreadStaticBlocks[staticBlockIndex] = staticBlock; + t_GCMaxThreadStaticBlocks = max(t_GCMaxThreadStaticBlocks, staticBlockIndex); } + // Get the data pointer of static block staticBlock = (void*) pMT->GetGCThreadStaticsBasePointer(); HELPER_METHOD_FRAME_END(); #else - _ASSERTE(!"JIT_GetSharedNonGCThreadStaticBaseOptimized not supported on non-windows."); + _ASSERTE(!"JIT_GetSharedGCThreadStaticBaseOptimized not supported on non-windows."); #endif // HOST_WINDOWS return staticBlock; diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index e8d63e5f69b9d..43afad2f087c9 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -71,7 +71,10 @@ EXTERN_C uint32_t _tls_index; #ifdef _MSC_VER __declspec(selectany) __declspec(thread) uint32_t t_NonGCMaxThreadStaticBlocks; +__declspec(selectany) __declspec(thread) uint32_t t_GCMaxThreadStaticBlocks; + __declspec(selectany) __declspec(thread) void** t_NonGCThreadStaticBlocks; +__declspec(selectany) __declspec(thread) void** t_GCThreadStaticBlocks; #else EXTERN_C __thread uint32_t t_maxThreadStaticBlocks; EXTERN_C __thread void** t_threadStaticBlocks; @@ -1816,7 +1819,9 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo->offsetOfThreadLocalStoragePointer = offsetof(_TEB, ThreadLocalStoragePointer); pInfo->offsetOfNonGCThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCThreadStaticBlocks); + pInfo->offsetOfGCThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCThreadStaticBlocks); pInfo->offsetOfNonGCMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCMaxThreadStaticBlocks); + pInfo->offsetOfGCMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCMaxThreadStaticBlocks); JIT_TO_EE_TRANSITION_LEAF(); } From 966e7a0c6cb9544dd927143f66ccce8553376f78 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 1 May 2023 21:27:39 -0700 Subject: [PATCH 05/21] fix linux build --- src/coreclr/vm/jitinterface.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 43afad2f087c9..499166bad2851 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1850,8 +1850,10 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo->tlsIndex.addr = (UINT8*)0; pInfo->offsetOfThreadLocalStoragePointer = 0; - pInfo->offsetOfThreadStaticBlocks = 0; - pInfo->offsetOfMaxThreadStaticBlocks = 0; + pInfo->offsetOfNonGCThreadStaticBlocks = 0; + pInfo->offsetOfGCThreadStaticBlocks = 0; + pInfo->offsetOfNonGCMaxThreadStaticBlocks = 0; + pInfo->offsetOfGCMaxThreadStaticBlocks = 0; JIT_TO_EE_TRANSITION_LEAF(); } From 26626adc0cc14380af18c9300d238a6ba01bb53d Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 3 May 2023 00:08:22 -0700 Subject: [PATCH 06/21] Restrict the optimization to non-generics --- src/coreclr/jit/flowgraph.cpp | 7 ++++-- src/coreclr/vm/jitinterface.cpp | 38 ++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 045d5f6d5bf59..586c36e3df58b 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -719,6 +719,10 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo bNeedClassID = false; FALLTHROUGH; + case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR: + callFlags |= GTF_CALL_HOISTABLE; + FALLTHROUGH; + case CORINFO_HELP_GETSHARED_GCSTATIC_BASE: case CORINFO_HELP_GETSHARED_GCSTATIC_BASE_DYNAMICCLASS: case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_DYNAMICCLASS: @@ -729,9 +733,8 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo break; case CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: - case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR: - case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR: case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: + case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR: bNeedClassID = false; FALLTHROUGH; diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 499166bad2851..9d361f26eab09 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1573,24 +1573,28 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, #ifdef HOST_WINDOWS #ifndef TARGET_ARM - bool canOptimizeHelper = - (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || - (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE) || - (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR) || - (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE); - // For windows, we convert the TLS access to the optimized helper where we will store - // the static blocks in TLS directly and access them via inline code. - if ((pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || - (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE)) + // Only check if the field type is non-generic. + if (((pField->GetFieldType() >= ELEMENT_TYPE_BOOLEAN) && (pField->GetFieldType() < ELEMENT_TYPE_VALUETYPE)) || + (pField->GetFieldType() == ELEMENT_TYPE_OBJECT) || + (pField->GetFieldType() == ELEMENT_TYPE_ARRAY) || + (pField->GetFieldType() == ELEMENT_TYPE_I) || + (pField->GetFieldType() == ELEMENT_TYPE_U) || + (pField->GetFieldType() == ELEMENT_TYPE_SZARRAY)) { - fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; - pResult->helper = CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; - } - else if ((pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR) || - (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE)) - { - fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; - pResult->helper = CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; + // For windows, we convert the TLS access to the optimized helper where we will store + // the static blocks in TLS directly and access them via inline code. + if ((pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE)) + { + fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; + pResult->helper = CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; + } + else if ((pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE)) + { + fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; + pResult->helper = CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; + } } #endif // !TARGET_ARM #endif // HOST_WINDOWS From 772d9e73de8affe5af25573519487f432849d48d Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 3 May 2023 08:13:37 -0700 Subject: [PATCH 07/21] Update the guid --- src/coreclr/inc/jiteeversionguid.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/coreclr/inc/jiteeversionguid.h b/src/coreclr/inc/jiteeversionguid.h index be6cc1e7f4f8d..1aba4d468834e 100644 --- a/src/coreclr/inc/jiteeversionguid.h +++ b/src/coreclr/inc/jiteeversionguid.h @@ -43,11 +43,12 @@ typedef const GUID *LPCGUID; #define GUID_DEFINED #endif // !GUID_DEFINED -constexpr GUID JITEEVersionIdentifier = { /* 387bcec3-9a71-4422-a11c-e7ce3b73c592 */ - 0x387bcec3, - 0x9a71, - 0x4422, - {0xa1, 0x1c, 0xe7, 0xce, 0x3b, 0x73, 0xc5, 0x92} + +constexpr GUID JITEEVersionIdentifier = { /* f63c2964-bae9-448f-baaf-9c9f2d4292f2 */ + 0xf63c2964, + 0xbae9, + 0x448f, + {0xba, 0xaf, 0x9c, 0x9f, 0x2d, 0x42, 0x92, 0xf2} }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// From 4378b9612290936799f911ca6efda36244665448 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 3 May 2023 08:50:01 -0700 Subject: [PATCH 08/21] Add canOptimizeHelper check --- src/coreclr/vm/jitinterface.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 9d361f26eab09..b742283ec3ec2 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1573,13 +1573,16 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, #ifdef HOST_WINDOWS #ifndef TARGET_ARM - // Only check if the field type is non-generic. - if (((pField->GetFieldType() >= ELEMENT_TYPE_BOOLEAN) && (pField->GetFieldType() < ELEMENT_TYPE_VALUETYPE)) || + bool canOptimizeHelper = + ((pField->GetFieldType() >= ELEMENT_TYPE_BOOLEAN) && (pField->GetFieldType() < ELEMENT_TYPE_VALUETYPE)) || (pField->GetFieldType() == ELEMENT_TYPE_OBJECT) || (pField->GetFieldType() == ELEMENT_TYPE_ARRAY) || (pField->GetFieldType() == ELEMENT_TYPE_I) || (pField->GetFieldType() == ELEMENT_TYPE_U) || - (pField->GetFieldType() == ELEMENT_TYPE_SZARRAY)) + (pField->GetFieldType() == ELEMENT_TYPE_SZARRAY); + + // Only check if the field type is non-generic. + if (canOptimizeHelper) { // For windows, we convert the TLS access to the optimized helper where we will store // the static blocks in TLS directly and access them via inline code. From 269719ffdd700e50572902707fdfea7f2799fb44 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 5 May 2023 13:44:00 -0700 Subject: [PATCH 09/21] Rename and related methods from typeIDMap to NonGCTypeID --- src/coreclr/inc/corinfo.h | 2 +- src/coreclr/inc/icorjitinfoimpl_generated.h | 2 +- src/coreclr/jit/ICorJitInfo_names_generated.h | 2 +- .../jit/ICorJitInfo_wrapper_generated.hpp | 8 ++++---- src/coreclr/jit/compiler.h | 2 +- src/coreclr/jit/ee_il_dll.hpp | 4 ++-- src/coreclr/jit/importer.cpp | 2 +- .../tools/Common/JitInterface/CorInfoImpl.cs | 2 +- .../JitInterface/CorInfoImpl_generated.cs | 6 +++--- .../ThunkGenerator/ThunkInput.txt | 2 +- .../aot/jitinterface/jitinterface_generated.h | 6 +++--- .../tools/superpmi/superpmi-shared/lwmlist.h | 2 +- .../superpmi-shared/methodcontext.cpp | 20 +++++++++---------- .../superpmi/superpmi-shared/methodcontext.h | 8 ++++---- .../superpmi-shim-collector/icorjitinfo.cpp | 8 ++++---- .../icorjitinfo_generated.cpp | 6 +++--- .../icorjitinfo_generated.cpp | 4 ++-- .../tools/superpmi/superpmi/icorjitinfo.cpp | 6 +++--- src/coreclr/vm/appdomain.cpp | 14 ++++++------- src/coreclr/vm/appdomain.hpp | 8 ++++---- src/coreclr/vm/jithelpers.cpp | 4 ++-- src/coreclr/vm/jitinterface.cpp | 20 +++++++++---------- 22 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index 26b6e5adc4d20..95865f745cd69 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -2754,7 +2754,7 @@ class ICorStaticInfo CORINFO_FIELD_INFO *pResult ) = 0; - virtual uint32_t getThreadLocalFieldInfo ( + virtual uint32_t getNonGCThreadLocalFieldInfo ( CORINFO_FIELD_HANDLE field) = 0; virtual void getThreadLocalStaticBlocksInfo ( diff --git a/src/coreclr/inc/icorjitinfoimpl_generated.h b/src/coreclr/inc/icorjitinfoimpl_generated.h index cf4c94498c33a..1195004a82b40 100644 --- a/src/coreclr/inc/icorjitinfoimpl_generated.h +++ b/src/coreclr/inc/icorjitinfoimpl_generated.h @@ -410,7 +410,7 @@ void getFieldInfo( CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult) override; -uint32_t getThreadLocalFieldInfo( +uint32_t getNonGCThreadLocalFieldInfo( CORINFO_FIELD_HANDLE field) override; void getThreadLocalStaticBlocksInfo( diff --git a/src/coreclr/jit/ICorJitInfo_names_generated.h b/src/coreclr/jit/ICorJitInfo_names_generated.h index cb5db87194525..7de8b47d8ea07 100644 --- a/src/coreclr/jit/ICorJitInfo_names_generated.h +++ b/src/coreclr/jit/ICorJitInfo_names_generated.h @@ -102,7 +102,7 @@ DEF_CLR_API(getFieldClass) DEF_CLR_API(getFieldType) DEF_CLR_API(getFieldOffset) DEF_CLR_API(getFieldInfo) -DEF_CLR_API(getThreadLocalFieldInfo) +DEF_CLR_API(getNonGCThreadLocalFieldInfo) DEF_CLR_API(getThreadLocalStaticBlocksInfo) DEF_CLR_API(isFieldStatic) DEF_CLR_API(getArrayOrStringLength) diff --git a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp index b819fc12fbce1..4266bc790e8bf 100644 --- a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp +++ b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp @@ -971,12 +971,12 @@ void WrapICorJitInfo::getFieldInfo( API_LEAVE(getFieldInfo); } -uint32_t WrapICorJitInfo::getThreadLocalFieldInfo( +uint32_t WrapICorJitInfo::getNonGCThreadLocalFieldInfo( CORINFO_FIELD_HANDLE field) { - API_ENTER(getThreadLocalFieldInfo); - uint32_t temp = wrapHnd->getThreadLocalFieldInfo(field); - API_LEAVE(getThreadLocalFieldInfo); + API_ENTER(getNonGCThreadLocalFieldInfo); + uint32_t temp = wrapHnd->getNonGCThreadLocalFieldInfo(field); + API_LEAVE(getNonGCThreadLocalFieldInfo); return temp; } diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 2feef5ba2831f..9be7b70bfe045 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -7827,7 +7827,7 @@ class Compiler void eeGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); - uint32_t eeGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); + uint32_t eeGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); // Get the flags diff --git a/src/coreclr/jit/ee_il_dll.hpp b/src/coreclr/jit/ee_il_dll.hpp index 162d5479dff49..b6edf4289f037 100644 --- a/src/coreclr/jit/ee_il_dll.hpp +++ b/src/coreclr/jit/ee_il_dll.hpp @@ -45,9 +45,9 @@ void Compiler::eeGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, } FORCEINLINE -uint32_t Compiler::eeGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t Compiler::eeGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) { - return info.compCompHnd->getThreadLocalFieldInfo(field); + return info.compCompHnd->getNonGCThreadLocalFieldInfo(field); } /***************************************************************************** diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index 7ae295cb1871e..28e5b44b16bb5 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -4133,7 +4133,7 @@ GenTree* Compiler::impImportStaticFieldAccess(CORINFO_RESOLVED_TOKEN* pResolvedT case CORINFO_FIELD_STATIC_TLS_MANAGED: - typeIndex = info.compCompHnd->getThreadLocalFieldInfo(pResolvedToken->hField); + typeIndex = info.compCompHnd->getNonGCThreadLocalFieldInfo(pResolvedToken->hField); FALLTHROUGH; case CORINFO_FIELD_STATIC_SHARED_STATIC_HELPER: diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 6d3806f298768..3ef2e1c671119 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -2859,7 +2859,7 @@ private nuint printFieldName(CORINFO_FIELD_STRUCT_* fld, byte* buffer, nuint buf } #pragma warning disable CA1822 // Mark members as static - private uint getThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld) + private uint getNonGCThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld) #pragma warning restore CA1822 // Mark members as static { // Implemented for JIT only for now. diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs index 3c7f632ef8e7b..38c004b058aec 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs @@ -1465,12 +1465,12 @@ private static void _getFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINF } [UnmanagedCallersOnly] - private static uint _getThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_FIELD_STRUCT_* field) + private static uint _getNonGCThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_FIELD_STRUCT_* field) { var _this = GetThis(thisHandle); try { - return _this.getThreadLocalFieldInfo(field); + return _this.getNonGCThreadLocalFieldInfo(field); } catch (Exception ex) { @@ -2830,7 +2830,7 @@ private static IntPtr GetUnmanagedCallbacks() callbacks[95] = (delegate* unmanaged)&_getFieldType; callbacks[96] = (delegate* unmanaged)&_getFieldOffset; callbacks[97] = (delegate* unmanaged)&_getFieldInfo; - callbacks[98] = (delegate* unmanaged)&_getThreadLocalFieldInfo; + callbacks[98] = (delegate* unmanaged)&_getNonGCThreadLocalFieldInfo; callbacks[99] = (delegate* unmanaged)&_getThreadLocalStaticBlocksInfo; callbacks[100] = (delegate* unmanaged)&_isFieldStatic; callbacks[101] = (delegate* unmanaged)&_getArrayOrStringLength; diff --git a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt index b9f8aa66f259e..73179d168739f 100644 --- a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt +++ b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt @@ -257,7 +257,7 @@ FUNCTIONS CorInfoType getFieldType(CORINFO_FIELD_HANDLE field, CORINFO_CLASS_HANDLE* structType, CORINFO_CLASS_HANDLE memberParent) unsigned getFieldOffset(CORINFO_FIELD_HANDLE field) void getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult) - uint32_t getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) + uint32_t getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) void getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) int getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) diff --git a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h index 62db21d2232e2..3e510aa87f4f9 100644 --- a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h +++ b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h @@ -109,7 +109,7 @@ struct JitInterfaceCallbacks CorInfoType (* getFieldType)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field, CORINFO_CLASS_HANDLE* structType, CORINFO_CLASS_HANDLE memberParent); unsigned (* getFieldOffset)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); void (* getFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); - uint32_t (* getThreadLocalFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); + uint32_t (* getNonGCThreadLocalFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); void (* getThreadLocalStaticBlocksInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); bool (* isFieldStatic)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE fldHnd); int (* getArrayOrStringLength)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_OBJECT_HANDLE objHnd); @@ -1169,11 +1169,11 @@ class JitInterfaceWrapper : public ICorJitInfo if (pException != nullptr) throw pException; } - virtual uint32_t getThreadLocalFieldInfo( + virtual uint32_t getNonGCThreadLocalFieldInfo( CORINFO_FIELD_HANDLE field) { CorInfoExceptionClass* pException = nullptr; - uint32_t temp = _callbacks->getThreadLocalFieldInfo(_thisHandle, &pException, field); + uint32_t temp = _callbacks->getNonGCThreadLocalFieldInfo(_thisHandle, &pException, field); 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 19a0600b3f582..686ff7068b1f1 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h @@ -38,7 +38,7 @@ LWM(EmbedFieldHandle, DWORDLONG, DLDL) LWM(EmbedGenericHandle, Agnostic_EmbedGenericHandle, Agnostic_CORINFO_GENERICHANDLE_RESULT) LWM(EmbedMethodHandle, DWORDLONG, DLDL) LWM(EmbedModuleHandle, DWORDLONG, DLDL) -LWM(GetThreadLocalFieldInfo, DWORDLONG, DWORD) +LWM(GetNonGCThreadLocalFieldInfo, DWORDLONG, DWORD) LWM(GetThreadLocalStaticBlocksInfo, DWORD, Agnostic_GetThreadLocalStaticBlocksInfo) DENSELWM(EmptyStringLiteral, DLD) DENSELWM(ErrorList, DWORD) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 787eda57e843e..c69471d6bd72e 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3628,29 +3628,29 @@ void MethodContext::repGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, } } -void MethodContext::recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result) +void MethodContext::recGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result) { - if (GetThreadLocalFieldInfo == nullptr) - GetThreadLocalFieldInfo = new LightWeightMap(); + if (GetNonGCThreadLocalFieldInfo == nullptr) + GetNonGCThreadLocalFieldInfo = new LightWeightMap(); DWORDLONG key = 0; key = CastHandle(field); - GetThreadLocalFieldInfo->Add(key, result); - DEBUG_REC(dmpGetThreadLocalFieldInfo(key, result)); + GetNonGCThreadLocalFieldInfo->Add(key, result); + DEBUG_REC(dmpGetNonGCThreadLocalFieldInfo(key, result)); } -void MethodContext::dmpGetThreadLocalFieldInfo(DWORDLONG key, DWORD value) +void MethodContext::dmpGetNonGCThreadLocalFieldInfo(DWORDLONG key, DWORD value) { - printf("GetThreadLocalFieldInfo key hnd-%016" PRIX64 ", result-%u", key, value); + printf("GetNonGCThreadLocalFieldInfo key hnd-%016" PRIX64 ", result-%u", key, value); } -uint32_t MethodContext::repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t MethodContext::repGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) { DWORDLONG key = CastHandle(field); - DWORD value = LookupByKeyOrMiss(GetThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); + DWORD value = LookupByKeyOrMiss(GetNonGCThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); - DEBUG_REP(dmpGetThreadLocalFieldInfo(key, value)); + DEBUG_REP(dmpGetNonGCThreadLocalFieldInfo(key, value)); return value; } diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h index 53b3b02f745ea..7aac93a564c04 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h @@ -485,9 +485,9 @@ class MethodContext CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); - void recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result); - void dmpGetThreadLocalFieldInfo(DWORDLONG key, DWORD value); - uint32_t repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); + void recGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result); + void dmpGetNonGCThreadLocalFieldInfo(DWORDLONG key, DWORD value); + uint32_t repGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); void recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); void dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value); @@ -1184,7 +1184,7 @@ enum mcPackets Packet_GetStringChar = 204, Packet_GetIsClassInitedFlagAddress = 205, Packet_GetStaticBaseAddress = 206, - Packet_GetThreadLocalFieldInfo = 207, + Packet_GetNonGCThreadLocalFieldInfo = 207, Packet_GetThreadLocalStaticBlocksInfo = 208, Packet_GetRISCV64PassStructInRegisterFlags = 209, Packet_GetObjectContent = 210, diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 96249dde36c0d..cf9d9380d718c 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -1096,11 +1096,11 @@ void interceptor_ICJI::getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, mc->recGetFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t interceptor_ICJI::getThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) { - mc->cr->AddCall("getThreadLocalFieldInfo"); - uint32_t result = original_ICorJitInfo->getThreadLocalFieldInfo(field); - mc->recGetThreadLocalFieldInfo(field, result); + mc->cr->AddCall("getNonGCThreadLocalFieldInfo"); + uint32_t result = original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); + mc->recGetNonGCThreadLocalFieldInfo(field, result); return result; } 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 58dc80abec8e1..31c5ec9af8b78 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp @@ -793,11 +793,11 @@ void interceptor_ICJI::getFieldInfo( original_ICorJitInfo->getFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t interceptor_ICJI::getThreadLocalFieldInfo( +uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo( CORINFO_FIELD_HANDLE field) { - mcs->AddCall("getThreadLocalFieldInfo"); - return original_ICorJitInfo->getThreadLocalFieldInfo(field); + mcs->AddCall("getNonGCThreadLocalFieldInfo"); + return original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); } void interceptor_ICJI::getThreadLocalStaticBlocksInfo( 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 a9dced511ddce..b9d9743233627 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp @@ -695,10 +695,10 @@ void interceptor_ICJI::getFieldInfo( original_ICorJitInfo->getFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t interceptor_ICJI::getThreadLocalFieldInfo( +uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo( CORINFO_FIELD_HANDLE field) { - return original_ICorJitInfo->getThreadLocalFieldInfo(field); + return original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); } void interceptor_ICJI::getThreadLocalStaticBlocksInfo( diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index 9915b4699eeeb..4e41a7d9f376e 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -917,10 +917,10 @@ void MyICJI::getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, jitInstance->mc->repGetFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t MyICJI::getThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t MyICJI::getNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) { - jitInstance->mc->cr->AddCall("getThreadLocalFieldInfo"); - return jitInstance->mc->repGetThreadLocalFieldInfo(field); + jitInstance->mc->cr->AddCall("getNonGCThreadLocalFieldInfo"); + return jitInstance->mc->repGetNonGCThreadLocalFieldInfo(field); } void MyICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) diff --git a/src/coreclr/vm/appdomain.cpp b/src/coreclr/vm/appdomain.cpp index 3cb82546ade00..7dcca418486a1 100644 --- a/src/coreclr/vm/appdomain.cpp +++ b/src/coreclr/vm/appdomain.cpp @@ -666,11 +666,11 @@ void BaseDomain::InitVSD() } #ifdef HOST_WINDOWS -void BaseDomain::InitThreadStaticBlockTypeMap() +void BaseDomain::InitNonGCThreadStaticBlockTypeMap() { STANDARD_VM_CONTRACT; - m_threadStaticBlockTypeIDMap.Init(); + m_NonGCThreadStaticBlockTypeIDMap.Init(); } #endif // HOST_WINDOWS @@ -1772,7 +1772,7 @@ void AppDomain::Create() #ifdef HOST_WINDOWS // allocate a thread static block to index map - pDomain->InitThreadStaticBlockTypeMap(); + pDomain->InitNonGCThreadStaticBlockTypeMap(); #endif pDomain->SetStage(AppDomain::STAGE_OPEN); @@ -4680,7 +4680,7 @@ PTR_MethodTable BaseDomain::LookupType(UINT32 id) { #ifdef HOST_WINDOWS //------------------------------------------------------------------------ -UINT32 BaseDomain::GetThreadStaticTypeIndex(PTR_MethodTable pMT) +UINT32 BaseDomain::GetNonGCThreadStaticTypeIndex(PTR_MethodTable pMT) { CONTRACTL { THROWS; @@ -4688,18 +4688,18 @@ UINT32 BaseDomain::GetThreadStaticTypeIndex(PTR_MethodTable pMT) PRECONDITION(pMT->GetDomain() == this); } CONTRACTL_END; - return m_threadStaticBlockTypeIDMap.GetTypeID(pMT, false); + return m_NonGCThreadStaticBlockTypeIDMap.GetTypeID(pMT, false); } //------------------------------------------------------------------------ -PTR_MethodTable BaseDomain::LookupThreadStaticBlockType(UINT32 id) { +PTR_MethodTable BaseDomain::LookupNonGCThreadStaticBlockType(UINT32 id) { CONTRACTL { NOTHROW; WRAPPER(GC_TRIGGERS); CONSISTENCY_CHECK(id != TYPE_ID_THIS_CLASS); } CONTRACTL_END; - PTR_MethodTable pMT = m_threadStaticBlockTypeIDMap.LookupType(id); + PTR_MethodTable pMT = m_NonGCThreadStaticBlockTypeIDMap.LookupType(id); CONSISTENCY_CHECK(CheckPointer(pMT)); return pMT; diff --git a/src/coreclr/vm/appdomain.hpp b/src/coreclr/vm/appdomain.hpp index e18666c9312f3..41840e5112cab 100644 --- a/src/coreclr/vm/appdomain.hpp +++ b/src/coreclr/vm/appdomain.hpp @@ -1225,18 +1225,18 @@ class BaseDomain // MethodTable to `typeIndex` map. `typeIndex` is embedded in the code during codegen. // During execution corresponding thread static data blocks are stored in `t_NonGCThreadStaticBlocks` // and `t_GCThreadStaticBlocks` array at the `typeIndex`. - TypeIDMap m_threadStaticBlockTypeIDMap; + TypeIDMap m_NonGCThreadStaticBlockTypeIDMap; #endif // HOST_WINDOWS public: #ifdef HOST_WINDOWS - void InitThreadStaticBlockTypeMap(); + void InitNonGCThreadStaticBlockTypeMap(); - UINT32 GetThreadStaticTypeIndex(PTR_MethodTable pMT); + UINT32 GetNonGCThreadStaticTypeIndex(PTR_MethodTable pMT); - PTR_MethodTable LookupThreadStaticBlockType(UINT32 id); + PTR_MethodTable LookupNonGCThreadStaticBlockType(UINT32 id); #endif UINT32 GetTypeID(PTR_MethodTable pMT); diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index b726c88f16262..a89e339e805ee 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -1845,7 +1845,7 @@ HCIMPL1(void*, JIT_GetSharedNonGCThreadStaticBaseOptimized, UINT32 staticBlockIn HELPER_METHOD_FRAME_BEGIN_RET_0(); // Set up a frame - MethodTable * pMT = AppDomain::GetCurrentDomain()->LookupThreadStaticBlockType(staticBlockIndex); + MethodTable * pMT = AppDomain::GetCurrentDomain()->LookupNonGCThreadStaticBlockType(staticBlockIndex); _ASSERTE(!pMT->HasGenericsStaticsInfo()); // Get the TLM @@ -1943,7 +1943,7 @@ HCIMPL1(void*, JIT_GetSharedGCThreadStaticBaseOptimized, UINT32 staticBlockIndex HELPER_METHOD_FRAME_BEGIN_RET_0(); // Set up a frame - MethodTable * pMT = AppDomain::GetCurrentDomain()->LookupThreadStaticBlockType(staticBlockIndex); + MethodTable * pMT = AppDomain::GetCurrentDomain()->LookupNonGCThreadStaticBlockType(staticBlockIndex); _ASSERTE(!pMT->HasGenericsStaticsInfo()); // Get the TLM diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index ef268c00b8e56..172a2a753b9e4 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1573,13 +1573,13 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, #ifdef HOST_WINDOWS #ifndef TARGET_ARM - bool canOptimizeHelper = - ((pField->GetFieldType() >= ELEMENT_TYPE_BOOLEAN) && (pField->GetFieldType() < ELEMENT_TYPE_VALUETYPE)) || - (pField->GetFieldType() == ELEMENT_TYPE_OBJECT) || - (pField->GetFieldType() == ELEMENT_TYPE_ARRAY) || - (pField->GetFieldType() == ELEMENT_TYPE_I) || - (pField->GetFieldType() == ELEMENT_TYPE_U) || - (pField->GetFieldType() == ELEMENT_TYPE_SZARRAY); + bool canOptimizeHelper = true; + //((pField->GetFieldType() >= ELEMENT_TYPE_BOOLEAN) && (pField->GetFieldType() < ELEMENT_TYPE_VALUETYPE)) || + //(pField->GetFieldType() == ELEMENT_TYPE_OBJECT) || + //(pField->GetFieldType() == ELEMENT_TYPE_ARRAY) || + //(pField->GetFieldType() == ELEMENT_TYPE_I) || + //(pField->GetFieldType() == ELEMENT_TYPE_U) || + //(pField->GetFieldType() == ELEMENT_TYPE_SZARRAY); // Only check if the field type is non-generic. if (canOptimizeHelper) @@ -1787,7 +1787,7 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, #ifdef HOST_WINDOWS /*********************************************************************/ -uint32_t CEEInfo::getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) +uint32_t CEEInfo::getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) { CONTRACTL { THROWS; @@ -1802,7 +1802,7 @@ uint32_t CEEInfo::getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) FieldDesc* fieldDesc = (FieldDesc*)field; _ASSERTE(fieldDesc->IsThreadStatic()); - typeIndex = AppDomain::GetCurrentDomain()->GetThreadStaticTypeIndex(fieldDesc->GetEnclosingMethodTable()); + typeIndex = AppDomain::GetCurrentDomain()->GetNonGCThreadStaticTypeIndex(fieldDesc->GetEnclosingMethodTable()); assert(typeIndex != TypeIDProvider::INVALID_TYPE_ID); @@ -1833,7 +1833,7 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* JIT_TO_EE_TRANSITION_LEAF(); } #else -uint32_t CEEInfo::getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) +uint32_t CEEInfo::getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) { CONTRACTL { NOTHROW; From a9073abaa06dade82b98c8a990fc9c0e914d6494 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Tue, 9 May 2023 11:42:02 -0700 Subject: [PATCH 10/21] Introduce GCTypeIDMap and getGCThreadLocalFieldInfo() --- src/coreclr/inc/corinfo.h | 3 + src/coreclr/inc/icorjitinfoimpl_generated.h | 3 + src/coreclr/jit/ICorJitInfo_names_generated.h | 1 + .../jit/ICorJitInfo_wrapper_generated.hpp | 9 + .../tools/Common/JitInterface/CorInfoImpl.cs | 9 + .../JitInterface/CorInfoImpl_generated.cs | 188 ++++++++++-------- .../ThunkGenerator/ThunkInput.txt | 1 + .../aot/jitinterface/jitinterface_generated.h | 10 + .../tools/superpmi/superpmi-shared/lwmlist.h | 1 + .../superpmi-shared/methodcontext.cpp | 27 +++ .../superpmi/superpmi-shared/methodcontext.h | 11 +- .../superpmi-shim-collector/icorjitinfo.cpp | 8 + .../icorjitinfo_generated.cpp | 7 + .../icorjitinfo_generated.cpp | 6 + .../tools/superpmi/superpmi/icorjitinfo.cpp | 6 + src/coreclr/vm/appdomain.cpp | 25 +++ src/coreclr/vm/appdomain.hpp | 3 + src/coreclr/vm/jitinterface.cpp | 35 ++++ 18 files changed, 264 insertions(+), 89 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index 95865f745cd69..d6c042291b59c 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -2757,6 +2757,9 @@ class ICorStaticInfo virtual uint32_t getNonGCThreadLocalFieldInfo ( CORINFO_FIELD_HANDLE field) = 0; + virtual uint32_t getGCThreadLocalFieldInfo ( + CORINFO_FIELD_HANDLE field) = 0; + virtual void getThreadLocalStaticBlocksInfo ( CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) = 0; diff --git a/src/coreclr/inc/icorjitinfoimpl_generated.h b/src/coreclr/inc/icorjitinfoimpl_generated.h index 1195004a82b40..485d4a636b197 100644 --- a/src/coreclr/inc/icorjitinfoimpl_generated.h +++ b/src/coreclr/inc/icorjitinfoimpl_generated.h @@ -413,6 +413,9 @@ void getFieldInfo( uint32_t getNonGCThreadLocalFieldInfo( CORINFO_FIELD_HANDLE field) override; +uint32_t getGCThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field) override; + void getThreadLocalStaticBlocksInfo( CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) override; diff --git a/src/coreclr/jit/ICorJitInfo_names_generated.h b/src/coreclr/jit/ICorJitInfo_names_generated.h index 7de8b47d8ea07..ceeeed0a1cb96 100644 --- a/src/coreclr/jit/ICorJitInfo_names_generated.h +++ b/src/coreclr/jit/ICorJitInfo_names_generated.h @@ -103,6 +103,7 @@ DEF_CLR_API(getFieldType) DEF_CLR_API(getFieldOffset) DEF_CLR_API(getFieldInfo) DEF_CLR_API(getNonGCThreadLocalFieldInfo) +DEF_CLR_API(getGCThreadLocalFieldInfo) DEF_CLR_API(getThreadLocalStaticBlocksInfo) DEF_CLR_API(isFieldStatic) DEF_CLR_API(getArrayOrStringLength) diff --git a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp index 4266bc790e8bf..5874c975a7386 100644 --- a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp +++ b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp @@ -980,6 +980,15 @@ uint32_t WrapICorJitInfo::getNonGCThreadLocalFieldInfo( return temp; } +uint32_t WrapICorJitInfo::getGCThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field) +{ + API_ENTER(getGCThreadLocalFieldInfo); + uint32_t temp = wrapHnd->getGCThreadLocalFieldInfo(field); + API_LEAVE(getGCThreadLocalFieldInfo); + return temp; +} + void WrapICorJitInfo::getThreadLocalStaticBlocksInfo( CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 3ef2e1c671119..d454b23cb7e78 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -2867,6 +2867,15 @@ private uint getNonGCThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld) return 0; } +#pragma warning disable CA1822 // Mark members as static + private uint getGCThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld) +#pragma warning restore CA1822 // Mark members as static + { + // Implemented for JIT only for now. + + return 0; + } + #pragma warning disable CA1822 // Mark members as static private void getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) #pragma warning restore CA1822 // Mark members as static diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs index 38c004b058aec..8c27580b5df58 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs @@ -1479,6 +1479,21 @@ private static uint _getNonGCThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppE } } + [UnmanagedCallersOnly] + private static uint _getGCThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_FIELD_STRUCT_* field) + { + var _this = GetThis(thisHandle); + try + { + return _this.getGCThreadLocalFieldInfo(field); + } + catch (Exception ex) + { + *ppException = _this.AllocException(ex); + return default; + } + } + [UnmanagedCallersOnly] private static void _getThreadLocalStaticBlocksInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { @@ -2730,7 +2745,7 @@ private static uint _getJitFlags(IntPtr thisHandle, IntPtr* ppException, CORJIT_ private static IntPtr GetUnmanagedCallbacks() { - void** callbacks = (void**)Marshal.AllocCoTaskMem(sizeof(IntPtr) * 184); + void** callbacks = (void**)Marshal.AllocCoTaskMem(sizeof(IntPtr) * 185); callbacks[0] = (delegate* unmanaged)&_isIntrinsic; callbacks[1] = (delegate* unmanaged)&_getMethodAttribs; @@ -2831,91 +2846,92 @@ private static IntPtr GetUnmanagedCallbacks() callbacks[96] = (delegate* unmanaged)&_getFieldOffset; callbacks[97] = (delegate* unmanaged)&_getFieldInfo; callbacks[98] = (delegate* unmanaged)&_getNonGCThreadLocalFieldInfo; - callbacks[99] = (delegate* unmanaged)&_getThreadLocalStaticBlocksInfo; - callbacks[100] = (delegate* unmanaged)&_isFieldStatic; - callbacks[101] = (delegate* unmanaged)&_getArrayOrStringLength; - callbacks[102] = (delegate* unmanaged)&_getBoundaries; - callbacks[103] = (delegate* unmanaged)&_setBoundaries; - callbacks[104] = (delegate* unmanaged)&_getVars; - callbacks[105] = (delegate* unmanaged)&_setVars; - callbacks[106] = (delegate* unmanaged)&_reportRichMappings; - callbacks[107] = (delegate* unmanaged)&_allocateArray; - callbacks[108] = (delegate* unmanaged)&_freeArray; - callbacks[109] = (delegate* unmanaged)&_getArgNext; - callbacks[110] = (delegate* unmanaged)&_getArgType; - callbacks[111] = (delegate* unmanaged)&_getExactClasses; - callbacks[112] = (delegate* unmanaged)&_getArgClass; - callbacks[113] = (delegate* unmanaged)&_getHFAType; - callbacks[114] = (delegate* unmanaged)&_GetErrorHRESULT; - callbacks[115] = (delegate* unmanaged)&_GetErrorMessage; - callbacks[116] = (delegate* unmanaged)&_FilterException; - callbacks[117] = (delegate* unmanaged)&_ThrowExceptionForJitResult; - callbacks[118] = (delegate* unmanaged)&_ThrowExceptionForHelper; - callbacks[119] = (delegate* unmanaged)&_runWithErrorTrap; - callbacks[120] = (delegate* unmanaged)&_runWithSPMIErrorTrap; - callbacks[121] = (delegate* unmanaged)&_getEEInfo; - callbacks[122] = (delegate* unmanaged)&_getJitTimeLogFilename; - callbacks[123] = (delegate* unmanaged)&_getMethodDefFromMethod; - callbacks[124] = (delegate* unmanaged)&_printMethodName; - callbacks[125] = (delegate* unmanaged)&_getMethodNameFromMetadata; - callbacks[126] = (delegate* unmanaged)&_getMethodHash; - callbacks[127] = (delegate* unmanaged)&_findNameOfToken; - callbacks[128] = (delegate* unmanaged)&_getSystemVAmd64PassStructInRegisterDescriptor; - callbacks[129] = (delegate* unmanaged)&_getLoongArch64PassStructInRegisterFlags; - callbacks[130] = (delegate* unmanaged)&_getRISCV64PassStructInRegisterFlags; - callbacks[131] = (delegate* unmanaged)&_getThreadTLSIndex; - callbacks[132] = (delegate* unmanaged)&_getInlinedCallFrameVptr; - callbacks[133] = (delegate* unmanaged)&_getAddrOfCaptureThreadGlobal; - callbacks[134] = (delegate* unmanaged)&_getHelperFtn; - callbacks[135] = (delegate* unmanaged)&_getFunctionEntryPoint; - callbacks[136] = (delegate* unmanaged)&_getFunctionFixedEntryPoint; - callbacks[137] = (delegate* unmanaged)&_getMethodSync; - callbacks[138] = (delegate* unmanaged)&_getLazyStringLiteralHelper; - callbacks[139] = (delegate* unmanaged)&_embedModuleHandle; - callbacks[140] = (delegate* unmanaged)&_embedClassHandle; - callbacks[141] = (delegate* unmanaged)&_embedMethodHandle; - callbacks[142] = (delegate* unmanaged)&_embedFieldHandle; - callbacks[143] = (delegate* unmanaged)&_embedGenericHandle; - callbacks[144] = (delegate* unmanaged)&_getLocationOfThisType; - callbacks[145] = (delegate* unmanaged)&_getAddressOfPInvokeTarget; - callbacks[146] = (delegate* unmanaged)&_GetCookieForPInvokeCalliSig; - callbacks[147] = (delegate* unmanaged)&_canGetCookieForPInvokeCalliSig; - callbacks[148] = (delegate* unmanaged)&_getJustMyCodeHandle; - callbacks[149] = (delegate* unmanaged)&_GetProfilingHandle; - callbacks[150] = (delegate* unmanaged)&_getCallInfo; - callbacks[151] = (delegate* unmanaged)&_canAccessFamily; - callbacks[152] = (delegate* unmanaged)&_isRIDClassDomainID; - callbacks[153] = (delegate* unmanaged)&_getClassDomainID; - callbacks[154] = (delegate* unmanaged)&_getStaticFieldContent; - callbacks[155] = (delegate* unmanaged)&_getObjectContent; - callbacks[156] = (delegate* unmanaged)&_getStaticFieldCurrentClass; - callbacks[157] = (delegate* unmanaged)&_getVarArgsHandle; - callbacks[158] = (delegate* unmanaged)&_canGetVarArgsHandle; - callbacks[159] = (delegate* unmanaged)&_constructStringLiteral; - callbacks[160] = (delegate* unmanaged)&_emptyStringLiteral; - callbacks[161] = (delegate* unmanaged)&_getFieldThreadLocalStoreID; - callbacks[162] = (delegate* unmanaged)&_GetDelegateCtor; - callbacks[163] = (delegate* unmanaged)&_MethodCompileComplete; - callbacks[164] = (delegate* unmanaged)&_getTailCallHelpers; - callbacks[165] = (delegate* unmanaged)&_convertPInvokeCalliToCall; - callbacks[166] = (delegate* unmanaged)&_notifyInstructionSetUsage; - callbacks[167] = (delegate* unmanaged)&_updateEntryPointForTailCall; - callbacks[168] = (delegate* unmanaged)&_allocMem; - callbacks[169] = (delegate* unmanaged)&_reserveUnwindInfo; - callbacks[170] = (delegate* unmanaged)&_allocUnwindInfo; - callbacks[171] = (delegate* unmanaged)&_allocGCInfo; - callbacks[172] = (delegate* unmanaged)&_setEHcount; - callbacks[173] = (delegate* unmanaged)&_setEHinfo; - callbacks[174] = (delegate* unmanaged)&_logMsg; - callbacks[175] = (delegate* unmanaged)&_doAssert; - callbacks[176] = (delegate* unmanaged)&_reportFatalError; - callbacks[177] = (delegate* unmanaged)&_getPgoInstrumentationResults; - callbacks[178] = (delegate* unmanaged)&_allocPgoInstrumentationBySchema; - callbacks[179] = (delegate* unmanaged)&_recordCallSite; - callbacks[180] = (delegate* unmanaged)&_recordRelocation; - callbacks[181] = (delegate* unmanaged)&_getRelocTypeHint; - callbacks[182] = (delegate* unmanaged)&_getExpectedTargetArchitecture; - callbacks[183] = (delegate* unmanaged)&_getJitFlags; + callbacks[99] = (delegate* unmanaged)&_getGCThreadLocalFieldInfo; + callbacks[100] = (delegate* unmanaged)&_getThreadLocalStaticBlocksInfo; + callbacks[101] = (delegate* unmanaged)&_isFieldStatic; + callbacks[102] = (delegate* unmanaged)&_getArrayOrStringLength; + callbacks[103] = (delegate* unmanaged)&_getBoundaries; + callbacks[104] = (delegate* unmanaged)&_setBoundaries; + callbacks[105] = (delegate* unmanaged)&_getVars; + callbacks[106] = (delegate* unmanaged)&_setVars; + callbacks[107] = (delegate* unmanaged)&_reportRichMappings; + callbacks[108] = (delegate* unmanaged)&_allocateArray; + callbacks[109] = (delegate* unmanaged)&_freeArray; + callbacks[110] = (delegate* unmanaged)&_getArgNext; + callbacks[111] = (delegate* unmanaged)&_getArgType; + callbacks[112] = (delegate* unmanaged)&_getExactClasses; + callbacks[113] = (delegate* unmanaged)&_getArgClass; + callbacks[114] = (delegate* unmanaged)&_getHFAType; + callbacks[115] = (delegate* unmanaged)&_GetErrorHRESULT; + callbacks[116] = (delegate* unmanaged)&_GetErrorMessage; + callbacks[117] = (delegate* unmanaged)&_FilterException; + callbacks[118] = (delegate* unmanaged)&_ThrowExceptionForJitResult; + callbacks[119] = (delegate* unmanaged)&_ThrowExceptionForHelper; + callbacks[120] = (delegate* unmanaged)&_runWithErrorTrap; + callbacks[121] = (delegate* unmanaged)&_runWithSPMIErrorTrap; + callbacks[122] = (delegate* unmanaged)&_getEEInfo; + callbacks[123] = (delegate* unmanaged)&_getJitTimeLogFilename; + callbacks[124] = (delegate* unmanaged)&_getMethodDefFromMethod; + callbacks[125] = (delegate* unmanaged)&_printMethodName; + callbacks[126] = (delegate* unmanaged)&_getMethodNameFromMetadata; + callbacks[127] = (delegate* unmanaged)&_getMethodHash; + callbacks[128] = (delegate* unmanaged)&_findNameOfToken; + callbacks[129] = (delegate* unmanaged)&_getSystemVAmd64PassStructInRegisterDescriptor; + callbacks[130] = (delegate* unmanaged)&_getLoongArch64PassStructInRegisterFlags; + callbacks[131] = (delegate* unmanaged)&_getRISCV64PassStructInRegisterFlags; + callbacks[132] = (delegate* unmanaged)&_getThreadTLSIndex; + callbacks[133] = (delegate* unmanaged)&_getInlinedCallFrameVptr; + callbacks[134] = (delegate* unmanaged)&_getAddrOfCaptureThreadGlobal; + callbacks[135] = (delegate* unmanaged)&_getHelperFtn; + callbacks[136] = (delegate* unmanaged)&_getFunctionEntryPoint; + callbacks[137] = (delegate* unmanaged)&_getFunctionFixedEntryPoint; + callbacks[138] = (delegate* unmanaged)&_getMethodSync; + callbacks[139] = (delegate* unmanaged)&_getLazyStringLiteralHelper; + callbacks[140] = (delegate* unmanaged)&_embedModuleHandle; + callbacks[141] = (delegate* unmanaged)&_embedClassHandle; + callbacks[142] = (delegate* unmanaged)&_embedMethodHandle; + callbacks[143] = (delegate* unmanaged)&_embedFieldHandle; + callbacks[144] = (delegate* unmanaged)&_embedGenericHandle; + callbacks[145] = (delegate* unmanaged)&_getLocationOfThisType; + callbacks[146] = (delegate* unmanaged)&_getAddressOfPInvokeTarget; + callbacks[147] = (delegate* unmanaged)&_GetCookieForPInvokeCalliSig; + callbacks[148] = (delegate* unmanaged)&_canGetCookieForPInvokeCalliSig; + callbacks[149] = (delegate* unmanaged)&_getJustMyCodeHandle; + callbacks[150] = (delegate* unmanaged)&_GetProfilingHandle; + callbacks[151] = (delegate* unmanaged)&_getCallInfo; + callbacks[152] = (delegate* unmanaged)&_canAccessFamily; + callbacks[153] = (delegate* unmanaged)&_isRIDClassDomainID; + callbacks[154] = (delegate* unmanaged)&_getClassDomainID; + callbacks[155] = (delegate* unmanaged)&_getStaticFieldContent; + callbacks[156] = (delegate* unmanaged)&_getObjectContent; + callbacks[157] = (delegate* unmanaged)&_getStaticFieldCurrentClass; + callbacks[158] = (delegate* unmanaged)&_getVarArgsHandle; + callbacks[159] = (delegate* unmanaged)&_canGetVarArgsHandle; + callbacks[160] = (delegate* unmanaged)&_constructStringLiteral; + callbacks[161] = (delegate* unmanaged)&_emptyStringLiteral; + callbacks[162] = (delegate* unmanaged)&_getFieldThreadLocalStoreID; + callbacks[163] = (delegate* unmanaged)&_GetDelegateCtor; + callbacks[164] = (delegate* unmanaged)&_MethodCompileComplete; + callbacks[165] = (delegate* unmanaged)&_getTailCallHelpers; + callbacks[166] = (delegate* unmanaged)&_convertPInvokeCalliToCall; + callbacks[167] = (delegate* unmanaged)&_notifyInstructionSetUsage; + callbacks[168] = (delegate* unmanaged)&_updateEntryPointForTailCall; + callbacks[169] = (delegate* unmanaged)&_allocMem; + callbacks[170] = (delegate* unmanaged)&_reserveUnwindInfo; + callbacks[171] = (delegate* unmanaged)&_allocUnwindInfo; + callbacks[172] = (delegate* unmanaged)&_allocGCInfo; + callbacks[173] = (delegate* unmanaged)&_setEHcount; + callbacks[174] = (delegate* unmanaged)&_setEHinfo; + callbacks[175] = (delegate* unmanaged)&_logMsg; + callbacks[176] = (delegate* unmanaged)&_doAssert; + callbacks[177] = (delegate* unmanaged)&_reportFatalError; + callbacks[178] = (delegate* unmanaged)&_getPgoInstrumentationResults; + callbacks[179] = (delegate* unmanaged)&_allocPgoInstrumentationBySchema; + callbacks[180] = (delegate* unmanaged)&_recordCallSite; + callbacks[181] = (delegate* unmanaged)&_recordRelocation; + callbacks[182] = (delegate* unmanaged)&_getRelocTypeHint; + callbacks[183] = (delegate* unmanaged)&_getExpectedTargetArchitecture; + callbacks[184] = (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 73179d168739f..a6ef5856781f7 100644 --- a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt +++ b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt @@ -258,6 +258,7 @@ FUNCTIONS unsigned getFieldOffset(CORINFO_FIELD_HANDLE field) void getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult) uint32_t getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) + uint32_t getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) void getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) int getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) diff --git a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h index 3e510aa87f4f9..6810651196890 100644 --- a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h +++ b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h @@ -110,6 +110,7 @@ struct JitInterfaceCallbacks unsigned (* getFieldOffset)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); void (* getFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); uint32_t (* getNonGCThreadLocalFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); + uint32_t (* getGCThreadLocalFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); void (* getThreadLocalStaticBlocksInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); bool (* isFieldStatic)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE fldHnd); int (* getArrayOrStringLength)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_OBJECT_HANDLE objHnd); @@ -1178,6 +1179,15 @@ class JitInterfaceWrapper : public ICorJitInfo return temp; } + virtual uint32_t getGCThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field) +{ + CorInfoExceptionClass* pException = nullptr; + uint32_t temp = _callbacks->getGCThreadLocalFieldInfo(_thisHandle, &pException, field); + if (pException != nullptr) throw pException; + return temp; +} + virtual void getThreadLocalStaticBlocksInfo( CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { diff --git a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h index 686ff7068b1f1..af0ea4b933623 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h @@ -39,6 +39,7 @@ LWM(EmbedGenericHandle, Agnostic_EmbedGenericHandle, Agnostic_CORINFO_GENERICHAN LWM(EmbedMethodHandle, DWORDLONG, DLDL) LWM(EmbedModuleHandle, DWORDLONG, DLDL) LWM(GetNonGCThreadLocalFieldInfo, DWORDLONG, DWORD) +LWM(GetGCThreadLocalFieldInfo, DWORDLONG, DWORD) LWM(GetThreadLocalStaticBlocksInfo, DWORD, Agnostic_GetThreadLocalStaticBlocksInfo) DENSELWM(EmptyStringLiteral, DLD) DENSELWM(ErrorList, DWORD) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index c69471d6bd72e..3d5dbb5eb68b6 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3655,6 +3655,33 @@ uint32_t MethodContext::repGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE fie return value; } +void MethodContext::recGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result) +{ + if (GetGCThreadLocalFieldInfo == nullptr) + GetGCThreadLocalFieldInfo = new LightWeightMap(); + + DWORDLONG key = 0; + + key = CastHandle(field); + GetGCThreadLocalFieldInfo->Add(key, result); + DEBUG_REC(dmpGetGCThreadLocalFieldInfo(key, result)); +} + +void MethodContext::dmpGetGCThreadLocalFieldInfo(DWORDLONG key, DWORD value) +{ + printf("GetGCThreadLocalFieldInfo key hnd-%016" PRIX64 ", result-%u", key, value); +} + +uint32_t MethodContext::repGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +{ + DWORDLONG key = CastHandle(field); + DWORD value = LookupByKeyOrMiss(GetGCThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); + + DEBUG_REP(dmpGetNonGCThreadLocalFieldInfo(key, value)); + + return value; +} + void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { if (GetThreadLocalStaticBlocksInfo == nullptr) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h index 7aac93a564c04..3088498944ec8 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h @@ -489,6 +489,10 @@ class MethodContext void dmpGetNonGCThreadLocalFieldInfo(DWORDLONG key, DWORD value); uint32_t repGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); + void recGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result); + void dmpGetGCThreadLocalFieldInfo(DWORDLONG key, DWORD value); + uint32_t repGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); + void recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); void dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value); void repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); @@ -1185,9 +1189,10 @@ enum mcPackets Packet_GetIsClassInitedFlagAddress = 205, Packet_GetStaticBaseAddress = 206, Packet_GetNonGCThreadLocalFieldInfo = 207, - Packet_GetThreadLocalStaticBlocksInfo = 208, - Packet_GetRISCV64PassStructInRegisterFlags = 209, - Packet_GetObjectContent = 210, + Packet_GetGCThreadLocalFieldInfo = 208, + Packet_GetThreadLocalStaticBlocksInfo = 209, + Packet_GetRISCV64PassStructInRegisterFlags = 210, + Packet_GetObjectContent = 211, }; void SetDebugDumpVariables(); diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp index cf9d9380d718c..7a0229eb70181 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -1104,6 +1104,14 @@ uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE fie return result; } +uint32_t interceptor_ICJI::getGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +{ + mc->cr->AddCall("getGCThreadLocalFieldInfo"); + uint32_t result = original_ICorJitInfo->getGCThreadLocalFieldInfo(field); + mc->recGetGCThreadLocalFieldInfo(field, result); + return result; +} + void interceptor_ICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { mc->cr->AddCall("getThreadLocalStaticBlocksInfo"); 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 31c5ec9af8b78..67f520a9d7edc 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp @@ -800,6 +800,13 @@ uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo( return original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); } +uint32_t interceptor_ICJI::getGCThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field) +{ + mcs->AddCall("getGCThreadLocalFieldInfo"); + return original_ICorJitInfo->getGCThreadLocalFieldInfo(field); +} + void interceptor_ICJI::getThreadLocalStaticBlocksInfo( CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { 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 b9d9743233627..cc2098c3c83f8 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp @@ -701,6 +701,12 @@ uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo( return original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); } +uint32_t interceptor_ICJI::getGCThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field) +{ + return original_ICorJitInfo->getGCThreadLocalFieldInfo(field); +} + void interceptor_ICJI::getThreadLocalStaticBlocksInfo( CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index 4e41a7d9f376e..a30802a0231b2 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -923,6 +923,12 @@ uint32_t MyICJI::getNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) return jitInstance->mc->repGetNonGCThreadLocalFieldInfo(field); } +uint32_t MyICJI::getGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +{ + jitInstance->mc->cr->AddCall("getGCThreadLocalFieldInfo"); + return jitInstance->mc->repGetGCThreadLocalFieldInfo(field); +} + void MyICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { jitInstance->mc->cr->AddCall("getThreadLocalStaticBlocksInfo"); diff --git a/src/coreclr/vm/appdomain.cpp b/src/coreclr/vm/appdomain.cpp index 7dcca418486a1..074071a421fad 100644 --- a/src/coreclr/vm/appdomain.cpp +++ b/src/coreclr/vm/appdomain.cpp @@ -4704,6 +4704,31 @@ PTR_MethodTable BaseDomain::LookupNonGCThreadStaticBlockType(UINT32 id) { CONSISTENCY_CHECK(CheckPointer(pMT)); return pMT; } +//------------------------------------------------------------------------ +UINT32 BaseDomain::GetGCThreadStaticTypeIndex(PTR_MethodTable pMT) +{ + CONTRACTL { + THROWS; + GC_TRIGGERS; + PRECONDITION(pMT->GetDomain() == this); + } CONTRACTL_END; + + return m_GCThreadStaticBlockTypeIDMap.GetTypeID(pMT, false); +} + +//------------------------------------------------------------------------ +PTR_MethodTable BaseDomain::LookupGCThreadStaticBlockType(UINT32 id) { + CONTRACTL { + NOTHROW; + WRAPPER(GC_TRIGGERS); + CONSISTENCY_CHECK(id != TYPE_ID_THIS_CLASS); + } CONTRACTL_END; + + PTR_MethodTable pMT = m_GCThreadStaticBlockTypeIDMap.LookupType(id); + + CONSISTENCY_CHECK(CheckPointer(pMT)); + return pMT; +} #endif // HOST_WINDOWS #ifndef DACCESS_COMPILE diff --git a/src/coreclr/vm/appdomain.hpp b/src/coreclr/vm/appdomain.hpp index 41840e5112cab..d11ddc7585e17 100644 --- a/src/coreclr/vm/appdomain.hpp +++ b/src/coreclr/vm/appdomain.hpp @@ -1226,6 +1226,7 @@ class BaseDomain // During execution corresponding thread static data blocks are stored in `t_NonGCThreadStaticBlocks` // and `t_GCThreadStaticBlocks` array at the `typeIndex`. TypeIDMap m_NonGCThreadStaticBlockTypeIDMap; + TypeIDMap m_GCThreadStaticBlockTypeIDMap; #endif // HOST_WINDOWS @@ -1235,8 +1236,10 @@ class BaseDomain void InitNonGCThreadStaticBlockTypeMap(); UINT32 GetNonGCThreadStaticTypeIndex(PTR_MethodTable pMT); + UINT32 GetGCThreadStaticTypeIndex(PTR_MethodTable pMT); PTR_MethodTable LookupNonGCThreadStaticBlockType(UINT32 id); + PTR_MethodTable LookupGCThreadStaticBlockType(UINT32 id); #endif UINT32 GetTypeID(PTR_MethodTable pMT); diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 172a2a753b9e4..8032f5774b192 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1810,6 +1810,30 @@ uint32_t CEEInfo::getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) return typeIndex; } +/*********************************************************************/ +uint32_t CEEInfo::getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) +{ + CONTRACTL { + THROWS; + GC_TRIGGERS; + MODE_PREEMPTIVE; + } CONTRACTL_END; + + UINT32 typeIndex = 0; + + JIT_TO_EE_TRANSITION(); + + FieldDesc* fieldDesc = (FieldDesc*)field; + _ASSERTE(fieldDesc->IsThreadStatic()); + + typeIndex = AppDomain::GetCurrentDomain()->GetGCThreadStaticTypeIndex(fieldDesc->GetEnclosingMethodTable()); + + assert(typeIndex != TypeIDProvider::INVALID_TYPE_ID); + + EE_TO_JIT_TRANSITION(); + return typeIndex; +} + /*********************************************************************/ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { @@ -1844,6 +1868,17 @@ uint32_t CEEInfo::getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) return 0; } +uint32_t CEEInfo::getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) +{ + CONTRACTL { + NOTHROW; + GC_NOTRIGGER; + MODE_PREEMPTIVE; + } CONTRACTL_END; + + return 0; +} + void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) { CONTRACTL { From cea1888bd5d7d263f06a03bd3b7e9b8f142b94b3 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Tue, 9 May 2023 12:28:01 -0700 Subject: [PATCH 11/21] Use GCThreadLocalFieldInfo() --- src/coreclr/jit/compiler.h | 1 + src/coreclr/jit/ee_il_dll.hpp | 6 ++++++ src/coreclr/jit/helperexpansion.cpp | 2 +- src/coreclr/jit/importer.cpp | 10 +++++++++- .../tools/superpmi/superpmi-shared/methodcontext.cpp | 2 +- src/coreclr/vm/appdomain.cpp | 1 + src/coreclr/vm/jithelpers.cpp | 2 +- 7 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 9be7b70bfe045..59c1b4d6b9da1 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -7828,6 +7828,7 @@ class Compiler CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); uint32_t eeGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); + uint32_t eeGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); // Get the flags diff --git a/src/coreclr/jit/ee_il_dll.hpp b/src/coreclr/jit/ee_il_dll.hpp index b6edf4289f037..59e0457fdee43 100644 --- a/src/coreclr/jit/ee_il_dll.hpp +++ b/src/coreclr/jit/ee_il_dll.hpp @@ -50,6 +50,12 @@ uint32_t Compiler::eeGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) return info.compCompHnd->getNonGCThreadLocalFieldInfo(field); } +FORCEINLINE +uint32_t Compiler::eeGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +{ + return info.compCompHnd->getGCThreadLocalFieldInfo(field); +} + /***************************************************************************** * * VOS info, method sigs, etc diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index 1c64d26f37ae1..11fe603be6d2b 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -608,7 +608,7 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* gtNewOperNode(GT_ADD, TYP_I_IMPL, threadStaticBlocksValue, typeThreadStaticBlockIndexValue); GenTree* typeThreadStaticBlockValue = gtNewIndir(TYP_I_IMPL, typeThreadStaticBlockRef, GTF_IND_NONFAULTING); - if (eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) + if (isGCThreadStatic) { // Need to add extra indirection to access the data pointer. // TODO: Get the offsetOfDataPtr() from runtime. diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index 28e5b44b16bb5..d5569af85cf1a 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -4133,7 +4133,15 @@ GenTree* Compiler::impImportStaticFieldAccess(CORINFO_RESOLVED_TOKEN* pResolvedT case CORINFO_FIELD_STATIC_TLS_MANAGED: - typeIndex = info.compCompHnd->getNonGCThreadLocalFieldInfo(pResolvedToken->hField); + if (pFieldInfo->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) + { + typeIndex = info.compCompHnd->getNonGCThreadLocalFieldInfo(pResolvedToken->hField); + } + else + { + assert(pFieldInfo->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED); + typeIndex = info.compCompHnd->getGCThreadLocalFieldInfo(pResolvedToken->hField); + } FALLTHROUGH; case CORINFO_FIELD_STATIC_SHARED_STATIC_HELPER: diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 3d5dbb5eb68b6..51eb17b27d59f 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3677,7 +3677,7 @@ uint32_t MethodContext::repGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) DWORDLONG key = CastHandle(field); DWORD value = LookupByKeyOrMiss(GetGCThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); - DEBUG_REP(dmpGetNonGCThreadLocalFieldInfo(key, value)); + DEBUG_REP(dmpGetGCThreadLocalFieldInfo(key, value)); return value; } diff --git a/src/coreclr/vm/appdomain.cpp b/src/coreclr/vm/appdomain.cpp index 074071a421fad..9d7ccdc601d76 100644 --- a/src/coreclr/vm/appdomain.cpp +++ b/src/coreclr/vm/appdomain.cpp @@ -671,6 +671,7 @@ void BaseDomain::InitNonGCThreadStaticBlockTypeMap() STANDARD_VM_CONTRACT; m_NonGCThreadStaticBlockTypeIDMap.Init(); + m_GCThreadStaticBlockTypeIDMap.Init(); } #endif // HOST_WINDOWS diff --git a/src/coreclr/vm/jithelpers.cpp b/src/coreclr/vm/jithelpers.cpp index a89e339e805ee..d4ce2c9aa69ac 100644 --- a/src/coreclr/vm/jithelpers.cpp +++ b/src/coreclr/vm/jithelpers.cpp @@ -1943,7 +1943,7 @@ HCIMPL1(void*, JIT_GetSharedGCThreadStaticBaseOptimized, UINT32 staticBlockIndex HELPER_METHOD_FRAME_BEGIN_RET_0(); // Set up a frame - MethodTable * pMT = AppDomain::GetCurrentDomain()->LookupNonGCThreadStaticBlockType(staticBlockIndex); + MethodTable * pMT = AppDomain::GetCurrentDomain()->LookupGCThreadStaticBlockType(staticBlockIndex); _ASSERTE(!pMT->HasGenericsStaticsInfo()); // Get the TLM From 7ba1bdaaca41a045ddfa60bb2a1663bf578fcc82 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 10 May 2023 12:23:21 -0700 Subject: [PATCH 12/21] fix the bug about gc tracking --- src/coreclr/inc/corinfo.h | 1 + src/coreclr/jit/flowgraph.cpp | 2 +- src/coreclr/jit/helperexpansion.cpp | 27 ++++++++++--------- .../tools/Common/JitInterface/CorInfoTypes.cs | 1 + .../tools/superpmi/superpmi-shared/agnostic.h | 1 + .../superpmi-shared/methodcontext.cpp | 7 +++-- src/coreclr/vm/jitinterface.cpp | 2 ++ 7 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index d6c042291b59c..23c11217cb843 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -1740,6 +1740,7 @@ struct CORINFO_THREAD_STATIC_BLOCKS_INFO uint32_t offsetOfGCMaxThreadStaticBlocks; uint32_t offsetOfNonGCThreadStaticBlocks; uint32_t offsetOfGCThreadStaticBlocks; + uint32_t offsetOfGCDataPointer; }; //---------------------------------------------------------------------------- diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index fa8ed6303f82a..33173d849f4ee 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -716,6 +716,7 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo switch (helper) { case CORINFO_HELP_GETSHARED_GCSTATIC_BASE_NOCTOR: + case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: bNeedClassID = false; FALLTHROUGH; @@ -733,7 +734,6 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo break; case CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: - case CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED: case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR: bNeedClassID = false; FALLTHROUGH; diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index 11fe603be6d2b..156828bba9df4 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -512,6 +512,7 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* JITDUMP("offsetOfThreadLocalStoragePointer= %u\n", threadStaticBlocksInfo.offsetOfThreadLocalStoragePointer); JITDUMP("offsetOfMaxThreadStaticBlocks= %u\n", offsetOfMaxThreadStaticBlocksVal); JITDUMP("offsetOfThreadStaticBlocks= %u\n", offsetOfThreadStaticBlocksVal); + JITDUMP("offsetOfGCDataPointer= %u\n", threadStaticBlocksInfo.offsetOfGCDataPointer); assert(threadStaticBlocksInfo.tlsIndex.accessType == IAT_VALUE); assert((eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) || @@ -527,6 +528,7 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* DebugInfo debugInfo = stmt->GetDebugInfo(); block = fgSplitBlockBeforeTree(block, stmt, call, &newFirstStmt, &callUse); *pBlock = block; + var_types callType = call->TypeGet(); assert(prevBb != nullptr && block != nullptr); // Block ops inserted by the split need to be morphed here since we are after morph. @@ -542,8 +544,8 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* // Grab a temp to store result (it's assigned from either fastPathBb or fallbackBb) unsigned threadStaticBlockLclNum = lvaGrabTemp(true DEBUGARG("TLS field access")); - lvaTable[threadStaticBlockLclNum].lvType = TYP_I_IMPL; - threadStaticBlockLcl = gtNewLclvNode(threadStaticBlockLclNum, call->TypeGet()); + lvaTable[threadStaticBlockLclNum].lvType = callType; + threadStaticBlockLcl = gtNewLclvNode(threadStaticBlockLclNum, callType); *callUse = gtClone(threadStaticBlockLcl); @@ -608,16 +610,6 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* gtNewOperNode(GT_ADD, TYP_I_IMPL, threadStaticBlocksValue, typeThreadStaticBlockIndexValue); GenTree* typeThreadStaticBlockValue = gtNewIndir(TYP_I_IMPL, typeThreadStaticBlockRef, GTF_IND_NONFAULTING); - if (isGCThreadStatic) - { - // Need to add extra indirection to access the data pointer. - // TODO: Get the offsetOfDataPtr() from runtime. - - typeThreadStaticBlockValue = gtNewIndir(TYP_I_IMPL, typeThreadStaticBlockValue, GTF_IND_NONFAULTING); - typeThreadStaticBlockValue = - gtNewOperNode(GT_ADD, TYP_I_IMPL, typeThreadStaticBlockValue, gtNewIconNode(16, TYP_I_IMPL)); - } - // Cache the threadStaticBlock value unsigned threadStaticBlockBaseLclNum = lvaGrabTemp(true DEBUGARG("ThreadStaticBlockBase access")); lvaTable[threadStaticBlockBaseLclNum].lvType = TYP_I_IMPL; @@ -670,6 +662,17 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* fgNewBBFromTreeAfter(BBJ_ALWAYS, threadStaticBlockNullCondBB, fallbackValueDef, debugInfo, true); // fastPathBb + if (isGCThreadStatic) + { + // Need to add extra indirection to access the data pointer. + + threadStaticBlockBaseLclValueUse = + gtNewIndir(TYP_I_IMPL, threadStaticBlockBaseLclValueUse, GTF_IND_NONFAULTING); + threadStaticBlockBaseLclValueUse = + gtNewOperNode(GT_ADD, callType, threadStaticBlockBaseLclValueUse, + gtNewIconNode(threadStaticBlocksInfo.offsetOfGCDataPointer, TYP_I_IMPL)); + } + GenTree* fastPathValueDef = gtNewStoreLclVarNode(threadStaticBlockLclNum, gtCloneExpr(threadStaticBlockBaseLclValueUse)); BasicBlock* fastPathBb = fgNewBBFromTreeAfter(BBJ_ALWAYS, fallbackBb, fastPathValueDef, debugInfo, true); diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 71cee5b63e7a9..8513e3a0c637a 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1162,6 +1162,7 @@ public unsafe struct CORINFO_THREAD_STATIC_BLOCKS_INFO public CORINFO_CONST_LOOKUP offsetOfGCMaxThreadStaticBlocks; public CORINFO_CONST_LOOKUP offsetOfNonGCThreadStaticBlocks; public CORINFO_CONST_LOOKUP offsetOfGCThreadStaticBlocks; + public CORINFO_CONST_LOOKUP offsetOfGCDataPointer; }; // System V struct passing diff --git a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h index 5f4d81c6398f2..298824e8f29df 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h @@ -526,6 +526,7 @@ struct Agnostic_GetThreadLocalStaticBlocksInfo UINT offsetOfGCMaxThreadStaticBlocks; UINT offsetOfNonGCThreadStaticBlocks; UINT offsetOfGCThreadStaticBlocks; + UINT offsetOfGCDataPointer; }; struct Agnostic_GetThreadLocalFieldInfo diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 51eb17b27d59f..b7e3976c90fa5 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3697,6 +3697,7 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC value.offsetOfThreadLocalStoragePointer = pInfo->offsetOfThreadLocalStoragePointer; value.offsetOfNonGCThreadStaticBlocks = pInfo->offsetOfNonGCThreadStaticBlocks; value.offsetOfGCThreadStaticBlocks = pInfo->offsetOfGCThreadStaticBlocks; + value.offsetOfGCDataPointer = pInfo->offsetOfGCDataPointer; // This data is same for entire process, so just add it against key '0'. GetThreadLocalStaticBlocksInfo->Add(0, value); @@ -3707,9 +3708,10 @@ void MethodContext::dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_ { printf("GetThreadLocalStaticBlocksInfo key 0, value tlsIndex-%016" PRIX64 ", offsetOfNonGCMaxThreadStaticBlocks-%u, offsetOfThreadLocalStoragePointer-%u, offsetOfNonGCThreadStaticBlocks-%u," - ", offsetOfGCMaxThreadStaticBlocks-%u, offsetOfGCThreadStaticBlocks-%u", + ", offsetOfGCMaxThreadStaticBlocks-%u, offsetOfGCThreadStaticBlocks-%u offsetOfGCDataPointer-%u", value.tlsIndex.handle, value.offsetOfNonGCMaxThreadStaticBlocks, value.offsetOfThreadLocalStoragePointer, - value.offsetOfNonGCThreadStaticBlocks, value.offsetOfGCMaxThreadStaticBlocks, value.offsetOfGCThreadStaticBlocks); + value.offsetOfNonGCThreadStaticBlocks, value.offsetOfGCMaxThreadStaticBlocks, + value.offsetOfGCThreadStaticBlocks, value.offsetOfGCDataPointer); } void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) @@ -3725,6 +3727,7 @@ void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC pInfo->offsetOfThreadLocalStoragePointer = value.offsetOfThreadLocalStoragePointer; pInfo->offsetOfNonGCThreadStaticBlocks = value.offsetOfNonGCThreadStaticBlocks; pInfo->offsetOfGCThreadStaticBlocks = value.offsetOfGCThreadStaticBlocks; + pInfo->offsetOfGCDataPointer = value.offsetOfGCDataPointer; } void MethodContext::recEmbedMethodHandle(CORINFO_METHOD_HANDLE handle, diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 8032f5774b192..9411aa7be117f 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1853,6 +1853,7 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo->offsetOfGCThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCThreadStaticBlocks); pInfo->offsetOfNonGCMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCMaxThreadStaticBlocks); pInfo->offsetOfGCMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCMaxThreadStaticBlocks); + pInfo->offsetOfGCDataPointer = static_cast(PtrArray::GetDataOffset()); JIT_TO_EE_TRANSITION_LEAF(); } @@ -1896,6 +1897,7 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo->offsetOfGCThreadStaticBlocks = 0; pInfo->offsetOfNonGCMaxThreadStaticBlocks = 0; pInfo->offsetOfGCMaxThreadStaticBlocks = 0; + pInfo->offsetOfGCDataPointer = 0; JIT_TO_EE_TRANSITION_LEAF(); } From bdf0aa9a46aaa59968b01bf59625f4a147c5cfd9 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 10 May 2023 12:52:16 -0700 Subject: [PATCH 13/21] resolve merge conflicts --- .../JitInterface/CorInfoImpl_generated.cs | 137 +++++++++--------- 1 file changed, 66 insertions(+), 71 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs index 263a3e8b31475..7c4485af3ddf0 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs @@ -2672,7 +2672,7 @@ private static uint _getJitFlags(IntPtr thisHandle, IntPtr* ppException, CORJIT_ private static IntPtr GetUnmanagedCallbacks() { - void** callbacks = (void**)Marshal.AllocCoTaskMem(sizeof(IntPtr) * 185); + void** callbacks = (void**)Marshal.AllocCoTaskMem(sizeof(IntPtr) * 180); callbacks[0] = (delegate* unmanaged)&_isIntrinsic; callbacks[1] = (delegate* unmanaged)&_getMethodAttribs; @@ -2789,76 +2789,71 @@ private static IntPtr GetUnmanagedCallbacks() callbacks[112] = (delegate* unmanaged)&_getExactClasses; callbacks[113] = (delegate* unmanaged)&_getArgClass; callbacks[114] = (delegate* unmanaged)&_getHFAType; - callbacks[115] = (delegate* unmanaged)&_GetErrorHRESULT; - callbacks[116] = (delegate* unmanaged)&_GetErrorMessage; - callbacks[117] = (delegate* unmanaged)&_FilterException; - callbacks[118] = (delegate* unmanaged)&_ThrowExceptionForJitResult; - callbacks[119] = (delegate* unmanaged)&_ThrowExceptionForHelper; - callbacks[120] = (delegate* unmanaged)&_runWithErrorTrap; - callbacks[121] = (delegate* unmanaged)&_runWithSPMIErrorTrap; - callbacks[122] = (delegate* unmanaged)&_getEEInfo; - callbacks[123] = (delegate* unmanaged)&_getJitTimeLogFilename; - callbacks[124] = (delegate* unmanaged)&_getMethodDefFromMethod; - callbacks[125] = (delegate* unmanaged)&_printMethodName; - callbacks[126] = (delegate* unmanaged)&_getMethodNameFromMetadata; - callbacks[127] = (delegate* unmanaged)&_getMethodHash; - callbacks[128] = (delegate* unmanaged)&_findNameOfToken; - callbacks[129] = (delegate* unmanaged)&_getSystemVAmd64PassStructInRegisterDescriptor; - callbacks[130] = (delegate* unmanaged)&_getLoongArch64PassStructInRegisterFlags; - callbacks[131] = (delegate* unmanaged)&_getRISCV64PassStructInRegisterFlags; - callbacks[132] = (delegate* unmanaged)&_getThreadTLSIndex; - callbacks[133] = (delegate* unmanaged)&_getInlinedCallFrameVptr; - callbacks[134] = (delegate* unmanaged)&_getAddrOfCaptureThreadGlobal; - callbacks[135] = (delegate* unmanaged)&_getHelperFtn; - callbacks[136] = (delegate* unmanaged)&_getFunctionEntryPoint; - callbacks[137] = (delegate* unmanaged)&_getFunctionFixedEntryPoint; - callbacks[138] = (delegate* unmanaged)&_getMethodSync; - callbacks[139] = (delegate* unmanaged)&_getLazyStringLiteralHelper; - callbacks[140] = (delegate* unmanaged)&_embedModuleHandle; - callbacks[141] = (delegate* unmanaged)&_embedClassHandle; - callbacks[142] = (delegate* unmanaged)&_embedMethodHandle; - callbacks[143] = (delegate* unmanaged)&_embedFieldHandle; - callbacks[144] = (delegate* unmanaged)&_embedGenericHandle; - callbacks[145] = (delegate* unmanaged)&_getLocationOfThisType; - callbacks[146] = (delegate* unmanaged)&_getAddressOfPInvokeTarget; - callbacks[147] = (delegate* unmanaged)&_GetCookieForPInvokeCalliSig; - callbacks[148] = (delegate* unmanaged)&_canGetCookieForPInvokeCalliSig; - callbacks[149] = (delegate* unmanaged)&_getJustMyCodeHandle; - callbacks[150] = (delegate* unmanaged)&_GetProfilingHandle; - callbacks[151] = (delegate* unmanaged)&_getCallInfo; - callbacks[152] = (delegate* unmanaged)&_canAccessFamily; - callbacks[153] = (delegate* unmanaged)&_isRIDClassDomainID; - callbacks[154] = (delegate* unmanaged)&_getClassDomainID; - callbacks[155] = (delegate* unmanaged)&_getStaticFieldContent; - callbacks[156] = (delegate* unmanaged)&_getObjectContent; - callbacks[157] = (delegate* unmanaged)&_getStaticFieldCurrentClass; - callbacks[158] = (delegate* unmanaged)&_getVarArgsHandle; - callbacks[159] = (delegate* unmanaged)&_canGetVarArgsHandle; - callbacks[160] = (delegate* unmanaged)&_constructStringLiteral; - callbacks[161] = (delegate* unmanaged)&_emptyStringLiteral; - callbacks[162] = (delegate* unmanaged)&_getFieldThreadLocalStoreID; - callbacks[163] = (delegate* unmanaged)&_GetDelegateCtor; - callbacks[164] = (delegate* unmanaged)&_MethodCompileComplete; - callbacks[165] = (delegate* unmanaged)&_getTailCallHelpers; - callbacks[166] = (delegate* unmanaged)&_convertPInvokeCalliToCall; - callbacks[167] = (delegate* unmanaged)&_notifyInstructionSetUsage; - callbacks[168] = (delegate* unmanaged)&_updateEntryPointForTailCall; - callbacks[169] = (delegate* unmanaged)&_allocMem; - callbacks[170] = (delegate* unmanaged)&_reserveUnwindInfo; - callbacks[171] = (delegate* unmanaged)&_allocUnwindInfo; - callbacks[172] = (delegate* unmanaged)&_allocGCInfo; - callbacks[173] = (delegate* unmanaged)&_setEHcount; - callbacks[174] = (delegate* unmanaged)&_setEHinfo; - callbacks[175] = (delegate* unmanaged)&_logMsg; - callbacks[176] = (delegate* unmanaged)&_doAssert; - callbacks[177] = (delegate* unmanaged)&_reportFatalError; - callbacks[178] = (delegate* unmanaged)&_getPgoInstrumentationResults; - callbacks[179] = (delegate* unmanaged)&_allocPgoInstrumentationBySchema; - callbacks[180] = (delegate* unmanaged)&_recordCallSite; - callbacks[181] = (delegate* unmanaged)&_recordRelocation; - callbacks[182] = (delegate* unmanaged)&_getRelocTypeHint; - callbacks[183] = (delegate* unmanaged)&_getExpectedTargetArchitecture; - callbacks[184] = (delegate* unmanaged)&_getJitFlags; + callbacks[115] = (delegate* unmanaged)&_runWithErrorTrap; + callbacks[116] = (delegate* unmanaged)&_runWithSPMIErrorTrap; + callbacks[117] = (delegate* unmanaged)&_getEEInfo; + callbacks[118] = (delegate* unmanaged)&_getJitTimeLogFilename; + callbacks[119] = (delegate* unmanaged)&_getMethodDefFromMethod; + callbacks[120] = (delegate* unmanaged)&_printMethodName; + callbacks[121] = (delegate* unmanaged)&_getMethodNameFromMetadata; + callbacks[122] = (delegate* unmanaged)&_getMethodHash; + callbacks[123] = (delegate* unmanaged)&_findNameOfToken; + callbacks[124] = (delegate* unmanaged)&_getSystemVAmd64PassStructInRegisterDescriptor; + callbacks[125] = (delegate* unmanaged)&_getLoongArch64PassStructInRegisterFlags; + callbacks[126] = (delegate* unmanaged)&_getRISCV64PassStructInRegisterFlags; + callbacks[127] = (delegate* unmanaged)&_getThreadTLSIndex; + callbacks[128] = (delegate* unmanaged)&_getInlinedCallFrameVptr; + callbacks[129] = (delegate* unmanaged)&_getAddrOfCaptureThreadGlobal; + callbacks[130] = (delegate* unmanaged)&_getHelperFtn; + callbacks[131] = (delegate* unmanaged)&_getFunctionEntryPoint; + callbacks[132] = (delegate* unmanaged)&_getFunctionFixedEntryPoint; + callbacks[133] = (delegate* unmanaged)&_getMethodSync; + callbacks[134] = (delegate* unmanaged)&_getLazyStringLiteralHelper; + callbacks[135] = (delegate* unmanaged)&_embedModuleHandle; + callbacks[136] = (delegate* unmanaged)&_embedClassHandle; + callbacks[137] = (delegate* unmanaged)&_embedMethodHandle; + callbacks[138] = (delegate* unmanaged)&_embedFieldHandle; + callbacks[139] = (delegate* unmanaged)&_embedGenericHandle; + callbacks[140] = (delegate* unmanaged)&_getLocationOfThisType; + callbacks[141] = (delegate* unmanaged)&_getAddressOfPInvokeTarget; + callbacks[142] = (delegate* unmanaged)&_GetCookieForPInvokeCalliSig; + callbacks[143] = (delegate* unmanaged)&_canGetCookieForPInvokeCalliSig; + callbacks[144] = (delegate* unmanaged)&_getJustMyCodeHandle; + callbacks[145] = (delegate* unmanaged)&_GetProfilingHandle; + callbacks[146] = (delegate* unmanaged)&_getCallInfo; + callbacks[147] = (delegate* unmanaged)&_canAccessFamily; + callbacks[148] = (delegate* unmanaged)&_isRIDClassDomainID; + callbacks[149] = (delegate* unmanaged)&_getClassDomainID; + callbacks[150] = (delegate* unmanaged)&_getStaticFieldContent; + callbacks[151] = (delegate* unmanaged)&_getObjectContent; + callbacks[152] = (delegate* unmanaged)&_getStaticFieldCurrentClass; + callbacks[153] = (delegate* unmanaged)&_getVarArgsHandle; + callbacks[154] = (delegate* unmanaged)&_canGetVarArgsHandle; + callbacks[155] = (delegate* unmanaged)&_constructStringLiteral; + callbacks[156] = (delegate* unmanaged)&_emptyStringLiteral; + callbacks[157] = (delegate* unmanaged)&_getFieldThreadLocalStoreID; + 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; return (IntPtr)callbacks; } From ba49c20db256f7c581f66603370ea5fd70d540b9 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 10 May 2023 13:01:38 -0700 Subject: [PATCH 14/21] remove the commented code --- src/coreclr/vm/jitinterface.cpp | 36 +++++++++++---------------------- 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 6cf8cd3e7238b..37179ed500570 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1573,31 +1573,19 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, #ifdef HOST_WINDOWS #ifndef TARGET_ARM - bool canOptimizeHelper = true; - //((pField->GetFieldType() >= ELEMENT_TYPE_BOOLEAN) && (pField->GetFieldType() < ELEMENT_TYPE_VALUETYPE)) || - //(pField->GetFieldType() == ELEMENT_TYPE_OBJECT) || - //(pField->GetFieldType() == ELEMENT_TYPE_ARRAY) || - //(pField->GetFieldType() == ELEMENT_TYPE_I) || - //(pField->GetFieldType() == ELEMENT_TYPE_U) || - //(pField->GetFieldType() == ELEMENT_TYPE_SZARRAY); - - // Only check if the field type is non-generic. - if (canOptimizeHelper) + // For windows, we convert the TLS access to the optimized helper where we will store + // the static blocks in TLS directly and access them via inline code. + if ((pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE)) { - // For windows, we convert the TLS access to the optimized helper where we will store - // the static blocks in TLS directly and access them via inline code. - if ((pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR) || - (pResult->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE)) - { - fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; - pResult->helper = CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; - } - else if ((pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR) || - (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE)) - { - fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; - pResult->helper = CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; - } + fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; + pResult->helper = CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; + } + else if ((pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR) || + (pResult->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE)) + { + fieldAccessor = CORINFO_FIELD_STATIC_TLS_MANAGED; + pResult->helper = CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; } #endif // !TARGET_ARM #endif // HOST_WINDOWS From ce6cbcdfd9bfa0b8835ed70ef958c9b91e675f43 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 10 May 2023 17:04:46 -0700 Subject: [PATCH 15/21] add comment --- src/coreclr/inc/corinfo.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index 116ce0e8aa00a..e67224b6e1477 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -2737,9 +2737,13 @@ class ICorStaticInfo CORINFO_FIELD_INFO *pResult ) = 0; + // Returns the index against which the field's thread static block in stored in TLS + // The field is non-gc type. virtual uint32_t getNonGCThreadLocalFieldInfo ( CORINFO_FIELD_HANDLE field) = 0; + // Returns the index against which the field's thread static block in stored in TLS + // The field is gc type. virtual uint32_t getGCThreadLocalFieldInfo ( CORINFO_FIELD_HANDLE field) = 0; From bb43e000b95970317ba3abbbfa64497da83b4523 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Thu, 11 May 2023 22:32:28 -0700 Subject: [PATCH 16/21] Unify some of the non-gc/gc methods --- src/coreclr/inc/corinfo.h | 17 +- src/coreclr/inc/icorjitinfoimpl_generated.h | 11 +- src/coreclr/jit/ICorJitInfo_names_generated.h | 3 +- .../jit/ICorJitInfo_wrapper_generated.hpp | 25 +-- src/coreclr/jit/compiler.h | 2 - src/coreclr/jit/ee_il_dll.hpp | 12 -- src/coreclr/jit/helperexpansion.cpp | 18 +- src/coreclr/jit/importer.cpp | 4 +- .../tools/Common/JitInterface/CorInfoImpl.cs | 13 +- .../JitInterface/CorInfoImpl_generated.cs | 188 ++++++++---------- .../tools/Common/JitInterface/CorInfoTypes.cs | 6 +- .../ThunkGenerator/ThunkInput.txt | 5 +- .../aot/jitinterface/jitinterface_generated.h | 26 +-- .../tools/superpmi/superpmi-shared/agnostic.h | 6 +- .../tools/superpmi/superpmi-shared/lwmlist.h | 3 +- .../superpmi-shared/methodcontext.cpp | 66 ++---- .../superpmi/superpmi-shared/methodcontext.h | 13 +- .../superpmi-shim-collector/icorjitinfo.cpp | 18 +- .../icorjitinfo_generated.cpp | 21 +- .../icorjitinfo_generated.cpp | 18 +- .../tools/superpmi/superpmi/icorjitinfo.cpp | 14 +- src/coreclr/vm/jitinterface.cpp | 60 +++--- 22 files changed, 200 insertions(+), 349 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index e67224b6e1477..3c9a22a4a9ec7 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -1730,10 +1730,8 @@ struct CORINFO_THREAD_STATIC_BLOCKS_INFO { CORINFO_CONST_LOOKUP tlsIndex; uint32_t offsetOfThreadLocalStoragePointer; - uint32_t offsetOfNonGCMaxThreadStaticBlocks; - uint32_t offsetOfGCMaxThreadStaticBlocks; - uint32_t offsetOfNonGCThreadStaticBlocks; - uint32_t offsetOfGCThreadStaticBlocks; + uint32_t offsetOfMaxThreadStaticBlocks; + uint32_t offsetOfThreadStaticBlocks; uint32_t offsetOfGCDataPointer; }; @@ -2737,18 +2735,13 @@ class ICorStaticInfo CORINFO_FIELD_INFO *pResult ) = 0; - // Returns the index against which the field's thread static block in stored in TLS - // The field is non-gc type. - virtual uint32_t getNonGCThreadLocalFieldInfo ( - CORINFO_FIELD_HANDLE field) = 0; - // Returns the index against which the field's thread static block in stored in TLS // The field is gc type. - virtual uint32_t getGCThreadLocalFieldInfo ( - CORINFO_FIELD_HANDLE field) = 0; + virtual uint32_t getThreadLocalFieldInfo ( + CORINFO_FIELD_HANDLE field, bool isGCType) = 0; virtual void getThreadLocalStaticBlocksInfo ( - CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) = 0; + CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) = 0; // Returns true iff "fldHnd" represents a static field. virtual bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) = 0; diff --git a/src/coreclr/inc/icorjitinfoimpl_generated.h b/src/coreclr/inc/icorjitinfoimpl_generated.h index ec0566aa62126..f3d93194df258 100644 --- a/src/coreclr/inc/icorjitinfoimpl_generated.h +++ b/src/coreclr/inc/icorjitinfoimpl_generated.h @@ -410,14 +410,13 @@ void getFieldInfo( CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult) override; -uint32_t getNonGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) override; - -uint32_t getGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) override; +uint32_t getThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field, + bool isGCtype) override; void getThreadLocalStaticBlocksInfo( - CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) override; + CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, + bool isGCType) override; bool isFieldStatic( CORINFO_FIELD_HANDLE fldHnd) override; diff --git a/src/coreclr/jit/ICorJitInfo_names_generated.h b/src/coreclr/jit/ICorJitInfo_names_generated.h index f9b262410384f..b93f42dfba8ff 100644 --- a/src/coreclr/jit/ICorJitInfo_names_generated.h +++ b/src/coreclr/jit/ICorJitInfo_names_generated.h @@ -102,8 +102,7 @@ DEF_CLR_API(getFieldClass) DEF_CLR_API(getFieldType) DEF_CLR_API(getFieldOffset) DEF_CLR_API(getFieldInfo) -DEF_CLR_API(getNonGCThreadLocalFieldInfo) -DEF_CLR_API(getGCThreadLocalFieldInfo) +DEF_CLR_API(getThreadLocalFieldInfo) DEF_CLR_API(getThreadLocalStaticBlocksInfo) DEF_CLR_API(isFieldStatic) DEF_CLR_API(getArrayOrStringLength) diff --git a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp index 76ad42c6c6ecb..da369eda01a37 100644 --- a/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp +++ b/src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp @@ -971,29 +971,22 @@ void WrapICorJitInfo::getFieldInfo( API_LEAVE(getFieldInfo); } -uint32_t WrapICorJitInfo::getNonGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) -{ - API_ENTER(getNonGCThreadLocalFieldInfo); - uint32_t temp = wrapHnd->getNonGCThreadLocalFieldInfo(field); - API_LEAVE(getNonGCThreadLocalFieldInfo); - return temp; -} - -uint32_t WrapICorJitInfo::getGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) +uint32_t WrapICorJitInfo::getThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field, + bool isGCtype) { - API_ENTER(getGCThreadLocalFieldInfo); - uint32_t temp = wrapHnd->getGCThreadLocalFieldInfo(field); - API_LEAVE(getGCThreadLocalFieldInfo); + API_ENTER(getThreadLocalFieldInfo); + uint32_t temp = wrapHnd->getThreadLocalFieldInfo(field, isGCtype); + API_LEAVE(getThreadLocalFieldInfo); return temp; } void WrapICorJitInfo::getThreadLocalStaticBlocksInfo( - CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) + CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, + bool isGCType) { API_ENTER(getThreadLocalStaticBlocksInfo); - wrapHnd->getThreadLocalStaticBlocksInfo(pInfo); + wrapHnd->getThreadLocalStaticBlocksInfo(pInfo, isGCType); API_LEAVE(getThreadLocalStaticBlocksInfo); } diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index cb991e647f0c6..2540daa21d65d 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -7816,8 +7816,6 @@ class Compiler void eeGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); - uint32_t eeGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); - uint32_t eeGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); // Get the flags diff --git a/src/coreclr/jit/ee_il_dll.hpp b/src/coreclr/jit/ee_il_dll.hpp index 59e0457fdee43..cfdc1f87c680e 100644 --- a/src/coreclr/jit/ee_il_dll.hpp +++ b/src/coreclr/jit/ee_il_dll.hpp @@ -44,18 +44,6 @@ void Compiler::eeGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, info.compCompHnd->getFieldInfo(pResolvedToken, info.compMethodHnd, accessFlags, pResult); } -FORCEINLINE -uint32_t Compiler::eeGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) -{ - return info.compCompHnd->getNonGCThreadLocalFieldInfo(field); -} - -FORCEINLINE -uint32_t Compiler::eeGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) -{ - return info.compCompHnd->getGCThreadLocalFieldInfo(field); -} - /***************************************************************************** * * VOS info, method sigs, etc diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index 156828bba9df4..c294ae7fccf83 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -491,22 +491,14 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* eeGetHelperNum(call->gtCallMethHnd) == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED; CORINFO_THREAD_STATIC_BLOCKS_INFO threadStaticBlocksInfo; - info.compCompHnd->getThreadLocalStaticBlocksInfo(&threadStaticBlocksInfo); + info.compCompHnd->getThreadLocalStaticBlocksInfo(&threadStaticBlocksInfo, isGCThreadStatic); uint32_t offsetOfMaxThreadStaticBlocksVal = 0; uint32_t offsetOfThreadStaticBlocksVal = 0; - if (isGCThreadStatic) - { - JITDUMP("getThreadLocalStaticBlocksInfo (GC)\n:"); - offsetOfMaxThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfGCMaxThreadStaticBlocks; - offsetOfThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfGCThreadStaticBlocks; - } - else - { - JITDUMP("getThreadLocalStaticBlocksInfo (NonGC)\n:"); - offsetOfMaxThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfNonGCMaxThreadStaticBlocks; - offsetOfThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfNonGCThreadStaticBlocks; - } + + JITDUMP("getThreadLocalStaticBlocksInfo (%s)\n:", isGCThreadStatic ? "GC" : "Non-GC"); + offsetOfMaxThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfMaxThreadStaticBlocks; + offsetOfThreadStaticBlocksVal = threadStaticBlocksInfo.offsetOfThreadStaticBlocks; JITDUMP("tlsIndex= %u\n", (ssize_t)threadStaticBlocksInfo.tlsIndex.addr); JITDUMP("offsetOfThreadLocalStoragePointer= %u\n", threadStaticBlocksInfo.offsetOfThreadLocalStoragePointer); diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index 7c95655f9bbd9..22c25523f41dd 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -3965,12 +3965,12 @@ GenTree* Compiler::impImportStaticFieldAccess(CORINFO_RESOLVED_TOKEN* pResolvedT if (pFieldInfo->helper == CORINFO_HELP_GETSHARED_NONGCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED) { - typeIndex = info.compCompHnd->getNonGCThreadLocalFieldInfo(pResolvedToken->hField); + typeIndex = info.compCompHnd->getThreadLocalFieldInfo(pResolvedToken->hField, false); } else { assert(pFieldInfo->helper == CORINFO_HELP_GETSHARED_GCTHREADSTATIC_BASE_NOCTOR_OPTIMIZED); - typeIndex = info.compCompHnd->getGCThreadLocalFieldInfo(pResolvedToken->hField); + typeIndex = info.compCompHnd->getThreadLocalFieldInfo(pResolvedToken->hField, true); } FALLTHROUGH; diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 4b7d35563904c..2a16f1102fec0 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -2859,7 +2859,7 @@ private nuint printFieldName(CORINFO_FIELD_STRUCT_* fld, byte* buffer, nuint buf } #pragma warning disable CA1822 // Mark members as static - private uint getNonGCThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld) + private uint getThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld, bool isGCType) #pragma warning restore CA1822 // Mark members as static { // Implemented for JIT only for now. @@ -2868,16 +2868,7 @@ private uint getNonGCThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld) } #pragma warning disable CA1822 // Mark members as static - private uint getGCThreadLocalFieldInfo(CORINFO_FIELD_STRUCT_* fld) -#pragma warning restore CA1822 // Mark members as static - { - // Implemented for JIT only for now. - - return 0; - } - -#pragma warning disable CA1822 // Mark members as static - private void getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) + private void getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) #pragma warning restore CA1822 // Mark members as static { // Implemented for JIT only for now. diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs index 7c4485af3ddf0..772a97e0cfb82 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl_generated.cs @@ -1465,12 +1465,12 @@ private static void _getFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINF } [UnmanagedCallersOnly] - private static uint _getNonGCThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_FIELD_STRUCT_* field) + private static uint _getThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_FIELD_STRUCT_* field, byte isGCtype) { var _this = GetThis(thisHandle); try { - return _this.getNonGCThreadLocalFieldInfo(field); + return _this.getThreadLocalFieldInfo(field, isGCtype != 0); } catch (Exception ex) { @@ -1480,27 +1480,12 @@ private static uint _getNonGCThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppE } [UnmanagedCallersOnly] - private static uint _getGCThreadLocalFieldInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_FIELD_STRUCT_* field) + private static void _getThreadLocalStaticBlocksInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, byte isGCType) { var _this = GetThis(thisHandle); try { - return _this.getGCThreadLocalFieldInfo(field); - } - catch (Exception ex) - { - *ppException = _this.AllocException(ex); - return default; - } - } - - [UnmanagedCallersOnly] - private static void _getThreadLocalStaticBlocksInfo(IntPtr thisHandle, IntPtr* ppException, CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) - { - var _this = GetThis(thisHandle); - try - { - _this.getThreadLocalStaticBlocksInfo(pInfo); + _this.getThreadLocalStaticBlocksInfo(pInfo, isGCType != 0); } catch (Exception ex) { @@ -2672,7 +2657,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; @@ -2772,88 +2757,87 @@ private static IntPtr GetUnmanagedCallbacks() callbacks[95] = (delegate* unmanaged)&_getFieldType; callbacks[96] = (delegate* unmanaged)&_getFieldOffset; callbacks[97] = (delegate* unmanaged)&_getFieldInfo; - callbacks[98] = (delegate* unmanaged)&_getNonGCThreadLocalFieldInfo; - callbacks[99] = (delegate* unmanaged)&_getGCThreadLocalFieldInfo; - callbacks[100] = (delegate* unmanaged)&_getThreadLocalStaticBlocksInfo; - callbacks[101] = (delegate* unmanaged)&_isFieldStatic; - callbacks[102] = (delegate* unmanaged)&_getArrayOrStringLength; - callbacks[103] = (delegate* unmanaged)&_getBoundaries; - callbacks[104] = (delegate* unmanaged)&_setBoundaries; - callbacks[105] = (delegate* unmanaged)&_getVars; - callbacks[106] = (delegate* unmanaged)&_setVars; - callbacks[107] = (delegate* unmanaged)&_reportRichMappings; - callbacks[108] = (delegate* unmanaged)&_allocateArray; - callbacks[109] = (delegate* unmanaged)&_freeArray; - callbacks[110] = (delegate* unmanaged)&_getArgNext; - callbacks[111] = (delegate* unmanaged)&_getArgType; - callbacks[112] = (delegate* unmanaged)&_getExactClasses; - callbacks[113] = (delegate* unmanaged)&_getArgClass; - callbacks[114] = (delegate* unmanaged)&_getHFAType; - callbacks[115] = (delegate* unmanaged)&_runWithErrorTrap; - callbacks[116] = (delegate* unmanaged)&_runWithSPMIErrorTrap; - callbacks[117] = (delegate* unmanaged)&_getEEInfo; - callbacks[118] = (delegate* unmanaged)&_getJitTimeLogFilename; - callbacks[119] = (delegate* unmanaged)&_getMethodDefFromMethod; - callbacks[120] = (delegate* unmanaged)&_printMethodName; - callbacks[121] = (delegate* unmanaged)&_getMethodNameFromMetadata; - callbacks[122] = (delegate* unmanaged)&_getMethodHash; - callbacks[123] = (delegate* unmanaged)&_findNameOfToken; - callbacks[124] = (delegate* unmanaged)&_getSystemVAmd64PassStructInRegisterDescriptor; - callbacks[125] = (delegate* unmanaged)&_getLoongArch64PassStructInRegisterFlags; - callbacks[126] = (delegate* unmanaged)&_getRISCV64PassStructInRegisterFlags; - callbacks[127] = (delegate* unmanaged)&_getThreadTLSIndex; - callbacks[128] = (delegate* unmanaged)&_getInlinedCallFrameVptr; - callbacks[129] = (delegate* unmanaged)&_getAddrOfCaptureThreadGlobal; - callbacks[130] = (delegate* unmanaged)&_getHelperFtn; - callbacks[131] = (delegate* unmanaged)&_getFunctionEntryPoint; - callbacks[132] = (delegate* unmanaged)&_getFunctionFixedEntryPoint; - callbacks[133] = (delegate* unmanaged)&_getMethodSync; - callbacks[134] = (delegate* unmanaged)&_getLazyStringLiteralHelper; - callbacks[135] = (delegate* unmanaged)&_embedModuleHandle; - callbacks[136] = (delegate* unmanaged)&_embedClassHandle; - callbacks[137] = (delegate* unmanaged)&_embedMethodHandle; - callbacks[138] = (delegate* unmanaged)&_embedFieldHandle; - callbacks[139] = (delegate* unmanaged)&_embedGenericHandle; - callbacks[140] = (delegate* unmanaged)&_getLocationOfThisType; - callbacks[141] = (delegate* unmanaged)&_getAddressOfPInvokeTarget; - callbacks[142] = (delegate* unmanaged)&_GetCookieForPInvokeCalliSig; - callbacks[143] = (delegate* unmanaged)&_canGetCookieForPInvokeCalliSig; - callbacks[144] = (delegate* unmanaged)&_getJustMyCodeHandle; - callbacks[145] = (delegate* unmanaged)&_GetProfilingHandle; - callbacks[146] = (delegate* unmanaged)&_getCallInfo; - callbacks[147] = (delegate* unmanaged)&_canAccessFamily; - callbacks[148] = (delegate* unmanaged)&_isRIDClassDomainID; - callbacks[149] = (delegate* unmanaged)&_getClassDomainID; - callbacks[150] = (delegate* unmanaged)&_getStaticFieldContent; - callbacks[151] = (delegate* unmanaged)&_getObjectContent; - callbacks[152] = (delegate* unmanaged)&_getStaticFieldCurrentClass; - callbacks[153] = (delegate* unmanaged)&_getVarArgsHandle; - callbacks[154] = (delegate* unmanaged)&_canGetVarArgsHandle; - callbacks[155] = (delegate* unmanaged)&_constructStringLiteral; - callbacks[156] = (delegate* unmanaged)&_emptyStringLiteral; - callbacks[157] = (delegate* unmanaged)&_getFieldThreadLocalStoreID; - 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[98] = (delegate* unmanaged)&_getThreadLocalFieldInfo; + callbacks[99] = (delegate* unmanaged)&_getThreadLocalStaticBlocksInfo; + callbacks[100] = (delegate* unmanaged)&_isFieldStatic; + callbacks[101] = (delegate* unmanaged)&_getArrayOrStringLength; + callbacks[102] = (delegate* unmanaged)&_getBoundaries; + callbacks[103] = (delegate* unmanaged)&_setBoundaries; + callbacks[104] = (delegate* unmanaged)&_getVars; + callbacks[105] = (delegate* unmanaged)&_setVars; + callbacks[106] = (delegate* unmanaged)&_reportRichMappings; + callbacks[107] = (delegate* unmanaged)&_allocateArray; + callbacks[108] = (delegate* unmanaged)&_freeArray; + callbacks[109] = (delegate* unmanaged)&_getArgNext; + callbacks[110] = (delegate* unmanaged)&_getArgType; + callbacks[111] = (delegate* unmanaged)&_getExactClasses; + callbacks[112] = (delegate* unmanaged)&_getArgClass; + callbacks[113] = (delegate* unmanaged)&_getHFAType; + callbacks[114] = (delegate* unmanaged)&_runWithErrorTrap; + callbacks[115] = (delegate* unmanaged)&_runWithSPMIErrorTrap; + callbacks[116] = (delegate* unmanaged)&_getEEInfo; + callbacks[117] = (delegate* unmanaged)&_getJitTimeLogFilename; + callbacks[118] = (delegate* unmanaged)&_getMethodDefFromMethod; + callbacks[119] = (delegate* unmanaged)&_printMethodName; + callbacks[120] = (delegate* unmanaged)&_getMethodNameFromMetadata; + callbacks[121] = (delegate* unmanaged)&_getMethodHash; + callbacks[122] = (delegate* unmanaged)&_findNameOfToken; + callbacks[123] = (delegate* unmanaged)&_getSystemVAmd64PassStructInRegisterDescriptor; + callbacks[124] = (delegate* unmanaged)&_getLoongArch64PassStructInRegisterFlags; + callbacks[125] = (delegate* unmanaged)&_getRISCV64PassStructInRegisterFlags; + callbacks[126] = (delegate* unmanaged)&_getThreadTLSIndex; + callbacks[127] = (delegate* unmanaged)&_getInlinedCallFrameVptr; + callbacks[128] = (delegate* unmanaged)&_getAddrOfCaptureThreadGlobal; + callbacks[129] = (delegate* unmanaged)&_getHelperFtn; + callbacks[130] = (delegate* unmanaged)&_getFunctionEntryPoint; + callbacks[131] = (delegate* unmanaged)&_getFunctionFixedEntryPoint; + callbacks[132] = (delegate* unmanaged)&_getMethodSync; + callbacks[133] = (delegate* unmanaged)&_getLazyStringLiteralHelper; + callbacks[134] = (delegate* unmanaged)&_embedModuleHandle; + callbacks[135] = (delegate* unmanaged)&_embedClassHandle; + callbacks[136] = (delegate* unmanaged)&_embedMethodHandle; + callbacks[137] = (delegate* unmanaged)&_embedFieldHandle; + callbacks[138] = (delegate* unmanaged)&_embedGenericHandle; + callbacks[139] = (delegate* unmanaged)&_getLocationOfThisType; + callbacks[140] = (delegate* unmanaged)&_getAddressOfPInvokeTarget; + callbacks[141] = (delegate* unmanaged)&_GetCookieForPInvokeCalliSig; + callbacks[142] = (delegate* unmanaged)&_canGetCookieForPInvokeCalliSig; + callbacks[143] = (delegate* unmanaged)&_getJustMyCodeHandle; + callbacks[144] = (delegate* unmanaged)&_GetProfilingHandle; + callbacks[145] = (delegate* unmanaged)&_getCallInfo; + callbacks[146] = (delegate* unmanaged)&_canAccessFamily; + callbacks[147] = (delegate* unmanaged)&_isRIDClassDomainID; + callbacks[148] = (delegate* unmanaged)&_getClassDomainID; + callbacks[149] = (delegate* unmanaged)&_getStaticFieldContent; + callbacks[150] = (delegate* unmanaged)&_getObjectContent; + callbacks[151] = (delegate* unmanaged)&_getStaticFieldCurrentClass; + callbacks[152] = (delegate* unmanaged)&_getVarArgsHandle; + callbacks[153] = (delegate* unmanaged)&_canGetVarArgsHandle; + callbacks[154] = (delegate* unmanaged)&_constructStringLiteral; + callbacks[155] = (delegate* unmanaged)&_emptyStringLiteral; + callbacks[156] = (delegate* unmanaged)&_getFieldThreadLocalStoreID; + 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/CorInfoTypes.cs b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs index 3f2fba81bcdad..71d8cd105dc60 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoTypes.cs @@ -1152,10 +1152,8 @@ public unsafe struct CORINFO_THREAD_STATIC_BLOCKS_INFO { public CORINFO_CONST_LOOKUP tlsIndex; public uint offsetOfThreadLocalStoragePointer; - public CORINFO_CONST_LOOKUP offsetOfNonGCMaxThreadStaticBlocks; - public CORINFO_CONST_LOOKUP offsetOfGCMaxThreadStaticBlocks; - public CORINFO_CONST_LOOKUP offsetOfNonGCThreadStaticBlocks; - public CORINFO_CONST_LOOKUP offsetOfGCThreadStaticBlocks; + public CORINFO_CONST_LOOKUP offsetOfMaxThreadStaticBlocks; + public CORINFO_CONST_LOOKUP offsetOfThreadStaticBlocks; public CORINFO_CONST_LOOKUP offsetOfGCDataPointer; }; diff --git a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt index 11bedcedd6aff..89d87da12f848 100644 --- a/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt +++ b/src/coreclr/tools/Common/JitInterface/ThunkGenerator/ThunkInput.txt @@ -257,9 +257,8 @@ FUNCTIONS CorInfoType getFieldType(CORINFO_FIELD_HANDLE field, CORINFO_CLASS_HANDLE* structType, CORINFO_CLASS_HANDLE memberParent) unsigned getFieldOffset(CORINFO_FIELD_HANDLE field) void getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult) - uint32_t getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) - uint32_t getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) - void getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) + uint32_t getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field, bool isGCtype) + void getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) int getArrayOrStringLength(CORINFO_OBJECT_HANDLE objHnd) void getBoundaries(CORINFO_METHOD_HANDLE ftn, unsigned int* cILOffsets, uint32_t** pILOffsets, ICorDebugInfo::BoundaryTypes* implicitBoundaries) diff --git a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h index ceeab2ebb92b8..56fb164b35956 100644 --- a/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h +++ b/src/coreclr/tools/aot/jitinterface/jitinterface_generated.h @@ -109,9 +109,8 @@ struct JitInterfaceCallbacks CorInfoType (* getFieldType)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field, CORINFO_CLASS_HANDLE* structType, CORINFO_CLASS_HANDLE memberParent); unsigned (* getFieldOffset)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); void (* getFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); - uint32_t (* getNonGCThreadLocalFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); - uint32_t (* getGCThreadLocalFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field); - void (* getThreadLocalStaticBlocksInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); + uint32_t (* getThreadLocalFieldInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE field, bool isGCtype); + void (* getThreadLocalStaticBlocksInfo)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType); bool (* isFieldStatic)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_FIELD_HANDLE fldHnd); int (* getArrayOrStringLength)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_OBJECT_HANDLE objHnd); void (* getBoundaries)(void * thisHandle, CorInfoExceptionClass** ppException, CORINFO_METHOD_HANDLE ftn, unsigned int* cILOffsets, uint32_t** pILOffsets, ICorDebugInfo::BoundaryTypes* implicitBoundaries); @@ -1165,29 +1164,22 @@ class JitInterfaceWrapper : public ICorJitInfo if (pException != nullptr) throw pException; } - virtual uint32_t getNonGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) -{ - CorInfoExceptionClass* pException = nullptr; - uint32_t temp = _callbacks->getNonGCThreadLocalFieldInfo(_thisHandle, &pException, field); - if (pException != nullptr) throw pException; - return temp; -} - - virtual uint32_t getGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) + virtual uint32_t getThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field, + bool isGCtype) { CorInfoExceptionClass* pException = nullptr; - uint32_t temp = _callbacks->getGCThreadLocalFieldInfo(_thisHandle, &pException, field); + uint32_t temp = _callbacks->getThreadLocalFieldInfo(_thisHandle, &pException, field, isGCtype); if (pException != nullptr) throw pException; return temp; } virtual void getThreadLocalStaticBlocksInfo( - CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) + CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, + bool isGCType) { CorInfoExceptionClass* pException = nullptr; - _callbacks->getThreadLocalStaticBlocksInfo(_thisHandle, &pException, pInfo); + _callbacks->getThreadLocalStaticBlocksInfo(_thisHandle, &pException, pInfo, isGCType); if (pException != nullptr) throw pException; } diff --git a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h index b5f231b9593ac..0783fa52962a4 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/agnostic.h @@ -520,10 +520,8 @@ struct Agnostic_GetThreadLocalStaticBlocksInfo { Agnostic_CORINFO_CONST_LOOKUP tlsIndex; UINT offsetOfThreadLocalStoragePointer; - UINT offsetOfNonGCMaxThreadStaticBlocks; - UINT offsetOfGCMaxThreadStaticBlocks; - UINT offsetOfNonGCThreadStaticBlocks; - UINT offsetOfGCThreadStaticBlocks; + UINT offsetOfMaxThreadStaticBlocks; + UINT offsetOfThreadStaticBlocks; UINT offsetOfGCDataPointer; }; diff --git a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h index 6e75a1e97f2b0..615072268280b 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h @@ -38,8 +38,7 @@ LWM(EmbedFieldHandle, DWORDLONG, DLDL) LWM(EmbedGenericHandle, Agnostic_EmbedGenericHandle, Agnostic_CORINFO_GENERICHANDLE_RESULT) LWM(EmbedMethodHandle, DWORDLONG, DLDL) LWM(EmbedModuleHandle, DWORDLONG, DLDL) -LWM(GetNonGCThreadLocalFieldInfo, DWORDLONG, DWORD) -LWM(GetGCThreadLocalFieldInfo, DWORDLONG, DWORD) +LWM(GetThreadLocalFieldInfo, DWORDLONG, DWORD) LWM(GetThreadLocalStaticBlocksInfo, DWORD, Agnostic_GetThreadLocalStaticBlocksInfo) DENSELWM(EmptyStringLiteral, DLD) DENSELWM(ErrorList, DWORD) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 9612e6cb19959..9c10421c8ae5a 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3601,56 +3601,29 @@ void MethodContext::repGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, } } -void MethodContext::recGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result) +void MethodContext::recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result) { - if (GetNonGCThreadLocalFieldInfo == nullptr) - GetNonGCThreadLocalFieldInfo = new LightWeightMap(); + if (GetThreadLocalFieldInfo == nullptr) + GetThreadLocalFieldInfo = new LightWeightMap(); DWORDLONG key = 0; key = CastHandle(field); - GetNonGCThreadLocalFieldInfo->Add(key, result); - DEBUG_REC(dmpGetNonGCThreadLocalFieldInfo(key, result)); -} - -void MethodContext::dmpGetNonGCThreadLocalFieldInfo(DWORDLONG key, DWORD value) -{ - printf("GetNonGCThreadLocalFieldInfo key hnd-%016" PRIX64 ", result-%u", key, value); -} - -uint32_t MethodContext::repGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) -{ - DWORDLONG key = CastHandle(field); - DWORD value = LookupByKeyOrMiss(GetNonGCThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); - - DEBUG_REP(dmpGetNonGCThreadLocalFieldInfo(key, value)); - - return value; -} - -void MethodContext::recGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result) -{ - if (GetGCThreadLocalFieldInfo == nullptr) - GetGCThreadLocalFieldInfo = new LightWeightMap(); - - DWORDLONG key = 0; - - key = CastHandle(field); - GetGCThreadLocalFieldInfo->Add(key, result); + GetThreadLocalFieldInfo->Add(key, result); DEBUG_REC(dmpGetGCThreadLocalFieldInfo(key, result)); } -void MethodContext::dmpGetGCThreadLocalFieldInfo(DWORDLONG key, DWORD value) +void MethodContext::dmpGetThreadLocalFieldInfo(DWORDLONG key, DWORD value) { - printf("GetGCThreadLocalFieldInfo key hnd-%016" PRIX64 ", result-%u", key, value); + printf("GetThreadLocalFieldInfo key hnd-%016" PRIX64 ", result-%u", key, value); } -uint32_t MethodContext::repGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t MethodContext::repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) { DWORDLONG key = CastHandle(field); - DWORD value = LookupByKeyOrMiss(GetGCThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); + DWORD value = LookupByKeyOrMiss(GetThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); - DEBUG_REP(dmpGetGCThreadLocalFieldInfo(key, value)); + DEBUG_REP(dmpGetThreadLocalFieldInfo(key, value)); return value; } @@ -3665,11 +3638,9 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC value.tlsIndex.handle = CastHandle(pInfo->tlsIndex.addr); value.tlsIndex.accessType = pInfo->tlsIndex.accessType; - value.offsetOfNonGCMaxThreadStaticBlocks = pInfo->offsetOfNonGCMaxThreadStaticBlocks; - value.offsetOfGCMaxThreadStaticBlocks = pInfo->offsetOfGCMaxThreadStaticBlocks; + value.offsetOfMaxThreadStaticBlocks = pInfo->offsetOfMaxThreadStaticBlocks; value.offsetOfThreadLocalStoragePointer = pInfo->offsetOfThreadLocalStoragePointer; - value.offsetOfNonGCThreadStaticBlocks = pInfo->offsetOfNonGCThreadStaticBlocks; - value.offsetOfGCThreadStaticBlocks = pInfo->offsetOfGCThreadStaticBlocks; + value.offsetOfThreadStaticBlocks = pInfo->offsetOfThreadStaticBlocks; value.offsetOfGCDataPointer = pInfo->offsetOfGCDataPointer; // This data is same for entire process, so just add it against key '0'. @@ -3680,11 +3651,10 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC void MethodContext::dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value) { printf("GetThreadLocalStaticBlocksInfo key 0, value tlsIndex-%016" PRIX64 - ", offsetOfNonGCMaxThreadStaticBlocks-%u, offsetOfThreadLocalStoragePointer-%u, offsetOfNonGCThreadStaticBlocks-%u," - ", offsetOfGCMaxThreadStaticBlocks-%u, offsetOfGCThreadStaticBlocks-%u offsetOfGCDataPointer-%u", - value.tlsIndex.handle, value.offsetOfNonGCMaxThreadStaticBlocks, value.offsetOfThreadLocalStoragePointer, - value.offsetOfNonGCThreadStaticBlocks, value.offsetOfGCMaxThreadStaticBlocks, - value.offsetOfGCThreadStaticBlocks, value.offsetOfGCDataPointer); + ", offsetOfThreadLocalStoragePointer-%u, offsetOfMaxThreadStaticBlocks-%u" + ", offsetOfThreadStaticBlocks-%u offsetOfGCDataPointer-%u", + value.tlsIndex.handle, value.offsetOfThreadLocalStoragePointer, + value.offsetOfMaxThreadStaticBlocks, value.offsetOfThreadStaticBlocks, value.offsetOfGCDataPointer); } void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) @@ -3695,11 +3665,9 @@ void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC pInfo->tlsIndex.accessType = (InfoAccessType)value.tlsIndex.accessType; pInfo->tlsIndex.addr = (void*)value.tlsIndex.handle; - pInfo->offsetOfNonGCMaxThreadStaticBlocks = value.offsetOfNonGCMaxThreadStaticBlocks; - pInfo->offsetOfGCMaxThreadStaticBlocks = value.offsetOfGCMaxThreadStaticBlocks; + pInfo->offsetOfMaxThreadStaticBlocks = value.offsetOfMaxThreadStaticBlocks; pInfo->offsetOfThreadLocalStoragePointer = value.offsetOfThreadLocalStoragePointer; - pInfo->offsetOfNonGCThreadStaticBlocks = value.offsetOfNonGCThreadStaticBlocks; - pInfo->offsetOfGCThreadStaticBlocks = value.offsetOfGCThreadStaticBlocks; + pInfo->offsetOfThreadStaticBlocks = value.offsetOfThreadStaticBlocks; pInfo->offsetOfGCDataPointer = value.offsetOfGCDataPointer; } diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h index 0676d57567870..dbfb42220aadf 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h @@ -485,13 +485,9 @@ class MethodContext CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); - void recGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result); - void dmpGetNonGCThreadLocalFieldInfo(DWORDLONG key, DWORD value); - uint32_t repGetNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); - - void recGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result); - void dmpGetGCThreadLocalFieldInfo(DWORDLONG key, DWORD value); - uint32_t repGetGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); + void recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result); + void dmpGetThreadLocalFieldInfo(DWORDLONG key, DWORD value); + uint32_t repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); void recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); void dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value); @@ -1184,8 +1180,7 @@ enum mcPackets Packet_GetStringChar = 204, Packet_GetIsClassInitedFlagAddress = 205, Packet_GetStaticBaseAddress = 206, - Packet_GetNonGCThreadLocalFieldInfo = 207, - Packet_GetGCThreadLocalFieldInfo = 208, + Packet_GetThreadLocalFieldInfo = 208, Packet_GetThreadLocalStaticBlocksInfo = 209, Packet_GetRISCV64PassStructInRegisterFlags = 210, Packet_GetObjectContent = 211, diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp index fdae76e04ca53..1eed77a02bca6 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -1096,26 +1096,18 @@ void interceptor_ICJI::getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, mc->recGetFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) -{ - mc->cr->AddCall("getNonGCThreadLocalFieldInfo"); - uint32_t result = original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); - mc->recGetNonGCThreadLocalFieldInfo(field, result); - return result; -} - -uint32_t interceptor_ICJI::getGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t interceptor_ICJI::getThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType) { mc->cr->AddCall("getGCThreadLocalFieldInfo"); - uint32_t result = original_ICorJitInfo->getGCThreadLocalFieldInfo(field); - mc->recGetGCThreadLocalFieldInfo(field, result); + uint32_t result = original_ICorJitInfo->getThreadLocalFieldInfo(field, isGCType); + mc->recGetThreadLocalFieldInfo(field, result); return result; } -void interceptor_ICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) +void interceptor_ICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) { mc->cr->AddCall("getThreadLocalStaticBlocksInfo"); - original_ICorJitInfo->getThreadLocalStaticBlocksInfo(pInfo); + original_ICorJitInfo->getThreadLocalStaticBlocksInfo(pInfo, isGCType); mc->recGetThreadLocalStaticBlocksInfo(pInfo); } 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 55ae345f7f251..6d301f516f60b 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-counter/icorjitinfo_generated.cpp @@ -793,25 +793,20 @@ void interceptor_ICJI::getFieldInfo( original_ICorJitInfo->getFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) -{ - mcs->AddCall("getNonGCThreadLocalFieldInfo"); - return original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); -} - -uint32_t interceptor_ICJI::getGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) +uint32_t interceptor_ICJI::getThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field, + bool isGCtype) { - mcs->AddCall("getGCThreadLocalFieldInfo"); - return original_ICorJitInfo->getGCThreadLocalFieldInfo(field); + mcs->AddCall("getThreadLocalFieldInfo"); + return original_ICorJitInfo->getThreadLocalFieldInfo(field, isGCtype); } void interceptor_ICJI::getThreadLocalStaticBlocksInfo( - CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) + CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, + bool isGCType) { mcs->AddCall("getThreadLocalStaticBlocksInfo"); - original_ICorJitInfo->getThreadLocalStaticBlocksInfo(pInfo); + original_ICorJitInfo->getThreadLocalStaticBlocksInfo(pInfo, isGCType); } bool interceptor_ICJI::isFieldStatic( 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 8408eb2571216..7dd611b5283dc 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-simple/icorjitinfo_generated.cpp @@ -695,22 +695,18 @@ void interceptor_ICJI::getFieldInfo( original_ICorJitInfo->getFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t interceptor_ICJI::getNonGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) -{ - return original_ICorJitInfo->getNonGCThreadLocalFieldInfo(field); -} - -uint32_t interceptor_ICJI::getGCThreadLocalFieldInfo( - CORINFO_FIELD_HANDLE field) +uint32_t interceptor_ICJI::getThreadLocalFieldInfo( + CORINFO_FIELD_HANDLE field, + bool isGCtype) { - return original_ICorJitInfo->getGCThreadLocalFieldInfo(field); + return original_ICorJitInfo->getThreadLocalFieldInfo(field, isGCtype); } void interceptor_ICJI::getThreadLocalStaticBlocksInfo( - CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) + CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, + bool isGCType) { - original_ICorJitInfo->getThreadLocalStaticBlocksInfo(pInfo); + original_ICorJitInfo->getThreadLocalStaticBlocksInfo(pInfo, isGCType); } bool interceptor_ICJI::isFieldStatic( diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index 1bcc4d1a61049..6a65ff355e31b 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -917,19 +917,13 @@ void MyICJI::getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, jitInstance->mc->repGetFieldInfo(pResolvedToken, callerHandle, flags, pResult); } -uint32_t MyICJI::getNonGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t MyICJI::getThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType) { - jitInstance->mc->cr->AddCall("getNonGCThreadLocalFieldInfo"); - return jitInstance->mc->repGetNonGCThreadLocalFieldInfo(field); + jitInstance->mc->cr->AddCall("getThreadLocalFieldInfo"); + return jitInstance->mc->repGetThreadLocalFieldInfo(field); } -uint32_t MyICJI::getGCThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) -{ - jitInstance->mc->cr->AddCall("getGCThreadLocalFieldInfo"); - return jitInstance->mc->repGetGCThreadLocalFieldInfo(field); -} - -void MyICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) +void MyICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) { jitInstance->mc->cr->AddCall("getThreadLocalStaticBlocksInfo"); jitInstance->mc->repGetThreadLocalStaticBlocksInfo(pInfo); diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 37179ed500570..914dee48b0d42 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1775,7 +1775,7 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, #ifdef HOST_WINDOWS /*********************************************************************/ -uint32_t CEEInfo::getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) +uint32_t CEEInfo::getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field, bool isGCType) { CONTRACTL { THROWS; @@ -1790,31 +1790,14 @@ uint32_t CEEInfo::getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) FieldDesc* fieldDesc = (FieldDesc*)field; _ASSERTE(fieldDesc->IsThreadStatic()); - typeIndex = AppDomain::GetCurrentDomain()->GetNonGCThreadStaticTypeIndex(fieldDesc->GetEnclosingMethodTable()); - - assert(typeIndex != TypeIDProvider::INVALID_TYPE_ID); - - EE_TO_JIT_TRANSITION(); - return typeIndex; -} - -/*********************************************************************/ -uint32_t CEEInfo::getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) -{ - CONTRACTL { - THROWS; - GC_TRIGGERS; - MODE_PREEMPTIVE; - } CONTRACTL_END; - - UINT32 typeIndex = 0; - - JIT_TO_EE_TRANSITION(); - - FieldDesc* fieldDesc = (FieldDesc*)field; - _ASSERTE(fieldDesc->IsThreadStatic()); - - typeIndex = AppDomain::GetCurrentDomain()->GetGCThreadStaticTypeIndex(fieldDesc->GetEnclosingMethodTable()); + if (isGCType) + { + typeIndex = AppDomain::GetCurrentDomain()->GetGCThreadStaticTypeIndex(fieldDesc->GetEnclosingMethodTable()); + } + else + { + typeIndex = AppDomain::GetCurrentDomain()->GetNonGCThreadStaticTypeIndex(fieldDesc->GetEnclosingMethodTable()); + } assert(typeIndex != TypeIDProvider::INVALID_TYPE_ID); @@ -1823,7 +1806,7 @@ uint32_t CEEInfo::getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) } /*********************************************************************/ -void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) +void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) { CONTRACTL { NOTHROW; @@ -1837,10 +1820,17 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo->tlsIndex.accessType = IAT_VALUE; pInfo->offsetOfThreadLocalStoragePointer = offsetof(_TEB, ThreadLocalStoragePointer); - pInfo->offsetOfNonGCThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCThreadStaticBlocks); - pInfo->offsetOfGCThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCThreadStaticBlocks); - pInfo->offsetOfNonGCMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCMaxThreadStaticBlocks); - pInfo->offsetOfGCMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCMaxThreadStaticBlocks); + if (isGCType) + { + pInfo->offsetOfThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCThreadStaticBlocks); + pInfo->offsetOfMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_GCMaxThreadStaticBlocks); + } + else + { + pInfo->offsetOfThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCThreadStaticBlocks); + pInfo->offsetOfMaxThreadStaticBlocks = CEEInfo::ThreadLocalOffset(&t_NonGCMaxThreadStaticBlocks); + } + pInfo->offsetOfGCDataPointer = static_cast(PtrArray::GetDataOffset()); JIT_TO_EE_TRANSITION_LEAF(); @@ -1868,7 +1858,7 @@ uint32_t CEEInfo::getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) return 0; } -void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) +void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) { CONTRACTL { NOTHROW; @@ -1881,10 +1871,8 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo->tlsIndex.addr = (UINT8*)0; pInfo->offsetOfThreadLocalStoragePointer = 0; - pInfo->offsetOfNonGCThreadStaticBlocks = 0; - pInfo->offsetOfGCThreadStaticBlocks = 0; - pInfo->offsetOfNonGCMaxThreadStaticBlocks = 0; - pInfo->offsetOfGCMaxThreadStaticBlocks = 0; + pInfo->offsetOfThreadStaticBlocks = 0; + pInfo->offsetOfMaxThreadStaticBlocks = 0; pInfo->offsetOfGCDataPointer = 0; JIT_TO_EE_TRANSITION_LEAF(); From 5b8a022dc36e68603bee84381da34b0654bbf2bc Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 12 May 2023 09:38:03 -0700 Subject: [PATCH 17/21] fix missing methods --- src/coreclr/vm/appdomain.cpp | 4 ++-- src/coreclr/vm/appdomain.hpp | 2 +- src/coreclr/vm/jitinterface.cpp | 12 +----------- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/coreclr/vm/appdomain.cpp b/src/coreclr/vm/appdomain.cpp index 9d7ccdc601d76..226df19e1aac6 100644 --- a/src/coreclr/vm/appdomain.cpp +++ b/src/coreclr/vm/appdomain.cpp @@ -666,7 +666,7 @@ void BaseDomain::InitVSD() } #ifdef HOST_WINDOWS -void BaseDomain::InitNonGCThreadStaticBlockTypeMap() +void BaseDomain::InitThreadStaticBlockTypeMap() { STANDARD_VM_CONTRACT; @@ -1773,7 +1773,7 @@ void AppDomain::Create() #ifdef HOST_WINDOWS // allocate a thread static block to index map - pDomain->InitNonGCThreadStaticBlockTypeMap(); + pDomain->InitThreadStaticBlockTypeMap(); #endif pDomain->SetStage(AppDomain::STAGE_OPEN); diff --git a/src/coreclr/vm/appdomain.hpp b/src/coreclr/vm/appdomain.hpp index d11ddc7585e17..c643c83bb2304 100644 --- a/src/coreclr/vm/appdomain.hpp +++ b/src/coreclr/vm/appdomain.hpp @@ -1233,7 +1233,7 @@ class BaseDomain public: #ifdef HOST_WINDOWS - void InitNonGCThreadStaticBlockTypeMap(); + void InitThreadStaticBlockTypeMap(); UINT32 GetNonGCThreadStaticTypeIndex(PTR_MethodTable pMT); UINT32 GetGCThreadStaticTypeIndex(PTR_MethodTable pMT); diff --git a/src/coreclr/vm/jitinterface.cpp b/src/coreclr/vm/jitinterface.cpp index 914dee48b0d42..86fff467ed467 100644 --- a/src/coreclr/vm/jitinterface.cpp +++ b/src/coreclr/vm/jitinterface.cpp @@ -1836,18 +1836,8 @@ void CEEInfo::getThreadLocalStaticBlocksInfo (CORINFO_THREAD_STATIC_BLOCKS_INFO* JIT_TO_EE_TRANSITION_LEAF(); } #else -uint32_t CEEInfo::getNonGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) -{ - CONTRACTL { - NOTHROW; - GC_NOTRIGGER; - MODE_PREEMPTIVE; - } CONTRACTL_END; - return 0; -} - -uint32_t CEEInfo::getGCThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field) +uint32_t CEEInfo::getThreadLocalFieldInfo (CORINFO_FIELD_HANDLE field, bool isGCType) { CONTRACTL { NOTHROW; From 5e81673347e3754267b38cf8ac0f3f8f9e61b70b Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 12 May 2023 09:42:14 -0700 Subject: [PATCH 18/21] update the comments --- src/coreclr/inc/corinfo.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index 3c9a22a4a9ec7..3208abe82bdd3 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -2735,11 +2735,11 @@ class ICorStaticInfo CORINFO_FIELD_INFO *pResult ) = 0; - // Returns the index against which the field's thread static block in stored in TLS - // The field is gc type. + // Returns the index against which the field's thread static block in stored in TLS. virtual uint32_t getThreadLocalFieldInfo ( CORINFO_FIELD_HANDLE field, bool isGCType) = 0; + // Returns the thread static block information like offsets, etc. from current TLS. virtual void getThreadLocalStaticBlocksInfo ( CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) = 0; From 8383cf623c62a846c29c9b90289a0445c9686ad5 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 12 May 2023 10:25:10 -0700 Subject: [PATCH 19/21] Track gc for derefernce of object handle --- src/coreclr/jit/helperexpansion.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/coreclr/jit/helperexpansion.cpp b/src/coreclr/jit/helperexpansion.cpp index c294ae7fccf83..fc71feb0090d8 100644 --- a/src/coreclr/jit/helperexpansion.cpp +++ b/src/coreclr/jit/helperexpansion.cpp @@ -658,8 +658,7 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement* { // Need to add extra indirection to access the data pointer. - threadStaticBlockBaseLclValueUse = - gtNewIndir(TYP_I_IMPL, threadStaticBlockBaseLclValueUse, GTF_IND_NONFAULTING); + threadStaticBlockBaseLclValueUse = gtNewIndir(callType, threadStaticBlockBaseLclValueUse, GTF_IND_NONFAULTING); threadStaticBlockBaseLclValueUse = gtNewOperNode(GT_ADD, callType, threadStaticBlockBaseLclValueUse, gtNewIconNode(threadStaticBlocksInfo.offsetOfGCDataPointer, TYP_I_IMPL)); From 1f4c8ef7c002762ee29a319a11acfb9a196846e9 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 12 May 2023 12:35:49 -0700 Subject: [PATCH 20/21] fix the superpmi methods --- .../tools/superpmi/superpmi-shared/lwmlist.h | 2 +- .../superpmi-shared/methodcontext.cpp | 64 ++++++++++--------- .../superpmi/superpmi-shared/methodcontext.h | 10 +-- .../superpmi-shim-collector/icorjitinfo.cpp | 4 +- .../tools/superpmi/superpmi/icorjitinfo.cpp | 4 +- 5 files changed, 45 insertions(+), 39 deletions(-) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h index 615072268280b..9ea8c6ada013c 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/lwmlist.h @@ -38,7 +38,7 @@ LWM(EmbedFieldHandle, DWORDLONG, DLDL) LWM(EmbedGenericHandle, Agnostic_EmbedGenericHandle, Agnostic_CORINFO_GENERICHANDLE_RESULT) LWM(EmbedMethodHandle, DWORDLONG, DLDL) LWM(EmbedModuleHandle, DWORDLONG, DLDL) -LWM(GetThreadLocalFieldInfo, DWORDLONG, DWORD) +LWM(GetThreadLocalFieldInfo, DLD, DWORD) LWM(GetThreadLocalStaticBlocksInfo, DWORD, Agnostic_GetThreadLocalStaticBlocksInfo) DENSELWM(EmptyStringLiteral, DLD) DENSELWM(ErrorList, DWORD) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 9c10421c8ae5a..267c1e40122e0 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3601,34 +3601,39 @@ void MethodContext::repGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, } } -void MethodContext::recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result) +void MethodContext::recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType, uint32_t result) { if (GetThreadLocalFieldInfo == nullptr) - GetThreadLocalFieldInfo = new LightWeightMap(); + GetThreadLocalFieldInfo = new LightWeightMap(); - DWORDLONG key = 0; - - key = CastHandle(field); + DLD key; + ZeroMemory(&key, sizeof(key)); + key.A = CastHandle(field); + key.B = isGCType ? 0 : 1; GetThreadLocalFieldInfo->Add(key, result); - DEBUG_REC(dmpGetGCThreadLocalFieldInfo(key, result)); + DEBUG_REC(dmpGetThreadLocalFieldInfo(key, result)); } -void MethodContext::dmpGetThreadLocalFieldInfo(DWORDLONG key, DWORD value) +void MethodContext::dmpGetThreadLocalFieldInfo(DLD key, DWORD value) { - printf("GetThreadLocalFieldInfo key hnd-%016" PRIX64 ", result-%u", key, value); + printf("GetThreadLocalFieldInfo key hnd-%016" PRIX64 ",gctype-%d result-%u", key.A, key.B, value); } -uint32_t MethodContext::repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field) +uint32_t MethodContext::repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType) { - DWORDLONG key = CastHandle(field); - DWORD value = LookupByKeyOrMiss(GetThreadLocalFieldInfo, key, ": key %016" PRIX64 "", key); + DLD key; + ZeroMemory(&key, sizeof(key)); + + key.A = CastHandle(field); + key.B = isGCType ? 0 : 1; + DWORD value = LookupByKeyOrMiss(GetThreadLocalFieldInfo, key, ": key hnd-%016" PRIX64 ", gctype-%u", key.A, key.B); DEBUG_REP(dmpGetThreadLocalFieldInfo(key, value)); return value; } -void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) +void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) { if (GetThreadLocalStaticBlocksInfo == nullptr) GetThreadLocalStaticBlocksInfo = new LightWeightMap(); @@ -3638,37 +3643,38 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC value.tlsIndex.handle = CastHandle(pInfo->tlsIndex.addr); value.tlsIndex.accessType = pInfo->tlsIndex.accessType; - value.offsetOfMaxThreadStaticBlocks = pInfo->offsetOfMaxThreadStaticBlocks; - value.offsetOfThreadLocalStoragePointer = pInfo->offsetOfThreadLocalStoragePointer; - value.offsetOfThreadStaticBlocks = pInfo->offsetOfThreadStaticBlocks; - value.offsetOfGCDataPointer = pInfo->offsetOfGCDataPointer; + value.offsetOfMaxThreadStaticBlocks = pInfo->offsetOfMaxThreadStaticBlocks; + value.offsetOfThreadLocalStoragePointer = pInfo->offsetOfThreadLocalStoragePointer; + value.offsetOfThreadStaticBlocks = pInfo->offsetOfThreadStaticBlocks; + value.offsetOfGCDataPointer = pInfo->offsetOfGCDataPointer; // This data is same for entire process, so just add it against key '0'. - GetThreadLocalStaticBlocksInfo->Add(0, value); - DEBUG_REC(dmpGetThreadLocalStaticBlocksInfo(0, value)); + GetThreadLocalStaticBlocksInfo->Add(isGCType ? 0 : 1, value); + DEBUG_REC(dmpGetThreadLocalStaticBlocksInfo(isGCType ? 0 : 1, value)); } void MethodContext::dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value) { - printf("GetThreadLocalStaticBlocksInfo key 0, value tlsIndex-%016" PRIX64 + printf("GetThreadLocalStaticBlocksInfo key %u, value tlsIndex-%016" PRIX64 ", offsetOfThreadLocalStoragePointer-%u, offsetOfMaxThreadStaticBlocks-%u" ", offsetOfThreadStaticBlocks-%u offsetOfGCDataPointer-%u", - value.tlsIndex.handle, value.offsetOfThreadLocalStoragePointer, + key, value.tlsIndex.handle, value.offsetOfThreadLocalStoragePointer, value.offsetOfMaxThreadStaticBlocks, value.offsetOfThreadStaticBlocks, value.offsetOfGCDataPointer); } -void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo) +void MethodContext::repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) { - Agnostic_GetThreadLocalStaticBlocksInfo value = LookupByKeyOrMiss(GetThreadLocalStaticBlocksInfo, 0, ": key %u", 0); + int key = isGCType ? 0 : 1; + Agnostic_GetThreadLocalStaticBlocksInfo value = LookupByKeyOrMiss(GetThreadLocalStaticBlocksInfo, key, ": key %u", key); - DEBUG_REP(dmpGetThreadLocalStaticBlocksInfo(0, value)); + DEBUG_REP(dmpGetThreadLocalStaticBlocksInfo(key, value)); - pInfo->tlsIndex.accessType = (InfoAccessType)value.tlsIndex.accessType; - pInfo->tlsIndex.addr = (void*)value.tlsIndex.handle; - pInfo->offsetOfMaxThreadStaticBlocks = value.offsetOfMaxThreadStaticBlocks; - pInfo->offsetOfThreadLocalStoragePointer = value.offsetOfThreadLocalStoragePointer; - pInfo->offsetOfThreadStaticBlocks = value.offsetOfThreadStaticBlocks; - pInfo->offsetOfGCDataPointer = value.offsetOfGCDataPointer; + pInfo->tlsIndex.accessType = (InfoAccessType)value.tlsIndex.accessType; + pInfo->tlsIndex.addr = (void*)value.tlsIndex.handle; + pInfo->offsetOfMaxThreadStaticBlocks = value.offsetOfMaxThreadStaticBlocks; + pInfo->offsetOfThreadLocalStoragePointer = value.offsetOfThreadLocalStoragePointer; + pInfo->offsetOfThreadStaticBlocks = value.offsetOfThreadStaticBlocks; + pInfo->offsetOfGCDataPointer = value.offsetOfGCDataPointer; } void MethodContext::recEmbedMethodHandle(CORINFO_METHOD_HANDLE handle, diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h index dbfb42220aadf..ac8bbff953fa4 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h @@ -485,13 +485,13 @@ class MethodContext CORINFO_ACCESS_FLAGS flags, CORINFO_FIELD_INFO* pResult); - void recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, uint32_t result); - void dmpGetThreadLocalFieldInfo(DWORDLONG key, DWORD value); - uint32_t repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field); + void recGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType, uint32_t result); + void dmpGetThreadLocalFieldInfo(DLD key, DWORD value); + uint32_t repGetThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType); - void recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); + void recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType); void dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value); - void repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo); + void repGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType); void recEmbedMethodHandle(CORINFO_METHOD_HANDLE handle, void** ppIndirection, CORINFO_METHOD_HANDLE result); void dmpEmbedMethodHandle(DWORDLONG key, DLDL value); diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 1eed77a02bca6..120ab047d7f71 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -1100,7 +1100,7 @@ uint32_t interceptor_ICJI::getThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, b { mc->cr->AddCall("getGCThreadLocalFieldInfo"); uint32_t result = original_ICorJitInfo->getThreadLocalFieldInfo(field, isGCType); - mc->recGetThreadLocalFieldInfo(field, result); + mc->recGetThreadLocalFieldInfo(field, isGCType, result); return result; } @@ -1108,7 +1108,7 @@ void interceptor_ICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC { mc->cr->AddCall("getThreadLocalStaticBlocksInfo"); original_ICorJitInfo->getThreadLocalStaticBlocksInfo(pInfo, isGCType); - mc->recGetThreadLocalStaticBlocksInfo(pInfo); + mc->recGetThreadLocalStaticBlocksInfo(pInfo, isGCType); } // Returns true iff "fldHnd" represents a static field. diff --git a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp index 6a65ff355e31b..16d52438b6c40 100644 --- a/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi/icorjitinfo.cpp @@ -920,13 +920,13 @@ void MyICJI::getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, uint32_t MyICJI::getThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType) { jitInstance->mc->cr->AddCall("getThreadLocalFieldInfo"); - return jitInstance->mc->repGetThreadLocalFieldInfo(field); + return jitInstance->mc->repGetThreadLocalFieldInfo(field, isGCType); } void MyICJI::getThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOCKS_INFO* pInfo, bool isGCType) { jitInstance->mc->cr->AddCall("getThreadLocalStaticBlocksInfo"); - jitInstance->mc->repGetThreadLocalStaticBlocksInfo(pInfo); + jitInstance->mc->repGetThreadLocalStaticBlocksInfo(pInfo, isGCType); } // Returns true iff "fldHnd" represents a static field. From ef9532e363dc51e93b8235eef0b8d74cebf7e320 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Fri, 12 May 2023 13:46:30 -0700 Subject: [PATCH 21/21] review feedback --- .../tools/superpmi/superpmi-shared/methodcontext.cpp | 5 +++-- .../tools/superpmi/superpmi-shared/methodcontext.h | 8 ++++---- .../superpmi/superpmi-shim-collector/icorjitinfo.cpp | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp index 267c1e40122e0..951819fd95bd9 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp @@ -3649,8 +3649,9 @@ void MethodContext::recGetThreadLocalStaticBlocksInfo(CORINFO_THREAD_STATIC_BLOC value.offsetOfGCDataPointer = pInfo->offsetOfGCDataPointer; // This data is same for entire process, so just add it against key '0'. - GetThreadLocalStaticBlocksInfo->Add(isGCType ? 0 : 1, value); - DEBUG_REC(dmpGetThreadLocalStaticBlocksInfo(isGCType ? 0 : 1, value)); + DWORD key = isGCType ? 0 : 1; + GetThreadLocalStaticBlocksInfo->Add(key, value); + DEBUG_REC(dmpGetThreadLocalStaticBlocksInfo(key, value)); } void MethodContext::dmpGetThreadLocalStaticBlocksInfo(DWORD key, const Agnostic_GetThreadLocalStaticBlocksInfo& value) diff --git a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h index ac8bbff953fa4..e6dacd31f2a3c 100644 --- a/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h +++ b/src/coreclr/tools/superpmi/superpmi-shared/methodcontext.h @@ -1180,10 +1180,10 @@ enum mcPackets Packet_GetStringChar = 204, Packet_GetIsClassInitedFlagAddress = 205, Packet_GetStaticBaseAddress = 206, - Packet_GetThreadLocalFieldInfo = 208, - Packet_GetThreadLocalStaticBlocksInfo = 209, - Packet_GetRISCV64PassStructInRegisterFlags = 210, - Packet_GetObjectContent = 211, + Packet_GetThreadLocalFieldInfo = 207, + Packet_GetThreadLocalStaticBlocksInfo = 208, + Packet_GetRISCV64PassStructInRegisterFlags = 209, + Packet_GetObjectContent = 210, }; void SetDebugDumpVariables(); diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp index 120ab047d7f71..c746be1fe5bd6 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/icorjitinfo.cpp @@ -1098,7 +1098,7 @@ void interceptor_ICJI::getFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken, uint32_t interceptor_ICJI::getThreadLocalFieldInfo(CORINFO_FIELD_HANDLE field, bool isGCType) { - mc->cr->AddCall("getGCThreadLocalFieldInfo"); + mc->cr->AddCall("getThreadLocalFieldInfo"); uint32_t result = original_ICorJitInfo->getThreadLocalFieldInfo(field, isGCType); mc->recGetThreadLocalFieldInfo(field, isGCType, result); return result;