]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
MFV r302642:
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / PowerPC / PPCAsmPrinter.cpp
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     // In the Large code model, we allow arbitrary displacements between
1097     // the text section and its associated TOC section.  We place the
1098     // full 8-byte offset to the TOC in memory immediatedly preceding
1099     // the function global entry point.
1100     if (TM.getCodeModel() == CodeModel::Large
1101         && !MF->getRegInfo().use_empty(PPC::X2)) {
1102       const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
1103
1104       MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC."));
1105       MCSymbol *GlobalEPSymbol = PPCFI->getGlobalEPSymbol();
1106       const MCExpr *TOCDeltaExpr =
1107         MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext),
1108                                 MCSymbolRefExpr::create(GlobalEPSymbol,
1109                                                         OutContext),
1110                                 OutContext);
1111
1112       OutStreamer->EmitLabel(PPCFI->getTOCOffsetSymbol());
1113       OutStreamer->EmitValue(TOCDeltaExpr, 8);
1114     }
1115     return AsmPrinter::EmitFunctionEntryLabel();
1116   }
1117
1118   // Emit an official procedure descriptor.
1119   MCSectionSubPair Current = OutStreamer->getCurrentSection();
1120   MCSectionELF *Section = OutStreamer->getContext().getELFSection(
1121       ".opd", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
1122   OutStreamer->SwitchSection(Section);
1123   OutStreamer->EmitLabel(CurrentFnSym);
1124   OutStreamer->EmitValueToAlignment(8);
1125   MCSymbol *Symbol1 = CurrentFnSymForSize;
1126   // Generates a R_PPC64_ADDR64 (from FK_DATA_8) relocation for the function
1127   // entry point.
1128   OutStreamer->EmitValue(MCSymbolRefExpr::create(Symbol1, OutContext),
1129                          8 /*size*/);
1130   MCSymbol *Symbol2 = OutContext.getOrCreateSymbol(StringRef(".TOC."));
1131   // Generates a R_PPC64_TOC relocation for TOC base insertion.
1132   OutStreamer->EmitValue(
1133     MCSymbolRefExpr::create(Symbol2, MCSymbolRefExpr::VK_PPC_TOCBASE, OutContext),
1134     8/*size*/);
1135   // Emit a null environment pointer.
1136   OutStreamer->EmitIntValue(0, 8 /* size */);
1137   OutStreamer->SwitchSection(Current.first, Current.second);
1138 }
1139
1140 bool PPCLinuxAsmPrinter::doFinalization(Module &M) {
1141   const DataLayout &DL = getDataLayout();
1142
1143   bool isPPC64 = DL.getPointerSizeInBits() == 64;
1144
1145   PPCTargetStreamer &TS =
1146       static_cast<PPCTargetStreamer &>(*OutStreamer->getTargetStreamer());
1147
1148   if (!TOC.empty()) {
1149     MCSectionELF *Section;
1150
1151     if (isPPC64)
1152       Section = OutStreamer->getContext().getELFSection(
1153           ".toc", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
1154         else
1155           Section = OutStreamer->getContext().getELFSection(
1156               ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
1157     OutStreamer->SwitchSection(Section);
1158
1159     for (MapVector<MCSymbol*, MCSymbol*>::iterator I = TOC.begin(),
1160          E = TOC.end(); I != E; ++I) {
1161       OutStreamer->EmitLabel(I->second);
1162       MCSymbol *S = I->first;
1163       if (isPPC64)
1164         TS.emitTCEntry(*S);
1165       else
1166         OutStreamer->EmitSymbolValue(S, 4);
1167     }
1168   }
1169
1170   return AsmPrinter::doFinalization(M);
1171 }
1172
1173 /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2.
1174 void PPCLinuxAsmPrinter::EmitFunctionBodyStart() {
1175   // In the ELFv2 ABI, in functions that use the TOC register, we need to
1176   // provide two entry points.  The ABI guarantees that when calling the
1177   // local entry point, r2 is set up by the caller to contain the TOC base
1178   // for this function, and when calling the global entry point, r12 is set
1179   // up by the caller to hold the address of the global entry point.  We
1180   // thus emit a prefix sequence along the following lines:
1181   //
1182   // func:
1183   // .Lfunc_gepNN:
1184   //         # global entry point
1185   //         addis r2,r12,(.TOC.-.Lfunc_gepNN)@ha
1186   //         addi  r2,r2,(.TOC.-.Lfunc_gepNN)@l
1187   // .Lfunc_lepNN:
1188   //         .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
1189   //         # local entry point, followed by function body
1190   //
1191   // For the Large code model, we create
1192   //
1193   // .Lfunc_tocNN:
1194   //         .quad .TOC.-.Lfunc_gepNN      # done by EmitFunctionEntryLabel
1195   // func:
1196   // .Lfunc_gepNN:
1197   //         # global entry point
1198   //         ld    r2,.Lfunc_tocNN-.Lfunc_gepNN(r12)
1199   //         add   r2,r2,r12
1200   // .Lfunc_lepNN:
1201   //         .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
1202   //         # local entry point, followed by function body
1203   //
1204   // This ensures we have r2 set up correctly while executing the function
1205   // body, no matter which entry point is called.
1206   if (Subtarget->isELFv2ABI()
1207       // Only do all that if the function uses r2 in the first place.
1208       && !MF->getRegInfo().use_empty(PPC::X2)) {
1209     const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
1210
1211     MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol();
1212     OutStreamer->EmitLabel(GlobalEntryLabel);
1213     const MCSymbolRefExpr *GlobalEntryLabelExp =
1214       MCSymbolRefExpr::create(GlobalEntryLabel, OutContext);
1215
1216     if (TM.getCodeModel() != CodeModel::Large) {
1217       MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC."));
1218       const MCExpr *TOCDeltaExpr =
1219         MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext),
1220                                 GlobalEntryLabelExp, OutContext);
1221
1222       const MCExpr *TOCDeltaHi =
1223         PPCMCExpr::createHa(TOCDeltaExpr, false, OutContext);
1224       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
1225                                    .addReg(PPC::X2)
1226                                    .addReg(PPC::X12)
1227                                    .addExpr(TOCDeltaHi));
1228
1229       const MCExpr *TOCDeltaLo =
1230         PPCMCExpr::createLo(TOCDeltaExpr, false, OutContext);
1231       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI)
1232                                    .addReg(PPC::X2)
1233                                    .addReg(PPC::X2)
1234                                    .addExpr(TOCDeltaLo));
1235     } else {
1236       MCSymbol *TOCOffset = PPCFI->getTOCOffsetSymbol();
1237       const MCExpr *TOCOffsetDeltaExpr =
1238         MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCOffset, OutContext),
1239                                 GlobalEntryLabelExp, OutContext);
1240
1241       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
1242                                    .addReg(PPC::X2)
1243                                    .addExpr(TOCOffsetDeltaExpr)
1244                                    .addReg(PPC::X12));
1245       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD8)
1246                                    .addReg(PPC::X2)
1247                                    .addReg(PPC::X2)
1248                                    .addReg(PPC::X12));
1249     }
1250
1251     MCSymbol *LocalEntryLabel = PPCFI->getLocalEPSymbol();
1252     OutStreamer->EmitLabel(LocalEntryLabel);
1253     const MCSymbolRefExpr *LocalEntryLabelExp =
1254        MCSymbolRefExpr::create(LocalEntryLabel, OutContext);
1255     const MCExpr *LocalOffsetExp =
1256       MCBinaryExpr::createSub(LocalEntryLabelExp,
1257                               GlobalEntryLabelExp, OutContext);
1258
1259     PPCTargetStreamer *TS =
1260       static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
1261
1262     if (TS)
1263       TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), LocalOffsetExp);
1264   }
1265 }
1266
1267 /// EmitFunctionBodyEnd - Print the traceback table before the .size
1268 /// directive.
1269 ///
1270 void PPCLinuxAsmPrinter::EmitFunctionBodyEnd() {
1271   // Only the 64-bit target requires a traceback table.  For now,
1272   // we only emit the word of zeroes that GDB requires to find
1273   // the end of the function, and zeroes for the eight-byte
1274   // mandatory fields.
1275   // FIXME: We should fill in the eight-byte mandatory fields as described in
1276   // the PPC64 ELF ABI (this is a low-priority item because GDB does not
1277   // currently make use of these fields).
1278   if (Subtarget->isPPC64()) {
1279     OutStreamer->EmitIntValue(0, 4/*size*/);
1280     OutStreamer->EmitIntValue(0, 8/*size*/);
1281   }
1282 }
1283
1284 void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) {
1285   static const char *const CPUDirectives[] = {
1286     "",
1287     "ppc",
1288     "ppc440",
1289     "ppc601",
1290     "ppc602",
1291     "ppc603",
1292     "ppc7400",
1293     "ppc750",
1294     "ppc970",
1295     "ppcA2",
1296     "ppce500mc",
1297     "ppce5500",
1298     "power3",
1299     "power4",
1300     "power5",
1301     "power5x",
1302     "power6",
1303     "power6x",
1304     "power7",
1305     "ppc64",
1306     "ppc64le"
1307   };
1308
1309   // Get the numerically largest directive.
1310   // FIXME: How should we merge darwin directives?
1311   unsigned Directive = PPC::DIR_NONE;
1312   for (const Function &F : M) {
1313     const PPCSubtarget &STI = TM.getSubtarget<PPCSubtarget>(F);
1314     unsigned FDir = STI.getDarwinDirective();
1315     Directive = Directive > FDir ? FDir : STI.getDarwinDirective();
1316     if (STI.hasMFOCRF() && Directive < PPC::DIR_970)
1317       Directive = PPC::DIR_970;
1318     if (STI.hasAltivec() && Directive < PPC::DIR_7400)
1319       Directive = PPC::DIR_7400;
1320     if (STI.isPPC64() && Directive < PPC::DIR_64)
1321       Directive = PPC::DIR_64;
1322   }
1323
1324   assert(Directive <= PPC::DIR_64 && "Directive out of range.");
1325
1326   assert(Directive < array_lengthof(CPUDirectives) &&
1327          "CPUDirectives[] might not be up-to-date!");
1328   PPCTargetStreamer &TStreamer =
1329       *static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
1330   TStreamer.emitMachine(CPUDirectives[Directive]);
1331
1332   // Prime text sections so they are adjacent.  This reduces the likelihood a
1333   // large data or debug section causes a branch to exceed 16M limit.
1334   const TargetLoweringObjectFileMachO &TLOFMacho =
1335       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
1336   OutStreamer->SwitchSection(TLOFMacho.getTextCoalSection());
1337   if (TM.getRelocationModel() == Reloc::PIC_) {
1338     OutStreamer->SwitchSection(
1339            OutContext.getMachOSection("__TEXT", "__picsymbolstub1",
1340                                       MachO::S_SYMBOL_STUBS |
1341                                       MachO::S_ATTR_PURE_INSTRUCTIONS,
1342                                       32, SectionKind::getText()));
1343   } else if (TM.getRelocationModel() == Reloc::DynamicNoPIC) {
1344     OutStreamer->SwitchSection(
1345            OutContext.getMachOSection("__TEXT","__symbol_stub1",
1346                                       MachO::S_SYMBOL_STUBS |
1347                                       MachO::S_ATTR_PURE_INSTRUCTIONS,
1348                                       16, SectionKind::getText()));
1349   }
1350   OutStreamer->SwitchSection(getObjFileLowering().getTextSection());
1351 }
1352
1353 static MCSymbol *GetLazyPtr(MCSymbol *Sym, MCContext &Ctx) {
1354   // Remove $stub suffix, add $lazy_ptr.
1355   StringRef NoStub = Sym->getName().substr(0, Sym->getName().size()-5);
1356   return Ctx.getOrCreateSymbol(NoStub + "$lazy_ptr");
1357 }
1358
1359 static MCSymbol *GetAnonSym(MCSymbol *Sym, MCContext &Ctx) {
1360   // Add $tmp suffix to $stub, yielding $stub$tmp.
1361   return Ctx.getOrCreateSymbol(Sym->getName() + "$tmp");
1362 }
1363
1364 void PPCDarwinAsmPrinter::
1365 EmitFunctionStubs(const MachineModuleInfoMachO::SymbolListTy &Stubs) {
1366   bool isPPC64 = getDataLayout().getPointerSizeInBits() == 64;
1367
1368   // Construct a local MCSubtargetInfo and shadow EmitToStreamer here.
1369   // This is because the MachineFunction won't exist (but have not yet been
1370   // freed) and since we're at the global level we can use the default
1371   // constructed subtarget.
1372   std::unique_ptr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo(
1373       TM.getTargetTriple().str(), TM.getTargetCPU(),
1374       TM.getTargetFeatureString()));
1375   auto EmitToStreamer = [&STI] (MCStreamer &S, const MCInst &Inst) {
1376     S.EmitInstruction(Inst, *STI);
1377   };
1378
1379   const TargetLoweringObjectFileMachO &TLOFMacho =
1380       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
1381
1382   // .lazy_symbol_pointer
1383   MCSection *LSPSection = TLOFMacho.getLazySymbolPointerSection();
1384
1385   // Output stubs for dynamically-linked functions
1386   if (TM.getRelocationModel() == Reloc::PIC_) {
1387     MCSection *StubSection = OutContext.getMachOSection(
1388         "__TEXT", "__picsymbolstub1",
1389         MachO::S_SYMBOL_STUBS | MachO::S_ATTR_PURE_INSTRUCTIONS, 32,
1390         SectionKind::getText());
1391     for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
1392       OutStreamer->SwitchSection(StubSection);
1393       EmitAlignment(4);
1394
1395       MCSymbol *Stub = Stubs[i].first;
1396       MCSymbol *RawSym = Stubs[i].second.getPointer();
1397       MCSymbol *LazyPtr = GetLazyPtr(Stub, OutContext);
1398       MCSymbol *AnonSymbol = GetAnonSym(Stub, OutContext);
1399
1400       OutStreamer->EmitLabel(Stub);
1401       OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
1402
1403       const MCExpr *Anon = MCSymbolRefExpr::create(AnonSymbol, OutContext);
1404       const MCExpr *LazyPtrExpr = MCSymbolRefExpr::create(LazyPtr, OutContext);
1405       const MCExpr *Sub =
1406         MCBinaryExpr::createSub(LazyPtrExpr, Anon, OutContext);
1407
1408       // mflr r0
1409       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR).addReg(PPC::R0));
1410       // bcl 20, 31, AnonSymbol
1411       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCLalways).addExpr(Anon));
1412       OutStreamer->EmitLabel(AnonSymbol);
1413       // mflr r11
1414       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR).addReg(PPC::R11));
1415       // addis r11, r11, ha16(LazyPtr - AnonSymbol)
1416       const MCExpr *SubHa16 = PPCMCExpr::createHa(Sub, true, OutContext);
1417       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
1418         .addReg(PPC::R11)
1419         .addReg(PPC::R11)
1420         .addExpr(SubHa16));
1421       // mtlr r0
1422       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR).addReg(PPC::R0));
1423
1424       // ldu r12, lo16(LazyPtr - AnonSymbol)(r11)
1425       // lwzu r12, lo16(LazyPtr - AnonSymbol)(r11)
1426       const MCExpr *SubLo16 = PPCMCExpr::createLo(Sub, true, OutContext);
1427       EmitToStreamer(*OutStreamer, MCInstBuilder(isPPC64 ? PPC::LDU : PPC::LWZU)
1428         .addReg(PPC::R12)
1429         .addExpr(SubLo16).addExpr(SubLo16)
1430         .addReg(PPC::R11));
1431       // mtctr r12
1432       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR).addReg(PPC::R12));
1433       // bctr
1434       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTR));
1435
1436       OutStreamer->SwitchSection(LSPSection);
1437       OutStreamer->EmitLabel(LazyPtr);
1438       OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
1439
1440       MCSymbol *DyldStubBindingHelper =
1441         OutContext.getOrCreateSymbol(StringRef("dyld_stub_binding_helper"));
1442       if (isPPC64) {
1443         // .quad dyld_stub_binding_helper
1444         OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 8);
1445       } else {
1446         // .long dyld_stub_binding_helper
1447         OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 4);
1448       }
1449     }
1450     OutStreamer->AddBlankLine();
1451     return;
1452   }
1453
1454   MCSection *StubSection = OutContext.getMachOSection(
1455       "__TEXT", "__symbol_stub1",
1456       MachO::S_SYMBOL_STUBS | MachO::S_ATTR_PURE_INSTRUCTIONS, 16,
1457       SectionKind::getText());
1458   for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
1459     MCSymbol *Stub = Stubs[i].first;
1460     MCSymbol *RawSym = Stubs[i].second.getPointer();
1461     MCSymbol *LazyPtr = GetLazyPtr(Stub, OutContext);
1462     const MCExpr *LazyPtrExpr = MCSymbolRefExpr::create(LazyPtr, OutContext);
1463
1464     OutStreamer->SwitchSection(StubSection);
1465     EmitAlignment(4);
1466     OutStreamer->EmitLabel(Stub);
1467     OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
1468
1469     // lis r11, ha16(LazyPtr)
1470     const MCExpr *LazyPtrHa16 =
1471       PPCMCExpr::createHa(LazyPtrExpr, true, OutContext);
1472     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LIS)
1473       .addReg(PPC::R11)
1474       .addExpr(LazyPtrHa16));
1475
1476     // ldu r12, lo16(LazyPtr)(r11)
1477     // lwzu r12, lo16(LazyPtr)(r11)
1478     const MCExpr *LazyPtrLo16 =
1479       PPCMCExpr::createLo(LazyPtrExpr, true, OutContext);
1480     EmitToStreamer(*OutStreamer, MCInstBuilder(isPPC64 ? PPC::LDU : PPC::LWZU)
1481       .addReg(PPC::R12)
1482       .addExpr(LazyPtrLo16).addExpr(LazyPtrLo16)
1483       .addReg(PPC::R11));
1484
1485     // mtctr r12
1486     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR).addReg(PPC::R12));
1487     // bctr
1488     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTR));
1489
1490     OutStreamer->SwitchSection(LSPSection);
1491     OutStreamer->EmitLabel(LazyPtr);
1492     OutStreamer->EmitSymbolAttribute(RawSym, MCSA_IndirectSymbol);
1493
1494     MCSymbol *DyldStubBindingHelper =
1495       OutContext.getOrCreateSymbol(StringRef("dyld_stub_binding_helper"));
1496     if (isPPC64) {
1497       // .quad dyld_stub_binding_helper
1498       OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 8);
1499     } else {
1500       // .long dyld_stub_binding_helper
1501       OutStreamer->EmitSymbolValue(DyldStubBindingHelper, 4);
1502     }
1503   }
1504
1505   OutStreamer->AddBlankLine();
1506 }
1507
1508 bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
1509   bool isPPC64 = getDataLayout().getPointerSizeInBits() == 64;
1510
1511   // Darwin/PPC always uses mach-o.
1512   const TargetLoweringObjectFileMachO &TLOFMacho =
1513       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
1514   MachineModuleInfoMachO &MMIMacho =
1515       MMI->getObjFileInfo<MachineModuleInfoMachO>();
1516
1517   MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetFnStubList();
1518   if (!Stubs.empty())
1519     EmitFunctionStubs(Stubs);
1520
1521   if (MAI->doesSupportExceptionHandling() && MMI) {
1522     // Add the (possibly multiple) personalities to the set of global values.
1523     // Only referenced functions get into the Personalities list.
1524     for (const Function *Personality : MMI->getPersonalities()) {
1525       if (Personality) {
1526         MCSymbol *NLPSym =
1527             getSymbolWithGlobalValueBase(Personality, "$non_lazy_ptr");
1528         MachineModuleInfoImpl::StubValueTy &StubSym =
1529             MMIMacho.getGVStubEntry(NLPSym);
1530         StubSym =
1531             MachineModuleInfoImpl::StubValueTy(getSymbol(Personality), true);
1532       }
1533     }
1534   }
1535
1536   // Output stubs for dynamically-linked functions.
1537   Stubs = MMIMacho.GetGVStubList();
1538
1539   // Output macho stubs for external and common global variables.
1540   if (!Stubs.empty()) {
1541     // Switch with ".non_lazy_symbol_pointer" directive.
1542     OutStreamer->SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
1543     EmitAlignment(isPPC64 ? 3 : 2);
1544
1545     for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
1546       // L_foo$stub:
1547       OutStreamer->EmitLabel(Stubs[i].first);
1548       //   .indirect_symbol _foo
1549       MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second;
1550       OutStreamer->EmitSymbolAttribute(MCSym.getPointer(), MCSA_IndirectSymbol);
1551
1552       if (MCSym.getInt())
1553         // External to current translation unit.
1554         OutStreamer->EmitIntValue(0, isPPC64 ? 8 : 4/*size*/);
1555       else
1556         // Internal to current translation unit.
1557         //
1558         // When we place the LSDA into the TEXT section, the type info pointers
1559         // need to be indirect and pc-rel. We accomplish this by using NLPs.
1560         // However, sometimes the types are local to the file. So we need to
1561         // fill in the value for the NLP in those cases.
1562         OutStreamer->EmitValue(MCSymbolRefExpr::create(MCSym.getPointer(),
1563                                                        OutContext),
1564                               isPPC64 ? 8 : 4/*size*/);
1565     }
1566
1567     Stubs.clear();
1568     OutStreamer->AddBlankLine();
1569   }
1570
1571   Stubs = MMIMacho.GetHiddenGVStubList();
1572   if (!Stubs.empty()) {
1573     OutStreamer->SwitchSection(getObjFileLowering().getDataSection());
1574     EmitAlignment(isPPC64 ? 3 : 2);
1575
1576     for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
1577       // L_foo$stub:
1578       OutStreamer->EmitLabel(Stubs[i].first);
1579       //   .long _foo
1580       OutStreamer->EmitValue(MCSymbolRefExpr::
1581                              create(Stubs[i].second.getPointer(),
1582                                     OutContext),
1583                              isPPC64 ? 8 : 4/*size*/);
1584     }
1585
1586     Stubs.clear();
1587     OutStreamer->AddBlankLine();
1588   }
1589
1590   // Funny Darwin hack: This flag tells the linker that no global symbols
1591   // contain code that falls through to other global symbols (e.g. the obvious
1592   // implementation of multiple entry points).  If this doesn't occur, the
1593   // linker can safely perform dead code stripping.  Since LLVM never generates
1594   // code that does this, it is always safe to set.
1595   OutStreamer->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
1596
1597   return AsmPrinter::doFinalization(M);
1598 }
1599
1600 /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code
1601 /// for a MachineFunction to the given output stream, in a format that the
1602 /// Darwin assembler can deal with.
1603 ///
1604 static AsmPrinter *
1605 createPPCAsmPrinterPass(TargetMachine &tm,
1606                         std::unique_ptr<MCStreamer> &&Streamer) {
1607   if (tm.getTargetTriple().isMacOSX())
1608     return new PPCDarwinAsmPrinter(tm, std::move(Streamer));
1609   return new PPCLinuxAsmPrinter(tm, std::move(Streamer));
1610 }
1611
1612 // Force static initialization.
1613 extern "C" void LLVMInitializePowerPCAsmPrinter() {
1614   TargetRegistry::RegisterAsmPrinter(ThePPC32Target, createPPCAsmPrinterPass);
1615   TargetRegistry::RegisterAsmPrinter(ThePPC64Target, createPPCAsmPrinterPass);
1616   TargetRegistry::RegisterAsmPrinter(ThePPC64LETarget, createPPCAsmPrinterPass);
1617 }