diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h index a946110869fc..be3085aacf9f 100644 --- a/src/coreclr/inc/corinfo.h +++ b/src/coreclr/inc/corinfo.h @@ -670,7 +670,6 @@ enum CorInfoHelpFunc CORINFO_HELP_DISPATCH_INDIRECT_CALL, // CFG: Validate and dispatch to pointer CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP, - CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP, CORINFO_HELP_LLVM_EH_CATCH, CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES, CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME, diff --git a/src/coreclr/inc/jithelpers.h b/src/coreclr/inc/jithelpers.h index 8a7798c166b7..5dedc2f18324 100644 --- a/src/coreclr/inc/jithelpers.h +++ b/src/coreclr/inc/jithelpers.h @@ -361,7 +361,6 @@ #endif JITHELPER(CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP, NULL, CORINFO_HELP_SIG_UNDEF) - JITHELPER(CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP, NULL, CORINFO_HELP_SIG_UNDEF) JITHELPER(CORINFO_HELP_LLVM_EH_CATCH, NULL, CORINFO_HELP_SIG_UNDEF) JITHELPER(CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES, NULL, CORINFO_HELP_SIG_UNDEF) JITHELPER(CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME, NULL, CORINFO_HELP_SIG_UNDEF) diff --git a/src/coreclr/jit/llvm.cpp b/src/coreclr/jit/llvm.cpp index 986e6795313a..8175b61915e8 100644 --- a/src/coreclr/jit/llvm.cpp +++ b/src/coreclr/jit/llvm.cpp @@ -541,7 +541,7 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const { FUNC(CORINFO_HELP_JIT_PINVOKE_END) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC }, { FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_SS_ARG }, { FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER_TRACK_TRANSITIONS) }, - { FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC }, + { FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC }, { FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT_TRACK_TRANSITIONS) }, // Implemented in "CoreLib\src\System\Runtime\TypeLoaderExports.cs". @@ -565,7 +565,6 @@ bool Llvm::helperCallMayPhysicallyThrow(CorInfoHelpFunc helperFunc) const { FUNC(CORINFO_HELP_DISPATCH_INDIRECT_CALL) }, { FUNC(CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP) CORINFO_TYPE_PTR, { }, HFIF_NO_RPI_OR_GC }, - { FUNC(CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC }, { FUNC(CORINFO_HELP_LLVM_EH_CATCH) CORINFO_TYPE_CLASS, { CORINFO_TYPE_NATIVEUINT }, HFIF_SS_ARG }, { FUNC(CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG }, { FUNC(CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_PTR, CORINFO_TYPE_NATIVEUINT }, HFIF_NO_RPI_OR_GC }, diff --git a/src/coreclr/jit/llvm.h b/src/coreclr/jit/llvm.h index 8002cf6a777d..19de5a2f057f 100644 --- a/src/coreclr/jit/llvm.h +++ b/src/coreclr/jit/llvm.h @@ -434,6 +434,7 @@ class Llvm void lowerVirtualStubCall(GenTreeCall* callNode); void insertNullCheckForCall(GenTreeCall* callNode); void lowerDelegateInvoke(GenTreeCall* callNode); + void lowerReversePInvokeExit(GenTreeCall* callNode); void lowerUnmanagedCall(GenTreeCall* callNode); void lowerCallToShadowStack(GenTreeCall* callNode); void lowerCallReturn(GenTreeCall* callNode); diff --git a/src/coreclr/jit/llvmcodegen.cpp b/src/coreclr/jit/llvmcodegen.cpp index b39b6b2a8c06..d60ac8d5e5ab 100644 --- a/src/coreclr/jit/llvmcodegen.cpp +++ b/src/coreclr/jit/llvmcodegen.cpp @@ -2069,11 +2069,6 @@ void Llvm::buildReturn(GenTree* node) return; } - if (node->OperIs(GT_RETURN) && _compiler->opts.IsReversePInvoke()) - { - emitHelperCall(CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP, getShadowStack()); - } - if (node->TypeIs(TYP_VOID)) { _builder.CreateRetVoid(); diff --git a/src/coreclr/jit/llvmlower.cpp b/src/coreclr/jit/llvmlower.cpp index 23515c17708f..e3605c26d2c6 100644 --- a/src/coreclr/jit/llvmlower.cpp +++ b/src/coreclr/jit/llvmlower.cpp @@ -434,6 +434,10 @@ void Llvm::lowerCall(GenTreeCall* callNode) { lowerRethrow(callNode); } + else if (callNode->IsHelperCall(_compiler, CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT)) + { + lowerReversePInvokeExit(callNode); + } // "gtFoldExprConst" can attach a superflous argument to the overflow helper. Remove it. else if (callNode->IsHelperCall(_compiler, CORINFO_HELP_OVERFLOW) && !callNode->gtArgs.IsEmpty()) { @@ -794,6 +798,13 @@ void Llvm::lowerDelegateInvoke(GenTreeCall* callNode) lowerIndir(callTarget->AsIndir()); } +void Llvm::lowerReversePInvokeExit(GenTreeCall* callNode) +{ + // The RPI exit call has an additional argument - the shadow stack top on entry to this RPI method. + GenTree* previousShadowStackTop = insertShadowStackAddr(callNode, 0, _shadowStackLclNum); + callNode->gtArgs.PushFront(_compiler, NewCallArg::Primitive(previousShadowStackTop, CORINFO_TYPE_PTR)); +} + void Llvm::lowerUnmanagedCall(GenTreeCall* callNode) { assert(callNode->IsUnmanaged()); diff --git a/src/coreclr/jit/utils.cpp b/src/coreclr/jit/utils.cpp index 865049170fb9..78b61131e4ca 100644 --- a/src/coreclr/jit/utils.cpp +++ b/src/coreclr/jit/utils.cpp @@ -1818,7 +1818,6 @@ void HelperCallProperties::init() break; case CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP: - case CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP: case CORINFO_HELP_LLVM_EH_CATCH: case CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES: case CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME: diff --git a/src/coreclr/nativeaot/Runtime/wasm/AllocFast.cpp b/src/coreclr/nativeaot/Runtime/wasm/AllocFast.cpp index ccd686519e3a..050913f633af 100644 --- a/src/coreclr/nativeaot/Runtime/wasm/AllocFast.cpp +++ b/src/coreclr/nativeaot/Runtime/wasm/AllocFast.cpp @@ -28,7 +28,7 @@ // WASM-specific allocators: we define them to use a shadow stack argument to avoid saving it on the fast path. // extern "C" void* RhpGcAlloc(MethodTable* pEEType, uint32_t uFlags, uintptr_t numElements, void* pTransitionFrame); -extern "C" void RhpSetShadowStackTop(void* pShadowStack); +void SetShadowStackTop(void* pShadowStack); // Note that the emulated exception handling model requires us to call all managed methods that may/will throw // only in the tail-like position so that control can immediately return to the caller in case of an exception. @@ -37,7 +37,7 @@ extern "C" void RhExceptionHandling_FailedAllocation(void* pShadowStack, MethodT static Object* AllocateObject(void* pShadowStack, MethodTable* pEEType, uint32_t uFlags, uintptr_t numElements) { // Save the current shadow stack before calling into GC; we may need to scan it for live references. - RhpSetShadowStackTop(pShadowStack); + SetShadowStackTop(pShadowStack); Object* pObject = (Object*)RhpGcAlloc(pEEType, uFlags, numElements, nullptr); if (pObject == nullptr) diff --git a/src/coreclr/nativeaot/Runtime/wasm/GcStress.cpp b/src/coreclr/nativeaot/Runtime/wasm/GcStress.cpp index 2e66ce3d5e7a..bc94b13dc97f 100644 --- a/src/coreclr/nativeaot/Runtime/wasm/GcStress.cpp +++ b/src/coreclr/nativeaot/Runtime/wasm/GcStress.cpp @@ -16,7 +16,7 @@ #include "wasm.h" -extern "C" void RhpSetShadowStackTop(void* pShadowStack); +void SetShadowStackTop(void* pShadowStack); FCIMPL2(void*, RhpGcStressOnce, void* obj, uint8_t* pFlag) { @@ -44,7 +44,7 @@ FCIMPL2(void*, RhpGcStressOnce, void* obj, uint8_t* pFlag) pThread->PushGCFrameRegistration(&gc); } - RhpSetShadowStackTop(pShadowStack); + SetShadowStackTop(pShadowStack); GCHeapUtilities::GetGCHeap()->GarbageCollect(); if (obj != nullptr) diff --git a/src/coreclr/nativeaot/Runtime/wasm/PInvoke.cpp b/src/coreclr/nativeaot/Runtime/wasm/PInvoke.cpp index 6d96d356f773..4ff4d1e90ba3 100644 --- a/src/coreclr/nativeaot/Runtime/wasm/PInvoke.cpp +++ b/src/coreclr/nativeaot/Runtime/wasm/PInvoke.cpp @@ -29,6 +29,11 @@ void* GetShadowStackTop() return t_pShadowStackTop; } +void SetShadowStackTop(void* pShadowStack) +{ + t_pShadowStackTop = pShadowStack; +} + FCIMPL_NO_SS(void*, RhpGetOrInitShadowStackTop) { void* pShadowStack = t_pShadowStackTop; @@ -48,12 +53,6 @@ FCIMPL_NO_SS(void*, RhpGetOrInitShadowStackTop) } FCIMPLEND -FCIMPL0(void, RhpSetShadowStackTop) -{ - t_pShadowStackTop = pShadowStack; -} -FCIMPLEND - EXTERN_C NOINLINE void FASTCALL RhpReversePInvokeAttachOrTrapThread2(ReversePInvokeFrame* pFrame); FCIMPL1(void, RhpReversePInvoke, ReversePInvokeFrame* pFrame) @@ -64,21 +63,21 @@ FCIMPL1(void, RhpReversePInvoke, ReversePInvokeFrame* pFrame) return; // The slow path may invoke runtime initialization, which runs managed code. - RhpSetShadowStackTop(pShadowStack); + SetShadowStackTop(pShadowStack); RhpReversePInvokeAttachOrTrapThread2(pFrame); } FCIMPLEND -FCIMPL_NO_SS(void, RhpReversePInvokeReturn, ReversePInvokeFrame* pFrame) +FCIMPL_NO_SS(void, RhpReversePInvokeReturn, void* pPreviousShadowStackTop, ReversePInvokeFrame* pFrame) { - // TODO-LLVM-CQ: move the restore of shadow stack top from codegen to here. pFrame->m_savedThread->InlineReversePInvokeReturn(pFrame); + SetShadowStackTop(pPreviousShadowStackTop); } FCIMPLEND FCIMPL1(void, RhpPInvoke, PInvokeTransitionFrame* pFrame) { - RhpSetShadowStackTop(pShadowStack); + SetShadowStackTop(pShadowStack); Thread* pCurThread = ThreadStore::RawGetCurrentThread(); pCurThread->InlinePInvoke(pFrame); } diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs b/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs index a4a6cb925814..80632204e915 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs @@ -312,7 +312,6 @@ which is the right helper to use to allocate an object of a given type. */ CORINFO_HELP_DISPATCH_INDIRECT_CALL, // CFG: Validate and dispatch to pointer CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP, - CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP, CORINFO_HELP_LLVM_EH_CATCH, CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES, CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME, diff --git a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs index d1977dde722b..1a45d472b253 100644 --- a/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs +++ b/src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.cs @@ -795,9 +795,6 @@ private ISymbolNode GetHelperFtnUncached(CorInfoHelpFunc ftnNum) case CorInfoHelpFunc.CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP: mangledName = "RhpGetOrInitShadowStackTop"; break; - case CorInfoHelpFunc.CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP: - mangledName = "RhpSetShadowStackTop"; - break; case CorInfoHelpFunc.CORINFO_HELP_LLVM_EH_CATCH: mangledName = "RhpHandleExceptionWasmCatch"; break;