From f71fe18149e67c4037d749bab009942d56852b37 Mon Sep 17 00:00:00 2001 From: pavelsavara Date: Fri, 24 Apr 2026 10:44:49 +0200 Subject: [PATCH 1/4] wasm IP --- src/coreclr/vm/eventtrace.cpp | 15 ++++++++++++++- src/coreclr/vm/prestub.cpp | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/coreclr/vm/eventtrace.cpp b/src/coreclr/vm/eventtrace.cpp index 2488a54040f945..3381029f2c83ec 100644 --- a/src/coreclr/vm/eventtrace.cpp +++ b/src/coreclr/vm/eventtrace.cpp @@ -4417,7 +4417,20 @@ TADDR MethodAndStartAddressToEECodeInfoPointer(MethodDesc *pMethodDesc, PCODE pN return 0; } - return GetInterpreterCodeFromInterpreterPrecodeIfPresent(start); + start = GetInterpreterCodeFromInterpreterPrecodeIfPresent(start); + +#if defined(FEATURE_INTERPRETER) && defined(FEATURE_PORTABLE_ENTRYPOINTS) + if (pNativeCodeStartAddress == (PCODE)0) + { + PTR_InterpByteCodeStart pInterpCode = pMethodDesc->GetInterpreterCode(); + if (pInterpCode != NULL) + { + return dac_cast(pInterpCode); + } + } +#endif + + return start; } /****************************************************************************/ diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index 73ae13ab6e5ac9..de537bec1e727a 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -810,8 +810,12 @@ PCODE MethodDesc::JitCompileCodeLockedEventWrapper(PrepareCodeConfig* pConfig, J if (isInterpreterCode) { // If this is interpreter code, we need to get the native code start address from the interpreter Precode +#ifdef FEATURE_PORTABLE_ENTRYPOINTS + InterpByteCodeStart* interpreterCode = (InterpByteCodeStart*)PortableEntryPoint::GetInterpreterData(pCode); +#else // !FEATURE_PORTABLE_ENTRYPOINTS InterpreterPrecode* pPrecode = InterpreterPrecode::FromEntryPoint(pCode); InterpByteCodeStart* interpreterCode = dac_cast(pPrecode->GetData()->ByteCodeAddr); +#endif // FEATURE_PORTABLE_ENTRYPOINTS pNativeCodeStartAddress = PINSTRToPCODE(dac_cast(interpreterCode)); } #endif // FEATURE_INTERPRETER From ace6916e7ac1259b0581d7a8b1bda43fcc824b6d Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Fri, 24 Apr 2026 10:57:19 +0200 Subject: [PATCH 2/4] Update src/coreclr/vm/eventtrace.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/coreclr/vm/eventtrace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/vm/eventtrace.cpp b/src/coreclr/vm/eventtrace.cpp index 3381029f2c83ec..d116865989cc34 100644 --- a/src/coreclr/vm/eventtrace.cpp +++ b/src/coreclr/vm/eventtrace.cpp @@ -4428,7 +4428,7 @@ TADDR MethodAndStartAddressToEECodeInfoPointer(MethodDesc *pMethodDesc, PCODE pN return dac_cast(pInterpCode); } } -#endif +#endif // defined(FEATURE_INTERPRETER) && defined(FEATURE_PORTABLE_ENTRYPOINTS) return start; } From e077850fb202fcfbf54d131d1ca12d6bd8fc5caf Mon Sep 17 00:00:00 2001 From: pavelsavara Date: Mon, 27 Apr 2026 12:00:04 +0200 Subject: [PATCH 3/4] feedback --- src/coreclr/debug/daccess/daccess.cpp | 10 +++++----- src/coreclr/debug/daccess/dacdbiimpl.cpp | 2 +- src/coreclr/debug/daccess/request.cpp | 6 +++--- src/coreclr/debug/ee/functioninfo.cpp | 2 +- src/coreclr/vm/eventtrace.cpp | 13 +------------ src/coreclr/vm/method.hpp | 2 +- src/coreclr/vm/precode.cpp | 23 ++++++++++++++++------- src/coreclr/vm/precode.h | 2 +- src/coreclr/vm/prestub.cpp | 2 +- 9 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/coreclr/debug/daccess/daccess.cpp b/src/coreclr/debug/daccess/daccess.cpp index 0c8801da35fe27..1910f342e4a54d 100644 --- a/src/coreclr/debug/daccess/daccess.cpp +++ b/src/coreclr/debug/daccess/daccess.cpp @@ -5425,7 +5425,7 @@ ClrDataAccess::RawGetMethodName( MethodDesc* methodDesc = NULL; { - EECodeInfo codeInfo(GetInterpreterCodeFromInterpreterPrecodeIfPresent(TO_TADDR(address))); + EECodeInfo codeInfo(GetInterpreterCodeFromEntryPointIfPresent(TO_TADDR(address))); if (codeInfo.IsValid()) { if (displacement) @@ -5605,11 +5605,11 @@ ClrDataAccess::GetMethodVarInfo(MethodDesc* methodDesc, { return E_INVALIDARG; } - nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromInterpreterPrecodeIfPresent(requestedNativeCodeVersion.GetNativeCode())); + nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromEntryPointIfPresent(requestedNativeCodeVersion.GetNativeCode(), methodDesc)); } else { - nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromInterpreterPrecodeIfPresent(methodDesc->GetNativeCode())); + nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromEntryPointIfPresent(methodDesc->GetNativeCode(), methodDesc)); } DebugInfoRequest request; @@ -5664,11 +5664,11 @@ ClrDataAccess::GetMethodNativeMap(MethodDesc* methodDesc, { return E_INVALIDARG; } - nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromInterpreterPrecodeIfPresent(requestedNativeCodeVersion.GetNativeCode())); + nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromEntryPointIfPresent(requestedNativeCodeVersion.GetNativeCode(), methodDesc)); } else { - nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromInterpreterPrecodeIfPresent(methodDesc->GetNativeCode())); + nativeCodeStartAddr = PCODEToPINSTR(GetInterpreterCodeFromEntryPointIfPresent(methodDesc->GetNativeCode(), methodDesc)); } DebugInfoRequest request; diff --git a/src/coreclr/debug/daccess/dacdbiimpl.cpp b/src/coreclr/debug/daccess/dacdbiimpl.cpp index 163213084a3e3a..7ee1ac54fbc8c4 100644 --- a/src/coreclr/debug/daccess/dacdbiimpl.cpp +++ b/src/coreclr/debug/daccess/dacdbiimpl.cpp @@ -1316,7 +1316,7 @@ HRESULT STDMETHODCALLTYPE DacDbiInterfaceImpl::GetNativeCodeInfoForAddr(CORDB_AD EX_TRY_ALLOW_DATATARGET_MISSING_MEMORY { - codeAddr = GetInterpreterCodeFromInterpreterPrecodeIfPresent(codeAddr); + codeAddr = GetInterpreterCodeFromEntryPointIfPresent(codeAddr); } EX_END_CATCH_ALLOW_DATATARGET_MISSING_MEMORY; diff --git a/src/coreclr/debug/daccess/request.cpp b/src/coreclr/debug/daccess/request.cpp index 60043181c1de6a..eb01247f35b430 100644 --- a/src/coreclr/debug/daccess/request.cpp +++ b/src/coreclr/debug/daccess/request.cpp @@ -911,7 +911,7 @@ HRESULT ClrDataAccess::GetThreadData(CLRDATA_ADDRESS threadAddr, struct DacpThre void CopyNativeCodeVersionToReJitData(NativeCodeVersion nativeCodeVersion, NativeCodeVersion activeCodeVersion, DacpReJitData * pReJitData) { pReJitData->rejitID = nativeCodeVersion.GetILCodeVersion().GetVersionId(); - pReJitData->NativeCodeAddr = GetInterpreterCodeFromInterpreterPrecodeIfPresent(nativeCodeVersion.GetNativeCode()); + pReJitData->NativeCodeAddr = GetInterpreterCodeFromEntryPointIfPresent(nativeCodeVersion.GetNativeCode(), nativeCodeVersion.GetMethodDesc()); if (nativeCodeVersion != activeCodeVersion) { @@ -1021,7 +1021,7 @@ HRESULT ClrDataAccess::GetMethodDescData( if (!requestedNativeCodeVersion.IsNull() && requestedNativeCodeVersion.GetNativeCode() != (PCODE)NULL) { methodDescData->bHasNativeCode = TRUE; - methodDescData->NativeCodeAddr = TO_CDADDR(PCODEToPINSTR(GetInterpreterCodeFromInterpreterPrecodeIfPresent(requestedNativeCodeVersion.GetNativeCode()))); + methodDescData->NativeCodeAddr = TO_CDADDR(PCODEToPINSTR(GetInterpreterCodeFromEntryPointIfPresent(requestedNativeCodeVersion.GetNativeCode(), pMD))); } else { @@ -1245,7 +1245,7 @@ HRESULT ClrDataAccess::GetTieredVersions( int count = 0; for (NativeCodeVersionIterator iter = nativeCodeVersions.Begin(); iter != nativeCodeVersions.End(); iter++) { - TADDR pNativeCode = PCODEToPINSTR(GetInterpreterCodeFromInterpreterPrecodeIfPresent((*iter).GetNativeCode())); + TADDR pNativeCode = PCODEToPINSTR(GetInterpreterCodeFromEntryPointIfPresent((*iter).GetNativeCode(), pMD)); nativeCodeAddrs[count].NativeCodeAddr = pNativeCode; PTR_NativeCodeVersionNode pNode = (*iter).AsNode(); nativeCodeAddrs[count].NativeCodeVersionNodePtr = PTR_CDADDR(pNode); diff --git a/src/coreclr/debug/ee/functioninfo.cpp b/src/coreclr/debug/ee/functioninfo.cpp index 6ad138388ee0a5..8512ea70c44ef5 100644 --- a/src/coreclr/debug/ee/functioninfo.cpp +++ b/src/coreclr/debug/ee/functioninfo.cpp @@ -2060,7 +2060,7 @@ void DebuggerMethodInfo::CreateDJIsForMethodDesc(MethodDesc * pMethodDesc) { // Some versions may not be compiled yet - skip those for now // if they compile later the JitCompiled callback will add a DJI to our cache at that time - PCODE codeAddr = GetInterpreterCodeFromInterpreterPrecodeIfPresent(itr->GetNativeCode()); + PCODE codeAddr = GetInterpreterCodeFromEntryPointIfPresent(itr->GetNativeCode(), pMethodDesc); LOG((LF_CORDB, LL_INFO10000, "DMI::CDJIFMD (%d) Native code for DJI - %p\n", ++count, codeAddr)); if (codeAddr) { diff --git a/src/coreclr/vm/eventtrace.cpp b/src/coreclr/vm/eventtrace.cpp index d116865989cc34..83214dc89b08ad 100644 --- a/src/coreclr/vm/eventtrace.cpp +++ b/src/coreclr/vm/eventtrace.cpp @@ -4417,18 +4417,7 @@ TADDR MethodAndStartAddressToEECodeInfoPointer(MethodDesc *pMethodDesc, PCODE pN return 0; } - start = GetInterpreterCodeFromInterpreterPrecodeIfPresent(start); - -#if defined(FEATURE_INTERPRETER) && defined(FEATURE_PORTABLE_ENTRYPOINTS) - if (pNativeCodeStartAddress == (PCODE)0) - { - PTR_InterpByteCodeStart pInterpCode = pMethodDesc->GetInterpreterCode(); - if (pInterpCode != NULL) - { - return dac_cast(pInterpCode); - } - } -#endif // defined(FEATURE_INTERPRETER) && defined(FEATURE_PORTABLE_ENTRYPOINTS) + start = GetInterpreterCodeFromEntryPointIfPresent(start, pNativeCodeStartAddress ? NULL : pMethodDesc); return start; } diff --git a/src/coreclr/vm/method.hpp b/src/coreclr/vm/method.hpp index 29b76fd0fede96..27372f2d66c53d 100644 --- a/src/coreclr/vm/method.hpp +++ b/src/coreclr/vm/method.hpp @@ -1631,7 +1631,7 @@ class MethodDesc PCODE GetCodeForInterpreterOrJitted() { WRAPPER_NO_CONTRACT; - return GetInterpreterCodeFromInterpreterPrecodeIfPresent(GetNativeCode()); + return GetInterpreterCodeFromEntryPointIfPresent(GetNativeCode(), this); } // Returns GetNativeCode() if it exists, but also checks to see if there diff --git a/src/coreclr/vm/precode.cpp b/src/coreclr/vm/precode.cpp index 5b1422aa1c8273..629e1a451103bf 100644 --- a/src/coreclr/vm/precode.cpp +++ b/src/coreclr/vm/precode.cpp @@ -959,32 +959,41 @@ BOOL StubPrecode::IsStubPrecodeByASM(PCODE addr) #endif // !FEATURE_PORTABLE_ENTRYPOINTS -TADDR GetInterpreterCodeFromInterpreterPrecodeIfPresent(TADDR codePointerMaybeInterpreterStub) +TADDR GetInterpreterCodeFromEntryPointIfPresent(TADDR entryPoint, MethodDesc* pMethodDesc) { CONTRACTL { NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; } CONTRACTL_END; - + #if defined(FEATURE_INTERPRETER) && !defined(FEATURE_PORTABLE_ENTRYPOINTS) - if (codePointerMaybeInterpreterStub == (TADDR)NULL) + if (entryPoint == (TADDR)NULL) { return (TADDR)NULL; } - RangeSection * pRS = ExecutionManager::FindCodeRange(codePointerMaybeInterpreterStub, ExecutionManager::GetScanFlags()); + RangeSection * pRS = ExecutionManager::FindCodeRange(entryPoint, ExecutionManager::GetScanFlags()); if (pRS != NULL && pRS->_flags & RangeSection::RANGE_SECTION_RANGELIST) { if (pRS->_pRangeList->GetCodeBlockKind() == STUB_CODE_BLOCK_STUBPRECODE) { - if (dac_cast(PCODEToPINSTR(codePointerMaybeInterpreterStub))->GetType() == PRECODE_INTERPRETER) + if (dac_cast(PCODEToPINSTR(entryPoint))->GetType() == PRECODE_INTERPRETER) { - codePointerMaybeInterpreterStub = (dac_cast(PCODEToPINSTR(codePointerMaybeInterpreterStub)))->GetData()->ByteCodeAddr; + entryPoint = (dac_cast(PCODEToPINSTR(entryPoint)))->GetData()->ByteCodeAddr; } } } +#elif defined(FEATURE_INTERPRETER) && defined(FEATURE_PORTABLE_ENTRYPOINTS) + if (pMethodDesc != NULL) + { + PTR_InterpByteCodeStart pInterpCode = pMethodDesc->GetInterpreterCode(); + if (pInterpCode != NULL) + { + return dac_cast(pInterpCode); + } + } #endif - return codePointerMaybeInterpreterStub; + return entryPoint; } diff --git a/src/coreclr/vm/precode.h b/src/coreclr/vm/precode.h index 3f8958ecea9b83..8c21e8b7647126 100644 --- a/src/coreclr/vm/precode.h +++ b/src/coreclr/vm/precode.h @@ -864,6 +864,6 @@ extern InterleavedLoaderHeapConfig s_fixupStubPrecodeHeapConfig; #endif // FEATURE_PORTABLE_ENTRYPOINTS -TADDR GetInterpreterCodeFromInterpreterPrecodeIfPresent(TADDR codePointerMaybeInterpreterStub); +TADDR GetInterpreterCodeFromEntryPointIfPresent(TADDR entryPoint, MethodDesc* pMethodDesc = NULL); #endif // __PRECODE_H__ diff --git a/src/coreclr/vm/prestub.cpp b/src/coreclr/vm/prestub.cpp index de537bec1e727a..d47ac1bf9d62e7 100644 --- a/src/coreclr/vm/prestub.cpp +++ b/src/coreclr/vm/prestub.cpp @@ -2544,7 +2544,7 @@ PCODE MethodDesc::DoPrestub(MethodTable *pDispatchingMT, CallerGCMode callerGCMo // Check to see if the entrypoint is into the interpreter. If so, grab the interpreter codes from the stub and put that directly // into the MethodDesc TADDR functionAddress = GetOrCreatePrecode()->GetTarget(); - TADDR byteCodeStartOrFunctionAddress = GetInterpreterCodeFromInterpreterPrecodeIfPresent(functionAddress); + TADDR byteCodeStartOrFunctionAddress = GetInterpreterCodeFromEntryPointIfPresent(functionAddress); if (byteCodeStartOrFunctionAddress != functionAddress) { // Then we must have an InterpByteCodeStart From 769d486a21b0193d363465d8761e67de2967f889 Mon Sep 17 00:00:00 2001 From: pavelsavara Date: Mon, 27 Apr 2026 12:21:41 +0200 Subject: [PATCH 4/4] feedback --- src/coreclr/vm/precode.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreclr/vm/precode.h b/src/coreclr/vm/precode.h index 8c21e8b7647126..4ed2db87c307dc 100644 --- a/src/coreclr/vm/precode.h +++ b/src/coreclr/vm/precode.h @@ -864,6 +864,7 @@ extern InterleavedLoaderHeapConfig s_fixupStubPrecodeHeapConfig; #endif // FEATURE_PORTABLE_ENTRYPOINTS +class MethodDesc; TADDR GetInterpreterCodeFromEntryPointIfPresent(TADDR entryPoint, MethodDesc* pMethodDesc = NULL); #endif // __PRECODE_H__