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/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/MCDirectives.h" 51 #include "llvm/MC/MCExpr.h" 52 #include "llvm/MC/MCInst.h" 53 #include "llvm/MC/MCInstBuilder.h" 54 #include "llvm/MC/MCSectionELF.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/Process.h" 66 #include "llvm/Support/TargetRegistry.h" 67 #include "llvm/Support/raw_ostream.h" 68 #include "llvm/Target/TargetMachine.h" 69 #include "llvm/Transforms/Utils/ModuleUtils.h" 70 #include <algorithm> 71 #include <cassert> 72 #include <cstdint> 73 #include <memory> 74 #include <new> 75 76 using namespace llvm; 77 using namespace llvm::XCOFF; 78 79 #define DEBUG_TYPE "asmprinter" 80 81 // Specialize DenseMapInfo to allow 82 // std::pair<const MCSymbol *, MCSymbolRefExpr::VariantKind> in DenseMap. 83 // This specialization is needed here because that type is used as keys in the 84 // map representing TOC entries. 85 namespace llvm { 86 template <> 87 struct DenseMapInfo<std::pair<const MCSymbol *, MCSymbolRefExpr::VariantKind>> { 88 using TOCKey = std::pair<const MCSymbol *, MCSymbolRefExpr::VariantKind>; 89 90 static inline TOCKey getEmptyKey() { 91 return {nullptr, MCSymbolRefExpr::VariantKind::VK_None}; 92 } 93 static inline TOCKey getTombstoneKey() { 94 return {nullptr, MCSymbolRefExpr::VariantKind::VK_Invalid}; 95 } 96 static unsigned getHashValue(const TOCKey &PairVal) { 97 return detail::combineHashValue( 98 DenseMapInfo<const MCSymbol *>::getHashValue(PairVal.first), 99 DenseMapInfo<int>::getHashValue(PairVal.second)); 100 } 101 static bool isEqual(const TOCKey &A, const TOCKey &B) { return A == B; } 102 }; 103 } // end namespace llvm 104 105 namespace { 106 107 class PPCAsmPrinter : public AsmPrinter { 108 protected: 109 // For TLS on AIX, we need to be able to identify TOC entries of specific 110 // VariantKind so we can add the right relocations when we generate the 111 // entries. So each entry is represented by a pair of MCSymbol and 112 // VariantKind. For example, we need to be able to identify the following 113 // entry as a TLSGD entry so we can add the @m relocation: 114 // .tc .i[TC],i[TL]@m 115 // By default, VK_None is used for the VariantKind. 116 MapVector<std::pair<const MCSymbol *, MCSymbolRefExpr::VariantKind>, 117 MCSymbol *> 118 TOC; 119 const PPCSubtarget *Subtarget = nullptr; 120 StackMaps SM; 121 122 public: 123 explicit PPCAsmPrinter(TargetMachine &TM, 124 std::unique_ptr<MCStreamer> Streamer) 125 : AsmPrinter(TM, std::move(Streamer)), SM(*this) {} 126 127 StringRef getPassName() const override { return "PowerPC Assembly Printer"; } 128 129 MCSymbol *lookUpOrCreateTOCEntry(const MCSymbol *Sym, 130 MCSymbolRefExpr::VariantKind Kind = 131 MCSymbolRefExpr::VariantKind::VK_None); 132 133 bool doInitialization(Module &M) override { 134 if (!TOC.empty()) 135 TOC.clear(); 136 return AsmPrinter::doInitialization(M); 137 } 138 139 void emitInstruction(const MachineInstr *MI) override; 140 141 /// This function is for PrintAsmOperand and PrintAsmMemoryOperand, 142 /// invoked by EmitMSInlineAsmStr and EmitGCCInlineAsmStr only. 143 /// The \p MI would be INLINEASM ONLY. 144 void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O); 145 146 void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &O) override; 147 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 148 const char *ExtraCode, raw_ostream &O) override; 149 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 150 const char *ExtraCode, raw_ostream &O) override; 151 152 void emitEndOfAsmFile(Module &M) override; 153 154 void LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI); 155 void LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI); 156 void EmitTlsCall(const MachineInstr *MI, MCSymbolRefExpr::VariantKind VK); 157 bool runOnMachineFunction(MachineFunction &MF) override { 158 Subtarget = &MF.getSubtarget<PPCSubtarget>(); 159 bool Changed = AsmPrinter::runOnMachineFunction(MF); 160 emitXRayTable(); 161 return Changed; 162 } 163 }; 164 165 /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux 166 class PPCLinuxAsmPrinter : public PPCAsmPrinter { 167 public: 168 explicit PPCLinuxAsmPrinter(TargetMachine &TM, 169 std::unique_ptr<MCStreamer> Streamer) 170 : PPCAsmPrinter(TM, std::move(Streamer)) {} 171 172 StringRef getPassName() const override { 173 return "Linux PPC Assembly Printer"; 174 } 175 176 void emitStartOfAsmFile(Module &M) override; 177 void emitEndOfAsmFile(Module &) override; 178 179 void emitFunctionEntryLabel() override; 180 181 void emitFunctionBodyStart() override; 182 void emitFunctionBodyEnd() override; 183 void emitInstruction(const MachineInstr *MI) override; 184 }; 185 186 class PPCAIXAsmPrinter : public PPCAsmPrinter { 187 private: 188 /// Symbols lowered from ExternalSymbolSDNodes, we will need to emit extern 189 /// linkage for them in AIX. 190 SmallPtrSet<MCSymbol *, 8> ExtSymSDNodeSymbols; 191 192 /// A format indicator and unique trailing identifier to form part of the 193 /// sinit/sterm function names. 194 std::string FormatIndicatorAndUniqueModId; 195 196 // Record a list of GlobalAlias associated with a GlobalObject. 197 // This is used for AIX's extra-label-at-definition aliasing strategy. 198 DenseMap<const GlobalObject *, SmallVector<const GlobalAlias *, 1>> 199 GOAliasMap; 200 201 void emitTracebackTable(); 202 203 SmallVector<const GlobalVariable *, 8> TOCDataGlobalVars; 204 205 void emitGlobalVariableHelper(const GlobalVariable *); 206 207 public: 208 PPCAIXAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer) 209 : PPCAsmPrinter(TM, std::move(Streamer)) { 210 if (MAI->isLittleEndian()) 211 report_fatal_error( 212 "cannot create AIX PPC Assembly Printer for a little-endian target"); 213 } 214 215 StringRef getPassName() const override { return "AIX PPC Assembly Printer"; } 216 217 bool doInitialization(Module &M) override; 218 219 void emitXXStructorList(const DataLayout &DL, const Constant *List, 220 bool IsCtor) override; 221 222 void SetupMachineFunction(MachineFunction &MF) override; 223 224 void emitGlobalVariable(const GlobalVariable *GV) override; 225 226 void emitFunctionDescriptor() override; 227 228 void emitFunctionEntryLabel() override; 229 230 void emitFunctionBodyEnd() override; 231 232 void emitEndOfAsmFile(Module &) override; 233 234 void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const override; 235 236 void emitInstruction(const MachineInstr *MI) override; 237 238 bool doFinalization(Module &M) override; 239 240 void emitTTypeReference(const GlobalValue *GV, unsigned Encoding) override; 241 }; 242 243 } // end anonymous namespace 244 245 void PPCAsmPrinter::PrintSymbolOperand(const MachineOperand &MO, 246 raw_ostream &O) { 247 // Computing the address of a global symbol, not calling it. 248 const GlobalValue *GV = MO.getGlobal(); 249 getSymbol(GV)->print(O, MAI); 250 printOffset(MO.getOffset(), O); 251 } 252 253 void PPCAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, 254 raw_ostream &O) { 255 const DataLayout &DL = getDataLayout(); 256 const MachineOperand &MO = MI->getOperand(OpNo); 257 258 switch (MO.getType()) { 259 case MachineOperand::MO_Register: { 260 // The MI is INLINEASM ONLY and UseVSXReg is always false. 261 const char *RegName = PPCInstPrinter::getRegisterName(MO.getReg()); 262 263 // Linux assembler (Others?) does not take register mnemonics. 264 // FIXME - What about special registers used in mfspr/mtspr? 265 O << PPCRegisterInfo::stripRegisterPrefix(RegName); 266 return; 267 } 268 case MachineOperand::MO_Immediate: 269 O << MO.getImm(); 270 return; 271 272 case MachineOperand::MO_MachineBasicBlock: 273 MO.getMBB()->getSymbol()->print(O, MAI); 274 return; 275 case MachineOperand::MO_ConstantPoolIndex: 276 O << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' 277 << MO.getIndex(); 278 return; 279 case MachineOperand::MO_BlockAddress: 280 GetBlockAddressSymbol(MO.getBlockAddress())->print(O, MAI); 281 return; 282 case MachineOperand::MO_GlobalAddress: { 283 PrintSymbolOperand(MO, O); 284 return; 285 } 286 287 default: 288 O << "<unknown operand type: " << (unsigned)MO.getType() << ">"; 289 return; 290 } 291 } 292 293 /// PrintAsmOperand - Print out an operand for an inline asm expression. 294 /// 295 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 296 const char *ExtraCode, raw_ostream &O) { 297 // Does this asm operand have a single letter operand modifier? 298 if (ExtraCode && ExtraCode[0]) { 299 if (ExtraCode[1] != 0) return true; // Unknown modifier. 300 301 switch (ExtraCode[0]) { 302 default: 303 // See if this is a generic print operand 304 return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, O); 305 case 'L': // Write second word of DImode reference. 306 // Verify that this operand has two consecutive registers. 307 if (!MI->getOperand(OpNo).isReg() || 308 OpNo+1 == MI->getNumOperands() || 309 !MI->getOperand(OpNo+1).isReg()) 310 return true; 311 ++OpNo; // Return the high-part. 312 break; 313 case 'I': 314 // Write 'i' if an integer constant, otherwise nothing. Used to print 315 // addi vs add, etc. 316 if (MI->getOperand(OpNo).isImm()) 317 O << "i"; 318 return false; 319 case 'x': 320 if(!MI->getOperand(OpNo).isReg()) 321 return true; 322 // This operand uses VSX numbering. 323 // If the operand is a VMX register, convert it to a VSX register. 324 Register Reg = MI->getOperand(OpNo).getReg(); 325 if (PPCInstrInfo::isVRRegister(Reg)) 326 Reg = PPC::VSX32 + (Reg - PPC::V0); 327 else if (PPCInstrInfo::isVFRegister(Reg)) 328 Reg = PPC::VSX32 + (Reg - PPC::VF0); 329 const char *RegName; 330 RegName = PPCInstPrinter::getRegisterName(Reg); 331 RegName = PPCRegisterInfo::stripRegisterPrefix(RegName); 332 O << RegName; 333 return false; 334 } 335 } 336 337 printOperand(MI, OpNo, O); 338 return false; 339 } 340 341 // At the moment, all inline asm memory operands are a single register. 342 // In any case, the output of this routine should always be just one 343 // assembler operand. 344 345 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 346 const char *ExtraCode, 347 raw_ostream &O) { 348 if (ExtraCode && ExtraCode[0]) { 349 if (ExtraCode[1] != 0) return true; // Unknown modifier. 350 351 switch (ExtraCode[0]) { 352 default: return true; // Unknown modifier. 353 case 'L': // A memory reference to the upper word of a double word op. 354 O << getDataLayout().getPointerSize() << "("; 355 printOperand(MI, OpNo, O); 356 O << ")"; 357 return false; 358 case 'y': // A memory reference for an X-form instruction 359 O << "0, "; 360 printOperand(MI, OpNo, O); 361 return false; 362 case 'U': // Print 'u' for update form. 363 case 'X': // Print 'x' for indexed form. 364 // FIXME: Currently for PowerPC memory operands are always loaded 365 // into a register, so we never get an update or indexed form. 366 // This is bad even for offset forms, since even if we know we 367 // have a value in -16(r1), we will generate a load into r<n> 368 // and then load from 0(r<n>). Until that issue is fixed, 369 // tolerate 'U' and 'X' but don't output anything. 370 assert(MI->getOperand(OpNo).isReg()); 371 return false; 372 } 373 } 374 375 assert(MI->getOperand(OpNo).isReg()); 376 O << "0("; 377 printOperand(MI, OpNo, O); 378 O << ")"; 379 return false; 380 } 381 382 /// lookUpOrCreateTOCEntry -- Given a symbol, look up whether a TOC entry 383 /// exists for it. If not, create one. Then return a symbol that references 384 /// the TOC entry. 385 MCSymbol * 386 PPCAsmPrinter::lookUpOrCreateTOCEntry(const MCSymbol *Sym, 387 MCSymbolRefExpr::VariantKind Kind) { 388 MCSymbol *&TOCEntry = TOC[{Sym, Kind}]; 389 if (!TOCEntry) 390 TOCEntry = createTempSymbol("C"); 391 return TOCEntry; 392 } 393 394 void PPCAsmPrinter::emitEndOfAsmFile(Module &M) { 395 emitStackMaps(SM); 396 } 397 398 void PPCAsmPrinter::LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI) { 399 unsigned NumNOPBytes = MI.getOperand(1).getImm(); 400 401 auto &Ctx = OutStreamer->getContext(); 402 MCSymbol *MILabel = Ctx.createTempSymbol(); 403 OutStreamer->emitLabel(MILabel); 404 405 SM.recordStackMap(*MILabel, MI); 406 assert(NumNOPBytes % 4 == 0 && "Invalid number of NOP bytes requested!"); 407 408 // Scan ahead to trim the shadow. 409 const MachineBasicBlock &MBB = *MI.getParent(); 410 MachineBasicBlock::const_iterator MII(MI); 411 ++MII; 412 while (NumNOPBytes > 0) { 413 if (MII == MBB.end() || MII->isCall() || 414 MII->getOpcode() == PPC::DBG_VALUE || 415 MII->getOpcode() == TargetOpcode::PATCHPOINT || 416 MII->getOpcode() == TargetOpcode::STACKMAP) 417 break; 418 ++MII; 419 NumNOPBytes -= 4; 420 } 421 422 // Emit nops. 423 for (unsigned i = 0; i < NumNOPBytes; i += 4) 424 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 425 } 426 427 // Lower a patchpoint of the form: 428 // [<def>], <id>, <numBytes>, <target>, <numArgs> 429 void PPCAsmPrinter::LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI) { 430 auto &Ctx = OutStreamer->getContext(); 431 MCSymbol *MILabel = Ctx.createTempSymbol(); 432 OutStreamer->emitLabel(MILabel); 433 434 SM.recordPatchPoint(*MILabel, MI); 435 PatchPointOpers Opers(&MI); 436 437 unsigned EncodedBytes = 0; 438 const MachineOperand &CalleeMO = Opers.getCallTarget(); 439 440 if (CalleeMO.isImm()) { 441 int64_t CallTarget = CalleeMO.getImm(); 442 if (CallTarget) { 443 assert((CallTarget & 0xFFFFFFFFFFFF) == CallTarget && 444 "High 16 bits of call target should be zero."); 445 Register ScratchReg = MI.getOperand(Opers.getNextScratchIdx()).getReg(); 446 EncodedBytes = 0; 447 // Materialize the jump address: 448 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI8) 449 .addReg(ScratchReg) 450 .addImm((CallTarget >> 32) & 0xFFFF)); 451 ++EncodedBytes; 452 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::RLDIC) 453 .addReg(ScratchReg) 454 .addReg(ScratchReg) 455 .addImm(32).addImm(16)); 456 ++EncodedBytes; 457 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORIS8) 458 .addReg(ScratchReg) 459 .addReg(ScratchReg) 460 .addImm((CallTarget >> 16) & 0xFFFF)); 461 ++EncodedBytes; 462 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORI8) 463 .addReg(ScratchReg) 464 .addReg(ScratchReg) 465 .addImm(CallTarget & 0xFFFF)); 466 467 // Save the current TOC pointer before the remote call. 468 int TOCSaveOffset = Subtarget->getFrameLowering()->getTOCSaveOffset(); 469 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::STD) 470 .addReg(PPC::X2) 471 .addImm(TOCSaveOffset) 472 .addReg(PPC::X1)); 473 ++EncodedBytes; 474 475 // If we're on ELFv1, then we need to load the actual function pointer 476 // from the function descriptor. 477 if (!Subtarget->isELFv2ABI()) { 478 // Load the new TOC pointer and the function address, but not r11 479 // (needing this is rare, and loading it here would prevent passing it 480 // via a 'nest' parameter. 481 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 482 .addReg(PPC::X2) 483 .addImm(8) 484 .addReg(ScratchReg)); 485 ++EncodedBytes; 486 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 487 .addReg(ScratchReg) 488 .addImm(0) 489 .addReg(ScratchReg)); 490 ++EncodedBytes; 491 } 492 493 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR8) 494 .addReg(ScratchReg)); 495 ++EncodedBytes; 496 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTRL8)); 497 ++EncodedBytes; 498 499 // Restore the TOC pointer after the call. 500 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 501 .addReg(PPC::X2) 502 .addImm(TOCSaveOffset) 503 .addReg(PPC::X1)); 504 ++EncodedBytes; 505 } 506 } else if (CalleeMO.isGlobal()) { 507 const GlobalValue *GValue = CalleeMO.getGlobal(); 508 MCSymbol *MOSymbol = getSymbol(GValue); 509 const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, OutContext); 510 511 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL8_NOP) 512 .addExpr(SymVar)); 513 EncodedBytes += 2; 514 } 515 516 // Each instruction is 4 bytes. 517 EncodedBytes *= 4; 518 519 // Emit padding. 520 unsigned NumBytes = Opers.getNumPatchBytes(); 521 assert(NumBytes >= EncodedBytes && 522 "Patchpoint can't request size less than the length of a call."); 523 assert((NumBytes - EncodedBytes) % 4 == 0 && 524 "Invalid number of NOP bytes requested!"); 525 for (unsigned i = EncodedBytes; i < NumBytes; i += 4) 526 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 527 } 528 529 /// This helper function creates the TlsGetAddr MCSymbol for AIX. We will 530 /// create the csect and use the qual-name symbol instead of creating just the 531 /// external symbol. 532 static MCSymbol *createMCSymbolForTlsGetAddr(MCContext &Ctx) { 533 return Ctx 534 .getXCOFFSection(".__tls_get_addr", SectionKind::getText(), 535 XCOFF::CsectProperties(XCOFF::XMC_PR, XCOFF::XTY_ER)) 536 ->getQualNameSymbol(); 537 } 538 539 /// EmitTlsCall -- Given a GETtls[ld]ADDR[32] instruction, print a 540 /// call to __tls_get_addr to the current output stream. 541 void PPCAsmPrinter::EmitTlsCall(const MachineInstr *MI, 542 MCSymbolRefExpr::VariantKind VK) { 543 MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None; 544 unsigned Opcode = PPC::BL8_NOP_TLS; 545 546 assert(MI->getNumOperands() >= 3 && "Expecting at least 3 operands from MI"); 547 if (MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSGD_PCREL_FLAG || 548 MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSLD_PCREL_FLAG) { 549 Kind = MCSymbolRefExpr::VK_PPC_NOTOC; 550 Opcode = PPC::BL8_NOTOC_TLS; 551 } 552 const Module *M = MF->getFunction().getParent(); 553 554 assert(MI->getOperand(0).isReg() && 555 ((Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::X3) || 556 (!Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::R3)) && 557 "GETtls[ld]ADDR[32] must define GPR3"); 558 assert(MI->getOperand(1).isReg() && 559 ((Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::X3) || 560 (!Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::R3)) && 561 "GETtls[ld]ADDR[32] must read GPR3"); 562 563 if (Subtarget->isAIXABI()) { 564 // On AIX, the variable offset should already be in R4 and the region handle 565 // should already be in R3. 566 // For TLSGD, which currently is the only supported access model, we only 567 // need to generate an absolute branch to .__tls_get_addr. 568 Register VarOffsetReg = Subtarget->isPPC64() ? PPC::X4 : PPC::R4; 569 (void)VarOffsetReg; 570 assert(MI->getOperand(2).isReg() && 571 MI->getOperand(2).getReg() == VarOffsetReg && 572 "GETtls[ld]ADDR[32] must read GPR4"); 573 MCSymbol *TlsGetAddr = createMCSymbolForTlsGetAddr(OutContext); 574 const MCExpr *TlsRef = MCSymbolRefExpr::create( 575 TlsGetAddr, MCSymbolRefExpr::VK_None, OutContext); 576 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BLA).addExpr(TlsRef)); 577 return; 578 } 579 580 MCSymbol *TlsGetAddr = OutContext.getOrCreateSymbol("__tls_get_addr"); 581 582 if (Subtarget->is32BitELFABI() && isPositionIndependent()) 583 Kind = MCSymbolRefExpr::VK_PLT; 584 585 const MCExpr *TlsRef = 586 MCSymbolRefExpr::create(TlsGetAddr, Kind, OutContext); 587 588 // Add 32768 offset to the symbol so we follow up the latest GOT/PLT ABI. 589 if (Kind == MCSymbolRefExpr::VK_PLT && Subtarget->isSecurePlt() && 590 M->getPICLevel() == PICLevel::BigPIC) 591 TlsRef = MCBinaryExpr::createAdd( 592 TlsRef, MCConstantExpr::create(32768, OutContext), OutContext); 593 const MachineOperand &MO = MI->getOperand(2); 594 const GlobalValue *GValue = MO.getGlobal(); 595 MCSymbol *MOSymbol = getSymbol(GValue); 596 const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, VK, OutContext); 597 EmitToStreamer(*OutStreamer, 598 MCInstBuilder(Subtarget->isPPC64() ? Opcode 599 : (unsigned)PPC::BL_TLS) 600 .addExpr(TlsRef) 601 .addExpr(SymVar)); 602 } 603 604 /// Map a machine operand for a TOC pseudo-machine instruction to its 605 /// corresponding MCSymbol. 606 static MCSymbol *getMCSymbolForTOCPseudoMO(const MachineOperand &MO, 607 AsmPrinter &AP) { 608 switch (MO.getType()) { 609 case MachineOperand::MO_GlobalAddress: 610 return AP.getSymbol(MO.getGlobal()); 611 case MachineOperand::MO_ConstantPoolIndex: 612 return AP.GetCPISymbol(MO.getIndex()); 613 case MachineOperand::MO_JumpTableIndex: 614 return AP.GetJTISymbol(MO.getIndex()); 615 case MachineOperand::MO_BlockAddress: 616 return AP.GetBlockAddressSymbol(MO.getBlockAddress()); 617 default: 618 llvm_unreachable("Unexpected operand type to get symbol."); 619 } 620 } 621 622 /// EmitInstruction -- Print out a single PowerPC MI in Darwin syntax to 623 /// the current output stream. 624 /// 625 void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) { 626 MCInst TmpInst; 627 const bool IsPPC64 = Subtarget->isPPC64(); 628 const bool IsAIX = Subtarget->isAIXABI(); 629 const Module *M = MF->getFunction().getParent(); 630 PICLevel::Level PL = M->getPICLevel(); 631 632 #ifndef NDEBUG 633 // Validate that SPE and FPU are mutually exclusive in codegen 634 if (!MI->isInlineAsm()) { 635 for (const MachineOperand &MO: MI->operands()) { 636 if (MO.isReg()) { 637 Register Reg = MO.getReg(); 638 if (Subtarget->hasSPE()) { 639 if (PPC::F4RCRegClass.contains(Reg) || 640 PPC::F8RCRegClass.contains(Reg) || 641 PPC::VFRCRegClass.contains(Reg) || 642 PPC::VRRCRegClass.contains(Reg) || 643 PPC::VSFRCRegClass.contains(Reg) || 644 PPC::VSSRCRegClass.contains(Reg) 645 ) 646 llvm_unreachable("SPE targets cannot have FPRegs!"); 647 } else { 648 if (PPC::SPERCRegClass.contains(Reg)) 649 llvm_unreachable("SPE register found in FPU-targeted code!"); 650 } 651 } 652 } 653 } 654 #endif 655 656 auto getTOCRelocAdjustedExprForXCOFF = [this](const MCExpr *Expr, 657 ptrdiff_t OriginalOffset) { 658 // Apply an offset to the TOC-based expression such that the adjusted 659 // notional offset from the TOC base (to be encoded into the instruction's D 660 // or DS field) is the signed 16-bit truncation of the original notional 661 // offset from the TOC base. 662 // This is consistent with the treatment used both by XL C/C++ and 663 // by AIX ld -r. 664 ptrdiff_t Adjustment = 665 OriginalOffset - llvm::SignExtend32<16>(OriginalOffset); 666 return MCBinaryExpr::createAdd( 667 Expr, MCConstantExpr::create(-Adjustment, OutContext), OutContext); 668 }; 669 670 auto getTOCEntryLoadingExprForXCOFF = 671 [IsPPC64, getTOCRelocAdjustedExprForXCOFF, 672 this](const MCSymbol *MOSymbol, const MCExpr *Expr, 673 MCSymbolRefExpr::VariantKind VK = 674 MCSymbolRefExpr::VariantKind::VK_None) -> const MCExpr * { 675 const unsigned EntryByteSize = IsPPC64 ? 8 : 4; 676 const auto TOCEntryIter = TOC.find({MOSymbol, VK}); 677 assert(TOCEntryIter != TOC.end() && 678 "Could not find the TOC entry for this symbol."); 679 const ptrdiff_t EntryDistanceFromTOCBase = 680 (TOCEntryIter - TOC.begin()) * EntryByteSize; 681 constexpr int16_t PositiveTOCRange = INT16_MAX; 682 683 if (EntryDistanceFromTOCBase > PositiveTOCRange) 684 return getTOCRelocAdjustedExprForXCOFF(Expr, EntryDistanceFromTOCBase); 685 686 return Expr; 687 }; 688 auto GetVKForMO = [&](const MachineOperand &MO) { 689 // For GD TLS access on AIX, we have two TOC entries for the symbol (one for 690 // the variable offset and the other for the region handle). They are 691 // differentiated by MO_TLSGD_FLAG and MO_TLSGDM_FLAG. 692 if (MO.getTargetFlags() & PPCII::MO_TLSGDM_FLAG) 693 return MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSGDM; 694 if (MO.getTargetFlags() & PPCII::MO_TLSGD_FLAG) 695 return MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSGD; 696 return MCSymbolRefExpr::VariantKind::VK_None; 697 }; 698 699 // Lower multi-instruction pseudo operations. 700 switch (MI->getOpcode()) { 701 default: break; 702 case TargetOpcode::DBG_VALUE: 703 llvm_unreachable("Should be handled target independently"); 704 case TargetOpcode::STACKMAP: 705 return LowerSTACKMAP(SM, *MI); 706 case TargetOpcode::PATCHPOINT: 707 return LowerPATCHPOINT(SM, *MI); 708 709 case PPC::MoveGOTtoLR: { 710 // Transform %lr = MoveGOTtoLR 711 // Into this: bl _GLOBAL_OFFSET_TABLE_@local-4 712 // _GLOBAL_OFFSET_TABLE_@local-4 (instruction preceding 713 // _GLOBAL_OFFSET_TABLE_) has exactly one instruction: 714 // blrl 715 // This will return the pointer to _GLOBAL_OFFSET_TABLE_@local 716 MCSymbol *GOTSymbol = 717 OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); 718 const MCExpr *OffsExpr = 719 MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol, 720 MCSymbolRefExpr::VK_PPC_LOCAL, 721 OutContext), 722 MCConstantExpr::create(4, OutContext), 723 OutContext); 724 725 // Emit the 'bl'. 726 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL).addExpr(OffsExpr)); 727 return; 728 } 729 case PPC::MovePCtoLR: 730 case PPC::MovePCtoLR8: { 731 // Transform %lr = MovePCtoLR 732 // Into this, where the label is the PIC base: 733 // bl L1$pb 734 // L1$pb: 735 MCSymbol *PICBase = MF->getPICBaseSymbol(); 736 737 // Emit the 'bl'. 738 EmitToStreamer(*OutStreamer, 739 MCInstBuilder(PPC::BL) 740 // FIXME: We would like an efficient form for this, so we 741 // don't have to do a lot of extra uniquing. 742 .addExpr(MCSymbolRefExpr::create(PICBase, OutContext))); 743 744 // Emit the label. 745 OutStreamer->emitLabel(PICBase); 746 return; 747 } 748 case PPC::UpdateGBR: { 749 // Transform %rd = UpdateGBR(%rt, %ri) 750 // Into: lwz %rt, .L0$poff - .L0$pb(%ri) 751 // add %rd, %rt, %ri 752 // or into (if secure plt mode is on): 753 // addis r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@ha 754 // addi r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@l 755 // Get the offset from the GOT Base Register to the GOT 756 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 757 if (Subtarget->isSecurePlt() && isPositionIndependent() ) { 758 unsigned PICR = TmpInst.getOperand(0).getReg(); 759 MCSymbol *BaseSymbol = OutContext.getOrCreateSymbol( 760 M->getPICLevel() == PICLevel::SmallPIC ? "_GLOBAL_OFFSET_TABLE_" 761 : ".LTOC"); 762 const MCExpr *PB = 763 MCSymbolRefExpr::create(MF->getPICBaseSymbol(), OutContext); 764 765 const MCExpr *DeltaExpr = MCBinaryExpr::createSub( 766 MCSymbolRefExpr::create(BaseSymbol, OutContext), PB, OutContext); 767 768 const MCExpr *DeltaHi = PPCMCExpr::createHa(DeltaExpr, OutContext); 769 EmitToStreamer( 770 *OutStreamer, 771 MCInstBuilder(PPC::ADDIS).addReg(PICR).addReg(PICR).addExpr(DeltaHi)); 772 773 const MCExpr *DeltaLo = PPCMCExpr::createLo(DeltaExpr, OutContext); 774 EmitToStreamer( 775 *OutStreamer, 776 MCInstBuilder(PPC::ADDI).addReg(PICR).addReg(PICR).addExpr(DeltaLo)); 777 return; 778 } else { 779 MCSymbol *PICOffset = 780 MF->getInfo<PPCFunctionInfo>()->getPICOffsetSymbol(*MF); 781 TmpInst.setOpcode(PPC::LWZ); 782 const MCExpr *Exp = 783 MCSymbolRefExpr::create(PICOffset, MCSymbolRefExpr::VK_None, OutContext); 784 const MCExpr *PB = 785 MCSymbolRefExpr::create(MF->getPICBaseSymbol(), 786 MCSymbolRefExpr::VK_None, 787 OutContext); 788 const MCOperand TR = TmpInst.getOperand(1); 789 const MCOperand PICR = TmpInst.getOperand(0); 790 791 // Step 1: lwz %rt, .L$poff - .L$pb(%ri) 792 TmpInst.getOperand(1) = 793 MCOperand::createExpr(MCBinaryExpr::createSub(Exp, PB, OutContext)); 794 TmpInst.getOperand(0) = TR; 795 TmpInst.getOperand(2) = PICR; 796 EmitToStreamer(*OutStreamer, TmpInst); 797 798 TmpInst.setOpcode(PPC::ADD4); 799 TmpInst.getOperand(0) = PICR; 800 TmpInst.getOperand(1) = TR; 801 TmpInst.getOperand(2) = PICR; 802 EmitToStreamer(*OutStreamer, TmpInst); 803 return; 804 } 805 } 806 case PPC::LWZtoc: { 807 // Transform %rN = LWZtoc @op1, %r2 808 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 809 810 // Change the opcode to LWZ. 811 TmpInst.setOpcode(PPC::LWZ); 812 813 const MachineOperand &MO = MI->getOperand(1); 814 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) && 815 "Invalid operand for LWZtoc."); 816 817 // Map the operand to its corresponding MCSymbol. 818 const MCSymbol *const MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this); 819 820 // Create a reference to the GOT entry for the symbol. The GOT entry will be 821 // synthesized later. 822 if (PL == PICLevel::SmallPIC && !IsAIX) { 823 const MCExpr *Exp = 824 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_GOT, 825 OutContext); 826 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 827 EmitToStreamer(*OutStreamer, TmpInst); 828 return; 829 } 830 831 MCSymbolRefExpr::VariantKind VK = GetVKForMO(MO); 832 833 // Otherwise, use the TOC. 'TOCEntry' is a label used to reference the 834 // storage allocated in the TOC which contains the address of 835 // 'MOSymbol'. Said TOC entry will be synthesized later. 836 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol, VK); 837 const MCExpr *Exp = 838 MCSymbolRefExpr::create(TOCEntry, MCSymbolRefExpr::VK_None, OutContext); 839 840 // AIX uses the label directly as the lwz displacement operand for 841 // references into the toc section. The displacement value will be generated 842 // relative to the toc-base. 843 if (IsAIX) { 844 assert( 845 TM.getCodeModel() == CodeModel::Small && 846 "This pseudo should only be selected for 32-bit small code model."); 847 Exp = getTOCEntryLoadingExprForXCOFF(MOSymbol, Exp, VK); 848 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 849 EmitToStreamer(*OutStreamer, TmpInst); 850 return; 851 } 852 853 // Create an explicit subtract expression between the local symbol and 854 // '.LTOC' to manifest the toc-relative offset. 855 const MCExpr *PB = MCSymbolRefExpr::create( 856 OutContext.getOrCreateSymbol(Twine(".LTOC")), OutContext); 857 Exp = MCBinaryExpr::createSub(Exp, PB, OutContext); 858 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 859 EmitToStreamer(*OutStreamer, TmpInst); 860 return; 861 } 862 case PPC::ADDItoc: { 863 assert(IsAIX && TM.getCodeModel() == CodeModel::Small && 864 "Operand only valid in AIX 32 bit mode"); 865 866 // Transform %rN = ADDItoc @op1, %r2. 867 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 868 869 // Change the opcode to load address. 870 TmpInst.setOpcode(PPC::LA); 871 872 const MachineOperand &MO = MI->getOperand(1); 873 assert(MO.isGlobal() && "Invalid operand for ADDItoc."); 874 875 // Map the operand to its corresponding MCSymbol. 876 const MCSymbol *const MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this); 877 878 const MCExpr *Exp = 879 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_None, OutContext); 880 881 TmpInst.getOperand(1) = TmpInst.getOperand(2); 882 TmpInst.getOperand(2) = MCOperand::createExpr(Exp); 883 EmitToStreamer(*OutStreamer, TmpInst); 884 return; 885 } 886 case PPC::LDtocJTI: 887 case PPC::LDtocCPT: 888 case PPC::LDtocBA: 889 case PPC::LDtoc: { 890 // Transform %x3 = LDtoc @min1, %x2 891 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 892 893 // Change the opcode to LD. 894 TmpInst.setOpcode(PPC::LD); 895 896 const MachineOperand &MO = MI->getOperand(1); 897 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) && 898 "Invalid operand!"); 899 900 // Map the operand to its corresponding MCSymbol. 901 const MCSymbol *const MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this); 902 903 MCSymbolRefExpr::VariantKind VK = GetVKForMO(MO); 904 905 // Map the machine operand to its corresponding MCSymbol, then map the 906 // global address operand to be a reference to the TOC entry we will 907 // synthesize later. 908 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol, VK); 909 910 MCSymbolRefExpr::VariantKind VKExpr = 911 IsAIX ? MCSymbolRefExpr::VK_None : MCSymbolRefExpr::VK_PPC_TOC; 912 const MCExpr *Exp = MCSymbolRefExpr::create(TOCEntry, VKExpr, OutContext); 913 TmpInst.getOperand(1) = MCOperand::createExpr( 914 IsAIX ? getTOCEntryLoadingExprForXCOFF(MOSymbol, Exp, VK) : Exp); 915 EmitToStreamer(*OutStreamer, TmpInst); 916 return; 917 } 918 case PPC::ADDIStocHA: { 919 assert((IsAIX && !IsPPC64 && TM.getCodeModel() == CodeModel::Large) && 920 "This pseudo should only be selected for 32-bit large code model on" 921 " AIX."); 922 923 // Transform %rd = ADDIStocHA %rA, @sym(%r2) 924 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 925 926 // Change the opcode to ADDIS. 927 TmpInst.setOpcode(PPC::ADDIS); 928 929 const MachineOperand &MO = MI->getOperand(2); 930 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) && 931 "Invalid operand for ADDIStocHA."); 932 933 // Map the machine operand to its corresponding MCSymbol. 934 MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this); 935 936 MCSymbolRefExpr::VariantKind VK = GetVKForMO(MO); 937 938 // Always use TOC on AIX. Map the global address operand to be a reference 939 // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to 940 // reference the storage allocated in the TOC which contains the address of 941 // 'MOSymbol'. 942 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol, VK); 943 const MCExpr *Exp = MCSymbolRefExpr::create(TOCEntry, 944 MCSymbolRefExpr::VK_PPC_U, 945 OutContext); 946 TmpInst.getOperand(2) = MCOperand::createExpr(Exp); 947 EmitToStreamer(*OutStreamer, TmpInst); 948 return; 949 } 950 case PPC::LWZtocL: { 951 assert(IsAIX && !IsPPC64 && TM.getCodeModel() == CodeModel::Large && 952 "This pseudo should only be selected for 32-bit large code model on" 953 " AIX."); 954 955 // Transform %rd = LWZtocL @sym, %rs. 956 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 957 958 // Change the opcode to lwz. 959 TmpInst.setOpcode(PPC::LWZ); 960 961 const MachineOperand &MO = MI->getOperand(1); 962 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) && 963 "Invalid operand for LWZtocL."); 964 965 // Map the machine operand to its corresponding MCSymbol. 966 MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this); 967 968 MCSymbolRefExpr::VariantKind VK = GetVKForMO(MO); 969 970 // Always use TOC on AIX. Map the global address operand to be a reference 971 // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to 972 // reference the storage allocated in the TOC which contains the address of 973 // 'MOSymbol'. 974 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol, VK); 975 const MCExpr *Exp = MCSymbolRefExpr::create(TOCEntry, 976 MCSymbolRefExpr::VK_PPC_L, 977 OutContext); 978 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 979 EmitToStreamer(*OutStreamer, TmpInst); 980 return; 981 } 982 case PPC::ADDIStocHA8: { 983 // Transform %xd = ADDIStocHA8 %x2, @sym 984 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 985 986 // Change the opcode to ADDIS8. If the global address is the address of 987 // an external symbol, is a jump table address, is a block address, or is a 988 // constant pool index with large code model enabled, then generate a TOC 989 // entry and reference that. Otherwise, reference the symbol directly. 990 TmpInst.setOpcode(PPC::ADDIS8); 991 992 const MachineOperand &MO = MI->getOperand(2); 993 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) && 994 "Invalid operand for ADDIStocHA8!"); 995 996 const MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this); 997 998 MCSymbolRefExpr::VariantKind VK = GetVKForMO(MO); 999 1000 const bool GlobalToc = 1001 MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal()); 1002 if (GlobalToc || MO.isJTI() || MO.isBlockAddress() || 1003 (MO.isCPI() && TM.getCodeModel() == CodeModel::Large)) 1004 MOSymbol = lookUpOrCreateTOCEntry(MOSymbol, VK); 1005 1006 VK = IsAIX ? MCSymbolRefExpr::VK_PPC_U : MCSymbolRefExpr::VK_PPC_TOC_HA; 1007 1008 const MCExpr *Exp = 1009 MCSymbolRefExpr::create(MOSymbol, VK, OutContext); 1010 1011 if (!MO.isJTI() && MO.getOffset()) 1012 Exp = MCBinaryExpr::createAdd(Exp, 1013 MCConstantExpr::create(MO.getOffset(), 1014 OutContext), 1015 OutContext); 1016 1017 TmpInst.getOperand(2) = MCOperand::createExpr(Exp); 1018 EmitToStreamer(*OutStreamer, TmpInst); 1019 return; 1020 } 1021 case PPC::LDtocL: { 1022 // Transform %xd = LDtocL @sym, %xs 1023 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 1024 1025 // Change the opcode to LD. If the global address is the address of 1026 // an external symbol, is a jump table address, is a block address, or is 1027 // a constant pool index with large code model enabled, then generate a 1028 // TOC entry and reference that. Otherwise, reference the symbol directly. 1029 TmpInst.setOpcode(PPC::LD); 1030 1031 const MachineOperand &MO = MI->getOperand(1); 1032 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || 1033 MO.isBlockAddress()) && 1034 "Invalid operand for LDtocL!"); 1035 1036 LLVM_DEBUG(assert( 1037 (!MO.isGlobal() || Subtarget->isGVIndirectSymbol(MO.getGlobal())) && 1038 "LDtocL used on symbol that could be accessed directly is " 1039 "invalid. Must match ADDIStocHA8.")); 1040 1041 const MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this); 1042 1043 MCSymbolRefExpr::VariantKind VK = GetVKForMO(MO); 1044 1045 if (!MO.isCPI() || TM.getCodeModel() == CodeModel::Large) 1046 MOSymbol = lookUpOrCreateTOCEntry(MOSymbol, VK); 1047 1048 VK = IsAIX ? MCSymbolRefExpr::VK_PPC_L : MCSymbolRefExpr::VK_PPC_TOC_LO; 1049 const MCExpr *Exp = 1050 MCSymbolRefExpr::create(MOSymbol, VK, OutContext); 1051 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 1052 EmitToStreamer(*OutStreamer, TmpInst); 1053 return; 1054 } 1055 case PPC::ADDItocL: { 1056 // Transform %xd = ADDItocL %xs, @sym 1057 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 1058 1059 // Change the opcode to ADDI8. If the global address is external, then 1060 // generate a TOC entry and reference that. Otherwise, reference the 1061 // symbol directly. 1062 TmpInst.setOpcode(PPC::ADDI8); 1063 1064 const MachineOperand &MO = MI->getOperand(2); 1065 assert((MO.isGlobal() || MO.isCPI()) && "Invalid operand for ADDItocL."); 1066 1067 LLVM_DEBUG(assert( 1068 !(MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal())) && 1069 "Interposable definitions must use indirect access.")); 1070 1071 const MCExpr *Exp = 1072 MCSymbolRefExpr::create(getMCSymbolForTOCPseudoMO(MO, *this), 1073 MCSymbolRefExpr::VK_PPC_TOC_LO, OutContext); 1074 TmpInst.getOperand(2) = MCOperand::createExpr(Exp); 1075 EmitToStreamer(*OutStreamer, TmpInst); 1076 return; 1077 } 1078 case PPC::ADDISgotTprelHA: { 1079 // Transform: %xd = ADDISgotTprelHA %x2, @sym 1080 // Into: %xd = ADDIS8 %x2, sym@got@tlsgd@ha 1081 assert(IsPPC64 && "Not supported for 32-bit PowerPC"); 1082 const MachineOperand &MO = MI->getOperand(2); 1083 const GlobalValue *GValue = MO.getGlobal(); 1084 MCSymbol *MOSymbol = getSymbol(GValue); 1085 const MCExpr *SymGotTprel = 1086 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA, 1087 OutContext); 1088 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8) 1089 .addReg(MI->getOperand(0).getReg()) 1090 .addReg(MI->getOperand(1).getReg()) 1091 .addExpr(SymGotTprel)); 1092 return; 1093 } 1094 case PPC::LDgotTprelL: 1095 case PPC::LDgotTprelL32: { 1096 // Transform %xd = LDgotTprelL @sym, %xs 1097 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 1098 1099 // Change the opcode to LD. 1100 TmpInst.setOpcode(IsPPC64 ? PPC::LD : PPC::LWZ); 1101 const MachineOperand &MO = MI->getOperand(1); 1102 const GlobalValue *GValue = MO.getGlobal(); 1103 MCSymbol *MOSymbol = getSymbol(GValue); 1104 const MCExpr *Exp = MCSymbolRefExpr::create( 1105 MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO 1106 : MCSymbolRefExpr::VK_PPC_GOT_TPREL, 1107 OutContext); 1108 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 1109 EmitToStreamer(*OutStreamer, TmpInst); 1110 return; 1111 } 1112 1113 case PPC::PPC32PICGOT: { 1114 MCSymbol *GOTSymbol = OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); 1115 MCSymbol *GOTRef = OutContext.createTempSymbol(); 1116 MCSymbol *NextInstr = OutContext.createTempSymbol(); 1117 1118 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL) 1119 // FIXME: We would like an efficient form for this, so we don't have to do 1120 // a lot of extra uniquing. 1121 .addExpr(MCSymbolRefExpr::create(NextInstr, OutContext))); 1122 const MCExpr *OffsExpr = 1123 MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol, OutContext), 1124 MCSymbolRefExpr::create(GOTRef, OutContext), 1125 OutContext); 1126 OutStreamer->emitLabel(GOTRef); 1127 OutStreamer->emitValue(OffsExpr, 4); 1128 OutStreamer->emitLabel(NextInstr); 1129 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR) 1130 .addReg(MI->getOperand(0).getReg())); 1131 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LWZ) 1132 .addReg(MI->getOperand(1).getReg()) 1133 .addImm(0) 1134 .addReg(MI->getOperand(0).getReg())); 1135 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD4) 1136 .addReg(MI->getOperand(0).getReg()) 1137 .addReg(MI->getOperand(1).getReg()) 1138 .addReg(MI->getOperand(0).getReg())); 1139 return; 1140 } 1141 case PPC::PPC32GOT: { 1142 MCSymbol *GOTSymbol = 1143 OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); 1144 const MCExpr *SymGotTlsL = MCSymbolRefExpr::create( 1145 GOTSymbol, MCSymbolRefExpr::VK_PPC_LO, OutContext); 1146 const MCExpr *SymGotTlsHA = MCSymbolRefExpr::create( 1147 GOTSymbol, MCSymbolRefExpr::VK_PPC_HA, OutContext); 1148 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI) 1149 .addReg(MI->getOperand(0).getReg()) 1150 .addExpr(SymGotTlsL)); 1151 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS) 1152 .addReg(MI->getOperand(0).getReg()) 1153 .addReg(MI->getOperand(0).getReg()) 1154 .addExpr(SymGotTlsHA)); 1155 return; 1156 } 1157 case PPC::ADDIStlsgdHA: { 1158 // Transform: %xd = ADDIStlsgdHA %x2, @sym 1159 // Into: %xd = ADDIS8 %x2, sym@got@tlsgd@ha 1160 assert(IsPPC64 && "Not supported for 32-bit PowerPC"); 1161 const MachineOperand &MO = MI->getOperand(2); 1162 const GlobalValue *GValue = MO.getGlobal(); 1163 MCSymbol *MOSymbol = getSymbol(GValue); 1164 const MCExpr *SymGotTlsGD = 1165 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA, 1166 OutContext); 1167 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8) 1168 .addReg(MI->getOperand(0).getReg()) 1169 .addReg(MI->getOperand(1).getReg()) 1170 .addExpr(SymGotTlsGD)); 1171 return; 1172 } 1173 case PPC::ADDItlsgdL: 1174 // Transform: %xd = ADDItlsgdL %xs, @sym 1175 // Into: %xd = ADDI8 %xs, sym@got@tlsgd@l 1176 case PPC::ADDItlsgdL32: { 1177 // Transform: %rd = ADDItlsgdL32 %rs, @sym 1178 // Into: %rd = ADDI %rs, sym@got@tlsgd 1179 const MachineOperand &MO = MI->getOperand(2); 1180 const GlobalValue *GValue = MO.getGlobal(); 1181 MCSymbol *MOSymbol = getSymbol(GValue); 1182 const MCExpr *SymGotTlsGD = MCSymbolRefExpr::create( 1183 MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO 1184 : MCSymbolRefExpr::VK_PPC_GOT_TLSGD, 1185 OutContext); 1186 EmitToStreamer(*OutStreamer, 1187 MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI) 1188 .addReg(MI->getOperand(0).getReg()) 1189 .addReg(MI->getOperand(1).getReg()) 1190 .addExpr(SymGotTlsGD)); 1191 return; 1192 } 1193 case PPC::GETtlsADDR: 1194 // Transform: %x3 = GETtlsADDR %x3, @sym 1195 // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsgd) 1196 case PPC::GETtlsADDRPCREL: 1197 case PPC::GETtlsADDR32AIX: 1198 case PPC::GETtlsADDR64AIX: 1199 // Transform: %r3 = GETtlsADDRNNAIX %r3, %r4 (for NN == 32/64). 1200 // Into: BLA .__tls_get_addr() 1201 // Unlike on Linux, there is no symbol or relocation needed for this call. 1202 case PPC::GETtlsADDR32: { 1203 // Transform: %r3 = GETtlsADDR32 %r3, @sym 1204 // Into: BL_TLS __tls_get_addr(sym at tlsgd)@PLT 1205 EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSGD); 1206 return; 1207 } 1208 case PPC::ADDIStlsldHA: { 1209 // Transform: %xd = ADDIStlsldHA %x2, @sym 1210 // Into: %xd = ADDIS8 %x2, sym@got@tlsld@ha 1211 assert(IsPPC64 && "Not supported for 32-bit PowerPC"); 1212 const MachineOperand &MO = MI->getOperand(2); 1213 const GlobalValue *GValue = MO.getGlobal(); 1214 MCSymbol *MOSymbol = getSymbol(GValue); 1215 const MCExpr *SymGotTlsLD = 1216 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA, 1217 OutContext); 1218 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8) 1219 .addReg(MI->getOperand(0).getReg()) 1220 .addReg(MI->getOperand(1).getReg()) 1221 .addExpr(SymGotTlsLD)); 1222 return; 1223 } 1224 case PPC::ADDItlsldL: 1225 // Transform: %xd = ADDItlsldL %xs, @sym 1226 // Into: %xd = ADDI8 %xs, sym@got@tlsld@l 1227 case PPC::ADDItlsldL32: { 1228 // Transform: %rd = ADDItlsldL32 %rs, @sym 1229 // Into: %rd = ADDI %rs, sym@got@tlsld 1230 const MachineOperand &MO = MI->getOperand(2); 1231 const GlobalValue *GValue = MO.getGlobal(); 1232 MCSymbol *MOSymbol = getSymbol(GValue); 1233 const MCExpr *SymGotTlsLD = MCSymbolRefExpr::create( 1234 MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO 1235 : MCSymbolRefExpr::VK_PPC_GOT_TLSLD, 1236 OutContext); 1237 EmitToStreamer(*OutStreamer, 1238 MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI) 1239 .addReg(MI->getOperand(0).getReg()) 1240 .addReg(MI->getOperand(1).getReg()) 1241 .addExpr(SymGotTlsLD)); 1242 return; 1243 } 1244 case PPC::GETtlsldADDR: 1245 // Transform: %x3 = GETtlsldADDR %x3, @sym 1246 // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsld) 1247 case PPC::GETtlsldADDRPCREL: 1248 case PPC::GETtlsldADDR32: { 1249 // Transform: %r3 = GETtlsldADDR32 %r3, @sym 1250 // Into: BL_TLS __tls_get_addr(sym at tlsld)@PLT 1251 EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSLD); 1252 return; 1253 } 1254 case PPC::ADDISdtprelHA: 1255 // Transform: %xd = ADDISdtprelHA %xs, @sym 1256 // Into: %xd = ADDIS8 %xs, sym@dtprel@ha 1257 case PPC::ADDISdtprelHA32: { 1258 // Transform: %rd = ADDISdtprelHA32 %rs, @sym 1259 // Into: %rd = ADDIS %rs, sym@dtprel@ha 1260 const MachineOperand &MO = MI->getOperand(2); 1261 const GlobalValue *GValue = MO.getGlobal(); 1262 MCSymbol *MOSymbol = getSymbol(GValue); 1263 const MCExpr *SymDtprel = 1264 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_HA, 1265 OutContext); 1266 EmitToStreamer( 1267 *OutStreamer, 1268 MCInstBuilder(IsPPC64 ? PPC::ADDIS8 : PPC::ADDIS) 1269 .addReg(MI->getOperand(0).getReg()) 1270 .addReg(MI->getOperand(1).getReg()) 1271 .addExpr(SymDtprel)); 1272 return; 1273 } 1274 case PPC::PADDIdtprel: { 1275 // Transform: %rd = PADDIdtprel %rs, @sym 1276 // Into: %rd = PADDI8 %rs, sym@dtprel 1277 const MachineOperand &MO = MI->getOperand(2); 1278 const GlobalValue *GValue = MO.getGlobal(); 1279 MCSymbol *MOSymbol = getSymbol(GValue); 1280 const MCExpr *SymDtprel = MCSymbolRefExpr::create( 1281 MOSymbol, MCSymbolRefExpr::VK_DTPREL, OutContext); 1282 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::PADDI8) 1283 .addReg(MI->getOperand(0).getReg()) 1284 .addReg(MI->getOperand(1).getReg()) 1285 .addExpr(SymDtprel)); 1286 return; 1287 } 1288 1289 case PPC::ADDIdtprelL: 1290 // Transform: %xd = ADDIdtprelL %xs, @sym 1291 // Into: %xd = ADDI8 %xs, sym@dtprel@l 1292 case PPC::ADDIdtprelL32: { 1293 // Transform: %rd = ADDIdtprelL32 %rs, @sym 1294 // Into: %rd = ADDI %rs, sym@dtprel@l 1295 const MachineOperand &MO = MI->getOperand(2); 1296 const GlobalValue *GValue = MO.getGlobal(); 1297 MCSymbol *MOSymbol = getSymbol(GValue); 1298 const MCExpr *SymDtprel = 1299 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_LO, 1300 OutContext); 1301 EmitToStreamer(*OutStreamer, 1302 MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI) 1303 .addReg(MI->getOperand(0).getReg()) 1304 .addReg(MI->getOperand(1).getReg()) 1305 .addExpr(SymDtprel)); 1306 return; 1307 } 1308 case PPC::MFOCRF: 1309 case PPC::MFOCRF8: 1310 if (!Subtarget->hasMFOCRF()) { 1311 // Transform: %r3 = MFOCRF %cr7 1312 // Into: %r3 = MFCR ;; cr7 1313 unsigned NewOpcode = 1314 MI->getOpcode() == PPC::MFOCRF ? PPC::MFCR : PPC::MFCR8; 1315 OutStreamer->AddComment(PPCInstPrinter:: 1316 getRegisterName(MI->getOperand(1).getReg())); 1317 EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode) 1318 .addReg(MI->getOperand(0).getReg())); 1319 return; 1320 } 1321 break; 1322 case PPC::MTOCRF: 1323 case PPC::MTOCRF8: 1324 if (!Subtarget->hasMFOCRF()) { 1325 // Transform: %cr7 = MTOCRF %r3 1326 // Into: MTCRF mask, %r3 ;; cr7 1327 unsigned NewOpcode = 1328 MI->getOpcode() == PPC::MTOCRF ? PPC::MTCRF : PPC::MTCRF8; 1329 unsigned Mask = 0x80 >> OutContext.getRegisterInfo() 1330 ->getEncodingValue(MI->getOperand(0).getReg()); 1331 OutStreamer->AddComment(PPCInstPrinter:: 1332 getRegisterName(MI->getOperand(0).getReg())); 1333 EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode) 1334 .addImm(Mask) 1335 .addReg(MI->getOperand(1).getReg())); 1336 return; 1337 } 1338 break; 1339 case PPC::LD: 1340 case PPC::STD: 1341 case PPC::LWA_32: 1342 case PPC::LWA: { 1343 // Verify alignment is legal, so we don't create relocations 1344 // that can't be supported. 1345 unsigned OpNum = (MI->getOpcode() == PPC::STD) ? 2 : 1; 1346 const MachineOperand &MO = MI->getOperand(OpNum); 1347 if (MO.isGlobal()) { 1348 const DataLayout &DL = MO.getGlobal()->getParent()->getDataLayout(); 1349 if (MO.getGlobal()->getPointerAlignment(DL) < 4) 1350 llvm_unreachable("Global must be word-aligned for LD, STD, LWA!"); 1351 } 1352 // Now process the instruction normally. 1353 break; 1354 } 1355 } 1356 1357 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this); 1358 EmitToStreamer(*OutStreamer, TmpInst); 1359 } 1360 1361 void PPCLinuxAsmPrinter::emitInstruction(const MachineInstr *MI) { 1362 if (!Subtarget->isPPC64()) 1363 return PPCAsmPrinter::emitInstruction(MI); 1364 1365 switch (MI->getOpcode()) { 1366 default: 1367 return PPCAsmPrinter::emitInstruction(MI); 1368 case TargetOpcode::PATCHABLE_FUNCTION_ENTER: { 1369 // .begin: 1370 // b .end # lis 0, FuncId[16..32] 1371 // nop # li 0, FuncId[0..15] 1372 // std 0, -8(1) 1373 // mflr 0 1374 // bl __xray_FunctionEntry 1375 // mtlr 0 1376 // .end: 1377 // 1378 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number 1379 // of instructions change. 1380 MCSymbol *BeginOfSled = OutContext.createTempSymbol(); 1381 MCSymbol *EndOfSled = OutContext.createTempSymbol(); 1382 OutStreamer->emitLabel(BeginOfSled); 1383 EmitToStreamer(*OutStreamer, 1384 MCInstBuilder(PPC::B).addExpr( 1385 MCSymbolRefExpr::create(EndOfSled, OutContext))); 1386 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 1387 EmitToStreamer( 1388 *OutStreamer, 1389 MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1)); 1390 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0)); 1391 EmitToStreamer(*OutStreamer, 1392 MCInstBuilder(PPC::BL8_NOP) 1393 .addExpr(MCSymbolRefExpr::create( 1394 OutContext.getOrCreateSymbol("__xray_FunctionEntry"), 1395 OutContext))); 1396 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0)); 1397 OutStreamer->emitLabel(EndOfSled); 1398 recordSled(BeginOfSled, *MI, SledKind::FUNCTION_ENTER, 2); 1399 break; 1400 } 1401 case TargetOpcode::PATCHABLE_RET: { 1402 unsigned RetOpcode = MI->getOperand(0).getImm(); 1403 MCInst RetInst; 1404 RetInst.setOpcode(RetOpcode); 1405 for (const auto &MO : llvm::drop_begin(MI->operands())) { 1406 MCOperand MCOp; 1407 if (LowerPPCMachineOperandToMCOperand(MO, MCOp, *this)) 1408 RetInst.addOperand(MCOp); 1409 } 1410 1411 bool IsConditional; 1412 if (RetOpcode == PPC::BCCLR) { 1413 IsConditional = true; 1414 } else if (RetOpcode == PPC::TCRETURNdi8 || RetOpcode == PPC::TCRETURNri8 || 1415 RetOpcode == PPC::TCRETURNai8) { 1416 break; 1417 } else if (RetOpcode == PPC::BLR8 || RetOpcode == PPC::TAILB8) { 1418 IsConditional = false; 1419 } else { 1420 EmitToStreamer(*OutStreamer, RetInst); 1421 break; 1422 } 1423 1424 MCSymbol *FallthroughLabel; 1425 if (IsConditional) { 1426 // Before: 1427 // bgtlr cr0 1428 // 1429 // After: 1430 // ble cr0, .end 1431 // .p2align 3 1432 // .begin: 1433 // blr # lis 0, FuncId[16..32] 1434 // nop # li 0, FuncId[0..15] 1435 // std 0, -8(1) 1436 // mflr 0 1437 // bl __xray_FunctionExit 1438 // mtlr 0 1439 // blr 1440 // .end: 1441 // 1442 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number 1443 // of instructions change. 1444 FallthroughLabel = OutContext.createTempSymbol(); 1445 EmitToStreamer( 1446 *OutStreamer, 1447 MCInstBuilder(PPC::BCC) 1448 .addImm(PPC::InvertPredicate( 1449 static_cast<PPC::Predicate>(MI->getOperand(1).getImm()))) 1450 .addReg(MI->getOperand(2).getReg()) 1451 .addExpr(MCSymbolRefExpr::create(FallthroughLabel, OutContext))); 1452 RetInst = MCInst(); 1453 RetInst.setOpcode(PPC::BLR8); 1454 } 1455 // .p2align 3 1456 // .begin: 1457 // b(lr)? # lis 0, FuncId[16..32] 1458 // nop # li 0, FuncId[0..15] 1459 // std 0, -8(1) 1460 // mflr 0 1461 // bl __xray_FunctionExit 1462 // mtlr 0 1463 // b(lr)? 1464 // 1465 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number 1466 // of instructions change. 1467 OutStreamer->emitCodeAlignment(8); 1468 MCSymbol *BeginOfSled = OutContext.createTempSymbol(); 1469 OutStreamer->emitLabel(BeginOfSled); 1470 EmitToStreamer(*OutStreamer, RetInst); 1471 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 1472 EmitToStreamer( 1473 *OutStreamer, 1474 MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1)); 1475 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0)); 1476 EmitToStreamer(*OutStreamer, 1477 MCInstBuilder(PPC::BL8_NOP) 1478 .addExpr(MCSymbolRefExpr::create( 1479 OutContext.getOrCreateSymbol("__xray_FunctionExit"), 1480 OutContext))); 1481 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0)); 1482 EmitToStreamer(*OutStreamer, RetInst); 1483 if (IsConditional) 1484 OutStreamer->emitLabel(FallthroughLabel); 1485 recordSled(BeginOfSled, *MI, SledKind::FUNCTION_EXIT, 2); 1486 break; 1487 } 1488 case TargetOpcode::PATCHABLE_FUNCTION_EXIT: 1489 llvm_unreachable("PATCHABLE_FUNCTION_EXIT should never be emitted"); 1490 case TargetOpcode::PATCHABLE_TAIL_CALL: 1491 // TODO: Define a trampoline `__xray_FunctionTailExit` and differentiate a 1492 // normal function exit from a tail exit. 1493 llvm_unreachable("Tail call is handled in the normal case. See comments " 1494 "around this assert."); 1495 } 1496 } 1497 1498 void PPCLinuxAsmPrinter::emitStartOfAsmFile(Module &M) { 1499 if (static_cast<const PPCTargetMachine &>(TM).isELFv2ABI()) { 1500 PPCTargetStreamer *TS = 1501 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 1502 1503 if (TS) 1504 TS->emitAbiVersion(2); 1505 } 1506 1507 if (static_cast<const PPCTargetMachine &>(TM).isPPC64() || 1508 !isPositionIndependent()) 1509 return AsmPrinter::emitStartOfAsmFile(M); 1510 1511 if (M.getPICLevel() == PICLevel::SmallPIC) 1512 return AsmPrinter::emitStartOfAsmFile(M); 1513 1514 OutStreamer->SwitchSection(OutContext.getELFSection( 1515 ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC)); 1516 1517 MCSymbol *TOCSym = OutContext.getOrCreateSymbol(Twine(".LTOC")); 1518 MCSymbol *CurrentPos = OutContext.createTempSymbol(); 1519 1520 OutStreamer->emitLabel(CurrentPos); 1521 1522 // The GOT pointer points to the middle of the GOT, in order to reference the 1523 // entire 64kB range. 0x8000 is the midpoint. 1524 const MCExpr *tocExpr = 1525 MCBinaryExpr::createAdd(MCSymbolRefExpr::create(CurrentPos, OutContext), 1526 MCConstantExpr::create(0x8000, OutContext), 1527 OutContext); 1528 1529 OutStreamer->emitAssignment(TOCSym, tocExpr); 1530 1531 OutStreamer->SwitchSection(getObjFileLowering().getTextSection()); 1532 } 1533 1534 void PPCLinuxAsmPrinter::emitFunctionEntryLabel() { 1535 // linux/ppc32 - Normal entry label. 1536 if (!Subtarget->isPPC64() && 1537 (!isPositionIndependent() || 1538 MF->getFunction().getParent()->getPICLevel() == PICLevel::SmallPIC)) 1539 return AsmPrinter::emitFunctionEntryLabel(); 1540 1541 if (!Subtarget->isPPC64()) { 1542 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); 1543 if (PPCFI->usesPICBase() && !Subtarget->isSecurePlt()) { 1544 MCSymbol *RelocSymbol = PPCFI->getPICOffsetSymbol(*MF); 1545 MCSymbol *PICBase = MF->getPICBaseSymbol(); 1546 OutStreamer->emitLabel(RelocSymbol); 1547 1548 const MCExpr *OffsExpr = 1549 MCBinaryExpr::createSub( 1550 MCSymbolRefExpr::create(OutContext.getOrCreateSymbol(Twine(".LTOC")), 1551 OutContext), 1552 MCSymbolRefExpr::create(PICBase, OutContext), 1553 OutContext); 1554 OutStreamer->emitValue(OffsExpr, 4); 1555 OutStreamer->emitLabel(CurrentFnSym); 1556 return; 1557 } else 1558 return AsmPrinter::emitFunctionEntryLabel(); 1559 } 1560 1561 // ELFv2 ABI - Normal entry label. 1562 if (Subtarget->isELFv2ABI()) { 1563 // In the Large code model, we allow arbitrary displacements between 1564 // the text section and its associated TOC section. We place the 1565 // full 8-byte offset to the TOC in memory immediately preceding 1566 // the function global entry point. 1567 if (TM.getCodeModel() == CodeModel::Large 1568 && !MF->getRegInfo().use_empty(PPC::X2)) { 1569 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); 1570 1571 MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC.")); 1572 MCSymbol *GlobalEPSymbol = PPCFI->getGlobalEPSymbol(*MF); 1573 const MCExpr *TOCDeltaExpr = 1574 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext), 1575 MCSymbolRefExpr::create(GlobalEPSymbol, 1576 OutContext), 1577 OutContext); 1578 1579 OutStreamer->emitLabel(PPCFI->getTOCOffsetSymbol(*MF)); 1580 OutStreamer->emitValue(TOCDeltaExpr, 8); 1581 } 1582 return AsmPrinter::emitFunctionEntryLabel(); 1583 } 1584 1585 // Emit an official procedure descriptor. 1586 MCSectionSubPair Current = OutStreamer->getCurrentSection(); 1587 MCSectionELF *Section = OutStreamer->getContext().getELFSection( 1588 ".opd", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC); 1589 OutStreamer->SwitchSection(Section); 1590 OutStreamer->emitLabel(CurrentFnSym); 1591 OutStreamer->emitValueToAlignment(8); 1592 MCSymbol *Symbol1 = CurrentFnSymForSize; 1593 // Generates a R_PPC64_ADDR64 (from FK_DATA_8) relocation for the function 1594 // entry point. 1595 OutStreamer->emitValue(MCSymbolRefExpr::create(Symbol1, OutContext), 1596 8 /*size*/); 1597 MCSymbol *Symbol2 = OutContext.getOrCreateSymbol(StringRef(".TOC.")); 1598 // Generates a R_PPC64_TOC relocation for TOC base insertion. 1599 OutStreamer->emitValue( 1600 MCSymbolRefExpr::create(Symbol2, MCSymbolRefExpr::VK_PPC_TOCBASE, OutContext), 1601 8/*size*/); 1602 // Emit a null environment pointer. 1603 OutStreamer->emitIntValue(0, 8 /* size */); 1604 OutStreamer->SwitchSection(Current.first, Current.second); 1605 } 1606 1607 void PPCLinuxAsmPrinter::emitEndOfAsmFile(Module &M) { 1608 const DataLayout &DL = getDataLayout(); 1609 1610 bool isPPC64 = DL.getPointerSizeInBits() == 64; 1611 1612 PPCTargetStreamer *TS = 1613 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 1614 1615 if (!TOC.empty()) { 1616 const char *Name = isPPC64 ? ".toc" : ".got2"; 1617 MCSectionELF *Section = OutContext.getELFSection( 1618 Name, ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC); 1619 OutStreamer->SwitchSection(Section); 1620 if (!isPPC64) 1621 OutStreamer->emitValueToAlignment(4); 1622 1623 for (const auto &TOCMapPair : TOC) { 1624 const MCSymbol *const TOCEntryTarget = TOCMapPair.first.first; 1625 MCSymbol *const TOCEntryLabel = TOCMapPair.second; 1626 1627 OutStreamer->emitLabel(TOCEntryLabel); 1628 if (isPPC64 && TS != nullptr) 1629 TS->emitTCEntry(*TOCEntryTarget, TOCMapPair.first.second); 1630 else 1631 OutStreamer->emitSymbolValue(TOCEntryTarget, 4); 1632 } 1633 } 1634 1635 PPCAsmPrinter::emitEndOfAsmFile(M); 1636 } 1637 1638 /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2. 1639 void PPCLinuxAsmPrinter::emitFunctionBodyStart() { 1640 // In the ELFv2 ABI, in functions that use the TOC register, we need to 1641 // provide two entry points. The ABI guarantees that when calling the 1642 // local entry point, r2 is set up by the caller to contain the TOC base 1643 // for this function, and when calling the global entry point, r12 is set 1644 // up by the caller to hold the address of the global entry point. We 1645 // thus emit a prefix sequence along the following lines: 1646 // 1647 // func: 1648 // .Lfunc_gepNN: 1649 // # global entry point 1650 // addis r2,r12,(.TOC.-.Lfunc_gepNN)@ha 1651 // addi r2,r2,(.TOC.-.Lfunc_gepNN)@l 1652 // .Lfunc_lepNN: 1653 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN 1654 // # local entry point, followed by function body 1655 // 1656 // For the Large code model, we create 1657 // 1658 // .Lfunc_tocNN: 1659 // .quad .TOC.-.Lfunc_gepNN # done by EmitFunctionEntryLabel 1660 // func: 1661 // .Lfunc_gepNN: 1662 // # global entry point 1663 // ld r2,.Lfunc_tocNN-.Lfunc_gepNN(r12) 1664 // add r2,r2,r12 1665 // .Lfunc_lepNN: 1666 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN 1667 // # local entry point, followed by function body 1668 // 1669 // This ensures we have r2 set up correctly while executing the function 1670 // body, no matter which entry point is called. 1671 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); 1672 const bool UsesX2OrR2 = !MF->getRegInfo().use_empty(PPC::X2) || 1673 !MF->getRegInfo().use_empty(PPC::R2); 1674 const bool PCrelGEPRequired = Subtarget->isUsingPCRelativeCalls() && 1675 UsesX2OrR2 && PPCFI->usesTOCBasePtr(); 1676 const bool NonPCrelGEPRequired = !Subtarget->isUsingPCRelativeCalls() && 1677 Subtarget->isELFv2ABI() && UsesX2OrR2; 1678 1679 // Only do all that if the function uses R2 as the TOC pointer 1680 // in the first place. We don't need the global entry point if the 1681 // function uses R2 as an allocatable register. 1682 if (NonPCrelGEPRequired || PCrelGEPRequired) { 1683 // Note: The logic here must be synchronized with the code in the 1684 // branch-selection pass which sets the offset of the first block in the 1685 // function. This matters because it affects the alignment. 1686 MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol(*MF); 1687 OutStreamer->emitLabel(GlobalEntryLabel); 1688 const MCSymbolRefExpr *GlobalEntryLabelExp = 1689 MCSymbolRefExpr::create(GlobalEntryLabel, OutContext); 1690 1691 if (TM.getCodeModel() != CodeModel::Large) { 1692 MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC.")); 1693 const MCExpr *TOCDeltaExpr = 1694 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext), 1695 GlobalEntryLabelExp, OutContext); 1696 1697 const MCExpr *TOCDeltaHi = PPCMCExpr::createHa(TOCDeltaExpr, OutContext); 1698 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS) 1699 .addReg(PPC::X2) 1700 .addReg(PPC::X12) 1701 .addExpr(TOCDeltaHi)); 1702 1703 const MCExpr *TOCDeltaLo = PPCMCExpr::createLo(TOCDeltaExpr, OutContext); 1704 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI) 1705 .addReg(PPC::X2) 1706 .addReg(PPC::X2) 1707 .addExpr(TOCDeltaLo)); 1708 } else { 1709 MCSymbol *TOCOffset = PPCFI->getTOCOffsetSymbol(*MF); 1710 const MCExpr *TOCOffsetDeltaExpr = 1711 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCOffset, OutContext), 1712 GlobalEntryLabelExp, OutContext); 1713 1714 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 1715 .addReg(PPC::X2) 1716 .addExpr(TOCOffsetDeltaExpr) 1717 .addReg(PPC::X12)); 1718 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD8) 1719 .addReg(PPC::X2) 1720 .addReg(PPC::X2) 1721 .addReg(PPC::X12)); 1722 } 1723 1724 MCSymbol *LocalEntryLabel = PPCFI->getLocalEPSymbol(*MF); 1725 OutStreamer->emitLabel(LocalEntryLabel); 1726 const MCSymbolRefExpr *LocalEntryLabelExp = 1727 MCSymbolRefExpr::create(LocalEntryLabel, OutContext); 1728 const MCExpr *LocalOffsetExp = 1729 MCBinaryExpr::createSub(LocalEntryLabelExp, 1730 GlobalEntryLabelExp, OutContext); 1731 1732 PPCTargetStreamer *TS = 1733 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 1734 1735 if (TS) 1736 TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), LocalOffsetExp); 1737 } else if (Subtarget->isUsingPCRelativeCalls()) { 1738 // When generating the entry point for a function we have a few scenarios 1739 // based on whether or not that function uses R2 and whether or not that 1740 // function makes calls (or is a leaf function). 1741 // 1) A leaf function that does not use R2 (or treats it as callee-saved 1742 // and preserves it). In this case st_other=0 and both 1743 // the local and global entry points for the function are the same. 1744 // No special entry point code is required. 1745 // 2) A function uses the TOC pointer R2. This function may or may not have 1746 // calls. In this case st_other=[2,6] and the global and local entry 1747 // points are different. Code to correctly setup the TOC pointer in R2 1748 // is put between the global and local entry points. This case is 1749 // covered by the if statatement above. 1750 // 3) A function does not use the TOC pointer R2 but does have calls. 1751 // In this case st_other=1 since we do not know whether or not any 1752 // of the callees clobber R2. This case is dealt with in this else if 1753 // block. Tail calls are considered calls and the st_other should also 1754 // be set to 1 in that case as well. 1755 // 4) The function does not use the TOC pointer but R2 is used inside 1756 // the function. In this case st_other=1 once again. 1757 // 5) This function uses inline asm. We mark R2 as reserved if the function 1758 // has inline asm as we have to assume that it may be used. 1759 if (MF->getFrameInfo().hasCalls() || MF->getFrameInfo().hasTailCall() || 1760 MF->hasInlineAsm() || (!PPCFI->usesTOCBasePtr() && UsesX2OrR2)) { 1761 PPCTargetStreamer *TS = 1762 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 1763 if (TS) 1764 TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), 1765 MCConstantExpr::create(1, OutContext)); 1766 } 1767 } 1768 } 1769 1770 /// EmitFunctionBodyEnd - Print the traceback table before the .size 1771 /// directive. 1772 /// 1773 void PPCLinuxAsmPrinter::emitFunctionBodyEnd() { 1774 // Only the 64-bit target requires a traceback table. For now, 1775 // we only emit the word of zeroes that GDB requires to find 1776 // the end of the function, and zeroes for the eight-byte 1777 // mandatory fields. 1778 // FIXME: We should fill in the eight-byte mandatory fields as described in 1779 // the PPC64 ELF ABI (this is a low-priority item because GDB does not 1780 // currently make use of these fields). 1781 if (Subtarget->isPPC64()) { 1782 OutStreamer->emitIntValue(0, 4/*size*/); 1783 OutStreamer->emitIntValue(0, 8/*size*/); 1784 } 1785 } 1786 1787 void PPCAIXAsmPrinter::emitLinkage(const GlobalValue *GV, 1788 MCSymbol *GVSym) const { 1789 1790 assert(MAI->hasVisibilityOnlyWithLinkage() && 1791 "AIX's linkage directives take a visibility setting."); 1792 1793 MCSymbolAttr LinkageAttr = MCSA_Invalid; 1794 switch (GV->getLinkage()) { 1795 case GlobalValue::ExternalLinkage: 1796 LinkageAttr = GV->isDeclaration() ? MCSA_Extern : MCSA_Global; 1797 break; 1798 case GlobalValue::LinkOnceAnyLinkage: 1799 case GlobalValue::LinkOnceODRLinkage: 1800 case GlobalValue::WeakAnyLinkage: 1801 case GlobalValue::WeakODRLinkage: 1802 case GlobalValue::ExternalWeakLinkage: 1803 LinkageAttr = MCSA_Weak; 1804 break; 1805 case GlobalValue::AvailableExternallyLinkage: 1806 LinkageAttr = MCSA_Extern; 1807 break; 1808 case GlobalValue::PrivateLinkage: 1809 return; 1810 case GlobalValue::InternalLinkage: 1811 assert(GV->getVisibility() == GlobalValue::DefaultVisibility && 1812 "InternalLinkage should not have other visibility setting."); 1813 LinkageAttr = MCSA_LGlobal; 1814 break; 1815 case GlobalValue::AppendingLinkage: 1816 llvm_unreachable("Should never emit this"); 1817 case GlobalValue::CommonLinkage: 1818 llvm_unreachable("CommonLinkage of XCOFF should not come to this path"); 1819 } 1820 1821 assert(LinkageAttr != MCSA_Invalid && "LinkageAttr should not MCSA_Invalid."); 1822 1823 MCSymbolAttr VisibilityAttr = MCSA_Invalid; 1824 if (!TM.getIgnoreXCOFFVisibility()) { 1825 switch (GV->getVisibility()) { 1826 1827 // TODO: "exported" and "internal" Visibility needs to go here. 1828 case GlobalValue::DefaultVisibility: 1829 break; 1830 case GlobalValue::HiddenVisibility: 1831 VisibilityAttr = MAI->getHiddenVisibilityAttr(); 1832 break; 1833 case GlobalValue::ProtectedVisibility: 1834 VisibilityAttr = MAI->getProtectedVisibilityAttr(); 1835 break; 1836 } 1837 } 1838 1839 OutStreamer->emitXCOFFSymbolLinkageWithVisibility(GVSym, LinkageAttr, 1840 VisibilityAttr); 1841 } 1842 1843 void PPCAIXAsmPrinter::SetupMachineFunction(MachineFunction &MF) { 1844 // Setup CurrentFnDescSym and its containing csect. 1845 MCSectionXCOFF *FnDescSec = 1846 cast<MCSectionXCOFF>(getObjFileLowering().getSectionForFunctionDescriptor( 1847 &MF.getFunction(), TM)); 1848 FnDescSec->setAlignment(Align(Subtarget->isPPC64() ? 8 : 4)); 1849 1850 CurrentFnDescSym = FnDescSec->getQualNameSymbol(); 1851 1852 return AsmPrinter::SetupMachineFunction(MF); 1853 } 1854 1855 void PPCAIXAsmPrinter::emitFunctionBodyEnd() { 1856 1857 if (!TM.getXCOFFTracebackTable()) 1858 return; 1859 1860 emitTracebackTable(); 1861 } 1862 1863 void PPCAIXAsmPrinter::emitTracebackTable() { 1864 1865 // Create a symbol for the end of function. 1866 MCSymbol *FuncEnd = createTempSymbol(MF->getName()); 1867 OutStreamer->emitLabel(FuncEnd); 1868 1869 OutStreamer->AddComment("Traceback table begin"); 1870 // Begin with a fullword of zero. 1871 OutStreamer->emitIntValueInHexWithPadding(0, 4 /*size*/); 1872 1873 SmallString<128> CommentString; 1874 raw_svector_ostream CommentOS(CommentString); 1875 1876 auto EmitComment = [&]() { 1877 OutStreamer->AddComment(CommentOS.str()); 1878 CommentString.clear(); 1879 }; 1880 1881 auto EmitCommentAndValue = [&](uint64_t Value, int Size) { 1882 EmitComment(); 1883 OutStreamer->emitIntValueInHexWithPadding(Value, Size); 1884 }; 1885 1886 unsigned int Version = 0; 1887 CommentOS << "Version = " << Version; 1888 EmitCommentAndValue(Version, 1); 1889 1890 // There is a lack of information in the IR to assist with determining the 1891 // source language. AIX exception handling mechanism would only search for 1892 // personality routine and LSDA area when such language supports exception 1893 // handling. So to be conservatively correct and allow runtime to do its job, 1894 // we need to set it to C++ for now. 1895 TracebackTable::LanguageID LanguageIdentifier = 1896 TracebackTable::CPlusPlus; // C++ 1897 1898 CommentOS << "Language = " 1899 << getNameForTracebackTableLanguageId(LanguageIdentifier); 1900 EmitCommentAndValue(LanguageIdentifier, 1); 1901 1902 // This is only populated for the third and fourth bytes. 1903 uint32_t FirstHalfOfMandatoryField = 0; 1904 1905 // Emit the 3rd byte of the mandatory field. 1906 1907 // We always set traceback offset bit to true. 1908 FirstHalfOfMandatoryField |= TracebackTable::HasTraceBackTableOffsetMask; 1909 1910 const PPCFunctionInfo *FI = MF->getInfo<PPCFunctionInfo>(); 1911 const MachineRegisterInfo &MRI = MF->getRegInfo(); 1912 1913 // Check the function uses floating-point processor instructions or not 1914 for (unsigned Reg = PPC::F0; Reg <= PPC::F31; ++Reg) { 1915 if (MRI.isPhysRegUsed(Reg)) { 1916 FirstHalfOfMandatoryField |= TracebackTable::IsFloatingPointPresentMask; 1917 break; 1918 } 1919 } 1920 1921 #define GENBOOLCOMMENT(Prefix, V, Field) \ 1922 CommentOS << (Prefix) << ((V) & (TracebackTable::Field##Mask) ? "+" : "-") \ 1923 << #Field 1924 1925 #define GENVALUECOMMENT(PrefixAndName, V, Field) \ 1926 CommentOS << (PrefixAndName) << " = " \ 1927 << static_cast<unsigned>(((V) & (TracebackTable::Field##Mask)) >> \ 1928 (TracebackTable::Field##Shift)) 1929 1930 GENBOOLCOMMENT("", FirstHalfOfMandatoryField, IsGlobaLinkage); 1931 GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsOutOfLineEpilogOrPrologue); 1932 EmitComment(); 1933 1934 GENBOOLCOMMENT("", FirstHalfOfMandatoryField, HasTraceBackTableOffset); 1935 GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsInternalProcedure); 1936 EmitComment(); 1937 1938 GENBOOLCOMMENT("", FirstHalfOfMandatoryField, HasControlledStorage); 1939 GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsTOCless); 1940 EmitComment(); 1941 1942 GENBOOLCOMMENT("", FirstHalfOfMandatoryField, IsFloatingPointPresent); 1943 EmitComment(); 1944 GENBOOLCOMMENT("", FirstHalfOfMandatoryField, 1945 IsFloatingPointOperationLogOrAbortEnabled); 1946 EmitComment(); 1947 1948 OutStreamer->emitIntValueInHexWithPadding( 1949 (FirstHalfOfMandatoryField & 0x0000ff00) >> 8, 1); 1950 1951 // Set the 4th byte of the mandatory field. 1952 FirstHalfOfMandatoryField |= TracebackTable::IsFunctionNamePresentMask; 1953 1954 static_assert(XCOFF::AllocRegNo == 31, "Unexpected register usage!"); 1955 if (MRI.isPhysRegUsed(Subtarget->isPPC64() ? PPC::X31 : PPC::R31)) 1956 FirstHalfOfMandatoryField |= TracebackTable::IsAllocaUsedMask; 1957 1958 const SmallVectorImpl<Register> &MustSaveCRs = FI->getMustSaveCRs(); 1959 if (!MustSaveCRs.empty()) 1960 FirstHalfOfMandatoryField |= TracebackTable::IsCRSavedMask; 1961 1962 if (FI->mustSaveLR()) 1963 FirstHalfOfMandatoryField |= TracebackTable::IsLRSavedMask; 1964 1965 GENBOOLCOMMENT("", FirstHalfOfMandatoryField, IsInterruptHandler); 1966 GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsFunctionNamePresent); 1967 GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsAllocaUsed); 1968 EmitComment(); 1969 GENVALUECOMMENT("OnConditionDirective", FirstHalfOfMandatoryField, 1970 OnConditionDirective); 1971 GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsCRSaved); 1972 GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsLRSaved); 1973 EmitComment(); 1974 OutStreamer->emitIntValueInHexWithPadding((FirstHalfOfMandatoryField & 0xff), 1975 1); 1976 1977 // Set the 5th byte of mandatory field. 1978 uint32_t SecondHalfOfMandatoryField = 0; 1979 1980 // Always store back chain. 1981 SecondHalfOfMandatoryField |= TracebackTable::IsBackChainStoredMask; 1982 1983 uint32_t FPRSaved = 0; 1984 for (unsigned Reg = PPC::F14; Reg <= PPC::F31; ++Reg) { 1985 if (MRI.isPhysRegModified(Reg)) { 1986 FPRSaved = PPC::F31 - Reg + 1; 1987 break; 1988 } 1989 } 1990 SecondHalfOfMandatoryField |= (FPRSaved << TracebackTable::FPRSavedShift) & 1991 TracebackTable::FPRSavedMask; 1992 GENBOOLCOMMENT("", SecondHalfOfMandatoryField, IsBackChainStored); 1993 GENBOOLCOMMENT(", ", SecondHalfOfMandatoryField, IsFixup); 1994 GENVALUECOMMENT(", NumOfFPRsSaved", SecondHalfOfMandatoryField, FPRSaved); 1995 EmitComment(); 1996 OutStreamer->emitIntValueInHexWithPadding( 1997 (SecondHalfOfMandatoryField & 0xff000000) >> 24, 1); 1998 1999 // Set the 6th byte of mandatory field. 2000 bool ShouldEmitEHBlock = TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock(MF); 2001 if (ShouldEmitEHBlock) 2002 SecondHalfOfMandatoryField |= TracebackTable::HasExtensionTableMask; 2003 2004 uint32_t GPRSaved = 0; 2005 2006 // X13 is reserved under 64-bit environment. 2007 unsigned GPRBegin = Subtarget->isPPC64() ? PPC::X14 : PPC::R13; 2008 unsigned GPREnd = Subtarget->isPPC64() ? PPC::X31 : PPC::R31; 2009 2010 for (unsigned Reg = GPRBegin; Reg <= GPREnd; ++Reg) { 2011 if (MRI.isPhysRegModified(Reg)) { 2012 GPRSaved = GPREnd - Reg + 1; 2013 break; 2014 } 2015 } 2016 2017 SecondHalfOfMandatoryField |= (GPRSaved << TracebackTable::GPRSavedShift) & 2018 TracebackTable::GPRSavedMask; 2019 2020 GENBOOLCOMMENT("", SecondHalfOfMandatoryField, HasVectorInfo); 2021 GENBOOLCOMMENT(", ", SecondHalfOfMandatoryField, HasExtensionTable); 2022 GENVALUECOMMENT(", NumOfGPRsSaved", SecondHalfOfMandatoryField, GPRSaved); 2023 EmitComment(); 2024 OutStreamer->emitIntValueInHexWithPadding( 2025 (SecondHalfOfMandatoryField & 0x00ff0000) >> 16, 1); 2026 2027 // Set the 7th byte of mandatory field. 2028 uint32_t NumberOfFixedPara = FI->getFixedParamNum(); 2029 SecondHalfOfMandatoryField |= 2030 (NumberOfFixedPara << TracebackTable::NumberOfFixedParmsShift) & 2031 TracebackTable::NumberOfFixedParmsMask; 2032 GENVALUECOMMENT("NumberOfFixedParms", SecondHalfOfMandatoryField, 2033 NumberOfFixedParms); 2034 EmitComment(); 2035 OutStreamer->emitIntValueInHexWithPadding( 2036 (SecondHalfOfMandatoryField & 0x0000ff00) >> 8, 1); 2037 2038 // Set the 8th byte of mandatory field. 2039 2040 // Always set parameter on stack. 2041 SecondHalfOfMandatoryField |= TracebackTable::HasParmsOnStackMask; 2042 2043 uint32_t NumberOfFPPara = FI->getFloatingPointParamNum(); 2044 SecondHalfOfMandatoryField |= 2045 (NumberOfFPPara << TracebackTable::NumberOfFloatingPointParmsShift) & 2046 TracebackTable::NumberOfFloatingPointParmsMask; 2047 2048 GENVALUECOMMENT("NumberOfFPParms", SecondHalfOfMandatoryField, 2049 NumberOfFloatingPointParms); 2050 GENBOOLCOMMENT(", ", SecondHalfOfMandatoryField, HasParmsOnStack); 2051 EmitComment(); 2052 OutStreamer->emitIntValueInHexWithPadding(SecondHalfOfMandatoryField & 0xff, 2053 1); 2054 2055 // Generate the optional fields of traceback table. 2056 2057 // Parameter type. 2058 if (NumberOfFixedPara || NumberOfFPPara) { 2059 assert((SecondHalfOfMandatoryField & TracebackTable::HasVectorInfoMask) == 2060 0 && 2061 "VectorInfo has not been implemented."); 2062 uint32_t ParaType = FI->getParameterType(); 2063 CommentOS << "Parameter type = " 2064 << XCOFF::parseParmsType(ParaType, 2065 NumberOfFixedPara + NumberOfFPPara); 2066 EmitComment(); 2067 OutStreamer->emitIntValueInHexWithPadding(ParaType, sizeof(ParaType)); 2068 } 2069 2070 // Traceback table offset. 2071 OutStreamer->AddComment("Function size"); 2072 if (FirstHalfOfMandatoryField & TracebackTable::HasTraceBackTableOffsetMask) { 2073 MCSymbol *FuncSectSym = getObjFileLowering().getFunctionEntryPointSymbol( 2074 &(MF->getFunction()), TM); 2075 OutStreamer->emitAbsoluteSymbolDiff(FuncEnd, FuncSectSym, 4); 2076 } 2077 2078 // Since we unset the Int_Handler. 2079 if (FirstHalfOfMandatoryField & TracebackTable::IsInterruptHandlerMask) 2080 report_fatal_error("Hand_Mask not implement yet"); 2081 2082 if (FirstHalfOfMandatoryField & TracebackTable::HasControlledStorageMask) 2083 report_fatal_error("Ctl_Info not implement yet"); 2084 2085 if (FirstHalfOfMandatoryField & TracebackTable::IsFunctionNamePresentMask) { 2086 StringRef Name = MF->getName().substr(0, INT16_MAX); 2087 int16_t NameLength = Name.size(); 2088 CommentOS << "Function name len = " 2089 << static_cast<unsigned int>(NameLength); 2090 EmitCommentAndValue(NameLength, 2); 2091 OutStreamer->AddComment("Function Name"); 2092 OutStreamer->emitBytes(Name); 2093 } 2094 2095 if (FirstHalfOfMandatoryField & TracebackTable::IsAllocaUsedMask) { 2096 uint8_t AllocReg = XCOFF::AllocRegNo; 2097 OutStreamer->AddComment("AllocaUsed"); 2098 OutStreamer->emitIntValueInHex(AllocReg, sizeof(AllocReg)); 2099 } 2100 2101 uint8_t ExtensionTableFlag = 0; 2102 if (SecondHalfOfMandatoryField & TracebackTable::HasExtensionTableMask) { 2103 if (ShouldEmitEHBlock) 2104 ExtensionTableFlag |= ExtendedTBTableFlag::TB_EH_INFO; 2105 2106 CommentOS << "ExtensionTableFlag = " 2107 << getExtendedTBTableFlagString(ExtensionTableFlag); 2108 EmitCommentAndValue(ExtensionTableFlag, sizeof(ExtensionTableFlag)); 2109 } 2110 2111 if (ExtensionTableFlag & ExtendedTBTableFlag::TB_EH_INFO) { 2112 auto &Ctx = OutStreamer->getContext(); 2113 MCSymbol *EHInfoSym = 2114 TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(MF); 2115 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(EHInfoSym); 2116 const MCSymbol *TOCBaseSym = 2117 cast<MCSectionXCOFF>(getObjFileLowering().getTOCBaseSection()) 2118 ->getQualNameSymbol(); 2119 const MCExpr *Exp = 2120 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCEntry, Ctx), 2121 MCSymbolRefExpr::create(TOCBaseSym, Ctx), Ctx); 2122 2123 const DataLayout &DL = getDataLayout(); 2124 OutStreamer->emitValueToAlignment(4); 2125 OutStreamer->AddComment("EHInfo Table"); 2126 OutStreamer->emitValue(Exp, DL.getPointerSize()); 2127 } 2128 2129 #undef GENBOOLCOMMENT 2130 #undef GENVALUECOMMENT 2131 } 2132 2133 static bool isSpecialLLVMGlobalArrayToSkip(const GlobalVariable *GV) { 2134 return GV->hasAppendingLinkage() && 2135 StringSwitch<bool>(GV->getName()) 2136 // TODO: Linker could still eliminate the GV if we just skip 2137 // handling llvm.used array. Skipping them for now until we or the 2138 // AIX OS team come up with a good solution. 2139 .Case("llvm.used", true) 2140 // It's correct to just skip llvm.compiler.used array here. 2141 .Case("llvm.compiler.used", true) 2142 .Default(false); 2143 } 2144 2145 static bool isSpecialLLVMGlobalArrayForStaticInit(const GlobalVariable *GV) { 2146 return StringSwitch<bool>(GV->getName()) 2147 .Cases("llvm.global_ctors", "llvm.global_dtors", true) 2148 .Default(false); 2149 } 2150 2151 void PPCAIXAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) { 2152 // Special LLVM global arrays have been handled at the initialization. 2153 if (isSpecialLLVMGlobalArrayToSkip(GV) || isSpecialLLVMGlobalArrayForStaticInit(GV)) 2154 return; 2155 2156 // If the Global Variable has the toc-data attribute, it needs to be emitted 2157 // when we emit the .toc section. 2158 if (GV->hasAttribute("toc-data")) { 2159 TOCDataGlobalVars.push_back(GV); 2160 return; 2161 } 2162 2163 emitGlobalVariableHelper(GV); 2164 } 2165 2166 void PPCAIXAsmPrinter::emitGlobalVariableHelper(const GlobalVariable *GV) { 2167 assert(!GV->getName().startswith("llvm.") && 2168 "Unhandled intrinsic global variable."); 2169 2170 if (GV->hasComdat()) 2171 report_fatal_error("COMDAT not yet supported by AIX."); 2172 2173 MCSymbolXCOFF *GVSym = cast<MCSymbolXCOFF>(getSymbol(GV)); 2174 2175 if (GV->isDeclarationForLinker()) { 2176 emitLinkage(GV, GVSym); 2177 return; 2178 } 2179 2180 SectionKind GVKind = getObjFileLowering().getKindForGlobal(GV, TM); 2181 if (!GVKind.isGlobalWriteableData() && !GVKind.isReadOnly() && 2182 !GVKind.isThreadLocal()) // Checks for both ThreadData and ThreadBSS. 2183 report_fatal_error("Encountered a global variable kind that is " 2184 "not supported yet."); 2185 2186 // Print GV in verbose mode 2187 if (isVerbose()) { 2188 if (GV->hasInitializer()) { 2189 GV->printAsOperand(OutStreamer->GetCommentOS(), 2190 /*PrintType=*/false, GV->getParent()); 2191 OutStreamer->GetCommentOS() << '\n'; 2192 } 2193 } 2194 2195 MCSectionXCOFF *Csect = cast<MCSectionXCOFF>( 2196 getObjFileLowering().SectionForGlobal(GV, GVKind, TM)); 2197 2198 // Switch to the containing csect. 2199 OutStreamer->SwitchSection(Csect); 2200 2201 const DataLayout &DL = GV->getParent()->getDataLayout(); 2202 2203 // Handle common and zero-initialized local symbols. 2204 if (GV->hasCommonLinkage() || GVKind.isBSSLocal() || 2205 GVKind.isThreadBSSLocal()) { 2206 Align Alignment = GV->getAlign().getValueOr(DL.getPreferredAlign(GV)); 2207 uint64_t Size = DL.getTypeAllocSize(GV->getType()->getElementType()); 2208 GVSym->setStorageClass( 2209 TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV)); 2210 2211 if (GVKind.isBSSLocal() || GVKind.isThreadBSSLocal()) 2212 OutStreamer->emitXCOFFLocalCommonSymbol( 2213 OutContext.getOrCreateSymbol(GVSym->getSymbolTableName()), Size, 2214 GVSym, Alignment.value()); 2215 else 2216 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment.value()); 2217 return; 2218 } 2219 2220 MCSymbol *EmittedInitSym = GVSym; 2221 emitLinkage(GV, EmittedInitSym); 2222 emitAlignment(getGVAlignment(GV, DL), GV); 2223 2224 // When -fdata-sections is enabled, every GlobalVariable will 2225 // be put into its own csect; therefore, label is not necessary here. 2226 if (!TM.getDataSections() || GV->hasSection()) { 2227 OutStreamer->emitLabel(EmittedInitSym); 2228 } 2229 2230 // Emit aliasing label for global variable. 2231 llvm::for_each(GOAliasMap[GV], [this](const GlobalAlias *Alias) { 2232 OutStreamer->emitLabel(getSymbol(Alias)); 2233 }); 2234 2235 emitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer()); 2236 } 2237 2238 void PPCAIXAsmPrinter::emitFunctionDescriptor() { 2239 const DataLayout &DL = getDataLayout(); 2240 const unsigned PointerSize = DL.getPointerSizeInBits() == 64 ? 8 : 4; 2241 2242 MCSectionSubPair Current = OutStreamer->getCurrentSection(); 2243 // Emit function descriptor. 2244 OutStreamer->SwitchSection( 2245 cast<MCSymbolXCOFF>(CurrentFnDescSym)->getRepresentedCsect()); 2246 2247 // Emit aliasing label for function descriptor csect. 2248 llvm::for_each(GOAliasMap[&MF->getFunction()], 2249 [this](const GlobalAlias *Alias) { 2250 OutStreamer->emitLabel(getSymbol(Alias)); 2251 }); 2252 2253 // Emit function entry point address. 2254 OutStreamer->emitValue(MCSymbolRefExpr::create(CurrentFnSym, OutContext), 2255 PointerSize); 2256 // Emit TOC base address. 2257 const MCSymbol *TOCBaseSym = 2258 cast<MCSectionXCOFF>(getObjFileLowering().getTOCBaseSection()) 2259 ->getQualNameSymbol(); 2260 OutStreamer->emitValue(MCSymbolRefExpr::create(TOCBaseSym, OutContext), 2261 PointerSize); 2262 // Emit a null environment pointer. 2263 OutStreamer->emitIntValue(0, PointerSize); 2264 2265 OutStreamer->SwitchSection(Current.first, Current.second); 2266 } 2267 2268 void PPCAIXAsmPrinter::emitFunctionEntryLabel() { 2269 // It's not necessary to emit the label when we have individual 2270 // function in its own csect. 2271 if (!TM.getFunctionSections()) 2272 PPCAsmPrinter::emitFunctionEntryLabel(); 2273 2274 // Emit aliasing label for function entry point label. 2275 llvm::for_each( 2276 GOAliasMap[&MF->getFunction()], [this](const GlobalAlias *Alias) { 2277 OutStreamer->emitLabel( 2278 getObjFileLowering().getFunctionEntryPointSymbol(Alias, TM)); 2279 }); 2280 } 2281 2282 void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) { 2283 // If there are no functions and there are no toc-data definitions in this 2284 // module, we will never need to reference the TOC base. 2285 if (M.empty() && TOCDataGlobalVars.empty()) 2286 return; 2287 2288 // Switch to section to emit TOC base. 2289 OutStreamer->SwitchSection(getObjFileLowering().getTOCBaseSection()); 2290 2291 PPCTargetStreamer *TS = 2292 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 2293 2294 for (auto &I : TOC) { 2295 MCSectionXCOFF *TCEntry; 2296 // Setup the csect for the current TC entry. If the variant kind is 2297 // VK_PPC_AIX_TLSGDM the entry represents the region handle, we create a 2298 // new symbol to prefix the name with a dot. 2299 if (I.first.second == MCSymbolRefExpr::VariantKind::VK_PPC_AIX_TLSGDM) { 2300 SmallString<128> Name; 2301 StringRef Prefix = "."; 2302 Name += Prefix; 2303 Name += I.first.first->getName(); 2304 MCSymbol *S = OutContext.getOrCreateSymbol(Name); 2305 TCEntry = cast<MCSectionXCOFF>( 2306 getObjFileLowering().getSectionForTOCEntry(S, TM)); 2307 } else { 2308 TCEntry = cast<MCSectionXCOFF>( 2309 getObjFileLowering().getSectionForTOCEntry(I.first.first, TM)); 2310 } 2311 OutStreamer->SwitchSection(TCEntry); 2312 2313 OutStreamer->emitLabel(I.second); 2314 if (TS != nullptr) 2315 TS->emitTCEntry(*I.first.first, I.first.second); 2316 } 2317 2318 for (const auto *GV : TOCDataGlobalVars) 2319 emitGlobalVariableHelper(GV); 2320 } 2321 2322 bool PPCAIXAsmPrinter::doInitialization(Module &M) { 2323 const bool Result = PPCAsmPrinter::doInitialization(M); 2324 2325 auto setCsectAlignment = [this](const GlobalObject *GO) { 2326 // Declarations have 0 alignment which is set by default. 2327 if (GO->isDeclarationForLinker()) 2328 return; 2329 2330 SectionKind GOKind = getObjFileLowering().getKindForGlobal(GO, TM); 2331 MCSectionXCOFF *Csect = cast<MCSectionXCOFF>( 2332 getObjFileLowering().SectionForGlobal(GO, GOKind, TM)); 2333 2334 Align GOAlign = getGVAlignment(GO, GO->getParent()->getDataLayout()); 2335 if (GOAlign > Csect->getAlignment()) 2336 Csect->setAlignment(GOAlign); 2337 }; 2338 2339 // We need to know, up front, the alignment of csects for the assembly path, 2340 // because once a .csect directive gets emitted, we could not change the 2341 // alignment value on it. 2342 for (const auto &G : M.globals()) { 2343 if (isSpecialLLVMGlobalArrayToSkip(&G)) 2344 continue; 2345 2346 if (isSpecialLLVMGlobalArrayForStaticInit(&G)) { 2347 // Generate a format indicator and a unique module id to be a part of 2348 // the sinit and sterm function names. 2349 if (FormatIndicatorAndUniqueModId.empty()) { 2350 std::string UniqueModuleId = getUniqueModuleId(&M); 2351 if (UniqueModuleId != "") 2352 // TODO: Use source file full path to generate the unique module id 2353 // and add a format indicator as a part of function name in case we 2354 // will support more than one format. 2355 FormatIndicatorAndUniqueModId = "clang_" + UniqueModuleId.substr(1); 2356 else 2357 // Use the Pid and current time as the unique module id when we cannot 2358 // generate one based on a module's strong external symbols. 2359 // FIXME: Adjust the comment accordingly after we use source file full 2360 // path instead. 2361 FormatIndicatorAndUniqueModId = 2362 "clangPidTime_" + llvm::itostr(sys::Process::getProcessId()) + 2363 "_" + llvm::itostr(time(nullptr)); 2364 } 2365 2366 emitSpecialLLVMGlobal(&G); 2367 continue; 2368 } 2369 2370 setCsectAlignment(&G); 2371 } 2372 2373 for (const auto &F : M) 2374 setCsectAlignment(&F); 2375 2376 // Construct an aliasing list for each GlobalObject. 2377 for (const auto &Alias : M.aliases()) { 2378 const GlobalObject *Base = Alias.getBaseObject(); 2379 if (!Base) 2380 report_fatal_error( 2381 "alias without a base object is not yet supported on AIX"); 2382 GOAliasMap[Base].push_back(&Alias); 2383 } 2384 2385 return Result; 2386 } 2387 2388 void PPCAIXAsmPrinter::emitInstruction(const MachineInstr *MI) { 2389 switch (MI->getOpcode()) { 2390 default: 2391 break; 2392 case PPC::GETtlsADDR64AIX: 2393 case PPC::GETtlsADDR32AIX: { 2394 // The reference to .__tls_get_addr is unknown to the assembler 2395 // so we need to emit an external symbol reference. 2396 MCSymbol *TlsGetAddr = createMCSymbolForTlsGetAddr(OutContext); 2397 ExtSymSDNodeSymbols.insert(TlsGetAddr); 2398 break; 2399 } 2400 case PPC::BL8: 2401 case PPC::BL: 2402 case PPC::BL8_NOP: 2403 case PPC::BL_NOP: { 2404 const MachineOperand &MO = MI->getOperand(0); 2405 if (MO.isSymbol()) { 2406 MCSymbolXCOFF *S = 2407 cast<MCSymbolXCOFF>(OutContext.getOrCreateSymbol(MO.getSymbolName())); 2408 ExtSymSDNodeSymbols.insert(S); 2409 } 2410 } break; 2411 case PPC::BL_TLS: 2412 case PPC::BL8_TLS: 2413 case PPC::BL8_TLS_: 2414 case PPC::BL8_NOP_TLS: 2415 report_fatal_error("TLS call not yet implemented"); 2416 case PPC::TAILB: 2417 case PPC::TAILB8: 2418 case PPC::TAILBA: 2419 case PPC::TAILBA8: 2420 case PPC::TAILBCTR: 2421 case PPC::TAILBCTR8: 2422 if (MI->getOperand(0).isSymbol()) 2423 report_fatal_error("Tail call for extern symbol not yet supported."); 2424 break; 2425 } 2426 return PPCAsmPrinter::emitInstruction(MI); 2427 } 2428 2429 bool PPCAIXAsmPrinter::doFinalization(Module &M) { 2430 // Do streamer related finalization for DWARF. 2431 if (!MAI->usesDwarfFileAndLocDirectives() && MMI->hasDebugInfo()) 2432 OutStreamer->doFinalizationAtSectionEnd( 2433 OutStreamer->getContext().getObjectFileInfo()->getTextSection()); 2434 2435 for (MCSymbol *Sym : ExtSymSDNodeSymbols) 2436 OutStreamer->emitSymbolAttribute(Sym, MCSA_Extern); 2437 return PPCAsmPrinter::doFinalization(M); 2438 } 2439 2440 static unsigned mapToSinitPriority(int P) { 2441 if (P < 0 || P > 65535) 2442 report_fatal_error("invalid init priority"); 2443 2444 if (P <= 20) 2445 return P; 2446 2447 if (P < 81) 2448 return 20 + (P - 20) * 16; 2449 2450 if (P <= 1124) 2451 return 1004 + (P - 81); 2452 2453 if (P < 64512) 2454 return 2047 + (P - 1124) * 33878; 2455 2456 return 2147482625u + (P - 64512); 2457 } 2458 2459 static std::string convertToSinitPriority(int Priority) { 2460 // This helper function converts clang init priority to values used in sinit 2461 // and sterm functions. 2462 // 2463 // The conversion strategies are: 2464 // We map the reserved clang/gnu priority range [0, 100] into the sinit/sterm 2465 // reserved priority range [0, 1023] by 2466 // - directly mapping the first 21 and the last 20 elements of the ranges 2467 // - linear interpolating the intermediate values with a step size of 16. 2468 // 2469 // We map the non reserved clang/gnu priority range of [101, 65535] into the 2470 // sinit/sterm priority range [1024, 2147483648] by: 2471 // - directly mapping the first and the last 1024 elements of the ranges 2472 // - linear interpolating the intermediate values with a step size of 33878. 2473 unsigned int P = mapToSinitPriority(Priority); 2474 2475 std::string PrioritySuffix; 2476 llvm::raw_string_ostream os(PrioritySuffix); 2477 os << llvm::format_hex_no_prefix(P, 8); 2478 os.flush(); 2479 return PrioritySuffix; 2480 } 2481 2482 void PPCAIXAsmPrinter::emitXXStructorList(const DataLayout &DL, 2483 const Constant *List, bool IsCtor) { 2484 SmallVector<Structor, 8> Structors; 2485 preprocessXXStructorList(DL, List, Structors); 2486 if (Structors.empty()) 2487 return; 2488 2489 unsigned Index = 0; 2490 for (Structor &S : Structors) { 2491 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(S.Func)) 2492 S.Func = CE->getOperand(0); 2493 2494 llvm::GlobalAlias::create( 2495 GlobalValue::ExternalLinkage, 2496 (IsCtor ? llvm::Twine("__sinit") : llvm::Twine("__sterm")) + 2497 llvm::Twine(convertToSinitPriority(S.Priority)) + 2498 llvm::Twine("_", FormatIndicatorAndUniqueModId) + 2499 llvm::Twine("_", llvm::utostr(Index++)), 2500 cast<Function>(S.Func)); 2501 } 2502 } 2503 2504 void PPCAIXAsmPrinter::emitTTypeReference(const GlobalValue *GV, 2505 unsigned Encoding) { 2506 if (GV) { 2507 MCSymbol *TypeInfoSym = TM.getSymbol(GV); 2508 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(TypeInfoSym); 2509 const MCSymbol *TOCBaseSym = 2510 cast<MCSectionXCOFF>(getObjFileLowering().getTOCBaseSection()) 2511 ->getQualNameSymbol(); 2512 auto &Ctx = OutStreamer->getContext(); 2513 const MCExpr *Exp = 2514 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCEntry, Ctx), 2515 MCSymbolRefExpr::create(TOCBaseSym, Ctx), Ctx); 2516 OutStreamer->emitValue(Exp, GetSizeOfEncodedValue(Encoding)); 2517 } else 2518 OutStreamer->emitIntValue(0, GetSizeOfEncodedValue(Encoding)); 2519 } 2520 2521 // Return a pass that prints the PPC assembly code for a MachineFunction to the 2522 // given output stream. 2523 static AsmPrinter * 2524 createPPCAsmPrinterPass(TargetMachine &tm, 2525 std::unique_ptr<MCStreamer> &&Streamer) { 2526 if (tm.getTargetTriple().isOSAIX()) 2527 return new PPCAIXAsmPrinter(tm, std::move(Streamer)); 2528 2529 return new PPCLinuxAsmPrinter(tm, std::move(Streamer)); 2530 } 2531 2532 // Force static initialization. 2533 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCAsmPrinter() { 2534 TargetRegistry::RegisterAsmPrinter(getThePPC32Target(), 2535 createPPCAsmPrinterPass); 2536 TargetRegistry::RegisterAsmPrinter(getThePPC32LETarget(), 2537 createPPCAsmPrinterPass); 2538 TargetRegistry::RegisterAsmPrinter(getThePPC64Target(), 2539 createPPCAsmPrinterPass); 2540 TargetRegistry::RegisterAsmPrinter(getThePPC64LETarget(), 2541 createPPCAsmPrinterPass); 2542 } 2543