diff --git a/src/coreclr/vm/codeman.inl b/src/coreclr/vm/codeman.inl index 099ff1cc13128d..9f70457a42a3e3 100644 --- a/src/coreclr/vm/codeman.inl +++ b/src/coreclr/vm/codeman.inl @@ -13,7 +13,7 @@ inline TADDR IJitManager::JitTokenToModuleRVABase(const METHODTOKEN& MethodToken { #ifdef TARGET_WASM if (MethodToken.m_pRangeSection->_flags & RangeSection::RANGE_SECTION_VIRTUALIP) - return (TADDR)MethodToken.m_pRangeSection->_pR2RModule->GetModuleBaseAddress(); + return dac_cast(MethodToken.m_pRangeSection->_pR2RModule->GetReadyToRunInfo()->GetImage()->GetBase()); #endif // For non-wasm, the rva base is always the same as the range base. return MethodToken.m_pRangeSection->_range.RangeStart(); diff --git a/src/coreclr/vm/frames.h b/src/coreclr/vm/frames.h index dc1a954604369f..856a9270d0fffd 100644 --- a/src/coreclr/vm/frames.h +++ b/src/coreclr/vm/frames.h @@ -791,6 +791,9 @@ inline CONTEXT * GETREDIRECTEDCONTEXT(Thread * thread) { LIMITED_METHOD_CONTRACT typedef DPTR(class TransitionFrame) PTR_TransitionFrame; #ifdef TARGET_WASM +// Wasm has no native return address for an R2R inline P/Invoke. This sentinel marks the frame as +// active; stack walkers recover the caller virtual IP from m_pCallSiteSP. +static constexpr TADDR INLINED_PINVOKE_FROM_R2R = 1; TADDR GetWasmVirtualIPFromStackPointer(TADDR sp); #endif diff --git a/src/coreclr/vm/stackwalk.cpp b/src/coreclr/vm/stackwalk.cpp index 6cce2efdd31108..cda43ae7f97cdb 100644 --- a/src/coreclr/vm/stackwalk.cpp +++ b/src/coreclr/vm/stackwalk.cpp @@ -2330,6 +2330,18 @@ StackWalkAction StackFrameIterator::NextRaw(void) _ASSERTE(!pInlinedFrame || adr); +#ifdef TARGET_WASM + if ((pInlinedFrame != NULL) && (adr == (PCODE)INLINED_PINVOKE_FROM_R2R)) + { + adr = GetWasmVirtualIPFromStackPointer(dac_cast(((InlinedCallFrame*)pInlinedFrame)->GetCallSiteSP())); + if (adr == (PCODE)NULL) + { + retVal = SWA_FAILED; + goto Cleanup; + } + } +#endif // TARGET_WASM + if (adr) { ProcessIp(adr); diff --git a/src/coreclr/vm/wasm/helpers.cpp b/src/coreclr/vm/wasm/helpers.cpp index 2f6ff7fddb2f73..31f970179698ac 100644 --- a/src/coreclr/vm/wasm/helpers.cpp +++ b/src/coreclr/vm/wasm/helpers.cpp @@ -13,7 +13,6 @@ #define WASM_STRINGIFY_HELPER(value) #value #define WASM_STRINGIFY(value) WASM_STRINGIFY_HELPER(value) -#define INLINED_PINVOKE_FROM_R2R 1 void ExecuteInterpretedMethodWithArgs_PortableEntryPoint(PCODE portableEntrypoint, TransitionBlock* block, size_t argsSize, int8_t* retBuff);