diff options
| author | Arnold Schwaighofer <arnold.schwaighofer@gmail.com> | 2008-02-26 22:21:54 +0000 |
|---|---|---|
| committer | Arnold Schwaighofer <arnold.schwaighofer@gmail.com> | 2008-02-26 22:21:54 +0000 |
| commit | 3bfca3e942ce4e564bca8a2b89a8360b50d9be64 (patch) | |
| tree | cb53a8883210dc07ffc411d4eee66976b6ff2e63 /llvm/lib | |
| parent | 8490c6935bca655b5d60550a335263374b70bab1 (diff) | |
| download | bcm5719-llvm-3bfca3e942ce4e564bca8a2b89a8360b50d9be64.tar.gz bcm5719-llvm-3bfca3e942ce4e564bca8a2b89a8360b50d9be64.zip | |
Refactor according to Evan's and Anton's suggestions.
llvm-svn: 47635
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 35 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 2 |
2 files changed, 27 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 5bd9cf85c2e..df30aa545ea 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -1083,6 +1083,24 @@ static bool IsPossiblyOverwrittenArgumentOfTailCall(SDOperand Op, return false; } +/// CallRequiresGOTInRegister - Check whether the call requires the GOT pointer +/// in a register before calling. +bool X86TargetLowering::CallRequiresGOTPtrInReg(bool Is64Bit, bool IsTailCall) { + return !IsTailCall && !Is64Bit && + getTargetMachine().getRelocationModel() == Reloc::PIC_ && + Subtarget->isPICStyleGOT(); +} + + +/// CallRequiresFnAddressInReg - Check whether the call requires the function +/// address to be loaded in a register. +bool +X86TargetLowering::CallRequiresFnAddressInReg(bool Is64Bit, bool IsTailCall) { + return !Is64Bit && IsTailCall && + getTargetMachine().getRelocationModel() == Reloc::PIC_ && + Subtarget->isPICStyleGOT(); +} + /// CopyTailCallClobberedArgumentsToVRegs - Create virtual registers for all /// arguments to force loading and guarantee that arguments sourcing from /// incomming parameters are not overwriting each other. @@ -1552,22 +1570,19 @@ SDOperand X86TargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG) { // ELF / PIC requires GOT in the EBX register before function calls via PLT // GOT pointer. + if (CallRequiresGOTPtrInReg(Is64Bit, IsTailCall)) { + Chain = DAG.getCopyToReg(Chain, X86::EBX, + DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()), + InFlag); + InFlag = Chain.getValue(1); + } // If we are tail calling and generating PIC/GOT style code load the address // of the callee into ecx. The value in ecx is used as target of the tail // jump. This is done to circumvent the ebx/callee-saved problem for tail // calls on PIC/GOT architectures. Normally we would just put the address of // GOT into ebx and then call target@PLT. But for tail callss ebx would be // restored (since ebx is callee saved) before jumping to the target@PLT. - if (!IsTailCall && !Is64Bit && - getTargetMachine().getRelocationModel() == Reloc::PIC_ && - Subtarget->isPICStyleGOT()) { - Chain = DAG.getCopyToReg(Chain, X86::EBX, - DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()), - InFlag); - InFlag = Chain.getValue(1); - } else if (!Is64Bit && IsTailCall && - getTargetMachine().getRelocationModel() == Reloc::PIC_ && - Subtarget->isPICStyleGOT() ) { + if (CallRequiresFnAddressInReg(Is64Bit, IsTailCall)) { // Note: The actual moving to ecx is done further down. GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee); if (G && !G->getGlobal()->hasHiddenVisibility() && diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 5a28f1e2b82..5e8a32f5a6e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -491,6 +491,8 @@ namespace llvm { // Call lowering helpers. bool IsCalleePop(SDOperand Op); + bool CallRequiresGOTPtrInReg(bool Is64Bit, bool IsTailCall); + bool CallRequiresFnAddressInReg(bool Is64Bit, bool IsTailCall); CCAssignFn *CCAssignFnForNode(SDOperand Op) const; NameDecorationStyle NameDecorationForFORMAL_ARGUMENTS(SDOperand Op); unsigned GetAlignedArgumentStackSize(unsigned StackSize, SelectionDAG &DAG); |

