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