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