diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 10 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/i386-setjmp-pic.ll | 23 |
2 files changed, 33 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index e85c04e4f7c..578f5a931fe 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -18322,6 +18322,16 @@ SDValue X86TargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const { SDValue X86TargetLowering::lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const { SDLoc DL(Op); + // If the subtarget is not 64bit, we may need the global base reg + // after isel expand pseudo, i.e., after CGBR pass ran. + // Therefore, ask for the GlobalBaseReg now, so that the pass + // inserts the code for us in case we need it. + // Otherwise, we will end up in a situation where we will + // reference a virtual register that is not defined! + if (!Subtarget.is64Bit()) { + const X86InstrInfo *TII = Subtarget.getInstrInfo(); + (void)TII->getGlobalBaseReg(&DAG.getMachineFunction()); + } return DAG.getNode(X86ISD::EH_SJLJ_SETJMP, DL, DAG.getVTList(MVT::i32, MVT::Other), Op.getOperand(0), Op.getOperand(1)); diff --git a/llvm/test/CodeGen/X86/i386-setjmp-pic.ll b/llvm/test/CodeGen/X86/i386-setjmp-pic.ll new file mode 100644 index 00000000000..43a8a0ec76c --- /dev/null +++ b/llvm/test/CodeGen/X86/i386-setjmp-pic.ll @@ -0,0 +1,23 @@ +; RUN: llc -verify-machineinstrs -relocation-model=pic %s -o - | FileCheck %s +target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128" +target triple = "i386-apple-macosx" + +; Check that the register used as base pointer for setjmp +; is properly initialized. +; The test used to fail with the machine verifier complaining +; that the global base pointer is not initialized. +; PR26742. +; +; CHECK: test: +; CHECK: calll [[BP_SETUP_LABEL:L[$0-9a-zA-Z_-]+]] +; CHECK: [[BP_SETUP_LABEL]]: +; CHECK-NEXT: popl [[BP:%[a-z]+]] +; +; CHECK: leal [[BLOCK_ADDR:LBB[$0-9a-zA-Z_-]+]]-[[BP_SETUP_LABEL]]([[BP]]), +define i32 @test(i8* %tmp) { +entry: + %tmp9 = call i32 @llvm.eh.sjlj.setjmp(i8* %tmp) + ret i32 %tmp9 +} + +declare i32 @llvm.eh.sjlj.setjmp(i8*) |

