Skip to content

Commit

Permalink
Remove CORINFO_HELP_LLVM_SET_SHADOW_STACK_TOP
Browse files Browse the repository at this point in the history
  • Loading branch information
SingleAccretion committed May 17, 2024
1 parent 3c13211 commit 09b5590
Show file tree
Hide file tree
Showing 12 changed files with 26 additions and 28 deletions.
1 change: 0 additions & 1 deletion src/coreclr/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion src/coreclr/inc/jithelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/jit/llvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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".
Expand All @@ -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 },
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/jit/llvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 0 additions & 5 deletions src/coreclr/jit/llvmcodegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
11 changes: 11 additions & 0 deletions src/coreclr/jit/llvmlower.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
{
Expand Down Expand Up @@ -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());
Expand Down
1 change: 0 additions & 1 deletion src/coreclr/jit/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/nativeaot/Runtime/wasm/AllocFast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/nativeaot/Runtime/wasm/GcStress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
Expand Down
19 changes: 9 additions & 10 deletions src/coreclr/nativeaot/Runtime/wasm/PInvoke.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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);
}
Expand Down
1 change: 0 additions & 1 deletion src/coreclr/tools/Common/JitInterface/CorInfoHelpFunc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 09b5590

Please sign in to comment.