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