Skip to content

Commit

Permalink
[X86] Fix the lowering of setjmp intrinsic on i386.
Browse files Browse the repository at this point in the history
When the lowering of the setjmp intrinsic requires
a global base pointer to be set, make sure such pointer
gets defined by the CGBR pass.

This fixes PR26742.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262762 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Quentin Colombet committed Mar 5, 2016
1 parent c9f13a8 commit cb15f70
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
10 changes: 10 additions & 0 deletions lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
23 changes: 23 additions & 0 deletions test/CodeGen/X86/i386-setjmp-pic.ll
Original file line number Diff line number Diff line change
@@ -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*)

0 comments on commit cb15f70

Please sign in to comment.