Home | History | Annotate | Download | only in PowerPC
      1 //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly ------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains a printer that converts from our internal representation
     11 // of machine-dependent LLVM code to PowerPC assembly language. This printer is
     12 // the output mechanism used by `llc'.
     13 //
     14 // Documentation at http://developer.apple.com/documentation/DeveloperTools/
     15 // Reference/Assembler/ASMIntroduction/chapter_1_section_1.html
     16 //
     17 //===----------------------------------------------------------------------===//
     18 
     19 #include "PPC.h"
     20 #include "InstPrinter/PPCInstPrinter.h"
     21 #include "MCTargetDesc/PPCMCExpr.h"
     22 #include "MCTargetDesc/PPCPredicates.h"
     23 #include "PPCMachineFunctionInfo.h"
     24 #include "PPCSubtarget.h"
     25 #include "PPCTargetMachine.h"
     26 #include "PPCTargetStreamer.h"
     27 #include "llvm/ADT/MapVector.h"
     28 #include "llvm/ADT/SmallString.h"
     29 #include "llvm/ADT/StringExtras.h"
     30 #include "llvm/CodeGen/AsmPrinter.h"
     31 #include "llvm/CodeGen/MachineConstantPool.h"
     32 #include "llvm/CodeGen/MachineFunctionPass.h"
     33 #include "llvm/CodeGen/MachineInstr.h"
     34 #include "llvm/CodeGen/MachineInstrBuilder.h"
     35 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
     36 #include "llvm/CodeGen/MachineRegisterInfo.h"
     37 #include "llvm/CodeGen/StackMaps.h"
     38 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
     39 #include "llvm/IR/Constants.h"
     40 #include "llvm/IR/DebugInfo.h"
     41 #include "llvm/IR/DerivedTypes.h"
     42 #include "llvm/IR/Mangler.h"
     43 #include "llvm/IR/Module.h"
     44 #include "llvm/MC/MCAsmInfo.h"
     45 #include "llvm/MC/MCContext.h"
     46 #include "llvm/MC/MCExpr.h"
     47 #include "llvm/MC/MCInst.h"
     48 #include "llvm/MC/MCInstBuilder.h"
     49 #include "llvm/MC/MCSectionELF.h"
     50 #include "llvm/MC/MCSectionMachO.h"
     51 #include "llvm/MC/MCStreamer.h"
     52 #include "llvm/MC/MCSymbolELF.h"
     53 #include "llvm/Support/CommandLine.h"
     54 #include "llvm/Support/Debug.h"
     55 #include "llvm/Support/ELF.h"
     56 #include "llvm/Support/ErrorHandling.h"
     57 #include "llvm/Support/MathExtras.h"
     58 #include "llvm/Support/TargetRegistry.h"
     59 #include "llvm/Support/raw_ostream.h"
     60 #include "llvm/Target/TargetInstrInfo.h"
     61 #include "llvm/Target/TargetOptions.h"
     62 #include "llvm/Target/TargetRegisterInfo.h"
     63 using namespace llvm;
     64 
     65 #define DEBUG_TYPE "asmprinter"
     66 
     67 namespace {
     68 class PPCAsmPrinter : public AsmPrinter {
     69 protected:
     70   MapVector<MCSymbol *, MCSymbol *> TOC;
     71   const PPCSubtarget *Subtarget;
     72   StackMaps SM;
     73 
     74 public:
     75   explicit PPCAsmPrinter(TargetMachine &TM,
     76                          std::unique_ptr<MCStreamer> Streamer)
     77       : AsmPrinter(TM, std::move(Streamer)), SM(*this) {}
     78 
     79   const char *getPassName() const override {
     80     return "PowerPC Assembly Printer";
     81   }
     82 
     83     MCSymbol *lookUpOrCreateTOCEntry(MCSymbol *Sym);
     84 
     85     void EmitInstruction(const MachineInstr *MI) override;
     86 
     87     void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O);
     88 
     89     bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
     90                          unsigned AsmVariant, const char *ExtraCode,
     91                          raw_ostream &O) override;
     92     bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
     93                                unsigned AsmVariant, const char *ExtraCode,
     94                                raw_ostream &O) override;
     95 
     96     void EmitEndOfAsmFile(Module &M) override;
     97 
     98     void LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI);
     99     void LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI);
    100     void EmitTlsCall(const MachineInstr *MI, MCSymbolRefExpr::VariantKind VK);
    101     bool runOnMachineFunction(MachineFunction &MF) override {
    102       Subtarget = &MF.getSubtarget<PPCSubtarget>();
    103       return AsmPrinter::runOnMachineFunction(MF);
    104     }
    105   };
    106 
    107   /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
    108   class PPCLinuxAsmPrinter : public PPCAsmPrinter {
    109   public:
    110     explicit PPCLinuxAsmPrinter(TargetMachine &TM,
    111                                 std::unique_ptr<MCStreamer> Streamer)
    112         : PPCAsmPrinter(TM, std::move(Streamer)) {}
    113 
    114     const char *getPassName() const override {
    115       return "Linux PPC Assembly Printer";
    116     }
    117 
    118     bool doFinalization(Module &M) override;
    119     void EmitStartOfAsmFile(Module &M) override;
    120 
    121     void EmitFunctionEntryLabel() override;
    122 
    123     void EmitFunctionBodyStart() override;
    124     void EmitFunctionBodyEnd() override;
    125   };
    126 
    127   /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac
    128   /// OS X
    129   class PPCDarwinAsmPrinter : public PPCAsmPrinter {
    130   public:
    131     explicit PPCDarwinAsmPrinter(TargetMachine &TM,
    132                                  std::unique_ptr<MCStreamer> Streamer)
    133         : PPCAsmPrinter(TM, std::move(Streamer)) {}
    134 
    135     const char *getPassName() const override {
    136       return "Darwin PPC Assembly Printer";
    137     }
    138 
    139     bool doFinalization(Module &M) override;
    140     void EmitStartOfAsmFile(Module &M) override;
    141 
    142     void EmitFunctionStubs(const MachineModuleInfoMachO::SymbolListTy &Stubs);
    143   };
    144 } // end of anonymous namespace
    145 
    146 /// stripRegisterPrefix - This method strips the character prefix from a
    147 /// register name so that only the number is left.  Used by for linux asm.
    148 static const char *stripRegisterPrefix(const char *RegName) {
    149   switch (RegName[0]) {
    150     case 'r':
    151     case 'f':
    152     case 'q': // for QPX
    153     case 'v':
    154       if (RegName[1] == 's')
    155         return RegName + 2;
    156       return RegName + 1;
    157     case 'c': if (RegName[1] == 'r') return RegName + 2;
    158   }
    159 
    160   return RegName;
    161 }
    162 
    163 void PPCAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
    164                                  raw_ostream &O) {
    165   const DataLayout &DL = getDataLayout();
    166   const MachineOperand &MO = MI->getOperand(OpNo);
    167 
    168   switch (MO.getType()) {
    169   case MachineOperand::MO_Register: {
    170     const char *RegName = PPCInstPrinter::getRegisterName(MO.getReg());
    171     // Linux assembler (Others?) does not take register mnemonics.
    172     // FIXME - What about special registers used in mfspr/mtspr?
    173     if (!Subtarget->isDarwin())
    174       RegName = stripRegisterPrefix(RegName);
    175     O << RegName;
    176     return;
    177   }
    178   case MachineOperand::MO_Immediate:
    179     O << MO.getImm();
    180     return;
    181 
    182   case MachineOperand::MO_MachineBasicBlock:
    183     MO.getMBB()->getSymbol()->print(O, MAI);
    184     return;
    185   case MachineOperand::MO_ConstantPoolIndex:
    186     O << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
    187       << MO.getIndex();
    188     return;
    189   case MachineOperand::MO_BlockAddress:
    190     GetBlockAddressSymbol(MO.getBlockAddress())->print(O, MAI);
    191     return;
    192   case MachineOperand::MO_GlobalAddress: {
    193     // Computing the address of a global symbol, not calling it.
    194     const GlobalValue *GV = MO.getGlobal();
    195     MCSymbol *SymToPrint;
    196 
    197     // External or weakly linked global variables need non-lazily-resolved stubs
    198     if (TM.getRelocationModel() != Reloc::Static &&
    199         !GV->isStrongDefinitionForLinker()) {
    200       if (!GV->hasHiddenVisibility()) {
    201         SymToPrint = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
    202         MachineModuleInfoImpl::StubValueTy &StubSym =
    203             MMI->getObjFileInfo<MachineModuleInfoMachO>().getGVStubEntry(
    204                 SymToPrint);
    205         if (!StubSym.getPointer())
    206           StubSym = MachineModuleInfoImpl::
    207             StubValueTy(getSymbol(GV), !GV->hasInternalLinkage());
    208       } else if (GV->isDeclaration() || GV->hasCommonLinkage() ||
    209                  GV->hasAvailableExternallyLinkage()) {
    210         SymToPrint = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
    211 
    212         MachineModuleInfoImpl::StubValueTy &StubSym =
    213             MMI->getObjFileInfo<MachineModuleInfoMachO>().getHiddenGVStubEntry(
    214                 SymToPrint);
    215         if (!StubSym.getPointer())
    216           StubSym = MachineModuleInfoImpl::
    217             StubValueTy(getSymbol(GV), !GV->hasInternalLinkage());
    218       } else {
    219         SymToPrint = getSymbol(GV);
    220       }
    221     } else {
    222       SymToPrint = getSymbol(GV);
    223     }
    224 
    225     SymToPrint->print(O, MAI);
    226 
    227     printOffset(MO.getOffset(), O);
    228     return;
    229   }
    230 
    231   default:
    232     O << "<unknown operand type: " << (unsigned)MO.getType() << ">";
    233     return;
    234   }
    235 }
    236 
    237 /// PrintAsmOperand - Print out an operand for an inline asm expression.
    238 ///
    239 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
    240                                     unsigned AsmVariant,
    241                                     const char *ExtraCode, raw_ostream &O) {
    242   // Does this asm operand have a single letter operand modifier?
    243   if (ExtraCode && ExtraCode[0]) {
    244     if (ExtraCode[1] != 0) return true; // Unknown modifier.
    245 
    246     switch (ExtraCode[0]) {
    247     default:
    248       // See if this is a generic print operand
    249       return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O);
    250     case 'c': // Don't print "$" before a global var name or constant.
    251       break; // PPC never has a prefix.
    252     case 'L': // Write second word of DImode reference.
    253       // Verify that this operand has two consecutive registers.
    254       if (!MI->getOperand(OpNo).isReg() ||
    255           OpNo+1 == MI->getNumOperands() ||
    256           !MI->getOperand(OpNo+1).isReg())
    257         return true;
    258       ++OpNo;   // Return the high-part.
    259       break;
    260     case 'I':
    261       // Write 'i' if an integer constant, otherwise nothing.  Used to print
    262       // addi vs add, etc.
    263       if (MI->getOperand(OpNo).isImm())
    264         O << "i";
    265       return false;
    266     }
    267   }
    268 
    269   printOperand(MI, OpNo, O);
    270   return false;
    271 }
    272 
    273 // At the moment, all inline asm memory operands are a single register.
    274 // In any case, the output of this routine should always be just one
    275 // assembler operand.
    276 
    277 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
    278                                           unsigned AsmVariant,
    279                                           const char *ExtraCode,
    280                                           raw_ostream &O) {
    281   if (ExtraCode && ExtraCode[0]) {
    282     if (ExtraCode[1] != 0) return true; // Unknown modifier.
    283 
    284     switch (ExtraCode[0]) {
    285     default: return true;  // Unknown modifier.
    286     case 'y': // A memory reference for an X-form instruction
    287       {
    288         const char *RegName = "r0";
    289         if (!Subtarget->isDarwin())
    290           RegName = stripRegisterPrefix(RegName);
    291         O << RegName << ", ";
    292         printOperand(MI, OpNo, O);
    293         return false;
    294       }
    295     case 'U': // Print 'u' for update form.
    296     case 'X': // Print 'x' for indexed form.
    297     {
    298       // FIXME: Currently for PowerPC memory operands are always loaded
    299       // into a register, so we never get an update or indexed form.
    300       // This is bad even for offset forms, since even if we know we
    301       // have a value in -16(r1), we will generate a load into r<n>
    302       // and then load from 0(r<n>).  Until that issue is fixed,
    303       // tolerate 'U' and 'X' but don't output anything.
    304       assert(MI->getOperand(OpNo).isReg());
    305       return false;
    306     }
    307     }
    308   }
    309 
    310   assert(MI->getOperand(OpNo).isReg());
    311   O << "0(";
    312   printOperand(MI, OpNo, O);
    313   O << ")";
    314   return false;
    315 }
    316 
    317 /// lookUpOrCreateTOCEntry -- Given a symbol, look up whether a TOC entry
    318 /// exists for it.  If not, create one.  Then return a symbol that references
    319 /// the TOC entry.
    320 MCSymbol *PPCAsmPrinter::lookUpOrCreateTOCEntry(MCSymbol *Sym) {
    321   MCSymbol *&TOCEntry = TOC[Sym];
    322   if (!TOCEntry)
    323     TOCEntry = createTempSymbol("C");
    324   return TOCEntry;
    325 }
    326 
    327 void PPCAsmPrinter::EmitEndOfAsmFile(Module &M) {
    328   SM.serializeToStackMapSection();
    329 }
    330 
    331 void PPCAsmPrinter::LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI) {
    332   unsigned NumNOPBytes = MI.getOperand(1).getImm();
    333 
    334   SM.recordStackMap(MI);
    335   assert(NumNOPBytes % 4 == 0 && "Invalid number of NOP bytes requested!");
    336 
    337   // Scan ahead to trim the shadow.
    338   const MachineBasicBlock &MBB = *MI.getParent();
    339   MachineBasicBlock::const_iterator MII(MI);
    340   ++MII;
    341   while (NumNOPBytes > 0) {
    342     if (MII == MBB.end() || MII->isCall() ||
    343         MII->getOpcode() == PPC::DBG_VALUE ||
    344         MII->getOpcode() == TargetOpcode::PATCHPOINT ||
    345         MII->getOpcode() == TargetOpcode::STACKMAP)
    346       break;
    347     ++MII;
    348     NumNOPBytes -= 4;
    349   }
    350 
    351   // Emit nops.
    352   for (unsigned i = 0; i < NumNOPBytes; i += 4)
    353     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
    354 }
    355 
    356 // Lower a patchpoint of the form:
    357 // [<def>], <id>, <numBytes>, <target>, <numArgs>
    358 void PPCAsmPrinter::LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI) {
    359   SM.recordPatchPoint(MI);
    360   PatchPointOpers Opers(&MI);
    361 
    362   unsigned EncodedBytes = 0;
    363   const MachineOperand &CalleeMO =
    364     Opers.getMetaOper(PatchPointOpers::TargetPos);
    365 
    366   if (CalleeMO.isImm()) {
    367     int64_t CallTarget = Opers.getMetaOper(PatchPointOpers::TargetPos).getImm();
    368     if (CallTarget) {
    369       assert((CallTarget & 0xFFFFFFFFFFFF) == CallTarget &&
    370              "High 16 bits of call target should be zero.");
    371       unsigned ScratchReg = MI.getOperand(Opers.getNextScratchIdx()).getReg();
    372       EncodedBytes = 0;
    373       // Materialize the jump address:
    374       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI8)
    375                                       .addReg(ScratchReg)
    376                                       .addImm((CallTarget >> 32) & 0xFFFF));
    377       ++EncodedBytes;
    378       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::RLDIC)
    379                                       .addReg(ScratchReg)
    380                                       .addReg(ScratchReg)
    381                                       .addImm(32).addImm(16));
    382       ++EncodedBytes;
    383       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORIS8)
    384                                       .addReg(ScratchReg)
    385                                       .addReg(ScratchReg)
    386                                       .addImm((CallTarget >> 16) & 0xFFFF));
    387       ++EncodedBytes;
    388       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORI8)
    389                                       .addReg(ScratchReg)
    390                                       .addReg(ScratchReg)
    391                                       .addImm(CallTarget & 0xFFFF));
    392 
    393       // Save the current TOC pointer before the remote call.
    394       int TOCSaveOffset = Subtarget->isELFv2ABI() ? 24 : 40;
    395       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::STD)
    396                                       .addReg(PPC::X2)
    397                                       .addImm(TOCSaveOffset)
    398                                       .addReg(PPC::X1));
    399       ++EncodedBytes;
    400 
    401       // If we're on ELFv1, then we need to load the actual function pointer
    402       // from the function descriptor.
    403       if (!Subtarget->isELFv2ABI()) {
    404         // Load the new TOC pointer and the function address, but not r11
    405         // (needing this is rare, and loading it here would prevent passing it
    406         // via a 'nest' parameter.
    407         EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
    408                                         .addReg(PPC::X2)
    409                                         .addImm(8)
    410                                         .addReg(ScratchReg));
    411         ++EncodedBytes;
    412         EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
    413                                         .addReg(ScratchReg)
    414                                         .addImm(0)
    415                                         .addReg(ScratchReg));
    416         ++EncodedBytes;
    417       }
    418 
    419       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR8)
    420                                       .addReg(ScratchReg));
    421       ++EncodedBytes;
    422       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTRL8));
    423       ++EncodedBytes;
    424 
    425       // Restore the TOC pointer after the call.
    426       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
    427                                       .addReg(PPC::X2)
    428                                       .addImm(TOCSaveOffset)
    429                                       .addReg(PPC::X1));
    430       ++EncodedBytes;
    431     }
    432   } else if (CalleeMO.isGlobal()) {
    433     const GlobalValue *GValue = CalleeMO.getGlobal();
    434     MCSymbol *MOSymbol = getSymbol(GValue);
    435     const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, OutContext);
    436 
    437     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL8_NOP)
    438                                     .addExpr(SymVar));
    439     EncodedBytes += 2;
    440   }
    441 
    442   // Each instruction is 4 bytes.
    443   EncodedBytes *= 4;
    444 
    445   // Emit padding.
    446   unsigned NumBytes = Opers.getMetaOper(PatchPointOpers::NBytesPos).getImm();
    447   assert(NumBytes >= EncodedBytes &&
    448          "Patchpoint can't request size less than the length of a call.");
    449   assert((NumBytes - EncodedBytes) % 4 == 0 &&
    450          "Invalid number of NOP bytes requested!");
    451   for (unsigned i = EncodedBytes; i < NumBytes; i += 4)
    452     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
    453 }
    454 
    455 /// EmitTlsCall -- Given a GETtls[ld]ADDR[32] instruction, print a
    456 /// call to __tls_get_addr to the current output stream.
    457 void PPCAsmPrinter::EmitTlsCall(const MachineInstr *MI,
    458                                 MCSymbolRefExpr::VariantKind VK) {
    459   StringRef Name = "__tls_get_addr";
    460   MCSymbol *TlsGetAddr = OutContext.getOrCreateSymbol(Name);
    461   MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None;
    462 
    463   assert(MI->getOperand(0).isReg() &&
    464          ((Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::X3) ||
    465           (!Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::R3)) &&
    466          "GETtls[ld]ADDR[32] must define GPR3");
    467   assert(MI->getOperand(1).isReg() &&
    468          ((Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::X3) ||
    469           (!Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::R3)) &&
    470          "GETtls[ld]ADDR[32] must read GPR3");
    471 
    472   if (!Subtarget->isPPC64() && !Subtarget->isDarwin() &&
    473       TM.getRelocationModel() == Reloc::PIC_)
    474     Kind = MCSymbolRefExpr::VK_PLT;
    475   const MCSymbolRefExpr *TlsRef =
    476     MCSymbolRefExpr::create(TlsGetAddr, Kind, OutContext);
    477   const MachineOperand &MO = MI->getOperand(2);
    478   const GlobalValue *GValue = MO.getGlobal();
    479   MCSymbol *MOSymbol = getSymbol(GValue);
    480   const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, VK, OutContext);
    481   EmitToStreamer(*OutStreamer,
    482                  MCInstBuilder(Subtarget->isPPC64() ?
    483                                PPC::BL8_NOP_TLS : PPC::BL_TLS)
    484                  .addExpr(TlsRef)
    485                  .addExpr(SymVar));
    486 }
    487 
    488 /// EmitInstruction -- Print out a single PowerPC MI in Darwin syntax to
    489 /// the current output stream.
    490 ///
    491 void PPCAsmPrinter::EmitInstruction(const MachineInstr *MI) {
    492   MCInst TmpInst;
    493   bool isPPC64 = Subtarget->isPPC64();
    494   bool isDarwin = TM.getTargetTriple().isOSDarwin();
    495   const Module *M = MF->getFunction()->getParent();
    496   PICLevel::Level PL = M->getPICLevel();
    497 
    498   // Lower multi-instruction pseudo operations.
    499   switch (MI->getOpcode()) {
    500   default: break;
    501   case TargetOpcode::DBG_VALUE:
    502     llvm_unreachable("Should be handled target independently");
    503   case TargetOpcode::STACKMAP:
    504     return LowerSTACKMAP(SM, *MI);
    505   case TargetOpcode::PATCHPOINT:
    506     return LowerPATCHPOINT(SM, *MI);
    507 
    508   case PPC::MoveGOTtoLR: {
    509     // Transform %LR = MoveGOTtoLR
    510     // Into this: bl _GLOBAL_OFFSET_TABLE_@local-4
    511     // _GLOBAL_OFFSET_TABLE_@local-4 (instruction preceding
    512     // _GLOBAL_OFFSET_TABLE_) has exactly one instruction:
    513     //      blrl
    514     // This will return the pointer to _GLOBAL_OFFSET_TABLE_@local
    515     MCSymbol *GOTSymbol =
    516       OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
    517     const MCExpr *OffsExpr =
    518       MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol,
    519                                                       MCSymbolRefExpr::VK_PPC_LOCAL,
    520                                                       OutContext),
    521                               MCConstantExpr::create(4, OutContext),
    522                               OutContext);
    523 
    524     // Emit the 'bl'.
    525     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL).addExpr(OffsExpr));
    526     return;
    527   }
    528   case PPC::MovePCtoLR:
    529   case PPC::MovePCtoLR8: {
    530     // Transform %LR = MovePCtoLR
    531     // Into this, where the label is the PIC base:
    532     //     bl L1$pb
    533     // L1$pb:
    534     MCSymbol *PICBase = MF->getPICBaseSymbol();
    535 
    536     // Emit the 'bl'.
    537     EmitToStreamer(*OutStreamer,
    538                    MCInstBuilder(PPC::BL)
    539                        // FIXME: We would like an efficient form for this, so we
    540                        // don't have to do a lot of extra uniquing.
    541                        .addExpr(MCSymbolRefExpr::create(PICBase, OutContext)));
    542 
    543     // Emit the label.
    544     OutStreamer->EmitLabel(PICBase);
    545     return;
    546   }
    547   case PPC::UpdateGBR: {
    548     // Transform %Rd = UpdateGBR(%Rt, %Ri)
    549     // Into: lwz %Rt, .L0$poff - .L0$pb(%Ri)
    550     //       add %Rd, %Rt, %Ri
    551     // Get the offset from the GOT Base Register to the GOT
    552     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
    553     MCSymbol *PICOffset =
    554       MF->getInfo<PPCFunctionInfo>()->getPICOffsetSymbol();
    555     TmpInst.setOpcode(PPC::LWZ);
    556     const MCExpr *Exp =
    557       MCSymbolRefExpr::create(PICOffset, MCSymbolRefExpr::VK_None, OutContext);
    558     const MCExpr *PB =
    559       MCSymbolRefExpr::create(MF->getPICBaseSymbol(),
    560                               MCSymbolRefExpr::VK_None,
    561                               OutContext);
    562     const MCOperand TR = TmpInst.getOperand(1);
    563     const MCOperand PICR = TmpInst.getOperand(0);
    564 
    565     // Step 1: lwz %Rt, .L$poff - .L$pb(%Ri)
    566     TmpInst.getOperand(1) =
    567         MCOperand::createExpr(MCBinaryExpr::createSub(Exp, PB, OutContext));
    568     TmpInst.getOperand(0) = TR;
    569     TmpInst.getOperand(2) = PICR;
    570     EmitToStreamer(*OutStreamer, TmpInst);
    571 
    572     TmpInst.setOpcode(PPC::ADD4);
    573     TmpInst.getOperand(0) = PICR;
    574     TmpInst.getOperand(1) = TR;
    575     TmpInst.getOperand(2) = PICR;
    576     EmitToStreamer(*OutStreamer, TmpInst);
    577     return;
    578   }
    579   case PPC::LWZtoc: {
    580     // Transform %R3 = LWZtoc <ga:@min1>, %R2
    581     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
    582 
    583     // Change the opcode to LWZ, and the global address operand to be a
    584     // reference to the GOT entry we will synthesize later.
    585     TmpInst.setOpcode(PPC::LWZ);
    586     const MachineOperand &MO = MI->getOperand(1);
    587 
    588     // Map symbol -> label of TOC entry
    589     assert(MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress());
    590     MCSymbol *MOSymbol = nullptr;
    591     if (MO.isGlobal())
    592       MOSymbol = getSymbol(MO.getGlobal());
    593     else if (MO.isCPI())
    594       MOSymbol = GetCPISymbol(MO.getIndex());
    595     else if (MO.isJTI())
    596       MOSymbol = GetJTISymbol(MO.getIndex());
    597     else if (MO.isBlockAddress())
    598       MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress());
    599 
    600     if (PL == PICLevel::Small) {
    601       const MCExpr *Exp =
    602         MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_GOT,
    603                                 OutContext);
    604       TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
    605     } else {
    606       MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
    607 
    608       const MCExpr *Exp =
    609         MCSymbolRefExpr::create(TOCEntry, MCSymbolRefExpr::VK_None,
    610                                 OutContext);
    611       const MCExpr *PB =
    612         MCSymbolRefExpr::create(OutContext.getOrCreateSymbol(Twine(".LTOC")),
    613                                                              OutContext);
    614       Exp = MCBinaryExpr::createSub(Exp, PB, OutContext);
    615       TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
    616     }
    617     EmitToStreamer(*OutStreamer, TmpInst);
    618     return;
    619   }
    620   case PPC::LDtocJTI:
    621   case PPC::LDtocCPT:
    622   case PPC::LDtocBA:
    623   case PPC::LDtoc: {
    624     // Transform %X3 = LDtoc <ga:@min1>, %X2
    625     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
    626 
    627     // Change the opcode to LD, and the global address operand to be a
    628     // reference to the TOC entry we will synthesize later.
    629     TmpInst.setOpcode(PPC::LD);
    630     const MachineOperand &MO = MI->getOperand(1);
    631 
    632     // Map symbol -> label of TOC entry
    633     assert(MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress());
    634     MCSymbol *MOSymbol = nullptr;
    635     if (MO.isGlobal())
    636       MOSymbol = getSymbol(MO.getGlobal());
    637     else if (MO.isCPI())
    638       MOSymbol = GetCPISymbol(MO.getIndex());
    639     else if (MO.isJTI())
    640       MOSymbol = GetJTISymbol(MO.getIndex());
    641     else if (MO.isBlockAddress())
    642       MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress());
    643 
    644     MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
    645 
    646     const MCExpr *Exp =
    647       MCSymbolRefExpr::create(TOCEntry, MCSymbolRefExpr::VK_PPC_TOC,
    648                               OutContext);
    649     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
    650     EmitToStreamer(*OutStreamer, TmpInst);
    651     return;
    652   }
    653 
    654   case PPC::ADDIStocHA: {
    655     // Transform %Xd = ADDIStocHA %X2, <ga:@sym>
    656     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
    657 
    658     // Change the opcode to ADDIS8.  If the global address is external, has
    659     // common linkage, is a non-local function address, or is a jump table
    660     // address, then generate a TOC entry and reference that.  Otherwise
    661     // reference the symbol directly.
    662     TmpInst.setOpcode(PPC::ADDIS8);
    663     const MachineOperand &MO = MI->getOperand(2);
    664     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() ||
    665             MO.isBlockAddress()) &&
    666            "Invalid operand for ADDIStocHA!");
    667     MCSymbol *MOSymbol = nullptr;
    668     bool GlobalToc = false;
    669 
    670     if (MO.isGlobal()) {
    671       const GlobalValue *GV = MO.getGlobal();
    672       MOSymbol = getSymbol(GV);
    673       unsigned char GVFlags = Subtarget->classifyGlobalReference(GV);
    674       GlobalToc = (GVFlags & PPCII::MO_NLP_FLAG);
    675     } else if (MO.isCPI()) {
    676       MOSymbol = GetCPISymbol(MO.getIndex());
    677     } else if (MO.isJTI()) {
    678       MOSymbol = GetJTISymbol(MO.getIndex());
    679     } else if (MO.isBlockAddress()) {
    680       MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress());
    681     }
    682 
    683     if (GlobalToc || MO.isJTI() || MO.isBlockAddress() ||
    684         TM.getCodeModel() == CodeModel::Large)
    685       MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
    686 
    687     const MCExpr *Exp =
    688       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_TOC_HA,
    689                               OutContext);
    690     TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
    691     EmitToStreamer(*OutStreamer, TmpInst);
    692     return;
    693   }
    694   case PPC::LDtocL: {
    695     // Transform %Xd = LDtocL <ga:@sym>, %Xs
    696     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
    697 
    698     // Change the opcode to LD.  If the global address is external, has
    699     // common linkage, or is a jump table address, then reference the
    700     // associated TOC entry.  Otherwise reference the symbol directly.
    701     TmpInst.setOpcode(PPC::LD);
    702     const MachineOperand &MO = MI->getOperand(1);
    703     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() ||
    704             MO.isBlockAddress()) &&
    705            "Invalid operand for LDtocL!");
    706     MCSymbol *MOSymbol = nullptr;
    707 
    708     if (MO.isJTI())
    709       MOSymbol = lookUpOrCreateTOCEntry(GetJTISymbol(MO.getIndex()));
    710     else if (MO.isBlockAddress()) {
    711       MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress());
    712       MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
    713     }
    714     else if (MO.isCPI()) {
    715       MOSymbol = GetCPISymbol(MO.getIndex());
    716       if (TM.getCodeModel() == CodeModel::Large)
    717         MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
    718     }
    719     else if (MO.isGlobal()) {
    720       const GlobalValue *GV = MO.getGlobal();
    721       MOSymbol = getSymbol(GV);
    722       DEBUG(
    723         unsigned char GVFlags = Subtarget->classifyGlobalReference(GV);
    724         assert((GVFlags & PPCII::MO_NLP_FLAG) &&
    725                "LDtocL used on symbol that could be accessed directly is "
    726                "invalid. Must match ADDIStocHA."));
    727       MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
    728     }
    729 
    730     const MCExpr *Exp =
    731       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_TOC_LO,
    732                               OutContext);
    733     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
    734     EmitToStreamer(*OutStreamer, TmpInst);
    735     return;
    736   }
    737   case PPC::ADDItocL: {
    738     // Transform %Xd = ADDItocL %Xs, <ga:@sym>
    739     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
    740 
    741     // Change the opcode to ADDI8.  If the global address is external, then
    742     // generate a TOC entry and reference that.  Otherwise reference the
    743     // symbol directly.
    744     TmpInst.setOpcode(PPC::ADDI8);
    745     const MachineOperand &MO = MI->getOperand(2);
    746     assert((MO.isGlobal() || MO.isCPI()) && "Invalid operand for ADDItocL");
    747     MCSymbol *MOSymbol = nullptr;
    748 
    749     if (MO.isGlobal()) {
    750       const GlobalValue *GV = MO.getGlobal();
    751       DEBUG(
    752         unsigned char GVFlags = Subtarget->classifyGlobalReference(GV);
    753         assert (
    754             !(GVFlags & PPCII::MO_NLP_FLAG) &&
    755             "Interposable definitions must use indirect access."));
    756       MOSymbol = getSymbol(GV);
    757     } else if (MO.isCPI()) {
    758       MOSymbol = GetCPISymbol(MO.getIndex());
    759     }
    760 
    761     const MCExpr *Exp =
    762       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_TOC_LO,
    763                               OutContext);
    764     TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
    765     EmitToStreamer(*OutStreamer, TmpInst);
    766     return;
    767   }
    768   case PPC::ADDISgotTprelHA: {
    769     // Transform: %Xd = ADDISgotTprelHA %X2, <ga:@sym>
    770     // Into:      %Xd = ADDIS8 %X2, sym@got@tlsgd@ha
    771     assert(Subtarget->isPPC64() && "Not supported for 32-bit PowerPC");
    772     const MachineOperand &MO = MI->getOperand(2);
    773     const GlobalValue *GValue = MO.getGlobal();
    774     MCSymbol *MOSymbol = getSymbol(GValue);
    775     const MCExpr *SymGotTprel =
    776       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA,
    777                               OutContext);
    778     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
    779                                  .addReg(MI->getOperand(0).getReg())
    780                                  .addReg(MI->getOperand(1).getReg())
    781                                  .addExpr(SymGotTprel));
    782     return;
    783   }
    784   case PPC::LDgotTprelL:
    785   case PPC::LDgotTprelL32: {
    786     // Transform %Xd = LDgotTprelL <ga:@sym>, %Xs
    787     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
    788 
    789     // Change the opcode to LD.
    790     TmpInst.setOpcode(isPPC64 ? PPC::LD : PPC::LWZ);
    791     const MachineOperand &MO = MI->getOperand(1);
    792     const GlobalValue *GValue = MO.getGlobal();
    793     MCSymbol *MOSymbol = getSymbol(GValue);
    794     const MCExpr *Exp =
    795       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO,
    796                               OutContext);
    797     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
    798     EmitToStreamer(*OutStreamer, TmpInst);
    799     return;
    800   }
    801 
    802   case PPC::PPC32PICGOT: {
    803     MCSymbol *GOTSymbol = OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
    804     MCSymbol *GOTRef = OutContext.createTempSymbol();
    805     MCSymbol *NextInstr = OutContext.createTempSymbol();
    806 
    807     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL)
    808       // FIXME: We would like an efficient form for this, so we don't have to do
    809       // a lot of extra uniquing.
    810       .addExpr(MCSymbolRefExpr::create(NextInstr, OutContext)));
    811     const MCExpr *OffsExpr =
    812       MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol, OutContext),
    813                                 MCSymbolRefExpr::create(GOTRef, OutContext),
    814         OutContext);
    815     OutStreamer->EmitLabel(GOTRef);
    816     OutStreamer->EmitValue(OffsExpr, 4);
    817     OutStreamer->EmitLabel(NextInstr);
    818     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR)
    819                                  .addReg(MI->getOperand(0).getReg()));
    820     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LWZ)
    821                                  .addReg(MI->getOperand(1).getReg())
    822                                  .addImm(0)
    823                                  .addReg(MI->getOperand(0).getReg()));
    824     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD4)
    825                                  .addReg(MI->getOperand(0).getReg())
    826                                  .addReg(MI->getOperand(1).getReg())
    827                                  .addReg(MI->getOperand(0).getReg()));
    828     return;
    829   }
    830   case PPC::PPC32GOT: {
    831     MCSymbol *GOTSymbol =
    832         OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
    833     const MCExpr *SymGotTlsL = MCSymbolRefExpr::create(
    834         GOTSymbol, MCSymbolRefExpr::VK_PPC_LO, OutContext);
    835     const MCExpr *SymGotTlsHA = MCSymbolRefExpr::create(
    836         GOTSymbol, MCSymbolRefExpr::VK_PPC_HA, OutContext);
    837     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI)
    838                                  .addReg(MI->getOperand(0).getReg())
    839                                  .addExpr(SymGotTlsL));
    840     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
    841                                  .addReg(MI->getOperand(0).getReg())
    842                                  .addReg(MI->getOperand(0).getReg())
    843                                  .addExpr(SymGotTlsHA));
    844     return;
    845   }
    846   case PPC::ADDIStlsgdHA: {
    847     // Transform: %Xd = ADDIStlsgdHA %X2, <ga:@sym>
    848     // Into:      %Xd = ADDIS8 %X2, sym@got@tlsgd@ha
    849     assert(Subtarget->isPPC64() && "Not supported for 32-bit PowerPC");
    850     const MachineOperand &MO = MI->getOperand(2);
    851     const GlobalValue *GValue = MO.getGlobal();
    852     MCSymbol *MOSymbol = getSymbol(GValue);
    853     const MCExpr *SymGotTlsGD =
    854       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA,
    855                               OutContext);
    856     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
    857                                  .addReg(MI->getOperand(0).getReg())
    858                                  .addReg(MI->getOperand(1).getReg())
    859                                  .addExpr(SymGotTlsGD));
    860     return;
    861   }
    862   case PPC::ADDItlsgdL:
    863     // Transform: %Xd = ADDItlsgdL %Xs, <ga:@sym>
    864     // Into:      %Xd = ADDI8 %Xs, sym@got@tlsgd@l
    865   case PPC::ADDItlsgdL32: {
    866     // Transform: %Rd = ADDItlsgdL32 %Rs, <ga:@sym>
    867     // Into:      %Rd = ADDI %Rs, sym@got@tlsgd
    868     const MachineOperand &MO = MI->getOperand(2);
    869     const GlobalValue *GValue = MO.getGlobal();
    870     MCSymbol *MOSymbol = getSymbol(GValue);
    871     const MCExpr *SymGotTlsGD = MCSymbolRefExpr::create(
    872         MOSymbol, Subtarget->isPPC64() ? MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO
    873                                        : MCSymbolRefExpr::VK_PPC_GOT_TLSGD,
    874         OutContext);
    875     EmitToStreamer(*OutStreamer,
    876                    MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDI8 : PPC::ADDI)
    877                    .addReg(MI->getOperand(0).getReg())
    878                    .addReg(MI->getOperand(1).getReg())
    879                    .addExpr(SymGotTlsGD));
    880     return;
    881   }
    882   case PPC::GETtlsADDR:
    883     // Transform: %X3 = GETtlsADDR %X3, <ga:@sym>
    884     // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsgd)
    885   case PPC::GETtlsADDR32: {
    886     // Transform: %R3 = GETtlsADDR32 %R3, <ga:@sym>
    887     // Into: BL_TLS __tls_get_addr(sym at tlsgd)@PLT
    888     EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSGD);
    889     return;
    890   }
    891   case PPC::ADDIStlsldHA: {
    892     // Transform: %Xd = ADDIStlsldHA %X2, <ga:@sym>
    893     // Into:      %Xd = ADDIS8 %X2, sym@got@tlsld@ha
    894     assert(Subtarget->isPPC64() && "Not supported for 32-bit PowerPC");
    895     const MachineOperand &MO = MI->getOperand(2);
    896     const GlobalValue *GValue = MO.getGlobal();
    897     MCSymbol *MOSymbol = getSymbol(GValue);
    898     const MCExpr *SymGotTlsLD =
    899       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA,
    900                               OutContext);
    901     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
    902                                  .addReg(MI->getOperand(0).getReg())
    903                                  .addReg(MI->getOperand(1).getReg())
    904                                  .addExpr(SymGotTlsLD));
    905     return;
    906   }
    907   case PPC::ADDItlsldL:
    908     // Transform: %Xd = ADDItlsldL %Xs, <ga:@sym>
    909     // Into:      %Xd = ADDI8 %Xs, sym@got@tlsld@l
    910   case PPC::ADDItlsldL32: {
    911     // Transform: %Rd = ADDItlsldL32 %Rs, <ga:@sym>
    912     // Into:      %Rd = ADDI %Rs, sym@got@tlsld
    913     const MachineOperand &MO = MI->getOperand(2);
    914     const GlobalValue *GValue = MO.getGlobal();
    915     MCSymbol *MOSymbol = getSymbol(GValue);
    916     const MCExpr *SymGotTlsLD = MCSymbolRefExpr::create(
    917         MOSymbol, Subtarget->isPPC64() ? MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO
    918                                        : MCSymbolRefExpr::VK_PPC_GOT_TLSLD,
    919         OutContext);
    920     EmitToStreamer(*OutStreamer,
    921                    MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDI8 : PPC::ADDI)
    922                        .addReg(MI->getOperand(0).getReg())
    923                        .addReg(MI->getOperand(1).getReg())
    924                        .addExpr(SymGotTlsLD));
    925     return;
    926   }
    927   case PPC::GETtlsldADDR:
    928     // Transform: %X3 = GETtlsldADDR %X3, <ga:@sym>
    929     // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsld)
    930   case PPC::GETtlsldADDR32: {
    931     // Transform: %R3 = GETtlsldADDR32 %R3, <ga:@sym>
    932     // Into: BL_TLS __tls_get_addr(sym at tlsld)@PLT
    933     EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSLD);
    934     return;
    935   }
    936   case PPC::ADDISdtprelHA:
    937     // Transform: %Xd = ADDISdtprelHA %Xs, <ga:@sym>
    938     // Into:      %Xd = ADDIS8 %Xs, sym@dtprel@ha
    939   case PPC::ADDISdtprelHA32: {
    940     // Transform: %Rd = ADDISdtprelHA32 %Rs, <ga:@sym>
    941     // Into:      %Rd = ADDIS %Rs, sym@dtprel@ha
    942     const MachineOperand &MO = MI->getOperand(2);
    943     const GlobalValue *GValue = MO.getGlobal();
    944     MCSymbol *MOSymbol = getSymbol(GValue);
    945     const MCExpr *SymDtprel =
    946       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_HA,
    947                               OutContext);
    948     EmitToStreamer(
    949         *OutStreamer,
    950         MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDIS8 : PPC::ADDIS)
    951             .addReg(MI->getOperand(0).getReg())
    952             .addReg(MI->getOperand(1).getReg())
    953             .addExpr(SymDtprel));
    954     return;
    955   }
    956   case PPC::ADDIdtprelL:
    957     // Transform: %Xd = ADDIdtprelL %Xs, <ga:@sym>
    958     // Into:      %Xd = ADDI8 %Xs, sym@dtprel@l
    959   case PPC::ADDIdtprelL32: {
    960     // Transform: %Rd = ADDIdtprelL32 %Rs, <ga:@sym>
    961     // Into:      %Rd = ADDI %Rs, sym@dtprel@l
    962     const MachineOperand &MO = MI->getOperand(2);
    963     const GlobalValue *GValue = MO.getGlobal();
    964     MCSymbol *MOSymbol = getSymbol(GValue);
    965     const MCExpr *SymDtprel =
    966       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_LO,
    967                               OutContext);
    968     EmitToStreamer(*OutStreamer,
    969                    MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDI8 : PPC::ADDI)
    970                        .addReg(MI->getOperand(0).getReg())
    971                        .addReg(MI->getOperand(1).getReg())
    972                        .addExpr(SymDtprel));
    973     return;
    974   }
    975   case PPC::MFOCRF:
    976   case PPC::MFOCRF8:
    977     if (!Subtarget->hasMFOCRF()) {
    978       // Transform: %R3 = MFOCRF %CR7
    979       // Into:      %R3 = MFCR   ;; cr7
    980       unsigned NewOpcode =
    981         MI->getOpcode() == PPC::MFOCRF ? PPC::MFCR : PPC::MFCR8;
    982       OutStreamer->AddComment(PPCInstPrinter::
    983                               getRegisterName(MI->getOperand(1).getReg()));
    984       EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode)
    985                                   .addReg(MI->getOperand(0).getReg()));
    986       return;
    987     }
    988     break;
    989   case PPC::MTOCRF:
    990   case PPC::MTOCRF8:
    991     if (!Subtarget->hasMFOCRF()) {
    992       // Transform: %CR7 = MTOCRF %R3
    993       // Into:      MTCRF mask, %R3 ;; cr7
    994       unsigned NewOpcode =
    995         MI->getOpcode() == PPC::MTOCRF ? PPC::MTCRF : PPC::MTCRF8;
    996       unsigned Mask = 0x80 >> OutContext.getRegisterInfo()
    997                               ->getEncodingValue(MI->getOperand(0).getReg());
    998       OutStreamer->AddComment(PPCInstPrinter::
    999                               getRegisterName(MI->getOperand(0).getReg()));
   1000       EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode)
   1001                                      .addImm(Mask)
   1002                                      .addReg(MI->getOperand(1).getReg()));
   1003       return;
   1004     }
   1005     break;
   1006   case PPC::LD:
   1007   case PPC::STD:
   1008   case PPC::LWA_32:
   1009   case PPC::LWA: {
   1010     // Verify alignment is legal, so we don't create relocations
   1011     // that can't be supported.
   1012     // FIXME:  This test is currently disabled for Darwin.  The test
   1013     // suite shows a handful of test cases that fail this check for
   1014     // Darwin.  Those need to be investigated before this sanity test
   1015     // can be enabled for those subtargets.
   1016     if (!Subtarget->isDarwin()) {
   1017       unsigned OpNum = (MI->getOpcode() == PPC::STD) ? 2 : 1;
   1018       const MachineOperand &MO = MI->getOperand(OpNum);
   1019       if (MO.isGlobal() && MO.getGlobal()->getAlignment() < 4)
   1020         llvm_unreachable("Global must be word-aligned for LD, STD, LWA!");
   1021     }
   1022     // Now process the instruction normally.
   1023     break;
   1024   }
   1025   }
   1026 
   1027   LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin);
   1028   EmitToStreamer(*OutStreamer, TmpInst);
   1029 }
   1030 
   1031 void PPCLinuxAsmPrinter::EmitStartOfAsmFile(Module &M) {
   1032   if (static_cast<const PPCTargetMachine &>(TM).isELFv2ABI()) {
   1033     PPCTargetStreamer *TS =
   1034       static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
   1035 
   1036     if (TS)
   1037       TS->emitAbiVersion(2);
   1038   }
   1039 
   1040   if (static_cast<const PPCTargetMachine &>(TM).isPPC64() ||
   1041       TM.getRelocationModel() != Reloc::PIC_)
   1042     return AsmPrinter::EmitStartOfAsmFile(M);
   1043 
   1044   if (M.getPICLevel() == PICLevel::Small)
   1045     return AsmPrinter::EmitStartOfAsmFile(M);
   1046 
   1047   OutStreamer->SwitchSection(OutContext.getELFSection(
   1048       ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC));
   1049 
   1050   MCSymbol *TOCSym = OutContext.getOrCreateSymbol(Twine(".LTOC"));
   1051   MCSymbol *CurrentPos = OutContext.createTempSymbol();
   1052 
   1053   OutStreamer->EmitLabel(CurrentPos);
   1054 
   1055   // The GOT pointer points to the middle of the GOT, in order to reference the
   1056   // entire 64kB range.  0x8000 is the midpoint.
   1057   const MCExpr *tocExpr =
   1058     MCBinaryExpr::createAdd(MCSymbolRefExpr::create(CurrentPos, OutContext),
   1059                             MCConstantExpr::create(0x8000, OutContext),
   1060                             OutContext);
   1061 
   1062   OutStreamer->EmitAssignment(TOCSym, tocExpr);
   1063 
   1064   OutStreamer->SwitchSection(getObjFileLowering().getTextSection());
   1065 }
   1066 
   1067 void PPCLinuxAsmPrinter::EmitFunctionEntryLabel() {
   1068   // linux/ppc32 - Normal entry label.
   1069   if (!Subtarget->isPPC64() &&
   1070       (TM.getRelocationModel() != Reloc::PIC_ ||
   1071        MF->getFunction()->getParent()->getPICLevel() == PICLevel::Small))
   1072     return AsmPrinter::EmitFunctionEntryLabel();
   1073 
   1074   if (!Subtarget->isPPC64()) {
   1075     const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
   1076     if (PPCFI->usesPICBase()) {
   1077       MCSymbol *RelocSymbol = PPCFI->getPICOffsetSymbol();
   1078       MCSymbol *PICBase = MF->getPICBaseSymbol();
   1079       OutStreamer->EmitLabel(RelocSymbol);
   1080 
   1081       const MCExpr *OffsExpr =
   1082         MCBinaryExpr::createSub(
   1083           MCSymbolRefExpr::create(OutContext.getOrCreateSymbol(Twine(".LTOC")),
   1084                                                                OutContext),
   1085                                   MCSymbolRefExpr::create(PICBase, OutContext),
   1086           OutContext);
   1087       OutStreamer->EmitValue(OffsExpr, 4);
   1088       OutStreamer->EmitLabel(CurrentFnSym);
   1089       return;
   1090     } else
   1091       return AsmPrinter::EmitFunctionEntryLabel();
   1092   }
   1093 
   1094   // ELFv2 ABI - Normal entry label.
   1095   if (Subtarget->isELFv2ABI())
   1096     return AsmPrinter::EmitFunctionEntryLabel();
   1097 
   1098   // Emit an official procedure descriptor.
   1099   MCSectionSubPair Current = OutStreamer->getCurrentSection();
   1100   MCSectionELF *Section = OutStreamer->getContext().getELFSection(
   1101       ".opd", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
   1102   OutStreamer->SwitchSection(Section);
   1103   OutStreamer->EmitLabel(CurrentFnSym);
   1104   OutStreamer->EmitValueToAlignment(8);
   1105   MCSymbol *Symbol1 = CurrentFnSymForSize;
   1106   // Generates a R_PPC64_ADDR64 (from FK_DATA_8) relocation for the function
   1107   // entry point.
   1108   OutStreamer->EmitValue(MCSymbolRefExpr::create(Symbol1, OutContext),
   1109                          8 /*size*/);
   1110   MCSymbol *Symbol2 = OutContext.getOrCreateSymbol(StringRef(".TOC."));
   1111   // Generates a R_PPC64_TOC relocation for TOC base insertion.
   1112   OutStreamer->EmitValue(
   1113     MCSymbolRefExpr::create(Symbol2, MCSymbolRefExpr::VK_PPC_TOCBASE, OutContext),
   1114     8/*size*/);
   1115   // Emit a null environment pointer.
   1116   OutStreamer->EmitIntValue(0, 8 /* size */);
   1117   OutStreamer->SwitchSection(Current.first, Current.second);
   1118 }
   1119 
   1120 bool PPCLinuxAsmPrinter::doFinalization(Module &M) {
   1121   const DataLayout &DL = getDataLayout();
   1122 
   1123   bool isPPC64 = DL.getPointerSizeInBits() == 64;
   1124 
   1125   PPCTargetStreamer &TS =
   1126       static_cast<PPCTargetStreamer &>(*OutStreamer->getTargetStreamer());
   1127 
   1128   if (!TOC.empty()) {
   1129     MCSectionELF *Section;
   1130 
   1131     if (isPPC64)
   1132       Section = OutStreamer->getContext().getELFSection(
   1133           ".toc", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
   1134         else
   1135           Section = OutStreamer->getContext().getELFSection(
   1136               ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
   1137     OutStreamer->SwitchSection(Section);
   1138 
   1139     for (MapVector<MCSymbol*, MCSymbol*>::iterator I = TOC.begin(),
   1140          E = TOC.end(); I != E; ++I) {
   1141       OutStreamer->EmitLabel(I->second);
   1142       MCSymbol *S = I->first;
   1143       if (isPPC64)
   1144         TS.emitTCEntry(*S);
   1145       else
   1146         OutStreamer->EmitSymbolValue(S, 4);
   1147     }
   1148   }
   1149 
   1150   return AsmPrinter::doFinalization(M);
   1151 }
   1152 
   1153 /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2.
   1154 void PPCLinuxAsmPrinter::EmitFunctionBodyStart() {
   1155   // In the ELFv2 ABI, in functions that use the TOC register, we need to
   1156   // provide two entry points.  The ABI guarantees that when calling the
   1157   // local entry point, r2 is set up by the caller to contain the TOC base
   1158   // for this function, and when calling the global entry point, r12 is set
   1159   // up by the caller to hold the address of the global entry point.  We
   1160   // thus emit a prefix sequence along the following lines:
   1161   //
   1162   // func:
   1163   //         # global entry point
   1164   //         addis r2,r12,(.TOC.-func)@ha
   1165   //         addi  r2,r2,(.TOC.-func)@l
   1166   //         .localentry func, .-func
   1167   //         # local entry point, followed by function body
   1168   //
   1169   // This ensures we have r2 set up correctly while executing the function
   1170   // body, no matter which entry point is called.
   1171   if (Subtarget->isELFv2ABI()
   1172       // Only do all that if the function uses r2 in the first place.
   1173       && !MF->getRegInfo().use_empty(PPC::X2)) {
   1174 
   1175     MCSymbol *GlobalEntryLabel = OutContext.createTempSymbol();
   1176     OutStreamer->EmitLabel(GlobalEntryLabel);
   1177     const MCSymbolRefExpr *GlobalEntryLabelExp =
   1178       MCSymbolRefExpr::create(GlobalEntryLabel, OutContext);
   1179 
   1180     MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC."));
   1181     const MCExpr *TOCDeltaExpr =
   1182       MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext),
   1183                               GlobalEntryLabelExp, OutContext);
   1184 
   1185     const MCExpr *TOCDeltaHi =
   1186       PPCMCExpr::createHa(TOCDeltaExpr, false, OutContext);
   1187     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
   1188                                  .addReg(PPC::X2)
   1189                                  .addReg(PPC::X12)
   1190                                  .addExpr(TOCDeltaHi));
   1191 
   1192     const MCExpr *TOCDeltaLo =
   1193       PPCMCExpr::createLo(TOCDeltaExpr, false, OutContext);
   1194     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI)
   1195                                  .addReg(PPC::X2)
   1196                                  .addReg(PPC::X2)
   1197                                  .addExpr(TOCDeltaLo));
   1198 
   1199     MCSymbol *LocalEntryLabel = OutContext.createTempSymbol();
   1200     OutStreamer->EmitLabel(LocalEntryLabel);
   1201     const MCSymbolRefExpr *LocalEntryLabelExp =
   1202        MCSymbolRefExpr::create(LocalEntryLabel, OutContext);
   1203     const MCExpr *LocalOffsetExp =
   1204       MCBinaryExpr::createSub(LocalEntryLabelExp,
   1205                               GlobalEntryLabelExp, OutContext);
   1206 
   1207     PPCTargetStreamer *TS =
   1208       static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
   1209 
   1210     if (TS)
   1211       TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), LocalOffsetExp);
   1212   }
   1213 }
   1214 
   1215 /// EmitFunctionBodyEnd - Print the traceback table before the .size
   1216 /// directive.
   1217 ///
   1218 void PPCLinuxAsmPrinter::EmitFunctionBodyEnd() {
   1219   // Only the 64-bit target requires a traceback table.  For now,
   1220   // we only emit the word of zeroes that GDB requires to find
   1221   // the end of the function, and zeroes for the eight-byte
   1222   // mandatory fields.
   1223   // FIXME: We should fill in the eight-byte mandatory fields as described in
   1224   // the PPC64 ELF ABI (this is a low-priority item because GDB does not
   1225   // currently make use of these fields).
   1226   if (Subtarget->isPPC64()) {
   1227     OutStreamer->EmitIntValue(0, 4/*size*/);
   1228     OutStreamer->EmitIntValue(0, 8/*size*/);
   1229   }
   1230 }
   1231 
   1232 void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) {
   1233   static const char *const CPUDirectives[] = {
   1234     "",
   1235     "ppc",
   1236     "ppc440",
   1237     "ppc601",
   1238     "ppc602",
   1239     "ppc603",
   1240     "ppc7400",
   1241     "ppc750",
   1242     "ppc970",
   1243     "ppcA2",
   1244     "ppce500mc",
   1245     "ppce5500",
   1246     "power3",
   1247     "power4",
   1248     "power5",
   1249     "power5x",
   1250     "power6",
   1251     "power6x",
   1252     "power7",
   1253     "ppc64",
   1254     "ppc64le"
   1255   };
   1256 
   1257   // Get the numerically largest directive.
   1258   // FIXME: How should we merge darwin directives?
   1259   unsigned Directive = PPC::DIR_NONE;
   1260   for (const Function &F : M) {
   1261     const PPCSubtarget &STI = TM.getSubtarget<PPCSubtarget>(F);
   1262     unsigned FDir = STI.getDarwinDirective();
   1263     Directive = Directive > FDir ? FDir : STI.getDarwinDirective();
   1264     if (STI.hasMFOCRF() && Directive < PPC::DIR_970)
   1265       Directive = PPC::DIR_970;
   1266     if (STI.hasAltivec() && Directive < PPC::DIR_7400)
   1267       Directive = PPC::DIR_7400;
   1268     if (STI.isPPC64() && Directive < PPC::DIR_64)
   1269       Directive = PPC::DIR_64;
   1270   }
   1271 
   1272   assert(Directive <= PPC::DIR_64 && "Directive out of range.");
   1273 
   1274   assert(Directive < array_lengthof(CPUDirectives) &&
   1275          "CPUDirectives[] might not be up-to-date!");
   1276   PPCTargetStreamer &TStreamer =
   1277       *static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
   1278   TStreamer.emitMachine(CPUDirectives[Directive]);
   1279 
   1280   // Prime text sections so they are adjacent.  This reduces the likelihood a
   1281   // large data or debug section causes a branch to exceed 16M limit.
   1282   const TargetLoweringObjectFileMachO &TLOFMacho =
   1283       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
   1284   OutStreamer->SwitchSection(TLOFMacho.getTextCoalSection());
   1285   if (TM.getRelocationModel() == Reloc::PIC_) {
   1286     OutStreamer->SwitchSection(
   1287            OutContext.getMachOSection("__TEXT", "__picsymbolstub1",
   1288                                       MachO::S_SYMBOL_STUBS |
   1289                                       MachO::S_ATTR_PURE_INSTRUCTIONS,
   1290                                       32, SectionKind::getText()));
   1291   } else if (TM.getRelocationModel() == Reloc::DynamicNoPIC) {
   1292     OutStreamer->SwitchSection(
   1293            OutContext.getMachOSection("__TEXT","__symbol_stub1",
   1294                                       MachO::S_SYMBOL_STUBS |
   1295                                       MachO::S_ATTR_PURE_INSTRUCTIONS,
   1296                                       16, SectionKind::getText()));
   1297   }
   1298   OutStreamer->SwitchSection(getObjFileLowering().getTextSection());
   1299 }
   1300 
   1301 static MCSymbol *GetLazyPtr(MCSymbol *Sym, MCContext &Ctx) {
   1302   // Remove $stub suffix, add $lazy_ptr.
   1303   StringRef NoStub = Sym->getName().substr(0, Sym->getName().size()-5);
   1304   return Ctx.getOrCreateSymbol(NoStub + "$lazy_ptr");
   1305 }
   1306 
   1307 static MCSymbol *GetAnonSym(MCSymbol *Sym, MCContext &Ctx) {
   1308   // Add $tmp suffix to $stub, yielding $stub$tmp.
   1309   return Ctx.getOrCreateSymbol(Sym->getName() + "$tmp");
   1310 }
   1311 
   1312 void PPCDarwinAsmPrinter::
   1313 EmitFunctionStubs(const MachineModuleInfoMachO::SymbolListTy &Stubs) {
   1314   bool isPPC64 = getDataLayout().getPointerSizeInBits() == 64;
   1315 
   1316   // Construct a local MCSubtargetInfo and shadow EmitToStreamer here.
   1317   // This is because the MachineFunction won't exist (but have not yet been
   1318   // freed) and since we're at the global level we can use the default
   1319   // constructed subtarget.
   1320   std::unique_ptr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo(
   1321       TM.getTargetTriple().str(), TM.getTargetCPU(),
   1322       TM.getTargetFeatureString()));
   1323   auto EmitToStreamer = [&STI] (MCStreamer &S, const MCInst &Inst) {
   1324     S.EmitInstruction(Inst, *STI);
   1325   };
   1326 
   1327   const TargetLoweringObjectFileMachO &TLOFMacho =
   1328       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
   1329 
   1330   // .lazy_symbol_pointer
   1331   MCSection *LSPSection = TLOFMacho.getLazySymbolPointerSection();
   1332 
   1333   // Output stubs for dynamically-linked functions
   1334   if (TM.getRelocationModel() == Reloc::PIC_) {
   1335     MCSection *StubSection = OutContext.getMachOSection(
   1336         "__TEXT", "__picsymbolstub1",
   1337         MachO::S_SYMBOL_STUBS | MachO::S_ATTR_PURE_INSTRUCTIONS, 32,
   1338         SectionKind::getText());
   1339     for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
   1340       OutStreamer->SwitchSection(StubSection);
   1341       EmitAlignment(4);
   1342 
   1343       MCSymbol *Stub = Stubs[i].first;
   1344       MCSymbol *RawSym = Stubs[i].second.getPointer();
   1345       MCSymbol *LazyPtr = GetLazyPtr(Stub, OutContext);
   1346       MCSymbol *AnonSymbol = GetAnonSym(Stub, OutContext);
   1347 
   1348       OutStreamer->EmitLabel(Stub);
   1349       OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
   1350 
   1351       const MCExpr *Anon = MCSymbolRefExpr::create(AnonSymbol, OutContext);
   1352       const MCExpr *LazyPtrExpr = MCSymbolRefExpr::create(LazyPtr, OutContext);
   1353       const MCExpr *Sub =
   1354         MCBinaryExpr::createSub(LazyPtrExpr, Anon, OutContext);
   1355 
   1356       // mflr r0
   1357       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR).addReg(PPC::R0));
   1358       // bcl 20, 31, AnonSymbol
   1359       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCLalways).addExpr(Anon));
   1360       OutStreamer->EmitLabel(AnonSymbol);
   1361       // mflr r11
   1362       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR).addReg(PPC::R11));
   1363       // addis r11, r11, ha16(LazyPtr - AnonSymbol)
   1364       const MCExpr *SubHa16 = PPCMCExpr::createHa(Sub, true, OutContext);
   1365       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
   1366         .addReg(PPC::R11)
   1367         .addReg(PPC::R11)
   1368         .addExpr(SubHa16));
   1369       // mtlr r0
   1370       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR).addReg(PPC::R0));
   1371 
   1372       // ldu r12, lo16(LazyPtr - AnonSymbol)(r11)
   1373       // lwzu r12, lo16(LazyPtr - AnonSymbol)(r11)
   1374       const MCExpr *SubLo16 = PPCMCExpr::createLo(Sub, true, OutContext);
   1375       EmitToStreamer(*OutStreamer, MCInstBuilder(isPPC64 ? PPC::LDU : PPC::LWZU)
   1376         .addReg(PPC::R12)
   1377         .addExpr(SubLo16).addExpr(SubLo16)
   1378         .addReg(PPC::R11));
   1379       // mtctr r12
   1380       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR).addReg(PPC::R12));
   1381       // bctr
   1382       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTR));
   1383 
   1384       OutStreamer->SwitchSection(LSPSection);
   1385       OutStreamer->EmitLabel(LazyPtr);
   1386       OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
   1387 
   1388       MCSymbol *DyldStubBindingHelper =
   1389         OutContext.getOrCreateSymbol(StringRef("dyld_stub_binding_helper"));
   1390       if (isPPC64) {
   1391         // .quad dyld_stub_binding_helper
   1392         OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 8);
   1393       } else {
   1394         // .long dyld_stub_binding_helper
   1395         OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 4);
   1396       }
   1397     }
   1398     OutStreamer->AddBlankLine();
   1399     return;
   1400   }
   1401 
   1402   MCSection *StubSection = OutContext.getMachOSection(
   1403       "__TEXT", "__symbol_stub1",
   1404       MachO::S_SYMBOL_STUBS | MachO::S_ATTR_PURE_INSTRUCTIONS, 16,
   1405       SectionKind::getText());
   1406   for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
   1407     MCSymbol *Stub = Stubs[i].first;
   1408     MCSymbol *RawSym = Stubs[i].second.getPointer();
   1409     MCSymbol *LazyPtr = GetLazyPtr(Stub, OutContext);
   1410     const MCExpr *LazyPtrExpr = MCSymbolRefExpr::create(LazyPtr, OutContext);
   1411 
   1412     OutStreamer->SwitchSection(StubSection);
   1413     EmitAlignment(4);
   1414     OutStreamer->EmitLabel(Stub);
   1415     OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
   1416 
   1417     // lis r11, ha16(LazyPtr)
   1418     const MCExpr *LazyPtrHa16 =
   1419       PPCMCExpr::createHa(LazyPtrExpr, true, OutContext);
   1420     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LIS)
   1421       .addReg(PPC::R11)
   1422       .addExpr(LazyPtrHa16));
   1423 
   1424     // ldu r12, lo16(LazyPtr)(r11)
   1425     // lwzu r12, lo16(LazyPtr)(r11)
   1426     const MCExpr *LazyPtrLo16 =
   1427       PPCMCExpr::createLo(LazyPtrExpr, true, OutContext);
   1428     EmitToStreamer(*OutStreamer, MCInstBuilder(isPPC64 ? PPC::LDU : PPC::LWZU)
   1429       .addReg(PPC::R12)
   1430       .addExpr(LazyPtrLo16).addExpr(LazyPtrLo16)
   1431       .addReg(PPC::R11));
   1432 
   1433     // mtctr r12
   1434     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR).addReg(PPC::R12));
   1435     // bctr
   1436     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTR));
   1437 
   1438     OutStreamer->SwitchSection(LSPSection);
   1439     OutStreamer->EmitLabel(LazyPtr);
   1440     OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
   1441 
   1442     MCSymbol *DyldStubBindingHelper =
   1443       OutContext.getOrCreateSymbol(StringRef("dyld_stub_binding_helper"));
   1444     if (isPPC64) {
   1445       // .quad dyld_stub_binding_helper
   1446       OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 8);
   1447     } else {
   1448       // .long dyld_stub_binding_helper
   1449       OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 4);
   1450     }
   1451   }
   1452 
   1453   OutStreamer->AddBlankLine();
   1454 }
   1455 
   1456 bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
   1457   bool isPPC64 = getDataLayout().getPointerSizeInBits() == 64;
   1458 
   1459   // Darwin/PPC always uses mach-o.
   1460   const TargetLoweringObjectFileMachO &TLOFMacho =
   1461       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
   1462   MachineModuleInfoMachO &MMIMacho =
   1463       MMI->getObjFileInfo<MachineModuleInfoMachO>();
   1464 
   1465   MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetFnStubList();
   1466   if (!Stubs.empty())
   1467     EmitFunctionStubs(Stubs);
   1468 
   1469   if (MAI->doesSupportExceptionHandling() && MMI) {
   1470     // Add the (possibly multiple) personalities to the set of global values.
   1471     // Only referenced functions get into the Personalities list.
   1472     for (const Function *Personality : MMI->getPersonalities()) {
   1473       if (Personality) {
   1474         MCSymbol *NLPSym =
   1475             getSymbolWithGlobalValueBase(Personality, "$non_lazy_ptr");
   1476         MachineModuleInfoImpl::StubValueTy &StubSym =
   1477             MMIMacho.getGVStubEntry(NLPSym);
   1478         StubSym =
   1479             MachineModuleInfoImpl::StubValueTy(getSymbol(Personality), true);
   1480       }
   1481     }
   1482   }
   1483 
   1484   // Output stubs for dynamically-linked functions.
   1485   Stubs = MMIMacho.GetGVStubList();
   1486 
   1487   // Output macho stubs for external and common global variables.
   1488   if (!Stubs.empty()) {
   1489     // Switch with ".non_lazy_symbol_pointer" directive.
   1490     OutStreamer->SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
   1491     EmitAlignment(isPPC64 ? 3 : 2);
   1492 
   1493     for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
   1494       // L_foo$stub:
   1495       OutStreamer->EmitLabel(Stubs[i].first);
   1496       //   .indirect_symbol _foo
   1497       MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second;
   1498       OutStreamer->EmitSymbolAttribute(MCSym.getPointer(), MCSA_IndirectSymbol);
   1499 
   1500       if (MCSym.getInt())
   1501         // External to current translation unit.
   1502         OutStreamer->EmitIntValue(0, isPPC64 ? 8 : 4/*size*/);
   1503       else
   1504         // Internal to current translation unit.
   1505         //
   1506         // When we place the LSDA into the TEXT section, the type info pointers
   1507         // need to be indirect and pc-rel. We accomplish this by using NLPs.
   1508         // However, sometimes the types are local to the file. So we need to
   1509         // fill in the value for the NLP in those cases.
   1510         OutStreamer->EmitValue(MCSymbolRefExpr::create(MCSym.getPointer(),
   1511                                                        OutContext),
   1512                               isPPC64 ? 8 : 4/*size*/);
   1513     }
   1514 
   1515     Stubs.clear();
   1516     OutStreamer->AddBlankLine();
   1517   }
   1518 
   1519   Stubs = MMIMacho.GetHiddenGVStubList();
   1520   if (!Stubs.empty()) {
   1521     OutStreamer->SwitchSection(getObjFileLowering().getDataSection());
   1522     EmitAlignment(isPPC64 ? 3 : 2);
   1523 
   1524     for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
   1525       // L_foo$stub:
   1526       OutStreamer->EmitLabel(Stubs[i].first);
   1527       //   .long _foo
   1528       OutStreamer->EmitValue(MCSymbolRefExpr::
   1529                              create(Stubs[i].second.getPointer(),
   1530                                     OutContext),
   1531                              isPPC64 ? 8 : 4/*size*/);
   1532     }
   1533 
   1534     Stubs.clear();
   1535     OutStreamer->AddBlankLine();
   1536   }
   1537 
   1538   // Funny Darwin hack: This flag tells the linker that no global symbols
   1539   // contain code that falls through to other global symbols (e.g. the obvious
   1540   // implementation of multiple entry points).  If this doesn't occur, the
   1541   // linker can safely perform dead code stripping.  Since LLVM never generates
   1542   // code that does this, it is always safe to set.
   1543   OutStreamer->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
   1544 
   1545   return AsmPrinter::doFinalization(M);
   1546 }
   1547 
   1548 /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code
   1549 /// for a MachineFunction to the given output stream, in a format that the
   1550 /// Darwin assembler can deal with.
   1551 ///
   1552 static AsmPrinter *
   1553 createPPCAsmPrinterPass(TargetMachine &tm,
   1554                         std::unique_ptr<MCStreamer> &&Streamer) {
   1555   if (tm.getTargetTriple().isMacOSX())
   1556     return new PPCDarwinAsmPrinter(tm, std::move(Streamer));
   1557   return new PPCLinuxAsmPrinter(tm, std::move(Streamer));
   1558 }
   1559 
   1560 // Force static initialization.
   1561 extern "C" void LLVMInitializePowerPCAsmPrinter() {
   1562   TargetRegistry::RegisterAsmPrinter(ThePPC32Target, createPPCAsmPrinterPass);
   1563   TargetRegistry::RegisterAsmPrinter(ThePPC64Target, createPPCAsmPrinterPass);
   1564   TargetRegistry::RegisterAsmPrinter(ThePPC64LETarget, createPPCAsmPrinterPass);
   1565 }
   1566