mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-04 06:09:05 +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.
|
/// StackProtectorIdx - The frame index for the stack protector.
|
||||||
int StackProtectorIdx;
|
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
|
/// MaxCallFrameSize - This contains the size of the largest call frame if the
|
||||||
/// target uses frame setup/destroy pseudo instructions (as defined in the
|
/// target uses frame setup/destroy pseudo instructions (as defined in the
|
||||||
/// TargetFrameInfo class). This information is important for frame pointer
|
/// TargetFrameInfo class). This information is important for frame pointer
|
||||||
@ -220,6 +224,7 @@ public:
|
|||||||
AdjustsStack = false;
|
AdjustsStack = false;
|
||||||
HasCalls = false;
|
HasCalls = false;
|
||||||
StackProtectorIdx = -1;
|
StackProtectorIdx = -1;
|
||||||
|
FunctionContextIdx = -1;
|
||||||
MaxCallFrameSize = 0;
|
MaxCallFrameSize = 0;
|
||||||
CSIValid = false;
|
CSIValid = false;
|
||||||
LocalFrameSize = 0;
|
LocalFrameSize = 0;
|
||||||
@ -244,6 +249,11 @@ public:
|
|||||||
int getStackProtectorIndex() const { return StackProtectorIdx; }
|
int getStackProtectorIndex() const { return StackProtectorIdx; }
|
||||||
void setStackProtectorIndex(int I) { StackProtectorIdx = I; }
|
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
|
/// isFrameAddressTaken - This method may be called any time after instruction
|
||||||
/// selection is complete to determine if there is a call to
|
/// selection is complete to determine if there is a call to
|
||||||
/// \@llvm.frameaddress in this function.
|
/// \@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]>;
|
def int_eh_dwarf_cfa : Intrinsic<[llvm_ptr_ty], [llvm_i32_ty]>;
|
||||||
|
|
||||||
let Properties = [IntrNoMem] in {
|
let Properties = [IntrNoMem] in {
|
||||||
def int_eh_sjlj_lsda : Intrinsic<[llvm_ptr_ty]>;
|
def int_eh_sjlj_lsda : Intrinsic<[llvm_ptr_ty]>;
|
||||||
def int_eh_sjlj_callsite: Intrinsic<[], [llvm_i32_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_dispatch_setup : Intrinsic<[], [llvm_i32_ty]>;
|
||||||
def int_eh_sjlj_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_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_longjmp : Intrinsic<[], [llvm_ptr_ty]>;
|
||||||
|
|
||||||
//===---------------- Generic Variable Attribute Intrinsics----------------===//
|
//===---------------- Generic Variable Attribute Intrinsics----------------===//
|
||||||
//
|
//
|
||||||
|
@ -4754,6 +4754,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|||||||
MMI.setCurrentCallSite(CI->getZExtValue());
|
MMI.setCurrentCallSite(CI->getZExtValue());
|
||||||
return 0;
|
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: {
|
case Intrinsic::eh_sjlj_setjmp: {
|
||||||
setValue(&I, DAG.getNode(ISD::EH_SJLJ_SETJMP, dl, MVT::i32, getRoot(),
|
setValue(&I, DAG.getNode(ISD::EH_SJLJ_SETJMP, dl, MVT::i32, getRoot(),
|
||||||
getValue(I.getArgOperand(0))));
|
getValue(I.getArgOperand(0))));
|
||||||
|
@ -721,6 +721,12 @@ void SjLjEHPass::setupFunctionContext(Function &F,
|
|||||||
AllocaInst *FuncCtx =
|
AllocaInst *FuncCtx =
|
||||||
new AllocaInst(FunctionContextTy, 0, Align, "fn_context", EntryBB->begin());
|
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.
|
// Fill in the function context structure.
|
||||||
Value *Idxs[2];
|
Value *Idxs[2];
|
||||||
Type *Int32Ty = Type::getInt32Ty(F.getContext());
|
Type *Int32Ty = Type::getInt32Ty(F.getContext());
|
||||||
|
Loading…
Reference in New Issue
Block a user