From 38ce7dfd0d88c0bdbdff3880c4dce2a9b3e273d3 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Wed, 29 Apr 2026 17:41:10 -0700 Subject: [PATCH 1/3] Checkpoint codegen for reverse pinvoke/unmanagedcallersonly --- src/coreclr/jit/codegenwasm.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 4df06a6e5d22b0..da0e8060f6daef 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -13,6 +13,7 @@ #include "gcinfoencoder.h" static const int LINEAR_MEMORY_INDEX = 0; +static const int STACK_POINTER_GLOBAL = 0; #ifdef TARGET_64BIT static const instruction INS_I_load = INS_i64_load; @@ -144,16 +145,19 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni m_compiler->unwindAllocStack(frameSize); - // TODO-WASM: reverse pinvoke frame allocation - // + unsigned initialSPLclIndex; + unsigned spLclIndex = WasmRegToIndex(spReg); if (!m_compiler->lvaGetDesc(m_compiler->lvaWasmSpArg)->lvIsParam) { - NYI_WASM("alloc local frame for reverse pinvoke"); + initialSPLclIndex = spLclIndex; + GetEmitter()->emitIns_I(INS_global_get, EA_PTRSIZE, STACK_POINTER_GLOBAL); + GetEmitter()->emitIns_I(INS_local_set, EA_PTRSIZE, initialSPLclIndex); + } + else + { + initialSPLclIndex = WasmRegToIndex(m_compiler->lvaGetParameterABIInfo(m_compiler->lvaWasmSpArg).Segment(0).GetRegister());; } - unsigned initialSPLclIndex = - WasmRegToIndex(m_compiler->lvaGetParameterABIInfo(m_compiler->lvaWasmSpArg).Segment(0).GetRegister()); - unsigned spLclIndex = WasmRegToIndex(spReg); assert(initialSPLclIndex == spLclIndex); if (frameSize != 0) { From ff718c19a21ce02cc808cf31c799dd9e560ddaf6 Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Mon, 4 May 2026 14:09:05 -0700 Subject: [PATCH 2/3] Address copilot feedback --- src/coreclr/jit/codegenwasm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index da0e8060f6daef..94438ebc46ea2b 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -13,6 +13,7 @@ #include "gcinfoencoder.h" static const int LINEAR_MEMORY_INDEX = 0; +// stackPointer is the 0th global in our generated Wasm modules static const int STACK_POINTER_GLOBAL = 0; #ifdef TARGET_64BIT @@ -155,7 +156,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni } else { - initialSPLclIndex = WasmRegToIndex(m_compiler->lvaGetParameterABIInfo(m_compiler->lvaWasmSpArg).Segment(0).GetRegister());; + initialSPLclIndex = WasmRegToIndex(m_compiler->lvaGetParameterABIInfo(m_compiler->lvaWasmSpArg).Segment(0).GetRegister()); } assert(initialSPLclIndex == spLclIndex); From 83feec47ea86f31a5e4fb1dec841fe987f43030d Mon Sep 17 00:00:00 2001 From: Katelyn Gadd Date: Mon, 4 May 2026 14:16:09 -0700 Subject: [PATCH 3/3] jit-format --- src/coreclr/jit/codegenwasm.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index 94438ebc46ea2b..3d7edebd7c387c 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -156,7 +156,8 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni } else { - initialSPLclIndex = WasmRegToIndex(m_compiler->lvaGetParameterABIInfo(m_compiler->lvaWasmSpArg).Segment(0).GetRegister()); + initialSPLclIndex = + WasmRegToIndex(m_compiler->lvaGetParameterABIInfo(m_compiler->lvaWasmSpArg).Segment(0).GetRegister()); } assert(initialSPLclIndex == spLclIndex);