Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/coreclr/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -595,14 +595,14 @@ enum CorInfoHelpFunc
CORINFO_HELP_VALIDATE_INDIRECT_CALL, // CFG: Validate function pointer
CORINFO_HELP_DISPATCH_INDIRECT_CALL, // CFG: Validate and dispatch to pointer

CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP,
CORINFO_HELP_LLVM_EH_CATCH,
CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES,
CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME,
CORINFO_HELP_LLVM_EH_REVERSE_PINVOKE_ENTER_AND_PUSH_VIRTUAL_UNWIND_FRAME,
CORINFO_HELP_LLVM_EH_POP_VIRTUAL_UNWIND_FRAME,
CORINFO_HELP_LLVM_EH_REVERSE_PINVOKE_EXIT_AND_POP_VIRTUAL_UNWIND_FRAME,
CORINFO_HELP_LLVM_EH_UNHANDLED_EXCEPTION,
CORINFO_HELP_LLVM_RESOLVE_INTERFACE_CALL_TARGET,
CORINFO_HELP_LLVM_GET_EXTERNAL_CALL_TARGET,
CORINFO_HELP_LLVM_STRESS_GC,

CORINFO_HELP_COUNT,
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/inc/jithelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -343,14 +343,14 @@
JITHELPER(CORINFO_HELP_DISPATCH_INDIRECT_CALL, NULL, METHOD__NIL)
#endif

JITHELPER(CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_EH_CATCH, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_EH_POP_UNWOUND_VIRTUAL_FRAMES, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_EH_REVERSE_PINVOKE_ENTER_AND_PUSH_VIRTUAL_UNWIND_FRAME, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_EH_POP_VIRTUAL_UNWIND_FRAME, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_EH_REVERSE_PINVOKE_EXIT_AND_POP_VIRTUAL_UNWIND_FRAME, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_EH_UNHANDLED_EXCEPTION, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_RESOLVE_INTERFACE_CALL_TARGET, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_GET_EXTERNAL_CALL_TARGET, NULL, METHOD__NIL)
JITHELPER(CORINFO_HELP_LLVM_STRESS_GC, JIT_StressGC, METHOD__NIL)
#undef JITHELPER
#undef DYNAMICJITHELPER
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/jit/flowgraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1740,6 +1740,7 @@ void Compiler::fgAddReversePInvokeEnterExit()
LclVarDsc* varDsc = lvaGetDesc(lvaReversePInvokeFrameVar);
lvaSetStruct(lvaReversePInvokeFrameVar, typGetBlkLayout(eeGetEEInfo()->sizeOfReversePInvokeFrame), false);

#ifndef TARGET_WASM // WASM RPI helpers have special ABI and are inserted in lowering.
// Add enter pinvoke exit callout at the start of prolog

GenTree* pInvokeFrameVar = gtNewLclVarAddrNode(lvaReversePInvokeFrameVar);
Expand Down Expand Up @@ -1804,6 +1805,7 @@ void Compiler::fgAddReversePInvokeEnterExit()
printf("\n");
}
#endif
#endif // !TARGET_WASM
}

