Changes in directory llvm/lib/Target/X86:
X86ISelLowering.cpp updated: 1.320 -> 1.321 --- Log message: ELF / PIC requires GOT be in the EBX register during calls via PLT GOT pointer. Add implicit uses of EBX to calls to ensure liveintervalanalysis does not treat the GOT in EBX move as dead upon definition. This should fix PR1207: http://llvm.org/PR1207 . --- Diffs of the changes: (+14 -0) X86ISelLowering.cpp | 14 ++++++++++++++ 1 files changed, 14 insertions(+) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.320 llvm/lib/Target/X86/X86ISelLowering.cpp:1.321 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.320 Thu Feb 1 02:39:52 2007 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Feb 21 15:18:14 2007 @@ -794,6 +794,8 @@ InFlag = Chain.getValue(1); } + // ELF / PIC requires GOT in the EBX register before function calls via PLT + // GOT pointer. if (getTargetMachine().getRelocationModel() == Reloc::PIC_ && Subtarget->isPICStyleGOT()) { Chain = DAG.getCopyToReg(Chain, X86::EBX, @@ -825,6 +827,11 @@ for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) Ops.push_back(DAG.getRegister(RegsToPass[i].first, RegsToPass[i].second.getValueType())); + + // Add an implicit use GOT pointer in EBX. + if (getTargetMachine().getRelocationModel() == Reloc::PIC_ && + Subtarget->isPICStyleGOT()) + Ops.push_back(DAG.getRegister(X86::EBX, getPointerTy())); if (InFlag.Val) Ops.push_back(InFlag); @@ -1788,6 +1795,8 @@ } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy()); + // ELF / PIC requires GOT in the EBX register before function calls via PLT + // GOT pointer. if (getTargetMachine().getRelocationModel() == Reloc::PIC_ && Subtarget->isPICStyleGOT()) { Chain = DAG.getCopyToReg(Chain, X86::EBX, @@ -1809,6 +1818,11 @@ Ops.push_back(DAG.getRegister(RegsToPass[i].first, RegsToPass[i].second.getValueType())); + // Add an implicit use GOT pointer in EBX. + if (getTargetMachine().getRelocationModel() == Reloc::PIC_ && + Subtarget->isPICStyleGOT()) + Ops.push_back(DAG.getRegister(X86::EBX, getPointerTy())); + if (InFlag.Val) Ops.push_back(InFlag); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits