diff options
Diffstat (limited to 'lib/Target/PowerPC/PPCMCInstLower.cpp')
| -rw-r--r-- | lib/Target/PowerPC/PPCMCInstLower.cpp | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/lib/Target/PowerPC/PPCMCInstLower.cpp b/lib/Target/PowerPC/PPCMCInstLower.cpp index 1e40711328ec..62a612feb55c 100644 --- a/lib/Target/PowerPC/PPCMCInstLower.cpp +++ b/lib/Target/PowerPC/PPCMCInstLower.cpp @@ -21,13 +21,13 @@  #include "llvm/CodeGen/MachineFunction.h"  #include "llvm/CodeGen/MachineModuleInfoImpls.h"  #include "llvm/CodeGen/TargetLowering.h" -#include "llvm/CodeGen/TargetLoweringObjectFile.h"  #include "llvm/IR/DataLayout.h"  #include "llvm/IR/GlobalValue.h"  #include "llvm/IR/Mangler.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCExpr.h"  #include "llvm/MC/MCInst.h" +#include "llvm/Target/TargetLoweringObjectFile.h"  using namespace llvm;  static MachineModuleInfoMachO &getMachOMMI(AsmPrinter &AP) { @@ -107,10 +107,20 @@ static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,        break;    } -  if (MO.getTargetFlags() == PPCII::MO_PLT) + if (MO.getTargetFlags() == PPCII::MO_PLT)      RefKind = MCSymbolRefExpr::VK_PLT; +  const MachineFunction *MF = MO.getParent()->getParent()->getParent(); +  const PPCSubtarget *Subtarget = &(MF->getSubtarget<PPCSubtarget>()); +  const TargetMachine &TM = Printer.TM;    const MCExpr *Expr = MCSymbolRefExpr::create(Symbol, RefKind, Ctx); +  // -msecure-plt option works only in PIC mode. If secure plt mode +  // is on add 32768 to symbol. +  if (Subtarget->isSecurePlt() && TM.isPositionIndependent() && +      MO.getTargetFlags() == PPCII::MO_PLT) +    Expr = MCBinaryExpr::createAdd(Expr, +                                   MCConstantExpr::create(32768, Ctx), +                                   Ctx);    if (!MO.isJTI() && MO.getOffset())      Expr = MCBinaryExpr::createAdd(Expr, | 