/*****************************************************************************
Expand Down
17 changes: 9 additions & 8 deletions src/coreclr/jit/llvm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,11 +517,11 @@ bool Llvm::helperCallMayVirtuallyUnwind(CorInfoHelpFunc helperFunc) const
{ FUNC(CORINFO_HELP_THROW_ENTRYPOINT_NOT_FOUND_EXCEPTION) },

// [R]PI helpers, implemented in "Runtime\thread.cpp".
{ FUNC(CORINFO_HELP_JIT_PINVOKE_BEGIN) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_SS_ARG | HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_JIT_PINVOKE_END) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_SS_ARG },
{ FUNC(CORINFO_HELP_JIT_PINVOKE_BEGIN) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG | HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_JIT_PINVOKE_END) CORINFO_TYPE_VOID, { }, HFIF_SS_ARG | HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER) CORINFO_TYPE_PTR, { CORINFO_TYPE_NATIVEUINT }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER_TRACK_TRANSITIONS) },
{ FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR, CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT_TRACK_TRANSITIONS) },

// Implemented in "CoreLib\src\System\Runtime\TypeLoaderExports.cs".
Expand All @@ -544,14 +544,15 @@ bool Llvm::helperCallMayVirtuallyUnwind(CorInfoHelpFunc helperFunc) const
{ FUNC(CORINFO_HELP_VALIDATE_INDIRECT_CALL) },
{ FUNC(CORINFO_HELP_DISPATCH_INDIRECT_CALL) },

{ FUNC(CORINFO_HELP_LLVM_GET_OR_INIT_SHADOW_STACK_TOP) CORINFO_TYPE_PTR, { }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
// TODO-LLVM-QPI: incorrect SS top args for RPI return helper.
{ 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 | HFIF_NO_VIRTUAL_UNWIND},
{ FUNC(CORINFO_HELP_LLVM_EH_POP_VIRTUAL_UNWIND_FRAME) CORINFO_TYPE_VOID, { }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND},
{ 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 | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_LLVM_EH_REVERSE_PINVOKE_ENTER_AND_PUSH_VIRTUAL_UNWIND_FRAME) CORINFO_TYPE_PTR, { CORINFO_TYPE_NATIVEUINT, CORINFO_TYPE_PTR, CORINFO_TYPE_NATIVEUINT }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_LLVM_EH_POP_VIRTUAL_UNWIND_FRAME) CORINFO_TYPE_VOID, { }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_LLVM_EH_REVERSE_PINVOKE_EXIT_AND_POP_VIRTUAL_UNWIND_FRAME) CORINFO_TYPE_VOID, { CORINFO_TYPE_PTR }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_LLVM_EH_UNHANDLED_EXCEPTION) CORINFO_TYPE_VOID, { CORINFO_TYPE_CLASS }, HFIF_SS_ARG },
{ FUNC(CORINFO_HELP_LLVM_RESOLVE_INTERFACE_CALL_TARGET) CORINFO_TYPE_PTR, { CORINFO_TYPE_CLASS, CORINFO_TYPE_PTR }, HFIF_SS_ARG },
{ FUNC(CORINFO_HELP_LLVM_GET_EXTERNAL_CALL_TARGET) CORINFO_TYPE_PTR, { }, HFIF_NO_RPI_OR_GC | HFIF_NO_VIRTUAL_UNWIND },
{ FUNC(CORINFO_HELP_LLVM_STRESS_GC) CORINFO_TYPE_BYREF, { CORINFO_TYPE_BYREF, CORINFO_TYPE_PTR }, HFIF_SS_ARG },
};
// clang-format on
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 @@ -308,6 +308,7 @@ class Llvm

// Shared between virtual unwind frame insertion and LSSA.
unsigned m_initialUnwindIndex = UNWIND_INDEX_NONE;
CORINFO_GENERIC_HANDLE m_ehInfoSymbol = nullptr;

// Shared between unwind index insertion and EH codegen.
ArrayStack<unsigned>* m_unwindIndexMap = nullptr;
Expand Down
55 changes: 31 additions & 24 deletions src/coreclr/jit/llvmlower.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,8 @@ void Llvm::lowerBlock(BasicBlock* block)

void Llvm::lowerRange(BasicBlock* block, LIR::Range& range)
{
BasicBlock* savedBlock = m_currentBlock;
LIR::Range* savedRange = m_currentRange;
m_currentBlock = block;
m_currentRange = &range;

Expand All @@ -253,8 +255,8 @@ void Llvm::lowerRange(BasicBlock* block, LIR::Range& range)

INDEBUG(range.CheckLIR(_compiler, /* checkUnusedValues */ true));

m_currentBlock = nullptr;
m_currentRange = nullptr;
m_currentBlock = savedBlock;
m_currentRange = savedRange;
}

