forked from OSchip/llvm-project
Give the 'eh.sjlj.dispatchsetup' intrinsic call the value coming from the setjmp
intrinsic call. This prevents it from being reordered so that it appears *before* the setjmp intrinsic (thus making it completely useless). <rdar://problem/9409683> llvm-svn: 131174
This commit is contained in:
parent
e2b889be65
commit
50117f8186
|
@ -307,7 +307,7 @@ 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_dispatch_setup : Intrinsic<[], []>;
|
||||
def int_eh_sjlj_dispatch_setup : Intrinsic<[], [llvm_i32_ty], [IntrReadMem]>;
|
||||
def int_eh_sjlj_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
|
||||
def int_eh_sjlj_longjmp : Intrinsic<[], [llvm_ptr_ty]>;
|
||||
|
||||
|
|
|
@ -4403,7 +4403,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|||
}
|
||||
case Intrinsic::eh_sjlj_dispatch_setup: {
|
||||
DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_DISPATCHSETUP, dl, MVT::Other,
|
||||
getRoot()));
|
||||
getRoot(), getValue(I.getArgOperand(0))));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -520,7 +520,7 @@ bool SjLjEHPass::insertSjLjEHSupport(Function &F) {
|
|||
|
||||
// Add a call to dispatch_setup after the setjmp call. This is expanded to any
|
||||
// target-specific setup that needs to be done.
|
||||
CallInst::Create(DispatchSetupFn, "", EntryBB->getTerminator());
|
||||
CallInst::Create(DispatchSetupFn, DispatchVal, "", EntryBB->getTerminator());
|
||||
|
||||
// check the return value of the setjmp. non-zero goes to dispatcher.
|
||||
Value *IsNormal = new ICmpInst(EntryBB->getTerminator(),
|
||||
|
|
|
@ -2151,7 +2151,7 @@ ARMTargetLowering::LowerEH_SJLJ_DISPATCHSETUP(SDValue Op, SelectionDAG &DAG)
|
|||
const {
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
return DAG.getNode(ARMISD::EH_SJLJ_DISPATCHSETUP, dl, MVT::Other,
|
||||
Op.getOperand(0));
|
||||
Op.getOperand(0), Op.getOperand(1));
|
||||
}
|
||||
|
||||
SDValue
|
||||
|
|
|
@ -58,7 +58,7 @@ def SDT_ARMEH_SJLJ_Setjmp : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisPtrTy<1>,
|
|||
SDTCisInt<2>]>;
|
||||
def SDT_ARMEH_SJLJ_Longjmp: SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisInt<1>]>;
|
||||
|
||||
def SDT_ARMEH_SJLJ_DispatchSetup: SDTypeProfile<0, 0, []>;
|
||||
def SDT_ARMEH_SJLJ_DispatchSetup: SDTypeProfile<0, 1, [SDTCisInt<0>]>;
|
||||
|
||||
def SDT_ARMMEMBARRIER : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
|
||||
|
||||
|
@ -3786,8 +3786,8 @@ def Int_eh_sjlj_longjmp : PseudoInst<(outs), (ins GPR:$src, GPR:$scratch),
|
|||
// that need the instruction size).
|
||||
let isBarrier = 1, hasSideEffects = 1 in
|
||||
def Int_eh_sjlj_dispatchsetup :
|
||||
PseudoInst<(outs), (ins), NoItinerary,
|
||||
[(ARMeh_sjlj_dispatchsetup)]>,
|
||||
PseudoInst<(outs), (ins GPR:$src), NoItinerary,
|
||||
[(ARMeh_sjlj_dispatchsetup GPR:$src)]>,
|
||||
Requires<[IsDarwin]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue