mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-29 14:40:39 +00:00
Create and use an llvm.eh.sjlj.functioncontext intrinsic.
This intrinsic is used to pass the index of the function context to the back-end for further processing. The back-end is in charge of filling in the rest of the entries. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140676 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2b6bd7ba58
commit
6ef94175d1
@ -174,6 +174,10 @@ class MachineFrameInfo {
|
||||
/// StackProtectorIdx - The frame index for the stack protector.
|
||||
int StackProtectorIdx;
|
||||
|
||||
/// FunctionContextIdx - The frame index for the function context. Used for
|
||||
/// SjLj exceptions.
|
||||
int FunctionContextIdx;
|
||||
|
||||
/// MaxCallFrameSize - This contains the size of the largest call frame if the
|
||||
/// target uses frame setup/destroy pseudo instructions (as defined in the
|
||||
/// TargetFrameInfo class). This information is important for frame pointer
|
||||
@ -220,6 +224,7 @@ public:
|
||||
AdjustsStack = false;
|
||||
HasCalls = false;
|
||||
StackProtectorIdx = -1;
|
||||
FunctionContextIdx = -1;
|
||||
MaxCallFrameSize = 0;
|
||||
CSIValid = false;
|
||||
LocalFrameSize = 0;
|
||||
@ -244,6 +249,11 @@ public:
|
||||
int getStackProtectorIndex() const { return StackProtectorIdx; }
|
||||
void setStackProtectorIndex(int I) { StackProtectorIdx = I; }
|
||||
|
||||
/// getFunctionContextIndex/setFunctionContextIndex - Return the index for the
|
||||
/// function context object. This object is used for SjLj exceptions.
|
||||
int getFunctionContextIndex() const { return FunctionContextIdx; }
|
||||
void setFunctionContextIndex(int I) { FunctionContextIdx = I; }
|
||||
|
||||
/// isFrameAddressTaken - This method may be called any time after instruction
|
||||
/// selection is complete to determine if there is a call to
|
||||
/// \@llvm.frameaddress in this function.
|
||||
|
@ -322,12 +322,13 @@ def int_eh_unwind_init: Intrinsic<[]>,
|
||||
def int_eh_dwarf_cfa : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty]>;
|
||||
|
||||
let Properties = [IntrNoMem] in {
|
||||
def int_eh_sjlj_lsda : Intrinsic<[llvm_ptr_ty]>;
|
||||
def int_eh_sjlj_callsite: Intrinsic<[], [llvm_i32_ty]>;
|
||||
def int_eh_sjlj_lsda : Intrinsic<[llvm_ptr_ty]>;
|
||||
def int_eh_sjlj_callsite : Intrinsic<[], [llvm_i32_ty]>;
|
||||
def int_eh_sjlj_functioncontext : Intrinsic<[], [llvm_ptr_ty]>;
|
||||
}
|
||||
def int_eh_sjlj_dispatch_setup : Intrinsic<[], [llvm_i32_ty]>;
|
||||
def int_eh_sjlj_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
|
||||
def int_eh_sjlj_longjmp : Intrinsic<[], [llvm_ptr_ty]>;
|
||||
def int_eh_sjlj_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
|
||||
def int_eh_sjlj_longjmp : Intrinsic<[], [llvm_ptr_ty]>;
|
||||
|
||||
//===---------------- Generic Variable Attribute Intrinsics----------------===//
|
||||
//
|
||||
|
@ -4754,6 +4754,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
MMI.setCurrentCallSite(CI->getZExtValue());
|
||||
return 0;
|
||||
}
|
||||
case Intrinsic::eh_sjlj_functioncontext: {
|
||||
// Get and store the index of the function context.
|
||||
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
AllocaInst *FnCtx = cast<AllocaInst>(I.getArgOperand(0));
|
||||
int FI = FuncInfo.StaticAllocaMap[FnCtx];
|
||||
MFI->setFunctionContextIndex(FI);
|
||||
return 0;
|
||||
}
|
||||
case Intrinsic::eh_sjlj_setjmp: {
|
||||
setValue(&I, DAG.getNode(ISD::EH_SJLJ_SETJMP, dl, MVT::i32, getRoot(),
|
||||
getValue(I.getArgOperand(0))));
|
||||
|
@ -721,6 +721,12 @@ void SjLjEHPass::setupFunctionContext(Function &F,
|
||||
AllocaInst *FuncCtx =
|
||||
new AllocaInst(FunctionContextTy, 0, Align, "fn_context", EntryBB->begin());
|
||||
|
||||
// Store a pointer to the function context so that the back-end will know
|
||||
// where to look for it.
|
||||
CallInst::Create(Intrinsic::getDeclaration(F.getParent(),
|
||||
Intrinsic::eh_sjlj_functioncontext),
|
||||
FuncCtx, "", EntryBB->getTerminator());
|
||||
|
||||
// Fill in the function context structure.
|
||||
Value *Idxs[2];
|
||||
Type *Int32Ty = Type::getInt32Ty(F.getContext());
|
||||
|
Loading…
Reference in New Issue
Block a user