void Llvm::lowerNode(GenTree* node)
Expand Down Expand Up @@ -795,21 +797,19 @@ void Llvm::lowerUnmanagedCall(GenTreeCall* callNode)
// two or more consecutive PI calls.
if (!callNode->IsSuppressGCTransition())
{
// TODO-LLVM-Upstream: don't allocate lvaInlinedPInvokeFrameVar (its size is zero).
assert(_compiler->opts.ShouldUsePInvokeHelpers()); // No inline transition support yet.
assert(_compiler->lvaInlinedPInvokeFrameVar != BAD_VAR_NUM);

// Insert CORINFO_HELP_JIT_PINVOKE_BEGIN.
GenTreeLclFld* frameAddr = _compiler->gtNewLclVarAddrNode(_compiler->lvaInlinedPInvokeFrameVar);
GenTreeCall* helperCall = _compiler->gtNewHelperCallNode(CORINFO_HELP_JIT_PINVOKE_BEGIN, TYP_VOID, frameAddr);
CurrentRange().InsertBefore(callNode, frameAddr, helperCall);
lowerNode(frameAddr);
GenTreeCall* helperCall = _compiler->gtNewHelperCallNode(CORINFO_HELP_JIT_PINVOKE_BEGIN, TYP_VOID);
CurrentRange().InsertBefore(callNode, helperCall);
lowerNode(helperCall);

// Insert CORINFO_HELP_JIT_PINVOKE_END. No need to explicitly lower the call/local address as the
// normal lowering loop will pick them up.
frameAddr = _compiler->gtNewLclVarAddrNode(_compiler->lvaInlinedPInvokeFrameVar);
helperCall = _compiler->gtNewHelperCallNode(CORINFO_HELP_JIT_PINVOKE_END, TYP_VOID, frameAddr);
CurrentRange().InsertAfter(callNode, frameAddr, helperCall);
helperCall = _compiler->gtNewHelperCallNode(CORINFO_HELP_JIT_PINVOKE_END, TYP_VOID);
CurrentRange().InsertAfter(callNode, helperCall);
}

if (callNode->gtCallType != CT_INDIRECT)
Expand Down Expand Up @@ -1598,20 +1598,27 @@ bool Llvm::addVirtualUnwindFrameForExceptionHandling()
CORINFO_GENERIC_HANDLE ehInfoSymbol =
m_llvm->GetSparseVirtualUnwindInfo(&clauses.BottomRef(), clauses.Height());

GenTree* ehInfoNode =
m_compiler->gtNewIconHandleNode(reinterpret_cast<size_t>(ehInfoSymbol), GTF_ICON_CONST_PTR);
GenTree* unwindFrameLclAddr = m_compiler->gtNewLclVarAddrNode(unwindFrameLclNum);
GenTreeIntCon* initialUnwindIndexNode = m_compiler->gtNewIconNode(m_initialIndexValue, TYP_I_IMPL);
GenTreeCall* initializeCall =
m_compiler->gtNewHelperCallNode(CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME, TYP_VOID,
unwindFrameLclAddr, ehInfoNode, initialUnwindIndexNode);

LIR::Range initRange;
initRange.InsertAtEnd(unwindFrameLclAddr);
initRange.InsertAtEnd(ehInfoNode);
initRange.InsertAtEnd(initialUnwindIndexNode);
initRange.InsertAtEnd(initializeCall);
m_llvm->lowerAndInsertIntoFirstBlock(std::move(initRange));
// For frames with an RPI transition, we will use RPI helpers that combine the transitions with unwind
// frame linking.
if (!m_compiler->opts.IsReversePInvoke())
{
GenTree* ehInfoNode =
m_compiler->gtNewIconHandleNode(reinterpret_cast<size_t>(ehInfoSymbol), GTF_ICON_CONST_PTR);
GenTree* unwindFrameLclAddr = m_compiler->gtNewLclVarAddrNode(unwindFrameLclNum);
GenTreeIntCon* initialUnwindIndexNode = m_compiler->gtNewIconNode(m_initialIndexValue, TYP_I_IMPL);
GenTreeCall* initializeCall =
m_compiler->gtNewHelperCallNode(CORINFO_HELP_LLVM_EH_PUSH_VIRTUAL_UNWIND_FRAME, TYP_VOID,
unwindFrameLclAddr, ehInfoNode, initialUnwindIndexNode);

LIR::Range initRange;
initRange.InsertAtEnd(unwindFrameLclAddr);
initRange.InsertAtEnd(ehInfoNode);
initRange.InsertAtEnd(initialUnwindIndexNode);
initRange.InsertAtEnd(initializeCall);
m_llvm->lowerAndInsertIntoFirstBlock(std::move(initRange));
}

m_llvm->m_ehInfoSymbol = ehInfoSymbol;
m_llvm->m_sparseVirtualUnwindFrameLclNum = unwindFrameLclNum;
}

Expand All @@ -1630,7 +1637,7 @@ bool Llvm::addVirtualUnwindFrameForExceptionHandling()
}

// Explicit pops are only needed for explicitly linked (via TLS) sparse frames.
if (m_llvm->m_sparseVirtualUnwindFrameLclNum != BAD_VAR_NUM)
if ((m_llvm->m_sparseVirtualUnwindFrameLclNum != BAD_VAR_NUM) && !m_compiler->opts.IsReversePInvoke())
{
for (BasicBlock* block : m_compiler->Blocks())
{
Expand Down
Loading