diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 9d6c855bb82..dc7bb7ca817 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -311,17 +311,22 @@ TargetLowering::getPICJumpTableRelocBaseExpr(const MachineFunction *MF, bool TargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const { - // Assume that everything is safe in static mode. - if (getTargetMachine().getRelocationModel() == Reloc::Static) - return true; + const TargetMachine &TM = getTargetMachine(); + Reloc::Model RM = TM.getRelocationModel(); + const GlobalValue *GV = GA->getGlobal(); + const Triple &TargetTriple = TM.getTargetTriple(); + + // If the address is not even local to this DSO we will have to load it from + // a got and then add the offset. + if (!shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV)) + return false; - // In dynamic-no-pic mode, assume that known defined values are safe. - if (getTargetMachine().getRelocationModel() == Reloc::DynamicNoPIC && - GA && GA->getGlobal()->isStrongDefinitionForLinker()) - return true; + // If the code is position independent we will have to add a base register. + if (RM == Reloc::PIC_) + return false; - // Otherwise assume nothing is safe. - return false; + // Otherwise we can do it. + return true; } //===----------------------------------------------------------------------===// |

