1 //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly ------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains a printer that converts from our internal representation
10 // of machine-dependent LLVM code to PowerPC assembly language. This printer is
11 // the output mechanism used by `llc'.
12 //
13 // Documentation at http://developer.apple.com/documentation/DeveloperTools/
14 // Reference/Assembler/ASMIntroduction/chapter_1_section_1.html
15 //
16 //===----------------------------------------------------------------------===//
17 
18 #include "MCTargetDesc/PPCInstPrinter.h"
19 #include "MCTargetDesc/PPCMCExpr.h"
20 #include "MCTargetDesc/PPCMCTargetDesc.h"
21 #include "MCTargetDesc/PPCPredicates.h"
22 #include "PPC.h"
23 #include "PPCInstrInfo.h"
24 #include "PPCMachineFunctionInfo.h"
25 #include "PPCSubtarget.h"
26 #include "PPCTargetMachine.h"
27 #include "PPCTargetStreamer.h"
28 #include "TargetInfo/PowerPCTargetInfo.h"
29 #include "llvm/ADT/MapVector.h"
30 #include "llvm/ADT/SmallPtrSet.h"
31 #include "llvm/ADT/StringRef.h"
32 #include "llvm/ADT/Triple.h"
33 #include "llvm/ADT/Twine.h"
34 #include "llvm/BinaryFormat/ELF.h"
35 #include "llvm/BinaryFormat/MachO.h"
36 #include "llvm/CodeGen/AsmPrinter.h"
37 #include "llvm/CodeGen/MachineBasicBlock.h"
38 #include "llvm/CodeGen/MachineFunction.h"
39 #include "llvm/CodeGen/MachineInstr.h"
40 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
41 #include "llvm/CodeGen/MachineOperand.h"
42 #include "llvm/CodeGen/MachineRegisterInfo.h"
43 #include "llvm/CodeGen/StackMaps.h"
44 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
45 #include "llvm/IR/DataLayout.h"
46 #include "llvm/IR/GlobalValue.h"
47 #include "llvm/IR/GlobalVariable.h"
48 #include "llvm/IR/Module.h"
49 #include "llvm/MC/MCAsmInfo.h"
50 #include "llvm/MC/MCContext.h"
51 #include "llvm/MC/MCDirectives.h"
52 #include "llvm/MC/MCExpr.h"
53 #include "llvm/MC/MCInst.h"
54 #include "llvm/MC/MCInstBuilder.h"
55 #include "llvm/MC/MCSectionELF.h"
56 #include "llvm/MC/MCSectionMachO.h"
57 #include "llvm/MC/MCSectionXCOFF.h"
58 #include "llvm/MC/MCStreamer.h"
59 #include "llvm/MC/MCSymbol.h"
60 #include "llvm/MC/MCSymbolELF.h"
61 #include "llvm/MC/MCSymbolXCOFF.h"
62 #include "llvm/MC/SectionKind.h"
63 #include "llvm/Support/Casting.h"
64 #include "llvm/Support/CodeGen.h"
65 #include "llvm/Support/Debug.h"
66 #include "llvm/Support/ErrorHandling.h"
67 #include "llvm/Support/TargetRegistry.h"
68 #include "llvm/Support/raw_ostream.h"
69 #include "llvm/Target/TargetMachine.h"
70 #include <algorithm>
71 #include <cassert>
72 #include <cstdint>
73 #include <memory>
74 #include <new>
75 
76 using namespace llvm;
77 
78 #define DEBUG_TYPE "asmprinter"
79 
80 namespace {
81 
82 class PPCAsmPrinter : public AsmPrinter {
83 protected:
84   MapVector<const MCSymbol *, MCSymbol *> TOC;
85   const PPCSubtarget *Subtarget = nullptr;
86   StackMaps SM;
87 
88 public:
89   explicit PPCAsmPrinter(TargetMachine &TM,
90                          std::unique_ptr<MCStreamer> Streamer)
91       : AsmPrinter(TM, std::move(Streamer)), SM(*this) {}
92 
93   StringRef getPassName() const override { return "PowerPC Assembly Printer"; }
94 
95   MCSymbol *lookUpOrCreateTOCEntry(const MCSymbol *Sym);
96 
97   bool doInitialization(Module &M) override {
98     if (!TOC.empty())
99       TOC.clear();
100     return AsmPrinter::doInitialization(M);
101   }
102 
103   void emitInstruction(const MachineInstr *MI) override;
104 
105   /// This function is for PrintAsmOperand and PrintAsmMemoryOperand,
106   /// invoked by EmitMSInlineAsmStr and EmitGCCInlineAsmStr only.
107   /// The \p MI would be INLINEASM ONLY.
108   void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O);
109 
110   void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &O) override;
111   bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
112                        const char *ExtraCode, raw_ostream &O) override;
113   bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
114                              const char *ExtraCode, raw_ostream &O) override;
115 
116   void emitEndOfAsmFile(Module &M) override;
117 
118   void LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI);
119   void LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI);
120   void EmitTlsCall(const MachineInstr *MI, MCSymbolRefExpr::VariantKind VK);
121   bool runOnMachineFunction(MachineFunction &MF) override {
122     Subtarget = &MF.getSubtarget<PPCSubtarget>();
123     bool Changed = AsmPrinter::runOnMachineFunction(MF);
124     emitXRayTable();
125     return Changed;
126   }
127 };
128 
129 /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
130 class PPCLinuxAsmPrinter : public PPCAsmPrinter {
131 public:
132   explicit PPCLinuxAsmPrinter(TargetMachine &TM,
133                               std::unique_ptr<MCStreamer> Streamer)
134       : PPCAsmPrinter(TM, std::move(Streamer)) {}
135 
136   StringRef getPassName() const override {
137     return "Linux PPC Assembly Printer";
138   }
139 
140   void emitStartOfAsmFile(Module &M) override;
141   void emitEndOfAsmFile(Module &) override;
142 
143   void emitFunctionEntryLabel() override;
144 
145   void emitFunctionBodyStart() override;
146   void emitFunctionBodyEnd() override;
147   void emitInstruction(const MachineInstr *MI) override;
148 };
149 
150 class PPCAIXAsmPrinter : public PPCAsmPrinter {
151 private:
152   /// Symbols lowered from ExternalSymbolSDNodes, we will need to emit extern
153   /// linkage for them in AIX.
154   SmallPtrSet<MCSymbol *, 8> ExtSymSDNodeSymbols;
155 
156   static void ValidateGV(const GlobalVariable *GV);
157 
158 public:
159   PPCAIXAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)
160       : PPCAsmPrinter(TM, std::move(Streamer)) {
161     if (MAI->isLittleEndian())
162       report_fatal_error(
163           "cannot create AIX PPC Assembly Printer for a little-endian target");
164   }
165 
166   StringRef getPassName() const override { return "AIX PPC Assembly Printer"; }
167 
168   bool doInitialization(Module &M) override;
169 
170   void SetupMachineFunction(MachineFunction &MF) override;
171 
172   void emitGlobalVariable(const GlobalVariable *GV) override;
173 
174   void emitFunctionDescriptor() override;
175 
176   void emitEndOfAsmFile(Module &) override;
177 
178   void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const override;
179 
180   void emitInstruction(const MachineInstr *MI) override;
181 
182   bool doFinalization(Module &M) override;
183 };
184 
185 } // end anonymous namespace
186 
187 void PPCAsmPrinter::PrintSymbolOperand(const MachineOperand &MO,
188                                        raw_ostream &O) {
189   // Computing the address of a global symbol, not calling it.
190   const GlobalValue *GV = MO.getGlobal();
191   getSymbol(GV)->print(O, MAI);
192   printOffset(MO.getOffset(), O);
193 }
194 
195 void PPCAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
196                                  raw_ostream &O) {
197   const DataLayout &DL = getDataLayout();
198   const MachineOperand &MO = MI->getOperand(OpNo);
199 
200   switch (MO.getType()) {
201   case MachineOperand::MO_Register: {
202     // The MI is INLINEASM ONLY and UseVSXReg is always false.
203     const char *RegName = PPCInstPrinter::getRegisterName(MO.getReg());
204 
205     // Linux assembler (Others?) does not take register mnemonics.
206     // FIXME - What about special registers used in mfspr/mtspr?
207     O << PPCRegisterInfo::stripRegisterPrefix(RegName);
208     return;
209   }
210   case MachineOperand::MO_Immediate:
211     O << MO.getImm();
212     return;
213 
214   case MachineOperand::MO_MachineBasicBlock:
215     MO.getMBB()->getSymbol()->print(O, MAI);
216     return;
217   case MachineOperand::MO_ConstantPoolIndex:
218     O << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
219       << MO.getIndex();
220     return;
221   case MachineOperand::MO_BlockAddress:
222     GetBlockAddressSymbol(MO.getBlockAddress())->print(O, MAI);
223     return;
224   case MachineOperand::MO_GlobalAddress: {
225     PrintSymbolOperand(MO, O);
226     return;
227   }
228 
229   default:
230     O << "<unknown operand type: " << (unsigned)MO.getType() << ">";
231     return;
232   }
233 }
234 
235 /// PrintAsmOperand - Print out an operand for an inline asm expression.
236 ///
237 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
238                                     const char *ExtraCode, raw_ostream &O) {
239   // Does this asm operand have a single letter operand modifier?
240   if (ExtraCode && ExtraCode[0]) {
241     if (ExtraCode[1] != 0) return true; // Unknown modifier.
242 
243     switch (ExtraCode[0]) {
244     default:
245       // See if this is a generic print operand
246       return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, O);
247     case 'L': // Write second word of DImode reference.
248       // Verify that this operand has two consecutive registers.
249       if (!MI->getOperand(OpNo).isReg() ||
250           OpNo+1 == MI->getNumOperands() ||
251           !MI->getOperand(OpNo+1).isReg())
252         return true;
253       ++OpNo;   // Return the high-part.
254       break;
255     case 'I':
256       // Write 'i' if an integer constant, otherwise nothing.  Used to print
257       // addi vs add, etc.
258       if (MI->getOperand(OpNo).isImm())
259         O << "i";
260       return false;
261     case 'x':
262       if(!MI->getOperand(OpNo).isReg())
263         return true;
264       // This operand uses VSX numbering.
265       // If the operand is a VMX register, convert it to a VSX register.
266       Register Reg = MI->getOperand(OpNo).getReg();
267       if (PPCInstrInfo::isVRRegister(Reg))
268         Reg = PPC::VSX32 + (Reg - PPC::V0);
269       else if (PPCInstrInfo::isVFRegister(Reg))
270         Reg = PPC::VSX32 + (Reg - PPC::VF0);
271       const char *RegName;
272       RegName = PPCInstPrinter::getRegisterName(Reg);
273       RegName = PPCRegisterInfo::stripRegisterPrefix(RegName);
274       O << RegName;
275       return false;
276     }
277   }
278 
279   printOperand(MI, OpNo, O);
280   return false;
281 }
282 
283 // At the moment, all inline asm memory operands are a single register.
284 // In any case, the output of this routine should always be just one
285 // assembler operand.
286 
287 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
288                                           const char *ExtraCode,
289                                           raw_ostream &O) {
290   if (ExtraCode && ExtraCode[0]) {
291     if (ExtraCode[1] != 0) return true; // Unknown modifier.
292 
293     switch (ExtraCode[0]) {
294     default: return true;  // Unknown modifier.
295     case 'L': // A memory reference to the upper word of a double word op.
296       O << getDataLayout().getPointerSize() << "(";
297       printOperand(MI, OpNo, O);
298       O << ")";
299       return false;
300     case 'y': // A memory reference for an X-form instruction
301       O << "0, ";
302       printOperand(MI, OpNo, O);
303       return false;
304     case 'U': // Print 'u' for update form.
305     case 'X': // Print 'x' for indexed form.
306       // FIXME: Currently for PowerPC memory operands are always loaded
307       // into a register, so we never get an update or indexed form.
308       // This is bad even for offset forms, since even if we know we
309       // have a value in -16(r1), we will generate a load into r<n>
310       // and then load from 0(r<n>).  Until that issue is fixed,
311       // tolerate 'U' and 'X' but don't output anything.
312       assert(MI->getOperand(OpNo).isReg());
313       return false;
314     }
315   }
316 
317   assert(MI->getOperand(OpNo).isReg());
318   O << "0(";
319   printOperand(MI, OpNo, O);
320   O << ")";
321   return false;
322 }
323 
324 /// lookUpOrCreateTOCEntry -- Given a symbol, look up whether a TOC entry
325 /// exists for it.  If not, create one.  Then return a symbol that references
326 /// the TOC entry.
327 MCSymbol *PPCAsmPrinter::lookUpOrCreateTOCEntry(const MCSymbol *Sym) {
328   MCSymbol *&TOCEntry = TOC[Sym];
329   if (!TOCEntry)
330     TOCEntry = createTempSymbol("C");
331   return TOCEntry;
332 }
333 
334 void PPCAsmPrinter::emitEndOfAsmFile(Module &M) {
335   emitStackMaps(SM);
336 }
337 
338 void PPCAsmPrinter::LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI) {
339   unsigned NumNOPBytes = MI.getOperand(1).getImm();
340 
341   auto &Ctx = OutStreamer->getContext();
342   MCSymbol *MILabel = Ctx.createTempSymbol();
343   OutStreamer->emitLabel(MILabel);
344 
345   SM.recordStackMap(*MILabel, MI);
346   assert(NumNOPBytes % 4 == 0 && "Invalid number of NOP bytes requested!");
347 
348   // Scan ahead to trim the shadow.
349   const MachineBasicBlock &MBB = *MI.getParent();
350   MachineBasicBlock::const_iterator MII(MI);
351   ++MII;
352   while (NumNOPBytes > 0) {
353     if (MII == MBB.end() || MII->isCall() ||
354         MII->getOpcode() == PPC::DBG_VALUE ||
355         MII->getOpcode() == TargetOpcode::PATCHPOINT ||
356         MII->getOpcode() == TargetOpcode::STACKMAP)
357       break;
358     ++MII;
359     NumNOPBytes -= 4;
360   }
361 
362   // Emit nops.
363   for (unsigned i = 0; i < NumNOPBytes; i += 4)
364     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
365 }
366 
367 // Lower a patchpoint of the form:
368 // [<def>], <id>, <numBytes>, <target>, <numArgs>
369 void PPCAsmPrinter::LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI) {
370   auto &Ctx = OutStreamer->getContext();
371   MCSymbol *MILabel = Ctx.createTempSymbol();
372   OutStreamer->emitLabel(MILabel);
373 
374   SM.recordPatchPoint(*MILabel, MI);
375   PatchPointOpers Opers(&MI);
376 
377   unsigned EncodedBytes = 0;
378   const MachineOperand &CalleeMO = Opers.getCallTarget();
379 
380   if (CalleeMO.isImm()) {
381     int64_t CallTarget = CalleeMO.getImm();
382     if (CallTarget) {
383       assert((CallTarget & 0xFFFFFFFFFFFF) == CallTarget &&
384              "High 16 bits of call target should be zero.");
385       Register ScratchReg = MI.getOperand(Opers.getNextScratchIdx()).getReg();
386       EncodedBytes = 0;
387       // Materialize the jump address:
388       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI8)
389                                       .addReg(ScratchReg)
390                                       .addImm((CallTarget >> 32) & 0xFFFF));
391       ++EncodedBytes;
392       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::RLDIC)
393                                       .addReg(ScratchReg)
394                                       .addReg(ScratchReg)
395                                       .addImm(32).addImm(16));
396       ++EncodedBytes;
397       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORIS8)
398                                       .addReg(ScratchReg)
399                                       .addReg(ScratchReg)
400                                       .addImm((CallTarget >> 16) & 0xFFFF));
401       ++EncodedBytes;
402       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORI8)
403                                       .addReg(ScratchReg)
404                                       .addReg(ScratchReg)
405                                       .addImm(CallTarget & 0xFFFF));
406 
407       // Save the current TOC pointer before the remote call.
408       int TOCSaveOffset = Subtarget->getFrameLowering()->getTOCSaveOffset();
409       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::STD)
410                                       .addReg(PPC::X2)
411                                       .addImm(TOCSaveOffset)
412                                       .addReg(PPC::X1));
413       ++EncodedBytes;
414 
415       // If we're on ELFv1, then we need to load the actual function pointer
416       // from the function descriptor.
417       if (!Subtarget->isELFv2ABI()) {
418         // Load the new TOC pointer and the function address, but not r11
419         // (needing this is rare, and loading it here would prevent passing it
420         // via a 'nest' parameter.
421         EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
422                                         .addReg(PPC::X2)
423                                         .addImm(8)
424                                         .addReg(ScratchReg));
425         ++EncodedBytes;
426         EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
427                                         .addReg(ScratchReg)
428                                         .addImm(0)
429                                         .addReg(ScratchReg));
430         ++EncodedBytes;
431       }
432 
433       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR8)
434                                       .addReg(ScratchReg));
435       ++EncodedBytes;
436       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTRL8));
437       ++EncodedBytes;
438 
439       // Restore the TOC pointer after the call.
440       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
441                                       .addReg(PPC::X2)
442                                       .addImm(TOCSaveOffset)
443                                       .addReg(PPC::X1));
444       ++EncodedBytes;
445     }
446   } else if (CalleeMO.isGlobal()) {
447     const GlobalValue *GValue = CalleeMO.getGlobal();
448     MCSymbol *MOSymbol = getSymbol(GValue);
449     const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, OutContext);
450 
451     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL8_NOP)
452                                     .addExpr(SymVar));
453     EncodedBytes += 2;
454   }
455 
456   // Each instruction is 4 bytes.
457   EncodedBytes *= 4;
458 
459   // Emit padding.
460   unsigned NumBytes = Opers.getNumPatchBytes();
461   assert(NumBytes >= EncodedBytes &&
462          "Patchpoint can't request size less than the length of a call.");
463   assert((NumBytes - EncodedBytes) % 4 == 0 &&
464          "Invalid number of NOP bytes requested!");
465   for (unsigned i = EncodedBytes; i < NumBytes; i += 4)
466     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
467 }
468 
469 /// EmitTlsCall -- Given a GETtls[ld]ADDR[32] instruction, print a
470 /// call to __tls_get_addr to the current output stream.
471 void PPCAsmPrinter::EmitTlsCall(const MachineInstr *MI,
472                                 MCSymbolRefExpr::VariantKind VK) {
473   StringRef Name = "__tls_get_addr";
474   MCSymbol *TlsGetAddr = OutContext.getOrCreateSymbol(Name);
475   MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None;
476   const Module *M = MF->getFunction().getParent();
477 
478   assert(MI->getOperand(0).isReg() &&
479          ((Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::X3) ||
480           (!Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::R3)) &&
481          "GETtls[ld]ADDR[32] must define GPR3");
482   assert(MI->getOperand(1).isReg() &&
483          ((Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::X3) ||
484           (!Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::R3)) &&
485          "GETtls[ld]ADDR[32] must read GPR3");
486 
487   if (Subtarget->is32BitELFABI() && isPositionIndependent())
488     Kind = MCSymbolRefExpr::VK_PLT;
489 
490   const MCExpr *TlsRef =
491     MCSymbolRefExpr::create(TlsGetAddr, Kind, OutContext);
492 
493   // Add 32768 offset to the symbol so we follow up the latest GOT/PLT ABI.
494   if (Kind == MCSymbolRefExpr::VK_PLT && Subtarget->isSecurePlt() &&
495       M->getPICLevel() == PICLevel::BigPIC)
496     TlsRef = MCBinaryExpr::createAdd(
497         TlsRef, MCConstantExpr::create(32768, OutContext), OutContext);
498   const MachineOperand &MO = MI->getOperand(2);
499   const GlobalValue *GValue = MO.getGlobal();
500   MCSymbol *MOSymbol = getSymbol(GValue);
501   const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, VK, OutContext);
502   EmitToStreamer(*OutStreamer,
503                  MCInstBuilder(Subtarget->isPPC64() ?
504                                PPC::BL8_NOP_TLS : PPC::BL_TLS)
505                  .addExpr(TlsRef)
506                  .addExpr(SymVar));
507 }
508 
509 /// Map a machine operand for a TOC pseudo-machine instruction to its
510 /// corresponding MCSymbol.
511 static MCSymbol *getMCSymbolForTOCPseudoMO(const MachineOperand &MO,
512                                            AsmPrinter &AP) {
513   switch (MO.getType()) {
514   case MachineOperand::MO_GlobalAddress:
515     return AP.getSymbol(MO.getGlobal());
516   case MachineOperand::MO_ConstantPoolIndex:
517     return AP.GetCPISymbol(MO.getIndex());
518   case MachineOperand::MO_JumpTableIndex:
519     return AP.GetJTISymbol(MO.getIndex());
520   case MachineOperand::MO_BlockAddress:
521     return AP.GetBlockAddressSymbol(MO.getBlockAddress());
522   default:
523     llvm_unreachable("Unexpected operand type to get symbol.");
524   }
525 }
526 
527 /// EmitInstruction -- Print out a single PowerPC MI in Darwin syntax to
528 /// the current output stream.
529 ///
530 void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
531   MCInst TmpInst;
532   const bool IsPPC64 = Subtarget->isPPC64();
533   const bool IsAIX = Subtarget->isAIXABI();
534   const Module *M = MF->getFunction().getParent();
535   PICLevel::Level PL = M->getPICLevel();
536 
537 #ifndef NDEBUG
538   // Validate that SPE and FPU are mutually exclusive in codegen
539   if (!MI->isInlineAsm()) {
540     for (const MachineOperand &MO: MI->operands()) {
541       if (MO.isReg()) {
542         Register Reg = MO.getReg();
543         if (Subtarget->hasSPE()) {
544           if (PPC::F4RCRegClass.contains(Reg) ||
545               PPC::F8RCRegClass.contains(Reg) ||
546               PPC::QBRCRegClass.contains(Reg) ||
547               PPC::QFRCRegClass.contains(Reg) ||
548               PPC::QSRCRegClass.contains(Reg) ||
549               PPC::VFRCRegClass.contains(Reg) ||
550               PPC::VRRCRegClass.contains(Reg) ||
551               PPC::VSFRCRegClass.contains(Reg) ||
552               PPC::VSSRCRegClass.contains(Reg)
553               )
554             llvm_unreachable("SPE targets cannot have FPRegs!");
555         } else {
556           if (PPC::SPERCRegClass.contains(Reg))
557             llvm_unreachable("SPE register found in FPU-targeted code!");
558         }
559       }
560     }
561   }
562 #endif
563   // Lower multi-instruction pseudo operations.
564   switch (MI->getOpcode()) {
565   default: break;
566   case TargetOpcode::DBG_VALUE:
567     llvm_unreachable("Should be handled target independently");
568   case TargetOpcode::STACKMAP:
569     return LowerSTACKMAP(SM, *MI);
570   case TargetOpcode::PATCHPOINT:
571     return LowerPATCHPOINT(SM, *MI);
572 
573   case PPC::MoveGOTtoLR: {
574     // Transform %lr = MoveGOTtoLR
575     // Into this: bl _GLOBAL_OFFSET_TABLE_@local-4
576     // _GLOBAL_OFFSET_TABLE_@local-4 (instruction preceding
577     // _GLOBAL_OFFSET_TABLE_) has exactly one instruction:
578     //      blrl
579     // This will return the pointer to _GLOBAL_OFFSET_TABLE_@local
580     MCSymbol *GOTSymbol =
581       OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
582     const MCExpr *OffsExpr =
583       MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol,
584                                                       MCSymbolRefExpr::VK_PPC_LOCAL,
585                                                       OutContext),
586                               MCConstantExpr::create(4, OutContext),
587                               OutContext);
588 
589     // Emit the 'bl'.
590     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL).addExpr(OffsExpr));
591     return;
592   }
593   case PPC::MovePCtoLR:
594   case PPC::MovePCtoLR8: {
595     // Transform %lr = MovePCtoLR
596     // Into this, where the label is the PIC base:
597     //     bl L1$pb
598     // L1$pb:
599     MCSymbol *PICBase = MF->getPICBaseSymbol();
600 
601     // Emit the 'bl'.
602     EmitToStreamer(*OutStreamer,
603                    MCInstBuilder(PPC::BL)
604                        // FIXME: We would like an efficient form for this, so we
605                        // don't have to do a lot of extra uniquing.
606                        .addExpr(MCSymbolRefExpr::create(PICBase, OutContext)));
607 
608     // Emit the label.
609     OutStreamer->emitLabel(PICBase);
610     return;
611   }
612   case PPC::UpdateGBR: {
613     // Transform %rd = UpdateGBR(%rt, %ri)
614     // Into: lwz %rt, .L0$poff - .L0$pb(%ri)
615     //       add %rd, %rt, %ri
616     // or into (if secure plt mode is on):
617     //       addis r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@ha
618     //       addi r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@l
619     // Get the offset from the GOT Base Register to the GOT
620     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
621     if (Subtarget->isSecurePlt() && isPositionIndependent() ) {
622       unsigned PICR = TmpInst.getOperand(0).getReg();
623       MCSymbol *BaseSymbol = OutContext.getOrCreateSymbol(
624           M->getPICLevel() == PICLevel::SmallPIC ? "_GLOBAL_OFFSET_TABLE_"
625                                                  : ".LTOC");
626       const MCExpr *PB =
627           MCSymbolRefExpr::create(MF->getPICBaseSymbol(), OutContext);
628 
629       const MCExpr *DeltaExpr = MCBinaryExpr::createSub(
630           MCSymbolRefExpr::create(BaseSymbol, OutContext), PB, OutContext);
631 
632       const MCExpr *DeltaHi = PPCMCExpr::createHa(DeltaExpr, OutContext);
633       EmitToStreamer(
634           *OutStreamer,
635           MCInstBuilder(PPC::ADDIS).addReg(PICR).addReg(PICR).addExpr(DeltaHi));
636 
637       const MCExpr *DeltaLo = PPCMCExpr::createLo(DeltaExpr, OutContext);
638       EmitToStreamer(
639           *OutStreamer,
640           MCInstBuilder(PPC::ADDI).addReg(PICR).addReg(PICR).addExpr(DeltaLo));
641       return;
642     } else {
643       MCSymbol *PICOffset =
644         MF->getInfo<PPCFunctionInfo>()->getPICOffsetSymbol(*MF);
645       TmpInst.setOpcode(PPC::LWZ);
646       const MCExpr *Exp =
647         MCSymbolRefExpr::create(PICOffset, MCSymbolRefExpr::VK_None, OutContext);
648       const MCExpr *PB =
649         MCSymbolRefExpr::create(MF->getPICBaseSymbol(),
650                                 MCSymbolRefExpr::VK_None,
651                                 OutContext);
652       const MCOperand TR = TmpInst.getOperand(1);
653       const MCOperand PICR = TmpInst.getOperand(0);
654 
655       // Step 1: lwz %rt, .L$poff - .L$pb(%ri)
656       TmpInst.getOperand(1) =
657           MCOperand::createExpr(MCBinaryExpr::createSub(Exp, PB, OutContext));
658       TmpInst.getOperand(0) = TR;
659       TmpInst.getOperand(2) = PICR;
660       EmitToStreamer(*OutStreamer, TmpInst);
661 
662       TmpInst.setOpcode(PPC::ADD4);
663       TmpInst.getOperand(0) = PICR;
664       TmpInst.getOperand(1) = TR;
665       TmpInst.getOperand(2) = PICR;
666       EmitToStreamer(*OutStreamer, TmpInst);
667       return;
668     }
669   }
670   case PPC::LWZtoc: {
671     // Transform %rN = LWZtoc @op1, %r2
672     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
673 
674     // Change the opcode to LWZ.
675     TmpInst.setOpcode(PPC::LWZ);
676 
677     const MachineOperand &MO = MI->getOperand(1);
678     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
679            "Invalid operand for LWZtoc.");
680 
681     // Map the operand to its corresponding MCSymbol.
682     const MCSymbol *const MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
683 
684     // Create a reference to the GOT entry for the symbol. The GOT entry will be
685     // synthesized later.
686     if (PL == PICLevel::SmallPIC && !IsAIX) {
687       const MCExpr *Exp =
688         MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_GOT,
689                                 OutContext);
690       TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
691       EmitToStreamer(*OutStreamer, TmpInst);
692       return;
693     }
694 
695     // Otherwise, use the TOC. 'TOCEntry' is a label used to reference the
696     // storage allocated in the TOC which contains the address of
697     // 'MOSymbol'. Said TOC entry will be synthesized later.
698     MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
699     const MCExpr *Exp =
700         MCSymbolRefExpr::create(TOCEntry, MCSymbolRefExpr::VK_None, OutContext);
701 
702     // AIX uses the label directly as the lwz displacement operand for
703     // references into the toc section. The displacement value will be generated
704     // relative to the toc-base.
705     if (IsAIX) {
706       assert(
707           TM.getCodeModel() == CodeModel::Small &&
708           "This pseudo should only be selected for 32-bit small code model.");
709       TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
710       EmitToStreamer(*OutStreamer, TmpInst);
711       return;
712     }
713 
714     // Create an explicit subtract expression between the local symbol and
715     // '.LTOC' to manifest the toc-relative offset.
716     const MCExpr *PB = MCSymbolRefExpr::create(
717         OutContext.getOrCreateSymbol(Twine(".LTOC")), OutContext);
718     Exp = MCBinaryExpr::createSub(Exp, PB, OutContext);
719     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
720     EmitToStreamer(*OutStreamer, TmpInst);
721     return;
722   }
723   case PPC::LDtocJTI:
724   case PPC::LDtocCPT:
725   case PPC::LDtocBA:
726   case PPC::LDtoc: {
727     // Transform %x3 = LDtoc @min1, %x2
728     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
729 
730     // Change the opcode to LD.
731     TmpInst.setOpcode(PPC::LD);
732 
733     const MachineOperand &MO = MI->getOperand(1);
734     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
735            "Invalid operand!");
736 
737     // Map the machine operand to its corresponding MCSymbol, then map the
738     // global address operand to be a reference to the TOC entry we will
739     // synthesize later.
740     MCSymbol *TOCEntry =
741         lookUpOrCreateTOCEntry(getMCSymbolForTOCPseudoMO(MO, *this));
742 
743     const MCSymbolRefExpr::VariantKind VK =
744         IsAIX ? MCSymbolRefExpr::VK_None : MCSymbolRefExpr::VK_PPC_TOC;
745     const MCExpr *Exp =
746         MCSymbolRefExpr::create(TOCEntry, VK, OutContext);
747     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
748     EmitToStreamer(*OutStreamer, TmpInst);
749     return;
750   }
751   case PPC::ADDIStocHA: {
752     assert((IsAIX && !IsPPC64 && TM.getCodeModel() == CodeModel::Large) &&
753            "This pseudo should only be selected for 32-bit large code model on"
754            " AIX.");
755 
756     // Transform %rd = ADDIStocHA %rA, @sym(%r2)
757     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
758 
759     // Change the opcode to ADDIS.
760     TmpInst.setOpcode(PPC::ADDIS);
761 
762     const MachineOperand &MO = MI->getOperand(2);
763     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
764            "Invalid operand for ADDIStocHA.");
765 
766     // Map the machine operand to its corresponding MCSymbol.
767     MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
768 
769     // Always use TOC on AIX. Map the global address operand to be a reference
770     // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to
771     // reference the storage allocated in the TOC which contains the address of
772     // 'MOSymbol'.
773     MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
774     const MCExpr *Exp = MCSymbolRefExpr::create(TOCEntry,
775                                                 MCSymbolRefExpr::VK_PPC_U,
776                                                 OutContext);
777     TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
778     EmitToStreamer(*OutStreamer, TmpInst);
779     return;
780   }
781   case PPC::LWZtocL: {
782     assert(IsAIX && !IsPPC64 && TM.getCodeModel() == CodeModel::Large &&
783            "This pseudo should only be selected for 32-bit large code model on"
784            " AIX.");
785 
786     // Transform %rd = LWZtocL @sym, %rs.
787     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
788 
789     // Change the opcode to lwz.
790     TmpInst.setOpcode(PPC::LWZ);
791 
792     const MachineOperand &MO = MI->getOperand(1);
793     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
794            "Invalid operand for LWZtocL.");
795 
796     // Map the machine operand to its corresponding MCSymbol.
797     MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
798 
799     // Always use TOC on AIX. Map the global address operand to be a reference
800     // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to
801     // reference the storage allocated in the TOC which contains the address of
802     // 'MOSymbol'.
803     MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
804     const MCExpr *Exp = MCSymbolRefExpr::create(TOCEntry,
805                                                 MCSymbolRefExpr::VK_PPC_L,
806                                                 OutContext);
807     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
808     EmitToStreamer(*OutStreamer, TmpInst);
809     return;
810   }
811   case PPC::ADDIStocHA8: {
812     // Transform %xd = ADDIStocHA8 %x2, @sym
813     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
814 
815     // Change the opcode to ADDIS8. If the global address is the address of
816     // an external symbol, is a jump table address, is a block address, or is a
817     // constant pool index with large code model enabled, then generate a TOC
818     // entry and reference that. Otherwise, reference the symbol directly.
819     TmpInst.setOpcode(PPC::ADDIS8);
820 
821     const MachineOperand &MO = MI->getOperand(2);
822     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
823            "Invalid operand for ADDIStocHA8!");
824 
825     const MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
826 
827     const bool GlobalToc =
828         MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal());
829     if (GlobalToc || MO.isJTI() || MO.isBlockAddress() ||
830         (MO.isCPI() && TM.getCodeModel() == CodeModel::Large))
831       MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
832 
833     const MCSymbolRefExpr::VariantKind VK =
834         IsAIX ? MCSymbolRefExpr::VK_PPC_U : MCSymbolRefExpr::VK_PPC_TOC_HA;
835 
836     const MCExpr *Exp =
837         MCSymbolRefExpr::create(MOSymbol, VK, OutContext);
838 
839     if (!MO.isJTI() && MO.getOffset())
840       Exp = MCBinaryExpr::createAdd(Exp,
841                                     MCConstantExpr::create(MO.getOffset(),
842                                                            OutContext),
843                                     OutContext);
844 
845     TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
846     EmitToStreamer(*OutStreamer, TmpInst);
847     return;
848   }
849   case PPC::LDtocL: {
850     // Transform %xd = LDtocL @sym, %xs
851     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
852 
853     // Change the opcode to LD. If the global address is the address of
854     // an external symbol, is a jump table address, is a block address, or is
855     // a constant pool index with large code model enabled, then generate a
856     // TOC entry and reference that. Otherwise, reference the symbol directly.
857     TmpInst.setOpcode(PPC::LD);
858 
859     const MachineOperand &MO = MI->getOperand(1);
860     assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() ||
861             MO.isBlockAddress()) &&
862            "Invalid operand for LDtocL!");
863 
864     LLVM_DEBUG(assert(
865         (!MO.isGlobal() || Subtarget->isGVIndirectSymbol(MO.getGlobal())) &&
866         "LDtocL used on symbol that could be accessed directly is "
867         "invalid. Must match ADDIStocHA8."));
868 
869     const MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
870 
871     if (!MO.isCPI() || TM.getCodeModel() == CodeModel::Large)
872       MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
873 
874     const MCSymbolRefExpr::VariantKind VK =
875         IsAIX ? MCSymbolRefExpr::VK_PPC_L : MCSymbolRefExpr::VK_PPC_TOC_LO;
876     const MCExpr *Exp =
877         MCSymbolRefExpr::create(MOSymbol, VK, OutContext);
878     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
879     EmitToStreamer(*OutStreamer, TmpInst);
880     return;
881   }
882   case PPC::ADDItocL: {
883     // Transform %xd = ADDItocL %xs, @sym
884     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
885 
886     // Change the opcode to ADDI8. If the global address is external, then
887     // generate a TOC entry and reference that. Otherwise, reference the
888     // symbol directly.
889     TmpInst.setOpcode(PPC::ADDI8);
890 
891     const MachineOperand &MO = MI->getOperand(2);
892     assert((MO.isGlobal() || MO.isCPI()) && "Invalid operand for ADDItocL.");
893 
894     LLVM_DEBUG(assert(
895         !(MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal())) &&
896         "Interposable definitions must use indirect access."));
897 
898     const MCExpr *Exp =
899         MCSymbolRefExpr::create(getMCSymbolForTOCPseudoMO(MO, *this),
900                                 MCSymbolRefExpr::VK_PPC_TOC_LO, OutContext);
901     TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
902     EmitToStreamer(*OutStreamer, TmpInst);
903     return;
904   }
905   case PPC::ADDISgotTprelHA: {
906     // Transform: %xd = ADDISgotTprelHA %x2, @sym
907     // Into:      %xd = ADDIS8 %x2, sym@got@tlsgd@ha
908     assert(IsPPC64 && "Not supported for 32-bit PowerPC");
909     const MachineOperand &MO = MI->getOperand(2);
910     const GlobalValue *GValue = MO.getGlobal();
911     MCSymbol *MOSymbol = getSymbol(GValue);
912     const MCExpr *SymGotTprel =
913         MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA,
914                                 OutContext);
915     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
916                                  .addReg(MI->getOperand(0).getReg())
917                                  .addReg(MI->getOperand(1).getReg())
918                                  .addExpr(SymGotTprel));
919     return;
920   }
921   case PPC::LDgotTprelL:
922   case PPC::LDgotTprelL32: {
923     // Transform %xd = LDgotTprelL @sym, %xs
924     LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
925 
926     // Change the opcode to LD.
927     TmpInst.setOpcode(IsPPC64 ? PPC::LD : PPC::LWZ);
928     const MachineOperand &MO = MI->getOperand(1);
929     const GlobalValue *GValue = MO.getGlobal();
930     MCSymbol *MOSymbol = getSymbol(GValue);
931     const MCExpr *Exp = MCSymbolRefExpr::create(
932         MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO
933                           : MCSymbolRefExpr::VK_PPC_GOT_TPREL,
934         OutContext);
935     TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
936     EmitToStreamer(*OutStreamer, TmpInst);
937     return;
938   }
939 
940   case PPC::PPC32PICGOT: {
941     MCSymbol *GOTSymbol = OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
942     MCSymbol *GOTRef = OutContext.createTempSymbol();
943     MCSymbol *NextInstr = OutContext.createTempSymbol();
944 
945     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL)
946       // FIXME: We would like an efficient form for this, so we don't have to do
947       // a lot of extra uniquing.
948       .addExpr(MCSymbolRefExpr::create(NextInstr, OutContext)));
949     const MCExpr *OffsExpr =
950       MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol, OutContext),
951                                 MCSymbolRefExpr::create(GOTRef, OutContext),
952         OutContext);
953     OutStreamer->emitLabel(GOTRef);
954     OutStreamer->emitValue(OffsExpr, 4);
955     OutStreamer->emitLabel(NextInstr);
956     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR)
957                                  .addReg(MI->getOperand(0).getReg()));
958     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LWZ)
959                                  .addReg(MI->getOperand(1).getReg())
960                                  .addImm(0)
961                                  .addReg(MI->getOperand(0).getReg()));
962     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD4)
963                                  .addReg(MI->getOperand(0).getReg())
964                                  .addReg(MI->getOperand(1).getReg())
965                                  .addReg(MI->getOperand(0).getReg()));
966     return;
967   }
968   case PPC::PPC32GOT: {
969     MCSymbol *GOTSymbol =
970         OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
971     const MCExpr *SymGotTlsL = MCSymbolRefExpr::create(
972         GOTSymbol, MCSymbolRefExpr::VK_PPC_LO, OutContext);
973     const MCExpr *SymGotTlsHA = MCSymbolRefExpr::create(
974         GOTSymbol, MCSymbolRefExpr::VK_PPC_HA, OutContext);
975     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI)
976                                  .addReg(MI->getOperand(0).getReg())
977                                  .addExpr(SymGotTlsL));
978     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
979                                  .addReg(MI->getOperand(0).getReg())
980                                  .addReg(MI->getOperand(0).getReg())
981                                  .addExpr(SymGotTlsHA));
982     return;
983   }
984   case PPC::ADDIStlsgdHA: {
985     // Transform: %xd = ADDIStlsgdHA %x2, @sym
986     // Into:      %xd = ADDIS8 %x2, sym@got@tlsgd@ha
987     assert(IsPPC64 && "Not supported for 32-bit PowerPC");
988     const MachineOperand &MO = MI->getOperand(2);
989     const GlobalValue *GValue = MO.getGlobal();
990     MCSymbol *MOSymbol = getSymbol(GValue);
991     const MCExpr *SymGotTlsGD =
992       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA,
993                               OutContext);
994     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
995                                  .addReg(MI->getOperand(0).getReg())
996                                  .addReg(MI->getOperand(1).getReg())
997                                  .addExpr(SymGotTlsGD));
998     return;
999   }
1000   case PPC::ADDItlsgdL:
1001     // Transform: %xd = ADDItlsgdL %xs, @sym
1002     // Into:      %xd = ADDI8 %xs, sym@got@tlsgd@l
1003   case PPC::ADDItlsgdL32: {
1004     // Transform: %rd = ADDItlsgdL32 %rs, @sym
1005     // Into:      %rd = ADDI %rs, sym@got@tlsgd
1006     const MachineOperand &MO = MI->getOperand(2);
1007     const GlobalValue *GValue = MO.getGlobal();
1008     MCSymbol *MOSymbol = getSymbol(GValue);
1009     const MCExpr *SymGotTlsGD = MCSymbolRefExpr::create(
1010         MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO
1011                           : MCSymbolRefExpr::VK_PPC_GOT_TLSGD,
1012         OutContext);
1013     EmitToStreamer(*OutStreamer,
1014                    MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI)
1015                    .addReg(MI->getOperand(0).getReg())
1016                    .addReg(MI->getOperand(1).getReg())
1017                    .addExpr(SymGotTlsGD));
1018     return;
1019   }
1020   case PPC::GETtlsADDR:
1021     // Transform: %x3 = GETtlsADDR %x3, @sym
1022     // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsgd)
1023   case PPC::GETtlsADDR32: {
1024     // Transform: %r3 = GETtlsADDR32 %r3, @sym
1025     // Into: BL_TLS __tls_get_addr(sym at tlsgd)@PLT
1026     EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSGD);
1027     return;
1028   }
1029   case PPC::ADDIStlsldHA: {
1030     // Transform: %xd = ADDIStlsldHA %x2, @sym
1031     // Into:      %xd = ADDIS8 %x2, sym@got@tlsld@ha
1032     assert(IsPPC64 && "Not supported for 32-bit PowerPC");
1033     const MachineOperand &MO = MI->getOperand(2);
1034     const GlobalValue *GValue = MO.getGlobal();
1035     MCSymbol *MOSymbol = getSymbol(GValue);
1036     const MCExpr *SymGotTlsLD =
1037       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA,
1038                               OutContext);
1039     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
1040                                  .addReg(MI->getOperand(0).getReg())
1041                                  .addReg(MI->getOperand(1).getReg())
1042                                  .addExpr(SymGotTlsLD));
1043     return;
1044   }
1045   case PPC::ADDItlsldL:
1046     // Transform: %xd = ADDItlsldL %xs, @sym
1047     // Into:      %xd = ADDI8 %xs, sym@got@tlsld@l
1048   case PPC::ADDItlsldL32: {
1049     // Transform: %rd = ADDItlsldL32 %rs, @sym
1050     // Into:      %rd = ADDI %rs, sym@got@tlsld
1051     const MachineOperand &MO = MI->getOperand(2);
1052     const GlobalValue *GValue = MO.getGlobal();
1053     MCSymbol *MOSymbol = getSymbol(GValue);
1054     const MCExpr *SymGotTlsLD = MCSymbolRefExpr::create(
1055         MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO
1056                           : MCSymbolRefExpr::VK_PPC_GOT_TLSLD,
1057         OutContext);
1058     EmitToStreamer(*OutStreamer,
1059                    MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI)
1060                        .addReg(MI->getOperand(0).getReg())
1061                        .addReg(MI->getOperand(1).getReg())
1062                        .addExpr(SymGotTlsLD));
1063     return;
1064   }
1065   case PPC::GETtlsldADDR:
1066     // Transform: %x3 = GETtlsldADDR %x3, @sym
1067     // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsld)
1068   case PPC::GETtlsldADDR32: {
1069     // Transform: %r3 = GETtlsldADDR32 %r3, @sym
1070     // Into: BL_TLS __tls_get_addr(sym at tlsld)@PLT
1071     EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSLD);
1072     return;
1073   }
1074   case PPC::ADDISdtprelHA:
1075     // Transform: %xd = ADDISdtprelHA %xs, @sym
1076     // Into:      %xd = ADDIS8 %xs, sym@dtprel@ha
1077   case PPC::ADDISdtprelHA32: {
1078     // Transform: %rd = ADDISdtprelHA32 %rs, @sym
1079     // Into:      %rd = ADDIS %rs, sym@dtprel@ha
1080     const MachineOperand &MO = MI->getOperand(2);
1081     const GlobalValue *GValue = MO.getGlobal();
1082     MCSymbol *MOSymbol = getSymbol(GValue);
1083     const MCExpr *SymDtprel =
1084       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_HA,
1085                               OutContext);
1086     EmitToStreamer(
1087         *OutStreamer,
1088         MCInstBuilder(IsPPC64 ? PPC::ADDIS8 : PPC::ADDIS)
1089             .addReg(MI->getOperand(0).getReg())
1090             .addReg(MI->getOperand(1).getReg())
1091             .addExpr(SymDtprel));
1092     return;
1093   }
1094   case PPC::ADDIdtprelL:
1095     // Transform: %xd = ADDIdtprelL %xs, @sym
1096     // Into:      %xd = ADDI8 %xs, sym@dtprel@l
1097   case PPC::ADDIdtprelL32: {
1098     // Transform: %rd = ADDIdtprelL32 %rs, @sym
1099     // Into:      %rd = ADDI %rs, sym@dtprel@l
1100     const MachineOperand &MO = MI->getOperand(2);
1101     const GlobalValue *GValue = MO.getGlobal();
1102     MCSymbol *MOSymbol = getSymbol(GValue);
1103     const MCExpr *SymDtprel =
1104       MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_LO,
1105                               OutContext);
1106     EmitToStreamer(*OutStreamer,
1107                    MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI)
1108                        .addReg(MI->getOperand(0).getReg())
1109                        .addReg(MI->getOperand(1).getReg())
1110                        .addExpr(SymDtprel));
1111     return;
1112   }
1113   case PPC::MFOCRF:
1114   case PPC::MFOCRF8:
1115     if (!Subtarget->hasMFOCRF()) {
1116       // Transform: %r3 = MFOCRF %cr7
1117       // Into:      %r3 = MFCR   ;; cr7
1118       unsigned NewOpcode =
1119         MI->getOpcode() == PPC::MFOCRF ? PPC::MFCR : PPC::MFCR8;
1120       OutStreamer->AddComment(PPCInstPrinter::
1121                               getRegisterName(MI->getOperand(1).getReg()));
1122       EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode)
1123                                   .addReg(MI->getOperand(0).getReg()));
1124       return;
1125     }
1126     break;
1127   case PPC::MTOCRF:
1128   case PPC::MTOCRF8:
1129     if (!Subtarget->hasMFOCRF()) {
1130       // Transform: %cr7 = MTOCRF %r3
1131       // Into:      MTCRF mask, %r3 ;; cr7
1132       unsigned NewOpcode =
1133         MI->getOpcode() == PPC::MTOCRF ? PPC::MTCRF : PPC::MTCRF8;
1134       unsigned Mask = 0x80 >> OutContext.getRegisterInfo()
1135                               ->getEncodingValue(MI->getOperand(0).getReg());
1136       OutStreamer->AddComment(PPCInstPrinter::
1137                               getRegisterName(MI->getOperand(0).getReg()));
1138       EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode)
1139                                      .addImm(Mask)
1140                                      .addReg(MI->getOperand(1).getReg()));
1141       return;
1142     }
1143     break;
1144   case PPC::LD:
1145   case PPC::STD:
1146   case PPC::LWA_32:
1147   case PPC::LWA: {
1148     // Verify alignment is legal, so we don't create relocations
1149     // that can't be supported.
1150     // FIXME:  This test is currently disabled for Darwin.  The test
1151     // suite shows a handful of test cases that fail this check for
1152     // Darwin.  Those need to be investigated before this sanity test
1153     // can be enabled for those subtargets.
1154     unsigned OpNum = (MI->getOpcode() == PPC::STD) ? 2 : 1;
1155     const MachineOperand &MO = MI->getOperand(OpNum);
1156     if (MO.isGlobal()) {
1157       const DataLayout &DL = MO.getGlobal()->getParent()->getDataLayout();
1158       if (MO.getGlobal()->getPointerAlignment(DL) < 4)
1159         llvm_unreachable("Global must be word-aligned for LD, STD, LWA!");
1160     }
1161     // Now process the instruction normally.
1162     break;
1163   }
1164   }
1165 
1166   LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
1167   EmitToStreamer(*OutStreamer, TmpInst);
1168 }
1169 
1170 void PPCLinuxAsmPrinter::emitInstruction(const MachineInstr *MI) {
1171   if (!Subtarget->isPPC64())
1172     return PPCAsmPrinter::emitInstruction(MI);
1173 
1174   switch (MI->getOpcode()) {
1175   default:
1176     return PPCAsmPrinter::emitInstruction(MI);
1177   case TargetOpcode::PATCHABLE_FUNCTION_ENTER: {
1178     // .begin:
1179     //   b .end # lis 0, FuncId[16..32]
1180     //   nop    # li  0, FuncId[0..15]
1181     //   std 0, -8(1)
1182     //   mflr 0
1183     //   bl __xray_FunctionEntry
1184     //   mtlr 0
1185     // .end:
1186     //
1187     // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
1188     // of instructions change.
1189     MCSymbol *BeginOfSled = OutContext.createTempSymbol();
1190     MCSymbol *EndOfSled = OutContext.createTempSymbol();
1191     OutStreamer->emitLabel(BeginOfSled);
1192     EmitToStreamer(*OutStreamer,
1193                    MCInstBuilder(PPC::B).addExpr(
1194                        MCSymbolRefExpr::create(EndOfSled, OutContext)));
1195     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
1196     EmitToStreamer(
1197         *OutStreamer,
1198         MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1));
1199     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0));
1200     EmitToStreamer(*OutStreamer,
1201                    MCInstBuilder(PPC::BL8_NOP)
1202                        .addExpr(MCSymbolRefExpr::create(
1203                            OutContext.getOrCreateSymbol("__xray_FunctionEntry"),
1204                            OutContext)));
1205     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0));
1206     OutStreamer->emitLabel(EndOfSled);
1207     recordSled(BeginOfSled, *MI, SledKind::FUNCTION_ENTER, 2);
1208     break;
1209   }
1210   case TargetOpcode::PATCHABLE_RET: {
1211     unsigned RetOpcode = MI->getOperand(0).getImm();
1212     MCInst RetInst;
1213     RetInst.setOpcode(RetOpcode);
1214     for (const auto &MO :
1215          make_range(std::next(MI->operands_begin()), MI->operands_end())) {
1216       MCOperand MCOp;
1217       if (LowerPPCMachineOperandToMCOperand(MO, MCOp, *this))
1218         RetInst.addOperand(MCOp);
1219     }
1220 
1221     bool IsConditional;
1222     if (RetOpcode == PPC::BCCLR) {
1223       IsConditional = true;
1224     } else if (RetOpcode == PPC::TCRETURNdi8 || RetOpcode == PPC::TCRETURNri8 ||
1225                RetOpcode == PPC::TCRETURNai8) {
1226       break;
1227     } else if (RetOpcode == PPC::BLR8 || RetOpcode == PPC::TAILB8) {
1228       IsConditional = false;
1229     } else {
1230       EmitToStreamer(*OutStreamer, RetInst);
1231       break;
1232     }
1233 
1234     MCSymbol *FallthroughLabel;
1235     if (IsConditional) {
1236       // Before:
1237       //   bgtlr cr0
1238       //
1239       // After:
1240       //   ble cr0, .end
1241       // .p2align 3
1242       // .begin:
1243       //   blr    # lis 0, FuncId[16..32]
1244       //   nop    # li  0, FuncId[0..15]
1245       //   std 0, -8(1)
1246       //   mflr 0
1247       //   bl __xray_FunctionExit
1248       //   mtlr 0
1249       //   blr
1250       // .end:
1251       //
1252       // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
1253       // of instructions change.
1254       FallthroughLabel = OutContext.createTempSymbol();
1255       EmitToStreamer(
1256           *OutStreamer,
1257           MCInstBuilder(PPC::BCC)
1258               .addImm(PPC::InvertPredicate(
1259                   static_cast<PPC::Predicate>(MI->getOperand(1).getImm())))
1260               .addReg(MI->getOperand(2).getReg())
1261               .addExpr(MCSymbolRefExpr::create(FallthroughLabel, OutContext)));
1262       RetInst = MCInst();
1263       RetInst.setOpcode(PPC::BLR8);
1264     }
1265     // .p2align 3
1266     // .begin:
1267     //   b(lr)? # lis 0, FuncId[16..32]
1268     //   nop    # li  0, FuncId[0..15]
1269     //   std 0, -8(1)
1270     //   mflr 0
1271     //   bl __xray_FunctionExit
1272     //   mtlr 0
1273     //   b(lr)?
1274     //
1275     // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
1276     // of instructions change.
1277     OutStreamer->emitCodeAlignment(8);
1278     MCSymbol *BeginOfSled = OutContext.createTempSymbol();
1279     OutStreamer->emitLabel(BeginOfSled);
1280     EmitToStreamer(*OutStreamer, RetInst);
1281     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
1282     EmitToStreamer(
1283         *OutStreamer,
1284         MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1));
1285     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0));
1286     EmitToStreamer(*OutStreamer,
1287                    MCInstBuilder(PPC::BL8_NOP)
1288                        .addExpr(MCSymbolRefExpr::create(
1289                            OutContext.getOrCreateSymbol("__xray_FunctionExit"),
1290                            OutContext)));
1291     EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0));
1292     EmitToStreamer(*OutStreamer, RetInst);
1293     if (IsConditional)
1294       OutStreamer->emitLabel(FallthroughLabel);
1295     recordSled(BeginOfSled, *MI, SledKind::FUNCTION_EXIT, 2);
1296     break;
1297   }
1298   case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
1299     llvm_unreachable("PATCHABLE_FUNCTION_EXIT should never be emitted");
1300   case TargetOpcode::PATCHABLE_TAIL_CALL:
1301     // TODO: Define a trampoline `__xray_FunctionTailExit` and differentiate a
1302     // normal function exit from a tail exit.
1303     llvm_unreachable("Tail call is handled in the normal case. See comments "
1304                      "around this assert.");
1305   }
1306 }
1307 
1308 void PPCLinuxAsmPrinter::emitStartOfAsmFile(Module &M) {
1309   if (static_cast<const PPCTargetMachine &>(TM).isELFv2ABI()) {
1310     PPCTargetStreamer *TS =
1311       static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
1312 
1313     if (TS)
1314       TS->emitAbiVersion(2);
1315   }
1316 
1317   if (static_cast<const PPCTargetMachine &>(TM).isPPC64() ||
1318       !isPositionIndependent())
1319     return AsmPrinter::emitStartOfAsmFile(M);
1320 
1321   if (M.getPICLevel() == PICLevel::SmallPIC)
1322     return AsmPrinter::emitStartOfAsmFile(M);
1323 
1324   OutStreamer->SwitchSection(OutContext.getELFSection(
1325       ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC));
1326 
1327   MCSymbol *TOCSym = OutContext.getOrCreateSymbol(Twine(".LTOC"));
1328   MCSymbol *CurrentPos = OutContext.createTempSymbol();
1329 
1330   OutStreamer->emitLabel(CurrentPos);
1331 
1332   // The GOT pointer points to the middle of the GOT, in order to reference the
1333   // entire 64kB range.  0x8000 is the midpoint.
1334   const MCExpr *tocExpr =
1335     MCBinaryExpr::createAdd(MCSymbolRefExpr::create(CurrentPos, OutContext),
1336                             MCConstantExpr::create(0x8000, OutContext),
1337                             OutContext);
1338 
1339   OutStreamer->emitAssignment(TOCSym, tocExpr);
1340 
1341   OutStreamer->SwitchSection(getObjFileLowering().getTextSection());
1342 }
1343 
1344 void PPCLinuxAsmPrinter::emitFunctionEntryLabel() {
1345   // linux/ppc32 - Normal entry label.
1346   if (!Subtarget->isPPC64() &&
1347       (!isPositionIndependent() ||
1348        MF->getFunction().getParent()->getPICLevel() == PICLevel::SmallPIC))
1349     return AsmPrinter::emitFunctionEntryLabel();
1350 
1351   if (!Subtarget->isPPC64()) {
1352     const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
1353     if (PPCFI->usesPICBase() && !Subtarget->isSecurePlt()) {
1354       MCSymbol *RelocSymbol = PPCFI->getPICOffsetSymbol(*MF);
1355       MCSymbol *PICBase = MF->getPICBaseSymbol();
1356       OutStreamer->emitLabel(RelocSymbol);
1357 
1358       const MCExpr *OffsExpr =
1359         MCBinaryExpr::createSub(
1360           MCSymbolRefExpr::create(OutContext.getOrCreateSymbol(Twine(".LTOC")),
1361                                                                OutContext),
1362                                   MCSymbolRefExpr::create(PICBase, OutContext),
1363           OutContext);
1364       OutStreamer->emitValue(OffsExpr, 4);
1365       OutStreamer->emitLabel(CurrentFnSym);
1366       return;
1367     } else
1368       return AsmPrinter::emitFunctionEntryLabel();
1369   }
1370 
1371   // ELFv2 ABI - Normal entry label.
1372   if (Subtarget->isELFv2ABI()) {
1373     // In the Large code model, we allow arbitrary displacements between
1374     // the text section and its associated TOC section.  We place the
1375     // full 8-byte offset to the TOC in memory immediately preceding
1376     // the function global entry point.
1377     if (TM.getCodeModel() == CodeModel::Large
1378         && !MF->getRegInfo().use_empty(PPC::X2)) {
1379       const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
1380 
1381       MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC."));
1382       MCSymbol *GlobalEPSymbol = PPCFI->getGlobalEPSymbol(*MF);
1383       const MCExpr *TOCDeltaExpr =
1384         MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext),
1385                                 MCSymbolRefExpr::create(GlobalEPSymbol,
1386                                                         OutContext),
1387                                 OutContext);
1388 
1389       OutStreamer->emitLabel(PPCFI->getTOCOffsetSymbol(*MF));
1390       OutStreamer->emitValue(TOCDeltaExpr, 8);
1391     }
1392     return AsmPrinter::emitFunctionEntryLabel();
1393   }
1394 
1395   // Emit an official procedure descriptor.
1396   MCSectionSubPair Current = OutStreamer->getCurrentSection();
1397   MCSectionELF *Section = OutStreamer->getContext().getELFSection(
1398       ".opd", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
1399   OutStreamer->SwitchSection(Section);
1400   OutStreamer->emitLabel(CurrentFnSym);
1401   OutStreamer->emitValueToAlignment(8);
1402   MCSymbol *Symbol1 = CurrentFnSymForSize;
1403   // Generates a R_PPC64_ADDR64 (from FK_DATA_8) relocation for the function
1404   // entry point.
1405   OutStreamer->emitValue(MCSymbolRefExpr::create(Symbol1, OutContext),
1406                          8 /*size*/);
1407   MCSymbol *Symbol2 = OutContext.getOrCreateSymbol(StringRef(".TOC."));
1408   // Generates a R_PPC64_TOC relocation for TOC base insertion.
1409   OutStreamer->emitValue(
1410     MCSymbolRefExpr::create(Symbol2, MCSymbolRefExpr::VK_PPC_TOCBASE, OutContext),
1411     8/*size*/);
1412   // Emit a null environment pointer.
1413   OutStreamer->emitIntValue(0, 8 /* size */);
1414   OutStreamer->SwitchSection(Current.first, Current.second);
1415 }
1416 
1417 void PPCLinuxAsmPrinter::emitEndOfAsmFile(Module &M) {
1418   const DataLayout &DL = getDataLayout();
1419 
1420   bool isPPC64 = DL.getPointerSizeInBits() == 64;
1421 
1422   PPCTargetStreamer *TS =
1423       static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
1424 
1425   if (!TOC.empty()) {
1426     const char *Name = isPPC64 ? ".toc" : ".got2";
1427     MCSectionELF *Section = OutContext.getELFSection(
1428         Name, ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
1429     OutStreamer->SwitchSection(Section);
1430     if (!isPPC64)
1431       OutStreamer->emitValueToAlignment(4);
1432 
1433     for (const auto &TOCMapPair : TOC) {
1434       const MCSymbol *const TOCEntryTarget = TOCMapPair.first;
1435       MCSymbol *const TOCEntryLabel = TOCMapPair.second;
1436 
1437       OutStreamer->emitLabel(TOCEntryLabel);
1438       if (isPPC64 && TS != nullptr)
1439         TS->emitTCEntry(*TOCEntryTarget);
1440       else
1441         OutStreamer->emitSymbolValue(TOCEntryTarget, 4);
1442     }
1443   }
1444 
1445   PPCAsmPrinter::emitEndOfAsmFile(M);
1446 }
1447 
1448 /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2.
1449 void PPCLinuxAsmPrinter::emitFunctionBodyStart() {
1450   // In the ELFv2 ABI, in functions that use the TOC register, we need to
1451   // provide two entry points.  The ABI guarantees that when calling the
1452   // local entry point, r2 is set up by the caller to contain the TOC base
1453   // for this function, and when calling the global entry point, r12 is set
1454   // up by the caller to hold the address of the global entry point.  We
1455   // thus emit a prefix sequence along the following lines:
1456   //
1457   // func:
1458   // .Lfunc_gepNN:
1459   //         # global entry point
1460   //         addis r2,r12,(.TOC.-.Lfunc_gepNN)@ha
1461   //         addi  r2,r2,(.TOC.-.Lfunc_gepNN)@l
1462   // .Lfunc_lepNN:
1463   //         .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
1464   //         # local entry point, followed by function body
1465   //
1466   // For the Large code model, we create
1467   //
1468   // .Lfunc_tocNN:
1469   //         .quad .TOC.-.Lfunc_gepNN      # done by EmitFunctionEntryLabel
1470   // func:
1471   // .Lfunc_gepNN:
1472   //         # global entry point
1473   //         ld    r2,.Lfunc_tocNN-.Lfunc_gepNN(r12)
1474   //         add   r2,r2,r12
1475   // .Lfunc_lepNN:
1476   //         .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
1477   //         # local entry point, followed by function body
1478   //
1479   // This ensures we have r2 set up correctly while executing the function
1480   // body, no matter which entry point is called.
1481   const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
1482   const bool UsesX2OrR2 = !MF->getRegInfo().use_empty(PPC::X2) ||
1483                           !MF->getRegInfo().use_empty(PPC::R2);
1484   const bool PCrelGEPRequired = Subtarget->isUsingPCRelativeCalls() &&
1485                                 UsesX2OrR2 && PPCFI->usesTOCBasePtr();
1486   const bool NonPCrelGEPRequired = !Subtarget->isUsingPCRelativeCalls() &&
1487                                    Subtarget->isELFv2ABI() && UsesX2OrR2;
1488 
1489   // Only do all that if the function uses R2 as the TOC pointer
1490   // in the first place. We don't need the global entry point if the
1491   // function uses R2 as an allocatable register.
1492   if (NonPCrelGEPRequired || PCrelGEPRequired) {
1493     // Note: The logic here must be synchronized with the code in the
1494     // branch-selection pass which sets the offset of the first block in the
1495     // function. This matters because it affects the alignment.
1496     MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol(*MF);
1497     OutStreamer->emitLabel(GlobalEntryLabel);
1498     const MCSymbolRefExpr *GlobalEntryLabelExp =
1499       MCSymbolRefExpr::create(GlobalEntryLabel, OutContext);
1500 
1501     if (TM.getCodeModel() != CodeModel::Large) {
1502       MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC."));
1503       const MCExpr *TOCDeltaExpr =
1504         MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext),
1505                                 GlobalEntryLabelExp, OutContext);
1506 
1507       const MCExpr *TOCDeltaHi = PPCMCExpr::createHa(TOCDeltaExpr, OutContext);
1508       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
1509                                    .addReg(PPC::X2)
1510                                    .addReg(PPC::X12)
1511                                    .addExpr(TOCDeltaHi));
1512 
1513       const MCExpr *TOCDeltaLo = PPCMCExpr::createLo(TOCDeltaExpr, OutContext);
1514       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI)
1515                                    .addReg(PPC::X2)
1516                                    .addReg(PPC::X2)
1517                                    .addExpr(TOCDeltaLo));
1518     } else {
1519       MCSymbol *TOCOffset = PPCFI->getTOCOffsetSymbol(*MF);
1520       const MCExpr *TOCOffsetDeltaExpr =
1521         MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCOffset, OutContext),
1522                                 GlobalEntryLabelExp, OutContext);
1523 
1524       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
1525                                    .addReg(PPC::X2)
1526                                    .addExpr(TOCOffsetDeltaExpr)
1527                                    .addReg(PPC::X12));
1528       EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD8)
1529                                    .addReg(PPC::X2)
1530                                    .addReg(PPC::X2)
1531                                    .addReg(PPC::X12));
1532     }
1533 
1534     MCSymbol *LocalEntryLabel = PPCFI->getLocalEPSymbol(*MF);
1535     OutStreamer->emitLabel(LocalEntryLabel);
1536     const MCSymbolRefExpr *LocalEntryLabelExp =
1537        MCSymbolRefExpr::create(LocalEntryLabel, OutContext);
1538     const MCExpr *LocalOffsetExp =
1539       MCBinaryExpr::createSub(LocalEntryLabelExp,
1540                               GlobalEntryLabelExp, OutContext);
1541 
1542     PPCTargetStreamer *TS =
1543       static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
1544 
1545     if (TS)
1546       TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), LocalOffsetExp);
1547   } else if (Subtarget->isUsingPCRelativeCalls()) {
1548     // When generating the entry point for a function we have a few scenarios
1549     // based on whether or not that function uses R2 and whether or not that
1550     // function makes calls (or is a leaf function).
1551     // 1) A leaf function that does not use R2 (or treats it as callee-saved
1552     //    and preserves it). In this case st_other=0 and both
1553     //    the local and global entry points for the function are the same.
1554     //    No special entry point code is required.
1555     // 2) A function uses the TOC pointer R2. This function may or may not have
1556     //    calls. In this case st_other=[2,6] and the global and local entry
1557     //    points are different. Code to correctly setup the TOC pointer in R2
1558     //    is put between the global and local entry points. This case is
1559     //    covered by the if statatement above.
1560     // 3) A function does not use the TOC pointer R2 but does have calls.
1561     //    In this case st_other=1 since we do not know whether or not any
1562     //    of the callees clobber R2. This case is dealt with in this else if
1563     //    block. Tail calls are considered calls and the st_other should also
1564     //    be set to 1 in that case as well.
1565     // 4) The function does not use the TOC pointer but R2 is used inside
1566     //    the function. In this case st_other=1 once again.
1567     // 5) This function uses inline asm. We mark R2 as reserved if the function
1568     //    has inline asm as we have to assume that it may be used.
1569     if (MF->getFrameInfo().hasCalls() || MF->getFrameInfo().hasTailCall() ||
1570         MF->hasInlineAsm() || (!PPCFI->usesTOCBasePtr() && UsesX2OrR2)) {
1571       PPCTargetStreamer *TS =
1572           static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
1573       if (TS)
1574         TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym),
1575                            MCConstantExpr::create(1, OutContext));
1576     }
1577   }
1578 }
1579 
1580 /// EmitFunctionBodyEnd - Print the traceback table before the .size
1581 /// directive.
1582 ///
1583 void PPCLinuxAsmPrinter::emitFunctionBodyEnd() {
1584   // Only the 64-bit target requires a traceback table.  For now,
1585   // we only emit the word of zeroes that GDB requires to find
1586   // the end of the function, and zeroes for the eight-byte
1587   // mandatory fields.
1588   // FIXME: We should fill in the eight-byte mandatory fields as described in
1589   // the PPC64 ELF ABI (this is a low-priority item because GDB does not
1590   // currently make use of these fields).
1591   if (Subtarget->isPPC64()) {
1592     OutStreamer->emitIntValue(0, 4/*size*/);
1593     OutStreamer->emitIntValue(0, 8/*size*/);
1594   }
1595 }
1596 
1597 void PPCAIXAsmPrinter::emitLinkage(const GlobalValue *GV,
1598                                    MCSymbol *GVSym) const {
1599 
1600   assert(MAI->hasVisibilityOnlyWithLinkage() &&
1601          "AIX's linkage directives take a visibility setting.");
1602 
1603   MCSymbolAttr LinkageAttr = MCSA_Invalid;
1604   switch (GV->getLinkage()) {
1605   case GlobalValue::ExternalLinkage:
1606     LinkageAttr = GV->isDeclaration() ? MCSA_Extern : MCSA_Global;
1607     break;
1608   case GlobalValue::LinkOnceAnyLinkage:
1609   case GlobalValue::LinkOnceODRLinkage:
1610   case GlobalValue::WeakAnyLinkage:
1611   case GlobalValue::WeakODRLinkage:
1612   case GlobalValue::ExternalWeakLinkage:
1613     LinkageAttr = MCSA_Weak;
1614     break;
1615   case GlobalValue::AvailableExternallyLinkage:
1616     LinkageAttr = MCSA_Extern;
1617     break;
1618   case GlobalValue::PrivateLinkage:
1619     return;
1620   case GlobalValue::InternalLinkage:
1621     assert(GV->getVisibility() == GlobalValue::DefaultVisibility &&
1622            "InternalLinkage should not have other visibility setting.");
1623     LinkageAttr = MCSA_LGlobal;
1624     break;
1625   case GlobalValue::AppendingLinkage:
1626     llvm_unreachable("Should never emit this");
1627   case GlobalValue::CommonLinkage:
1628     llvm_unreachable("CommonLinkage of XCOFF should not come to this path");
1629   }
1630 
1631   assert(LinkageAttr != MCSA_Invalid && "LinkageAttr should not MCSA_Invalid.");
1632 
1633   MCSymbolAttr VisibilityAttr = MCSA_Invalid;
1634   switch (GV->getVisibility()) {
1635 
1636   // TODO: "exported" and "internal" Visibility needs to go here.
1637   case GlobalValue::DefaultVisibility:
1638     break;
1639   case GlobalValue::HiddenVisibility:
1640     VisibilityAttr = MAI->getHiddenVisibilityAttr();
1641     break;
1642   case GlobalValue::ProtectedVisibility:
1643     VisibilityAttr = MAI->getProtectedVisibilityAttr();
1644     break;
1645   }
1646 
1647   OutStreamer->emitXCOFFSymbolLinkageWithVisibility(GVSym, LinkageAttr,
1648                                                     VisibilityAttr);
1649 }
1650 
1651 void PPCAIXAsmPrinter::SetupMachineFunction(MachineFunction &MF) {
1652   // Setup CurrentFnDescSym and its containing csect.
1653   MCSectionXCOFF *FnDescSec =
1654       cast<MCSectionXCOFF>(getObjFileLowering().getSectionForFunctionDescriptor(
1655           &MF.getFunction(), TM));
1656   FnDescSec->setAlignment(Align(Subtarget->isPPC64() ? 8 : 4));
1657 
1658   CurrentFnDescSym = FnDescSec->getQualNameSymbol();
1659 
1660   return AsmPrinter::SetupMachineFunction(MF);
1661 }
1662 
1663 void PPCAIXAsmPrinter::ValidateGV(const GlobalVariable *GV) {
1664   // Early error checking limiting what is supported.
1665   if (GV->isThreadLocal())
1666     report_fatal_error("Thread local not yet supported on AIX.");
1667 
1668   if (GV->hasSection())
1669     report_fatal_error("Custom section for Data not yet supported.");
1670 
1671   if (GV->hasComdat())
1672     report_fatal_error("COMDAT not yet supported by AIX.");
1673 }
1674 
1675 static bool isSpecialLLVMGlobalArrayForStaticInit(const GlobalVariable *GV) {
1676   return StringSwitch<bool>(GV->getName())
1677       .Cases("llvm.global_ctors", "llvm.global_dtors", true)
1678       .Default(false);
1679 }
1680 
1681 void PPCAIXAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) {
1682   ValidateGV(GV);
1683 
1684   // TODO: Update the handling of global arrays for static init when we support
1685   // the ".ref" directive.
1686   // Otherwise, we can skip these arrays, because the AIX linker collects
1687   // static init functions simply based on their name.
1688   if (isSpecialLLVMGlobalArrayForStaticInit(GV))
1689     return;
1690 
1691   // Create the symbol, set its storage class.
1692   MCSymbolXCOFF *GVSym = cast<MCSymbolXCOFF>(getSymbol(GV));
1693   GVSym->setStorageClass(
1694       TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV));
1695 
1696   if (GV->isDeclarationForLinker()) {
1697     emitLinkage(GV, GVSym);
1698     return;
1699   }
1700 
1701   SectionKind GVKind = getObjFileLowering().getKindForGlobal(GV, TM);
1702   if (!GVKind.isGlobalWriteableData() && !GVKind.isReadOnly())
1703     report_fatal_error("Encountered a global variable kind that is "
1704                        "not supported yet.");
1705 
1706   MCSectionXCOFF *Csect = cast<MCSectionXCOFF>(
1707       getObjFileLowering().SectionForGlobal(GV, GVKind, TM));
1708 
1709   // Switch to the containing csect.
1710   OutStreamer->SwitchSection(Csect);
1711 
1712   const DataLayout &DL = GV->getParent()->getDataLayout();
1713 
1714   // Handle common symbols.
1715   if (GVKind.isCommon() || GVKind.isBSSLocal()) {
1716     Align Alignment = GV->getAlign().getValueOr(DL.getPreferredAlign(GV));
1717     uint64_t Size = DL.getTypeAllocSize(GV->getType()->getElementType());
1718 
1719     if (GVKind.isBSSLocal())
1720       OutStreamer->emitXCOFFLocalCommonSymbol(
1721           OutContext.getOrCreateSymbol(GVSym->getUnqualifiedName()), Size,
1722           GVSym, Alignment.value());
1723     else
1724       OutStreamer->emitCommonSymbol(GVSym, Size, Alignment.value());
1725     return;
1726   }
1727 
1728   MCSymbol *EmittedInitSym = GVSym;
1729   emitLinkage(GV, EmittedInitSym);
1730   emitAlignment(getGVAlignment(GV, DL), GV);
1731   OutStreamer->emitLabel(EmittedInitSym);
1732   emitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer());
1733 }
1734 
1735 void PPCAIXAsmPrinter::emitFunctionDescriptor() {
1736   const DataLayout &DL = getDataLayout();
1737   const unsigned PointerSize = DL.getPointerSizeInBits() == 64 ? 8 : 4;
1738 
1739   MCSectionSubPair Current = OutStreamer->getCurrentSection();
1740   // Emit function descriptor.
1741   OutStreamer->SwitchSection(
1742       cast<MCSymbolXCOFF>(CurrentFnDescSym)->getRepresentedCsect());
1743   // Emit function entry point address.
1744   OutStreamer->emitValue(MCSymbolRefExpr::create(CurrentFnSym, OutContext),
1745                          PointerSize);
1746   // Emit TOC base address.
1747   const MCSymbol *TOCBaseSym =
1748       cast<MCSectionXCOFF>(getObjFileLowering().getTOCBaseSection())
1749           ->getQualNameSymbol();
1750   OutStreamer->emitValue(MCSymbolRefExpr::create(TOCBaseSym, OutContext),
1751                          PointerSize);
1752   // Emit a null environment pointer.
1753   OutStreamer->emitIntValue(0, PointerSize);
1754 
1755   OutStreamer->SwitchSection(Current.first, Current.second);
1756 }
1757 
1758 void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
1759   // If there are no functions in this module, we will never need to reference
1760   // the TOC base.
1761   if (M.empty())
1762     return;
1763 
1764   // Switch to section to emit TOC base.
1765   OutStreamer->SwitchSection(getObjFileLowering().getTOCBaseSection());
1766 
1767   PPCTargetStreamer *TS =
1768       static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
1769 
1770   const unsigned EntryByteSize = Subtarget->isPPC64() ? 8 : 4;
1771   const unsigned TOCEntriesByteSize = TOC.size() * EntryByteSize;
1772   // TODO: If TOC entries' size is larger than 32768, then we run out of
1773   // positive displacement to reach the TOC entry. We need to decide how to
1774   // handle entries' size larger than that later.
1775   if (TOCEntriesByteSize > 32767) {
1776     report_fatal_error("Handling of TOC entry displacement larger than 32767 "
1777                        "is not yet implemented.");
1778   }
1779 
1780   for (auto &I : TOC) {
1781     // Setup the csect for the current TC entry.
1782     MCSectionXCOFF *TCEntry = cast<MCSectionXCOFF>(
1783         getObjFileLowering().getSectionForTOCEntry(I.first));
1784     OutStreamer->SwitchSection(TCEntry);
1785 
1786     OutStreamer->emitLabel(I.second);
1787     if (TS != nullptr)
1788       TS->emitTCEntry(*I.first);
1789   }
1790 }
1791 
1792 bool PPCAIXAsmPrinter::doInitialization(Module &M) {
1793   if (M.alias_size() > 0u)
1794     report_fatal_error(
1795         "module has aliases, which LLVM does not yet support for AIX");
1796 
1797   const bool Result = PPCAsmPrinter::doInitialization(M);
1798 
1799   auto setCsectAlignment = [this](const GlobalObject *GO) {
1800     // Declarations have 0 alignment which is set by default.
1801     if (GO->isDeclarationForLinker())
1802       return;
1803 
1804     SectionKind GOKind = getObjFileLowering().getKindForGlobal(GO, TM);
1805     MCSectionXCOFF *Csect = cast<MCSectionXCOFF>(
1806         getObjFileLowering().SectionForGlobal(GO, GOKind, TM));
1807 
1808     Align GOAlign = getGVAlignment(GO, GO->getParent()->getDataLayout());
1809     if (GOAlign > Csect->getAlignment())
1810       Csect->setAlignment(GOAlign);
1811   };
1812 
1813   // We need to know, up front, the alignment of csects for the assembly path,
1814   // because once a .csect directive gets emitted, we could not change the
1815   // alignment value on it.
1816   for (const auto &G : M.globals())
1817     setCsectAlignment(&G);
1818 
1819   for (const auto &F : M)
1820     setCsectAlignment(&F);
1821 
1822   return Result;
1823 }
1824 
1825 void PPCAIXAsmPrinter::emitInstruction(const MachineInstr *MI) {
1826   switch (MI->getOpcode()) {
1827   default:
1828     break;
1829   case PPC::BL8:
1830   case PPC::BL:
1831   case PPC::BL8_NOP:
1832   case PPC::BL_NOP: {
1833     const MachineOperand &MO = MI->getOperand(0);
1834     if (MO.isSymbol()) {
1835       MCSymbolXCOFF *S =
1836           cast<MCSymbolXCOFF>(OutContext.getOrCreateSymbol(MO.getSymbolName()));
1837       if (!S->hasRepresentedCsectSet()) {
1838         // On AIX, an undefined symbol needs to be associated with a
1839         // MCSectionXCOFF to get the correct storage mapping class.
1840         // In this case, XCOFF::XMC_PR.
1841         MCSectionXCOFF *Sec = OutContext.getXCOFFSection(
1842             S->getName(), XCOFF::XMC_PR, XCOFF::XTY_ER, XCOFF::C_EXT,
1843             SectionKind::getMetadata());
1844         S->setRepresentedCsect(Sec);
1845       }
1846       ExtSymSDNodeSymbols.insert(S);
1847     }
1848   } break;
1849   case PPC::BL_TLS:
1850   case PPC::BL8_TLS:
1851   case PPC::BL8_TLS_:
1852   case PPC::BL8_NOP_TLS:
1853     report_fatal_error("TLS call not yet implemented");
1854   case PPC::TAILB:
1855   case PPC::TAILB8:
1856   case PPC::TAILBA:
1857   case PPC::TAILBA8:
1858   case PPC::TAILBCTR:
1859   case PPC::TAILBCTR8:
1860     if (MI->getOperand(0).isSymbol())
1861       report_fatal_error("Tail call for extern symbol not yet supported.");
1862     break;
1863   }
1864   return PPCAsmPrinter::emitInstruction(MI);
1865 }
1866 
1867 bool PPCAIXAsmPrinter::doFinalization(Module &M) {
1868   bool Ret = PPCAsmPrinter::doFinalization(M);
1869   for (MCSymbol *Sym : ExtSymSDNodeSymbols)
1870     OutStreamer->emitSymbolAttribute(Sym, MCSA_Extern);
1871   return Ret;
1872 }
1873 
1874 /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code
1875 /// for a MachineFunction to the given output stream, in a format that the
1876 /// Darwin assembler can deal with.
1877 ///
1878 static AsmPrinter *
1879 createPPCAsmPrinterPass(TargetMachine &tm,
1880                         std::unique_ptr<MCStreamer> &&Streamer) {
1881   if (tm.getTargetTriple().isOSAIX())
1882     return new PPCAIXAsmPrinter(tm, std::move(Streamer));
1883 
1884   return new PPCLinuxAsmPrinter(tm, std::move(Streamer));
1885 }
1886 
1887 // Force static initialization.
1888 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCAsmPrinter() {
1889   TargetRegistry::RegisterAsmPrinter(getThePPC32Target(),
1890                                      createPPCAsmPrinterPass);
1891   TargetRegistry::RegisterAsmPrinter(getThePPC64Target(),
1892                                      createPPCAsmPrinterPass);
1893   TargetRegistry::RegisterAsmPrinter(getThePPC64LETarget(),
1894                                      createPPCAsmPrinterPass);
1895 }
1896