From dd995601df22d859591bd9a05974f0f0c383f0e8 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Fri, 3 Apr 2026 14:54:13 -0700 Subject: [PATCH 1/4] use CodeRangeMapRangeList for callcounting stubs --- src/coreclr/vm/callcounting.cpp | 91 ++---------------------------- src/coreclr/vm/callcounting.h | 14 +---- src/coreclr/vm/codeman.h | 9 ++- src/coreclr/vm/common.h | 1 + src/coreclr/vm/loaderallocator.hpp | 4 +- src/coreclr/vm/stubmgr.cpp | 11 ++++ 6 files changed, 31 insertions(+), 99 deletions(-) diff --git a/src/coreclr/vm/callcounting.cpp b/src/coreclr/vm/callcounting.cpp index 2fe7f4aa3d2731..e5b93970f64ac1 100644 --- a/src/coreclr/vm/callcounting.cpp +++ b/src/coreclr/vm/callcounting.cpp @@ -180,7 +180,9 @@ CallCountingManager::CallCountingInfo::CodeVersionHashTraits::Hash(const key_t & //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CallCountingManager::CallCountingStubAllocator -CallCountingManager::CallCountingStubAllocator::CallCountingStubAllocator() : m_heap(nullptr) +CallCountingManager::CallCountingStubAllocator::CallCountingStubAllocator() + : m_heap(nullptr), + m_heapRangeList(STUB_CODE_BLOCK_CALLCOUNTING, true /* collectible */) { WRAPPER_NO_CONTRACT; } @@ -355,24 +357,6 @@ NOINLINE InterleavedLoaderHeap *CallCountingManager::CallCountingStubAllocator:: #endif // !DACCESS_COMPILE -bool CallCountingManager::CallCountingStubAllocator::IsStub(TADDR entryPoint) -{ - WRAPPER_NO_CONTRACT; - _ASSERTE(entryPoint != (TADDR)NULL); - - return !!m_heapRangeList.IsInRange(entryPoint); -} - -#ifdef DACCESS_COMPILE - -void CallCountingManager::CallCountingStubAllocator::EnumerateHeapRanges(CLRDataEnumMemoryFlags flags) -{ - WRAPPER_NO_CONTRACT; - m_heapRangeList.EnumMemoryRegions(flags); -} - -#endif // DACCESS_COMPILE - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CallCountingManager::MethodDescForwarderStubHashTraits @@ -1161,39 +1145,6 @@ void CallCountingManager::TrimCollections() #endif // !DACCESS_COMPILE -bool CallCountingManager::IsCallCountingStub(PCODE entryPoint) -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - MODE_ANY; - SUPPORTS_DAC; - } - CONTRACTL_END; - - TADDR entryAddress = PCODEToPINSTR(entryPoint); - _ASSERTE(entryAddress != (PCODE)NULL); - - CodeVersionManager::LockHolder codeVersioningLockHolder; - - PTR_CallCountingManagerHash callCountingManagers = s_callCountingManagers; - if (callCountingManagers == NULL) - { - return false; - } - - for (auto itEnd = callCountingManagers->End(), it = callCountingManagers->Begin(); it != itEnd; ++it) - { - PTR_CallCountingManager callCountingManager = *it; - if (callCountingManager->m_callCountingStubAllocator.IsStub(entryAddress)) - { - return true; - } - } - return false; -} - PCODE CallCountingManager::GetTargetForMethod(PCODE callCountingStubEntryPoint) { CONTRACTL @@ -1205,41 +1156,9 @@ PCODE CallCountingManager::GetTargetForMethod(PCODE callCountingStubEntryPoint) } CONTRACTL_END; - _ASSERTE(IsCallCountingStub(callCountingStubEntryPoint)); - return PTR_CallCountingStub(PCODEToPINSTR(callCountingStubEntryPoint))->GetTargetForMethod(); } -#ifdef DACCESS_COMPILE - -void CallCountingManager::DacEnumerateCallCountingStubHeapRanges(CLRDataEnumMemoryFlags flags) -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - MODE_ANY; - SUPPORTS_DAC; - } - CONTRACTL_END; - - CodeVersionManager::LockHolder codeVersioningLockHolder; - - PTR_CallCountingManagerHash callCountingManagers = s_callCountingManagers; - if (callCountingManagers == NULL) - { - return; - } - - for (auto itEnd = callCountingManagers->End(), it = callCountingManagers->Begin(); it != itEnd; ++it) - { - PTR_CallCountingManager callCountingManager = *it; - callCountingManager->m_callCountingStubAllocator.EnumerateHeapRanges(flags); - } -} - -#endif // DACCESS_COMPILE - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CallCountingManager::CallCountingStubManager @@ -1289,7 +1208,8 @@ BOOL CallCountingStubManager::CheckIsStub_Internal(PCODE entryPoint) WRAPPER_NO_CONTRACT; SUPPORTS_DAC; - return CallCountingManager::IsCallCountingStub(entryPoint); + // Forwarded to from RangeSectionStubManager + return FALSE; } BOOL CallCountingStubManager::DoTraceStub(PCODE callCountingStubEntryPoint, TraceDestination *trace) @@ -1310,7 +1230,6 @@ void CallCountingStubManager::DoEnumMemoryRegions(CLRDataEnumMemoryFlags flags) DAC_ENUM_VTHIS(); EMEM_OUT(("MEM: %p CallCountingStubManager\n", dac_cast(this))); - CallCountingManager::DacEnumerateCallCountingStubHeapRanges(flags); } #endif diff --git a/src/coreclr/vm/callcounting.h b/src/coreclr/vm/callcounting.h index 254f22d5eb2dce..7858be8d241d52 100644 --- a/src/coreclr/vm/callcounting.h +++ b/src/coreclr/vm/callcounting.h @@ -4,6 +4,7 @@ #pragma once #include "codeversion.h" +#include "loaderallocator.hpp" #ifdef FEATURE_TIERED_COMPILATION @@ -256,7 +257,7 @@ class CallCountingManager // LoaderHeap cannot be constructed when DACCESS_COMPILE is defined (at the time, its destructor was private). Working // around that by controlling creation/destruction using a pointer. InterleavedLoaderHeap *m_heap; - RangeList m_heapRangeList; + CodeRangeMapRangeList m_heapRangeList; public: CallCountingStubAllocator(); @@ -271,12 +272,6 @@ class CallCountingManager #endif // !DACCESS_COMPILE public: - bool IsStub(TADDR entryPoint); - - #ifdef DACCESS_COMPILE - void EnumerateHeapRanges(CLRDataEnumMemoryFlags flags); - #endif - DISABLE_COPY(CallCountingStubAllocator); }; @@ -371,11 +366,7 @@ class CallCountingManager #endif // !DACCESS_COMPILE public: - static bool IsCallCountingStub(PCODE entryPoint); static PCODE GetTargetForMethod(PCODE callCountingStubEntryPoint); -#ifdef DACCESS_COMPILE - static void DacEnumerateCallCountingStubHeapRanges(CLRDataEnumMemoryFlags flags); -#endif DISABLE_COPY(CallCountingManager); }; @@ -418,6 +409,7 @@ typedef VPTR(CallCountingStubManager) PTR_CallCountingStubManager; class CallCountingStubManager : public StubManager { VPTR_VTABLE_CLASS(CallCountingStubManager, StubManager); + friend class RangeSectionStubManager; private: SPTR_DECL(CallCountingStubManager, g_pManager); diff --git a/src/coreclr/vm/codeman.h b/src/coreclr/vm/codeman.h index 843aab8ebc3fe6..c1d37f9fd84a21 100644 --- a/src/coreclr/vm/codeman.h +++ b/src/coreclr/vm/codeman.h @@ -113,8 +113,11 @@ enum StubCodeBlockKind : int STUB_CODE_BLOCK_NOCODE = 0x10, STUB_CODE_BLOCK_MANAGED = 0x11, STUB_CODE_BLOCK_STUBLINK = 0x12, - // Placeholdes used by ReadyToRun images + // Placeholder used by ReadyToRun images STUB_CODE_BLOCK_METHOD_CALL_THUNK = 0x13, +#ifdef FEATURE_TIERED_COMPILATION + STUB_CODE_BLOCK_CALLCOUNTING = 0x14, +#endif }; inline const char *GetStubCodeBlockKindString(StubCodeBlockKind kind) @@ -129,6 +132,10 @@ inline const char *GetStubCodeBlockKindString(StubCodeBlockKind kind) return "Managed"; case STUB_CODE_BLOCK_METHOD_CALL_THUNK: return "MethodCallThunk"; +#ifdef FEATURE_TIERED_COMPILATION + case STUB_CODE_BLOCK_CALLCOUNTING: + return "CallCountingStub"; +#endif case STUB_CODE_BLOCK_DYNAMICHELPER: return "MethodCallThunk"; case STUB_CODE_BLOCK_FIXUPPRECODE: diff --git a/src/coreclr/vm/common.h b/src/coreclr/vm/common.h index bfce067a851101..714f92b79b9946 100644 --- a/src/coreclr/vm/common.h +++ b/src/coreclr/vm/common.h @@ -295,6 +295,7 @@ namespace Loader #include "threads.h" #include "clrex.inl" #include "loaderallocator.hpp" +#include "callcounting.h" #include "appdomain.hpp" #include "appdomain.inl" #include "assembly.hpp" diff --git a/src/coreclr/vm/loaderallocator.hpp b/src/coreclr/vm/loaderallocator.hpp index ae1d8f4b40cfc1..61d5e529db8c3a 100644 --- a/src/coreclr/vm/loaderallocator.hpp +++ b/src/coreclr/vm/loaderallocator.hpp @@ -20,7 +20,6 @@ class FuncPtrStubs; #include "ilstubcache.h" #include "asynccontinuations.h" -#include "callcounting.h" #include "methoddescbackpatchinfo.h" #include "crossloaderallocatorhash.h" #include "onstackreplacement.h" @@ -36,6 +35,9 @@ enum LoaderAllocatorType LAT_Assembly }; +class CallCountingManager; +typedef DPTR(CallCountingManager) PTR_CallCountingManager; + typedef SHash> LoaderAllocatorSet; class CustomAssemblyBinder; diff --git a/src/coreclr/vm/stubmgr.cpp b/src/coreclr/vm/stubmgr.cpp index c35426881acc83..c9a0f76c6041ac 100644 --- a/src/coreclr/vm/stubmgr.cpp +++ b/src/coreclr/vm/stubmgr.cpp @@ -1518,6 +1518,9 @@ BOOL RangeSectionStubManager::CheckIsStub_Internal(PCODE stubStartAddress) case STUB_CODE_BLOCK_JUMPSTUB: case STUB_CODE_BLOCK_STUBLINK: case STUB_CODE_BLOCK_METHOD_CALL_THUNK: +#ifdef FEATURE_TIERED_COMPILATION + case STUB_CODE_BLOCK_CALLCOUNTING: +#endif // FEATURE_TIERED_COMPILATION #ifdef FEATURE_VIRTUAL_STUB_DISPATCH case STUB_CODE_BLOCK_VSD_DISPATCH_STUB: case STUB_CODE_BLOCK_VSD_RESOLVE_STUB: @@ -1553,6 +1556,10 @@ BOOL RangeSectionStubManager::DoTraceStub(PCODE stubStartAddress, TraceDestinati case STUB_CODE_BLOCK_STUBLINK: return StubLinkStubManager::g_pManager->DoTraceStub(stubStartAddress, trace); +#ifdef FEATURE_TIERED_COMPILATION + case STUB_CODE_BLOCK_CALLCOUNTING: + return CallCountingStubManager::g_pManager->DoTraceStub(stubStartAddress, trace); +#endif // FEATURE_TIERED_COMPILATION #ifdef FEATURE_VIRTUAL_STUB_DISPATCH case STUB_CODE_BLOCK_VSD_DISPATCH_STUB: @@ -1592,6 +1599,10 @@ LPCWSTR RangeSectionStubManager::GetStubManagerName(PCODE addr) case STUB_CODE_BLOCK_METHOD_CALL_THUNK: return W("MethodCallThunk"); +#ifdef FEATURE_TIERED_COMPILATION + case STUB_CODE_BLOCK_CALLCOUNTING: + return W("CallCountingStub"); +#endif // FEATURE_TIERED_COMPILATION #ifdef FEATURE_VIRTUAL_STUB_DISPATCH case STUB_CODE_BLOCK_VSD_DISPATCH_STUB: From 4ae7b09f99a21cd02869cc510bdc6ef09241dd9b Mon Sep 17 00:00:00 2001 From: rcj1 Date: Sun, 5 Apr 2026 11:58:50 -0700 Subject: [PATCH 2/4] remove unneeded code --- src/coreclr/debug/daccess/daccess.cpp | 23 -------- src/coreclr/inc/dacvars.h | 6 --- src/coreclr/inc/vptr_list.h | 6 --- src/coreclr/vm/appdomain.cpp | 6 --- src/coreclr/vm/callcounting.cpp | 76 --------------------------- src/coreclr/vm/callcounting.h | 46 ---------------- src/coreclr/vm/stubmgr.cpp | 73 ++++--------------------- src/coreclr/vm/stubmgr.h | 40 -------------- 8 files changed, 9 insertions(+), 267 deletions(-) diff --git a/src/coreclr/debug/daccess/daccess.cpp b/src/coreclr/debug/daccess/daccess.cpp index 93062186b89fc9..eb0498ebb0b790 100644 --- a/src/coreclr/debug/daccess/daccess.cpp +++ b/src/coreclr/debug/daccess/daccess.cpp @@ -5528,29 +5528,6 @@ ClrDataAccess::RawGetMethodName( EX_END_CATCH } } -#ifdef FEATURE_DYNAMIC_CODE_COMPILED - else - if (pStubManager == JumpStubStubManager::g_pManager) - { - PCODE pTarget = decodeBackToBackJump(TO_TADDR(address)); - - HRESULT hr = GetRuntimeNameByAddress(pTarget, flags, bufLen, symbolLen, symbolBuf, NULL); - if (SUCCEEDED(hr)) - { - return hr; - } - - PCSTR pHelperName = GetJitHelperName(pTarget); - if (pHelperName != NULL) - { - hr = ConvertUtf8(pHelperName, bufLen, symbolLen, symbolBuf); - if (FAILED(hr)) - return S_FALSE; - - return hr; - } - } -#endif // FEATURE_DYNAMIC_CODE_COMPILED LPCWSTR wszStubManagerName = pStubManager->GetStubManagerName(TO_TADDR(address)); _ASSERTE(wszStubManagerName != NULL); diff --git a/src/coreclr/inc/dacvars.h b/src/coreclr/inc/dacvars.h index 80d4e0d5506cf2..a61b9ed87a701d 100644 --- a/src/coreclr/inc/dacvars.h +++ b/src/coreclr/inc/dacvars.h @@ -96,14 +96,8 @@ DEFINE_DACVAR(VMHELPDEF *, dac__hlpDynamicFuncTable, ::hlpDynamicFuncTable) DEFINE_DACVAR(PTR_StubManager, StubManager__g_pFirstManager, StubManager::g_pFirstManager) DEFINE_DACVAR(PTR_PrecodeStubManager, PrecodeStubManager__g_pManager, PrecodeStubManager::g_pManager) DEFINE_DACVAR(PTR_StubLinkStubManager, StubLinkStubManager__g_pManager, StubLinkStubManager::g_pManager) -#ifdef FEATURE_DYNAMIC_CODE_COMPILED -DEFINE_DACVAR(PTR_JumpStubStubManager, JumpStubStubManager__g_pManager, JumpStubStubManager::g_pManager) -#endif // FEATURE_DYNAMIC_CODE_COMPILED DEFINE_DACVAR(PTR_RangeSectionStubManager, RangeSectionStubManager__g_pManager, RangeSectionStubManager::g_pManager) DEFINE_DACVAR(PTR_VirtualCallStubManagerManager, VirtualCallStubManagerManager__g_pManager, VirtualCallStubManagerManager::g_pManager) -#ifdef FEATURE_TIERED_COMPILATION -DEFINE_DACVAR(PTR_CallCountingStubManager, CallCountingStubManager__g_pManager, CallCountingStubManager::g_pManager) -#endif // FEATURE_TIERED_COMPILATION DEFINE_DACVAR(PTR_ThreadStore, ThreadStore__s_pThreadStore, ThreadStore::s_pThreadStore) diff --git a/src/coreclr/inc/vptr_list.h b/src/coreclr/inc/vptr_list.h index 5d50adb9bfcad3..aca2dbaa0a6207 100644 --- a/src/coreclr/inc/vptr_list.h +++ b/src/coreclr/inc/vptr_list.h @@ -30,9 +30,6 @@ VPTR_CLASS(StubLinkStubManager) VPTR_CLASS(ThePreStubManager) VPTR_CLASS(VirtualCallStubManager) VPTR_CLASS(VirtualCallStubManagerManager) -#ifdef FEATURE_DYNAMIC_CODE_COMPILED -VPTR_CLASS(JumpStubStubManager) -#endif // FEATURE_DYNAMIC_CODE_COMPILED VPTR_CLASS(RangeSectionStubManager) VPTR_CLASS(ILStubManager) VPTR_CLASS(PInvokeStubManager) @@ -41,9 +38,6 @@ VPTR_CLASS(InteropDispatchStubManager) VPTR_CLASS(TailCallStubManager) #endif VPTR_CLASS(AsyncThunkStubManager) -#ifdef FEATURE_TIERED_COMPILATION -VPTR_CLASS(CallCountingStubManager) -#endif // FEATURE_TIERED_COMPILATION VPTR_CLASS(PEImageLayout) VPTR_CLASS(ConvertedImageLayout) diff --git a/src/coreclr/vm/appdomain.cpp b/src/coreclr/vm/appdomain.cpp index 63f78b3f757e86..2355f948b92f05 100644 --- a/src/coreclr/vm/appdomain.cpp +++ b/src/coreclr/vm/appdomain.cpp @@ -722,9 +722,6 @@ void SystemDomain::Attach() #ifndef FEATURE_PORTABLE_ENTRYPOINTS PrecodeStubManager::Init(); #endif // !FEATURE_PORTABLE_ENTRYPOINTS -#ifdef FEATURE_DYNAMIC_CODE_COMPILED - JumpStubStubManager::Init(); -#endif // FEATURE_DYNAMIC_CODE_COMPILED RangeSectionStubManager::Init(); ILStubManager::Init(); PInvokeStubManager::Init(); @@ -732,9 +729,6 @@ void SystemDomain::Attach() StubLinkStubManager::Init(); TailCallStubManager::Init(); AsyncThunkStubManager::Init(); -#ifdef FEATURE_TIERED_COMPILATION - CallCountingStubManager::Init(); -#endif m_SystemDomainCrst.Init(CrstSystemDomain, (CrstFlags)(CRST_REENTRANCY | CRST_TAKEN_DURING_SHUTDOWN)); m_DelayedUnloadCrst.Init(CrstSystemDomainDelayedUnloadList, CRST_UNSAFE_COOPGC); diff --git a/src/coreclr/vm/callcounting.cpp b/src/coreclr/vm/callcounting.cpp index e5b93970f64ac1..9177036fa5fb0e 100644 --- a/src/coreclr/vm/callcounting.cpp +++ b/src/coreclr/vm/callcounting.cpp @@ -1159,80 +1159,4 @@ PCODE CallCountingManager::GetTargetForMethod(PCODE callCountingStubEntryPoint) return PTR_CallCountingStub(PCODEToPINSTR(callCountingStubEntryPoint))->GetTargetForMethod(); } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CallCountingManager::CallCountingStubManager - -SPTR_IMPL(CallCountingStubManager, CallCountingStubManager, g_pManager); - -#ifndef DACCESS_COMPILE - -CallCountingStubManager::CallCountingStubManager() -{ - WRAPPER_NO_CONTRACT; -} - -void CallCountingStubManager::Init() -{ - CONTRACTL - { - THROWS; - GC_NOTRIGGER; - MODE_ANY; - } - CONTRACTL_END; - - g_pManager = new CallCountingStubManager(); - StubManager::AddStubManager(g_pManager); -} - -#endif // !DACCESS_COMPILE - -#ifdef _DEBUG -const char *CallCountingStubManager::DbgGetName() -{ - WRAPPER_NO_CONTRACT; - return "CallCountingStubManager"; -} -#endif - -#ifdef DACCESS_COMPILE -LPCWSTR CallCountingStubManager::GetStubManagerName(PCODE addr) -{ - WRAPPER_NO_CONTRACT; - return W("CallCountingStub"); -} -#endif - -BOOL CallCountingStubManager::CheckIsStub_Internal(PCODE entryPoint) -{ - WRAPPER_NO_CONTRACT; - SUPPORTS_DAC; - - // Forwarded to from RangeSectionStubManager - return FALSE; -} - -BOOL CallCountingStubManager::DoTraceStub(PCODE callCountingStubEntryPoint, TraceDestination *trace) -{ - WRAPPER_NO_CONTRACT; - SUPPORTS_DAC; - _ASSERTE(trace != nullptr); - - trace->InitForStub(CallCountingManager::GetTargetForMethod(callCountingStubEntryPoint)); - return true; -} - -#ifdef DACCESS_COMPILE -void CallCountingStubManager::DoEnumMemoryRegions(CLRDataEnumMemoryFlags flags) -{ - WRAPPER_NO_CONTRACT; - SUPPORTS_DAC; - - DAC_ENUM_VTHIS(); - EMEM_OUT(("MEM: %p CallCountingStubManager\n", dac_cast(this))); -} -#endif - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #endif // FEATURE_TIERED_COMPILATION diff --git a/src/coreclr/vm/callcounting.h b/src/coreclr/vm/callcounting.h index 7858be8d241d52..7db35016307ef1 100644 --- a/src/coreclr/vm/callcounting.h +++ b/src/coreclr/vm/callcounting.h @@ -400,52 +400,6 @@ inline PCODE CallCountingStub::GetTargetForMethod() const return GetData()->TargetForMethod; } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// CallCountingManager::CallCountingStubManager - -class CallCountingStubManager; -typedef VPTR(CallCountingStubManager) PTR_CallCountingStubManager; - -class CallCountingStubManager : public StubManager -{ - VPTR_VTABLE_CLASS(CallCountingStubManager, StubManager); - friend class RangeSectionStubManager; - -private: - SPTR_DECL(CallCountingStubManager, g_pManager); - -#ifndef DACCESS_COMPILE -public: - CallCountingStubManager(); - -public: - static void Init(); -#endif - -#ifdef _DEBUG -public: - virtual const char *DbgGetName(); // override -#endif - -#ifdef DACCESS_COMPILE -public: - virtual LPCWSTR GetStubManagerName(PCODE addr); -#endif - -protected: - virtual BOOL CheckIsStub_Internal(PCODE entryPoint); // override - virtual BOOL DoTraceStub(PCODE callCountingStubEntryPoint, TraceDestination *trace); // override - -#ifdef DACCESS_COMPILE -protected: - virtual void DoEnumMemoryRegions(CLRDataEnumMemoryFlags flags); // override -#endif - - DISABLE_COPY(CallCountingStubManager); -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #undef DISABLE_COPY #endif // FEATURE_TIERED_COMPILATION diff --git a/src/coreclr/vm/stubmgr.cpp b/src/coreclr/vm/stubmgr.cpp index c9a0f76c6041ac..9f518313ce7baf 100644 --- a/src/coreclr/vm/stubmgr.cpp +++ b/src/coreclr/vm/stubmgr.cpp @@ -1433,57 +1433,6 @@ BOOL StubLinkStubManager::TraceManager(Thread *thread, #endif // #ifndef DACCESS_COMPILE -#ifdef FEATURE_DYNAMIC_CODE_COMPILED -// ------------------------------------------------------- -// JumpStub stubs -// -// Stub manager for jump stubs created by ExecutionManager::jumpStub() -// These are currently used only on the 64-bit targets IA64 and AMD64 -// -// ------------------------------------------------------- - -SPTR_IMPL(JumpStubStubManager, JumpStubStubManager, g_pManager); - -#ifndef DACCESS_COMPILE -/* static */ -void JumpStubStubManager::Init() -{ - CONTRACTL - { - THROWS; - GC_NOTRIGGER; - MODE_ANY; - } - CONTRACTL_END - - g_pManager = new JumpStubStubManager(); - StubManager::AddStubManager(g_pManager); -} -#endif // #ifndef DACCESS_COMPILE - -BOOL JumpStubStubManager::CheckIsStub_Internal(PCODE stubStartAddress) -{ - WRAPPER_NO_CONTRACT; - SUPPORTS_DAC; - - // Forwarded to from RangeSectionStubManager - return FALSE; -} - -BOOL JumpStubStubManager::DoTraceStub(PCODE stubStartAddress, - TraceDestination *trace) -{ - LIMITED_METHOD_CONTRACT; - - PCODE jumpTarget = decodeBackToBackJump(stubStartAddress); - trace->InitForStub(jumpTarget); - - LOG_TRACE_DESTINATION(trace, stubStartAddress, "JumpStubStubManager::DoTraceStub"); - - return TRUE; -} -#endif // FEATURE_DYNAMIC_CODE_COMPILED - // // Stub manager for code sections. It forwards the query to the more appropriate // stub manager, or handles the query itself. @@ -1551,14 +1500,21 @@ BOOL RangeSectionStubManager::DoTraceStub(PCODE stubStartAddress, TraceDestinati { #ifdef FEATURE_DYNAMIC_CODE_COMPILED case STUB_CODE_BLOCK_JUMPSTUB: - return JumpStubStubManager::g_pManager->DoTraceStub(stubStartAddress, trace); + { + PCODE jumpTarget = decodeBackToBackJump(stubStartAddress); + trace->InitForStub(jumpTarget); + return TRUE; + } #endif // FEATURE_DYNAMIC_CODE_COMPILED case STUB_CODE_BLOCK_STUBLINK: return StubLinkStubManager::g_pManager->DoTraceStub(stubStartAddress, trace); #ifdef FEATURE_TIERED_COMPILATION case STUB_CODE_BLOCK_CALLCOUNTING: - return CallCountingStubManager::g_pManager->DoTraceStub(stubStartAddress, trace); + { + trace->InitForStub(CallCountingManager::GetTargetForMethod(stubStartAddress)); + return TRUE; + } #endif // FEATURE_TIERED_COMPILATION #ifdef FEATURE_VIRTUAL_STUB_DISPATCH @@ -2342,17 +2298,6 @@ StubLinkStubManager::DoEnumMemoryRegions(CLRDataEnumMemoryFlags flags) GetRangeList()->EnumMemoryRegions(flags); } -#ifdef FEATURE_DYNAMIC_CODE_COMPILED -void -JumpStubStubManager::DoEnumMemoryRegions(CLRDataEnumMemoryFlags flags) -{ - SUPPORTS_DAC; - WRAPPER_NO_CONTRACT; - DAC_ENUM_VTHIS(); - EMEM_OUT(("MEM: %p JumpStubStubManager\n", dac_cast(this))); -} -#endif // FEATURE_DYNAMIC_CODE_COMPILED - void RangeSectionStubManager::DoEnumMemoryRegions(CLRDataEnumMemoryFlags flags) { diff --git a/src/coreclr/vm/stubmgr.h b/src/coreclr/vm/stubmgr.h index a19724b65f4a2c..102c0d02e1deff 100644 --- a/src/coreclr/vm/stubmgr.h +++ b/src/coreclr/vm/stubmgr.h @@ -504,46 +504,6 @@ class StubLinkStubManager : public StubManager #endif } ; -#ifdef FEATURE_DYNAMIC_CODE_COMPILED -// -// Stub manager for jump stubs created by ExecutionManager::jumpStub() -// -typedef VPTR(class JumpStubStubManager) PTR_JumpStubStubManager; - -class JumpStubStubManager : public StubManager -{ - VPTR_VTABLE_CLASS(JumpStubStubManager, StubManager) - - public: - - SPTR_DECL(JumpStubStubManager, g_pManager); - - static void Init(); - -#ifndef DACCESS_COMPILE - JumpStubStubManager() {LIMITED_METHOD_CONTRACT;} - ~JumpStubStubManager() {WRAPPER_NO_CONTRACT;} - -#endif - -#ifdef _DEBUG - virtual const char * DbgGetName() { LIMITED_METHOD_CONTRACT; return "JumpStubStubManager"; } -#endif - - virtual BOOL CheckIsStub_Internal(PCODE stubStartAddress); - - virtual BOOL DoTraceStub(PCODE stubStartAddress, TraceDestination *trace); - -#ifdef DACCESS_COMPILE - virtual void DoEnumMemoryRegions(CLRDataEnumMemoryFlags flags); - - protected: - virtual LPCWSTR GetStubManagerName(PCODE addr) - { LIMITED_METHOD_CONTRACT; return W("JumpStub"); } -#endif -}; -#endif // FEATURE_DYNAMIC_CODE_COMPILED - // // Stub manager for code sections. It forwards the query to the more appropriate // stub manager, or handles the query itself. From d31fa990c770c4a8a3fd379b82ddd86f05fbe242 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 6 Apr 2026 09:55:20 -0700 Subject: [PATCH 3/4] code review --- src/coreclr/vm/codeman.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/vm/codeman.h b/src/coreclr/vm/codeman.h index c1d37f9fd84a21..c9577724842a84 100644 --- a/src/coreclr/vm/codeman.h +++ b/src/coreclr/vm/codeman.h @@ -107,6 +107,9 @@ enum StubCodeBlockKind : int STUB_CODE_BLOCK_VSD_LOOKUP_STUB = 8, STUB_CODE_BLOCK_VSD_VTABLE_STUB = 9, #endif // FEATURE_VIRTUAL_STUB_DISPATCH +#ifdef FEATURE_TIERED_COMPILATION + STUB_CODE_BLOCK_CALLCOUNTING = 0xA, +#endif // Last valid value. Note that the definition is duplicated in debug\daccess\fntableaccess.cpp STUB_CODE_BLOCK_LAST = 0xF, // Placeholders returned by code:GetStubCodeBlockKind @@ -115,9 +118,6 @@ enum StubCodeBlockKind : int STUB_CODE_BLOCK_STUBLINK = 0x12, // Placeholder used by ReadyToRun images STUB_CODE_BLOCK_METHOD_CALL_THUNK = 0x13, -#ifdef FEATURE_TIERED_COMPILATION - STUB_CODE_BLOCK_CALLCOUNTING = 0x14, -#endif }; inline const char *GetStubCodeBlockKindString(StubCodeBlockKind kind) From ad4b1c5c0b6bf99da3cf59e0fe043141ae0ea9a2 Mon Sep 17 00:00:00 2001 From: Rachel Date: Mon, 6 Apr 2026 11:03:04 -0700 Subject: [PATCH 4/4] Update src/coreclr/vm/codeman.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/coreclr/vm/codeman.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/vm/codeman.h b/src/coreclr/vm/codeman.h index c9577724842a84..4ab670fd133026 100644 --- a/src/coreclr/vm/codeman.h +++ b/src/coreclr/vm/codeman.h @@ -109,7 +109,7 @@ enum StubCodeBlockKind : int #endif // FEATURE_VIRTUAL_STUB_DISPATCH #ifdef FEATURE_TIERED_COMPILATION STUB_CODE_BLOCK_CALLCOUNTING = 0xA, -#endif +#endif // FEATURE_TIERED_COMPILATION // Last valid value. Note that the definition is duplicated in debug\daccess\fntableaccess.cpp STUB_CODE_BLOCK_LAST = 0xF, // Placeholders returned by code:GetStubCodeBlockKind