1 //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly ------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains a printer that converts from our internal representation 11 // of machine-dependent LLVM code to PowerPC assembly language. This printer is 12 // the output mechanism used by `llc'. 13 // 14 // Documentation at http://developer.apple.com/documentation/DeveloperTools/ 15 // Reference/Assembler/ASMIntroduction/chapter_1_section_1.html 16 // 17 //===----------------------------------------------------------------------===// 18 19 #include "InstPrinter/PPCInstPrinter.h" 20 #include "MCTargetDesc/PPCMCExpr.h" 21 #include "MCTargetDesc/PPCMCTargetDesc.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 "llvm/ADT/MapVector.h" 29 #include "llvm/ADT/StringRef.h" 30 #include "llvm/ADT/Triple.h" 31 #include "llvm/ADT/Twine.h" 32 #include "llvm/BinaryFormat/ELF.h" 33 #include "llvm/BinaryFormat/MachO.h" 34 #include "llvm/CodeGen/AsmPrinter.h" 35 #include "llvm/CodeGen/MachineBasicBlock.h" 36 #include "llvm/CodeGen/MachineFunction.h" 37 #include "llvm/CodeGen/MachineInstr.h" 38 #include "llvm/CodeGen/MachineModuleInfoImpls.h" 39 #include "llvm/CodeGen/MachineOperand.h" 40 #include "llvm/CodeGen/MachineRegisterInfo.h" 41 #include "llvm/CodeGen/StackMaps.h" 42 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 43 #include "llvm/IR/DataLayout.h" 44 #include "llvm/IR/GlobalValue.h" 45 #include "llvm/IR/Module.h" 46 #include "llvm/MC/MCAsmInfo.h" 47 #include "llvm/MC/MCContext.h" 48 #include "llvm/MC/MCExpr.h" 49 #include "llvm/MC/MCInst.h" 50 #include "llvm/MC/MCInstBuilder.h" 51 #include "llvm/MC/MCSectionELF.h" 52 #include "llvm/MC/MCSectionMachO.h" 53 #include "llvm/MC/MCStreamer.h" 54 #include "llvm/MC/MCSymbol.h" 55 #include "llvm/MC/MCSymbolELF.h" 56 #include "llvm/MC/SectionKind.h" 57 #include "llvm/Support/Casting.h" 58 #include "llvm/Support/CodeGen.h" 59 #include "llvm/Support/Debug.h" 60 #include "llvm/Support/ErrorHandling.h" 61 #include "llvm/Support/TargetRegistry.h" 62 #include "llvm/Support/raw_ostream.h" 63 #include "llvm/Target/TargetMachine.h" 64 #include <algorithm> 65 #include <cassert> 66 #include <cstdint> 67 #include <memory> 68 #include <new> 69 70 using namespace llvm; 71 72 #define DEBUG_TYPE "asmprinter" 73 74 namespace { 75 76 class PPCAsmPrinter : public AsmPrinter { 77 protected: 78 MapVector<MCSymbol *, MCSymbol *> TOC; 79 const PPCSubtarget *Subtarget; 80 StackMaps SM; 81 82 public: 83 explicit PPCAsmPrinter(TargetMachine &TM, 84 std::unique_ptr<MCStreamer> Streamer) 85 : AsmPrinter(TM, std::move(Streamer)), SM(*this) {} 86 87 StringRef getPassName() const override { return "PowerPC Assembly Printer"; } 88 89 MCSymbol *lookUpOrCreateTOCEntry(MCSymbol *Sym); 90 91 bool doInitialization(Module &M) override { 92 if (!TOC.empty()) 93 TOC.clear(); 94 return AsmPrinter::doInitialization(M); 95 } 96 97 void EmitInstruction(const MachineInstr *MI) override; 98 99 void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O); 100 101 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 102 unsigned AsmVariant, const char *ExtraCode, 103 raw_ostream &O) override; 104 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 105 unsigned AsmVariant, const char *ExtraCode, 106 raw_ostream &O) override; 107 108 void EmitEndOfAsmFile(Module &M) override; 109 110 void LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI); 111 void LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI); 112 void EmitTlsCall(const MachineInstr *MI, MCSymbolRefExpr::VariantKind VK); 113 bool runOnMachineFunction(MachineFunction &MF) override { 114 Subtarget = &MF.getSubtarget<PPCSubtarget>(); 115 bool Changed = AsmPrinter::runOnMachineFunction(MF); 116 emitXRayTable(); 117 return Changed; 118 } 119 }; 120 121 /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux 122 class PPCLinuxAsmPrinter : public PPCAsmPrinter { 123 public: 124 explicit PPCLinuxAsmPrinter(TargetMachine &TM, 125 std::unique_ptr<MCStreamer> Streamer) 126 : PPCAsmPrinter(TM, std::move(Streamer)) {} 127 128 StringRef getPassName() const override { 129 return "Linux PPC Assembly Printer"; 130 } 131 132 bool doFinalization(Module &M) override; 133 void EmitStartOfAsmFile(Module &M) override; 134 135 void EmitFunctionEntryLabel() override; 136 137 void EmitFunctionBodyStart() override; 138 void EmitFunctionBodyEnd() override; 139 void EmitInstruction(const MachineInstr *MI) override; 140 }; 141 142 /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac 143 /// OS X 144 class PPCDarwinAsmPrinter : public PPCAsmPrinter { 145 public: 146 explicit PPCDarwinAsmPrinter(TargetMachine &TM, 147 std::unique_ptr<MCStreamer> Streamer) 148 : PPCAsmPrinter(TM, std::move(Streamer)) {} 149 150 StringRef getPassName() const override { 151 return "Darwin PPC Assembly Printer"; 152 } 153 154 bool doFinalization(Module &M) override; 155 void EmitStartOfAsmFile(Module &M) override; 156 }; 157 158 } // end anonymous namespace 159 160 /// stripRegisterPrefix - This method strips the character prefix from a 161 /// register name so that only the number is left. Used by for linux asm. 162 static const char *stripRegisterPrefix(const char *RegName) { 163 switch (RegName[0]) { 164 case 'r': 165 case 'f': 166 case 'q': // for QPX 167 case 'v': 168 if (RegName[1] == 's') 169 return RegName + 2; 170 return RegName + 1; 171 case 'c': if (RegName[1] == 'r') return RegName + 2; 172 } 173 174 return RegName; 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 unsigned Reg = MO.getReg(); 185 186 // There are VSX instructions that use VSX register numbering (vs0 - vs63) 187 // as well as those that use VMX register numbering (v0 - v31 which 188 // correspond to vs32 - vs63). If we have an instruction that uses VSX 189 // numbering, we need to convert the VMX registers to VSX registers. 190 // Namely, we print 32-63 when the instruction operates on one of the 191 // VMX registers. 192 // (Please synchronize with PPCInstPrinter::printOperand) 193 if (MI->getDesc().TSFlags & PPCII::UseVSXReg) { 194 if (PPCInstrInfo::isVRRegister(Reg)) 195 Reg = PPC::VSX32 + (Reg - PPC::V0); 196 else if (PPCInstrInfo::isVFRegister(Reg)) 197 Reg = PPC::VSX32 + (Reg - PPC::VF0); 198 } 199 const char *RegName = PPCInstPrinter::getRegisterName(Reg); 200 201 // Linux assembler (Others?) does not take register mnemonics. 202 // FIXME - What about special registers used in mfspr/mtspr? 203 if (!Subtarget->isDarwin()) 204 RegName = stripRegisterPrefix(RegName); 205 O << RegName; 206 return; 207 } 208 case MachineOperand::MO_Immediate: 209 O << MO.getImm(); 210 return; 211 212 case MachineOperand::MO_MachineBasicBlock: 213 MO.getMBB()->getSymbol()->print(O, MAI); 214 return; 215 case MachineOperand::MO_ConstantPoolIndex: 216 O << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' 217 << MO.getIndex(); 218 return; 219 case MachineOperand::MO_BlockAddress: 220 GetBlockAddressSymbol(MO.getBlockAddress())->print(O, MAI); 221 return; 222 case MachineOperand::MO_GlobalAddress: { 223 // Computing the address of a global symbol, not calling it. 224 const GlobalValue *GV = MO.getGlobal(); 225 MCSymbol *SymToPrint; 226 227 // External or weakly linked global variables need non-lazily-resolved stubs 228 if (Subtarget->hasLazyResolverStub(GV)) { 229 SymToPrint = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); 230 MachineModuleInfoImpl::StubValueTy &StubSym = 231 MMI->getObjFileInfo<MachineModuleInfoMachO>().getGVStubEntry( 232 SymToPrint); 233 if (!StubSym.getPointer()) 234 StubSym = MachineModuleInfoImpl::StubValueTy(getSymbol(GV), 235 !GV->hasInternalLinkage()); 236 } else { 237 SymToPrint = getSymbol(GV); 238 } 239 240 SymToPrint->print(O, MAI); 241 242 printOffset(MO.getOffset(), O); 243 return; 244 } 245 246 default: 247 O << "<unknown operand type: " << (unsigned)MO.getType() << ">"; 248 return; 249 } 250 } 251 252 /// PrintAsmOperand - Print out an operand for an inline asm expression. 253 /// 254 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 255 unsigned AsmVariant, 256 const char *ExtraCode, raw_ostream &O) { 257 // Does this asm operand have a single letter operand modifier? 258 if (ExtraCode && ExtraCode[0]) { 259 if (ExtraCode[1] != 0) return true; // Unknown modifier. 260 261 switch (ExtraCode[0]) { 262 default: 263 // See if this is a generic print operand 264 return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O); 265 case 'c': // Don't print "$" before a global var name or constant. 266 break; // PPC never has a prefix. 267 case 'L': // Write second word of DImode reference. 268 // Verify that this operand has two consecutive registers. 269 if (!MI->getOperand(OpNo).isReg() || 270 OpNo+1 == MI->getNumOperands() || 271 !MI->getOperand(OpNo+1).isReg()) 272 return true; 273 ++OpNo; // Return the high-part. 274 break; 275 case 'I': 276 // Write 'i' if an integer constant, otherwise nothing. Used to print 277 // addi vs add, etc. 278 if (MI->getOperand(OpNo).isImm()) 279 O << "i"; 280 return false; 281 } 282 } 283 284 printOperand(MI, OpNo, O); 285 return false; 286 } 287 288 // At the moment, all inline asm memory operands are a single register. 289 // In any case, the output of this routine should always be just one 290 // assembler operand. 291 292 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 293 unsigned AsmVariant, 294 const char *ExtraCode, 295 raw_ostream &O) { 296 if (ExtraCode && ExtraCode[0]) { 297 if (ExtraCode[1] != 0) return true; // Unknown modifier. 298 299 switch (ExtraCode[0]) { 300 default: return true; // Unknown modifier. 301 case 'y': // A memory reference for an X-form instruction 302 { 303 const char *RegName = "r0"; 304 if (!Subtarget->isDarwin()) 305 RegName = stripRegisterPrefix(RegName); 306 O << RegName << ", "; 307 printOperand(MI, OpNo, O); 308 return false; 309 } 310 case 'U': // Print 'u' for update form. 311 case 'X': // Print 'x' for indexed form. 312 { 313 // FIXME: Currently for PowerPC memory operands are always loaded 314 // into a register, so we never get an update or indexed form. 315 // This is bad even for offset forms, since even if we know we 316 // have a value in -16(r1), we will generate a load into r<n> 317 // and then load from 0(r<n>). Until that issue is fixed, 318 // tolerate 'U' and 'X' but don't output anything. 319 assert(MI->getOperand(OpNo).isReg()); 320 return false; 321 } 322 } 323 } 324 325 assert(MI->getOperand(OpNo).isReg()); 326 O << "0("; 327 printOperand(MI, OpNo, O); 328 O << ")"; 329 return false; 330 } 331 332 /// lookUpOrCreateTOCEntry -- Given a symbol, look up whether a TOC entry 333 /// exists for it. If not, create one. Then return a symbol that references 334 /// the TOC entry. 335 MCSymbol *PPCAsmPrinter::lookUpOrCreateTOCEntry(MCSymbol *Sym) { 336 MCSymbol *&TOCEntry = TOC[Sym]; 337 if (!TOCEntry) 338 TOCEntry = createTempSymbol("C"); 339 return TOCEntry; 340 } 341 342 void PPCAsmPrinter::EmitEndOfAsmFile(Module &M) { 343 SM.serializeToStackMapSection(); 344 } 345 346 void PPCAsmPrinter::LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI) { 347 unsigned NumNOPBytes = MI.getOperand(1).getImm(); 348 349 SM.recordStackMap(MI); 350 assert(NumNOPBytes % 4 == 0 && "Invalid number of NOP bytes requested!"); 351 352 // Scan ahead to trim the shadow. 353 const MachineBasicBlock &MBB = *MI.getParent(); 354 MachineBasicBlock::const_iterator MII(MI); 355 ++MII; 356 while (NumNOPBytes > 0) { 357 if (MII == MBB.end() || MII->isCall() || 358 MII->getOpcode() == PPC::DBG_VALUE || 359 MII->getOpcode() == TargetOpcode::PATCHPOINT || 360 MII->getOpcode() == TargetOpcode::STACKMAP) 361 break; 362 ++MII; 363 NumNOPBytes -= 4; 364 } 365 366 // Emit nops. 367 for (unsigned i = 0; i < NumNOPBytes; i += 4) 368 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 369 } 370 371 // Lower a patchpoint of the form: 372 // [<def>], <id>, <numBytes>, <target>, <numArgs> 373 void PPCAsmPrinter::LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI) { 374 SM.recordPatchPoint(MI); 375 PatchPointOpers Opers(&MI); 376 377 unsigned EncodedBytes = 0; 378 const MachineOperand &CalleeMO = Opers.getCallTarget(); 379 380 if (CalleeMO.isImm()) { 381 int64_t CallTarget = CalleeMO.getImm(); 382 if (CallTarget) { 383 assert((CallTarget & 0xFFFFFFFFFFFF) == CallTarget && 384 "High 16 bits of call target should be zero."); 385 unsigned ScratchReg = MI.getOperand(Opers.getNextScratchIdx()).getReg(); 386 EncodedBytes = 0; 387 // Materialize the jump address: 388 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI8) 389 .addReg(ScratchReg) 390 .addImm((CallTarget >> 32) & 0xFFFF)); 391 ++EncodedBytes; 392 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::RLDIC) 393 .addReg(ScratchReg) 394 .addReg(ScratchReg) 395 .addImm(32).addImm(16)); 396 ++EncodedBytes; 397 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORIS8) 398 .addReg(ScratchReg) 399 .addReg(ScratchReg) 400 .addImm((CallTarget >> 16) & 0xFFFF)); 401 ++EncodedBytes; 402 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORI8) 403 .addReg(ScratchReg) 404 .addReg(ScratchReg) 405 .addImm(CallTarget & 0xFFFF)); 406 407 // Save the current TOC pointer before the remote call. 408 int TOCSaveOffset = Subtarget->getFrameLowering()->getTOCSaveOffset(); 409 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::STD) 410 .addReg(PPC::X2) 411 .addImm(TOCSaveOffset) 412 .addReg(PPC::X1)); 413 ++EncodedBytes; 414 415 // If we're on ELFv1, then we need to load the actual function pointer 416 // from the function descriptor. 417 if (!Subtarget->isELFv2ABI()) { 418 // Load the new TOC pointer and the function address, but not r11 419 // (needing this is rare, and loading it here would prevent passing it 420 // via a 'nest' parameter. 421 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 422 .addReg(PPC::X2) 423 .addImm(8) 424 .addReg(ScratchReg)); 425 ++EncodedBytes; 426 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 427 .addReg(ScratchReg) 428 .addImm(0) 429 .addReg(ScratchReg)); 430 ++EncodedBytes; 431 } 432 433 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR8) 434 .addReg(ScratchReg)); 435 ++EncodedBytes; 436 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTRL8)); 437 ++EncodedBytes; 438 439 // Restore the TOC pointer after the call. 440 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 441 .addReg(PPC::X2) 442 .addImm(TOCSaveOffset) 443 .addReg(PPC::X1)); 444 ++EncodedBytes; 445 } 446 } else if (CalleeMO.isGlobal()) { 447 const GlobalValue *GValue = CalleeMO.getGlobal(); 448 MCSymbol *MOSymbol = getSymbol(GValue); 449 const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, OutContext); 450 451 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL8_NOP) 452 .addExpr(SymVar)); 453 EncodedBytes += 2; 454 } 455 456 // Each instruction is 4 bytes. 457 EncodedBytes *= 4; 458 459 // Emit padding. 460 unsigned NumBytes = Opers.getNumPatchBytes(); 461 assert(NumBytes >= EncodedBytes && 462 "Patchpoint can't request size less than the length of a call."); 463 assert((NumBytes - EncodedBytes) % 4 == 0 && 464 "Invalid number of NOP bytes requested!"); 465 for (unsigned i = EncodedBytes; i < NumBytes; i += 4) 466 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 467 } 468 469 /// EmitTlsCall -- Given a GETtls[ld]ADDR[32] instruction, print a 470 /// call to __tls_get_addr to the current output stream. 471 void PPCAsmPrinter::EmitTlsCall(const MachineInstr *MI, 472 MCSymbolRefExpr::VariantKind VK) { 473 StringRef Name = "__tls_get_addr"; 474 MCSymbol *TlsGetAddr = OutContext.getOrCreateSymbol(Name); 475 MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None; 476 477 assert(MI->getOperand(0).isReg() && 478 ((Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::X3) || 479 (!Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::R3)) && 480 "GETtls[ld]ADDR[32] must define GPR3"); 481 assert(MI->getOperand(1).isReg() && 482 ((Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::X3) || 483 (!Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::R3)) && 484 "GETtls[ld]ADDR[32] must read GPR3"); 485 486 if (!Subtarget->isPPC64() && !Subtarget->isDarwin() && 487 isPositionIndependent()) 488 Kind = MCSymbolRefExpr::VK_PLT; 489 const MCSymbolRefExpr *TlsRef = 490 MCSymbolRefExpr::create(TlsGetAddr, Kind, OutContext); 491 const MachineOperand &MO = MI->getOperand(2); 492 const GlobalValue *GValue = MO.getGlobal(); 493 MCSymbol *MOSymbol = getSymbol(GValue); 494 const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, VK, OutContext); 495 EmitToStreamer(*OutStreamer, 496 MCInstBuilder(Subtarget->isPPC64() ? 497 PPC::BL8_NOP_TLS : PPC::BL_TLS) 498 .addExpr(TlsRef) 499 .addExpr(SymVar)); 500 } 501 502 /// EmitInstruction -- Print out a single PowerPC MI in Darwin syntax to 503 /// the current output stream. 504 /// 505 void PPCAsmPrinter::EmitInstruction(const MachineInstr *MI) { 506 MCInst TmpInst; 507 bool isPPC64 = Subtarget->isPPC64(); 508 bool isDarwin = TM.getTargetTriple().isOSDarwin(); 509 const Module *M = MF->getFunction()->getParent(); 510 PICLevel::Level PL = M->getPICLevel(); 511 512 // Lower multi-instruction pseudo operations. 513 switch (MI->getOpcode()) { 514 default: break; 515 case TargetOpcode::DBG_VALUE: 516 llvm_unreachable("Should be handled target independently"); 517 case TargetOpcode::STACKMAP: 518 return LowerSTACKMAP(SM, *MI); 519 case TargetOpcode::PATCHPOINT: 520 return LowerPATCHPOINT(SM, *MI); 521 522 case PPC::MoveGOTtoLR: { 523 // Transform %LR = MoveGOTtoLR 524 // Into this: bl _GLOBAL_OFFSET_TABLE_@local-4 525 // _GLOBAL_OFFSET_TABLE_@local-4 (instruction preceding 526 // _GLOBAL_OFFSET_TABLE_) has exactly one instruction: 527 // blrl 528 // This will return the pointer to _GLOBAL_OFFSET_TABLE_@local 529 MCSymbol *GOTSymbol = 530 OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); 531 const MCExpr *OffsExpr = 532 MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol, 533 MCSymbolRefExpr::VK_PPC_LOCAL, 534 OutContext), 535 MCConstantExpr::create(4, OutContext), 536 OutContext); 537 538 // Emit the 'bl'. 539 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL).addExpr(OffsExpr)); 540 return; 541 } 542 case PPC::MovePCtoLR: 543 case PPC::MovePCtoLR8: { 544 // Transform %LR = MovePCtoLR 545 // Into this, where the label is the PIC base: 546 // bl L1$pb 547 // L1$pb: 548 MCSymbol *PICBase = MF->getPICBaseSymbol(); 549 550 // Emit the 'bl'. 551 EmitToStreamer(*OutStreamer, 552 MCInstBuilder(PPC::BL) 553 // FIXME: We would like an efficient form for this, so we 554 // don't have to do a lot of extra uniquing. 555 .addExpr(MCSymbolRefExpr::create(PICBase, OutContext))); 556 557 // Emit the label. 558 OutStreamer->EmitLabel(PICBase); 559 return; 560 } 561 case PPC::UpdateGBR: { 562 // Transform %Rd = UpdateGBR(%Rt, %Ri) 563 // Into: lwz %Rt, .L0$poff - .L0$pb(%Ri) 564 // add %Rd, %Rt, %Ri 565 // Get the offset from the GOT Base Register to the GOT 566 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 567 MCSymbol *PICOffset = 568 MF->getInfo<PPCFunctionInfo>()->getPICOffsetSymbol(); 569 TmpInst.setOpcode(PPC::LWZ); 570 const MCExpr *Exp = 571 MCSymbolRefExpr::create(PICOffset, MCSymbolRefExpr::VK_None, OutContext); 572 const MCExpr *PB = 573 MCSymbolRefExpr::create(MF->getPICBaseSymbol(), 574 MCSymbolRefExpr::VK_None, 575 OutContext); 576 const MCOperand TR = TmpInst.getOperand(1); 577 const MCOperand PICR = TmpInst.getOperand(0); 578 579 // Step 1: lwz %Rt, .L$poff - .L$pb(%Ri) 580 TmpInst.getOperand(1) = 581 MCOperand::createExpr(MCBinaryExpr::createSub(Exp, PB, OutContext)); 582 TmpInst.getOperand(0) = TR; 583 TmpInst.getOperand(2) = PICR; 584 EmitToStreamer(*OutStreamer, TmpInst); 585 586 TmpInst.setOpcode(PPC::ADD4); 587 TmpInst.getOperand(0) = PICR; 588 TmpInst.getOperand(1) = TR; 589 TmpInst.getOperand(2) = PICR; 590 EmitToStreamer(*OutStreamer, TmpInst); 591 return; 592 } 593 case PPC::LWZtoc: { 594 // Transform %R3 = LWZtoc <ga:@min1>, %R2 595 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 596 597 // Change the opcode to LWZ, and the global address operand to be a 598 // reference to the GOT entry we will synthesize later. 599 TmpInst.setOpcode(PPC::LWZ); 600 const MachineOperand &MO = MI->getOperand(1); 601 602 // Map symbol -> label of TOC entry 603 assert(MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()); 604 MCSymbol *MOSymbol = nullptr; 605 if (MO.isGlobal()) 606 MOSymbol = getSymbol(MO.getGlobal()); 607 else if (MO.isCPI()) 608 MOSymbol = GetCPISymbol(MO.getIndex()); 609 else if (MO.isJTI()) 610 MOSymbol = GetJTISymbol(MO.getIndex()); 611 else if (MO.isBlockAddress()) 612 MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress()); 613 614 if (PL == PICLevel::SmallPIC) { 615 const MCExpr *Exp = 616 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_GOT, 617 OutContext); 618 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 619 } else { 620 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol); 621 622 const MCExpr *Exp = 623 MCSymbolRefExpr::create(TOCEntry, MCSymbolRefExpr::VK_None, 624 OutContext); 625 const MCExpr *PB = 626 MCSymbolRefExpr::create(OutContext.getOrCreateSymbol(Twine(".LTOC")), 627 OutContext); 628 Exp = MCBinaryExpr::createSub(Exp, PB, OutContext); 629 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 630 } 631 EmitToStreamer(*OutStreamer, TmpInst); 632 return; 633 } 634 case PPC::LDtocJTI: 635 case PPC::LDtocCPT: 636 case PPC::LDtocBA: 637 case PPC::LDtoc: { 638 // Transform %X3 = LDtoc <ga:@min1>, %X2 639 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 640 641 // Change the opcode to LD, and the global address operand to be a 642 // reference to the TOC entry we will synthesize later. 643 TmpInst.setOpcode(PPC::LD); 644 const MachineOperand &MO = MI->getOperand(1); 645 646 // Map symbol -> label of TOC entry 647 assert(MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()); 648 MCSymbol *MOSymbol = nullptr; 649 if (MO.isGlobal()) 650 MOSymbol = getSymbol(MO.getGlobal()); 651 else if (MO.isCPI()) 652 MOSymbol = GetCPISymbol(MO.getIndex()); 653 else if (MO.isJTI()) 654 MOSymbol = GetJTISymbol(MO.getIndex()); 655 else if (MO.isBlockAddress()) 656 MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress()); 657 658 MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol); 659 660 const MCExpr *Exp = 661 MCSymbolRefExpr::create(TOCEntry, MCSymbolRefExpr::VK_PPC_TOC, 662 OutContext); 663 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 664 EmitToStreamer(*OutStreamer, TmpInst); 665 return; 666 } 667 668 case PPC::ADDIStocHA: { 669 // Transform %Xd = ADDIStocHA %X2, <ga:@sym> 670 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 671 672 // Change the opcode to ADDIS8. If the global address is external, has 673 // common linkage, is a non-local function address, or is a jump table 674 // address, then generate a TOC entry and reference that. Otherwise 675 // reference the symbol directly. 676 TmpInst.setOpcode(PPC::ADDIS8); 677 const MachineOperand &MO = MI->getOperand(2); 678 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || 679 MO.isBlockAddress()) && 680 "Invalid operand for ADDIStocHA!"); 681 MCSymbol *MOSymbol = nullptr; 682 bool GlobalToc = false; 683 684 if (MO.isGlobal()) { 685 const GlobalValue *GV = MO.getGlobal(); 686 MOSymbol = getSymbol(GV); 687 unsigned char GVFlags = Subtarget->classifyGlobalReference(GV); 688 GlobalToc = (GVFlags & PPCII::MO_NLP_FLAG); 689 } else if (MO.isCPI()) { 690 MOSymbol = GetCPISymbol(MO.getIndex()); 691 } else if (MO.isJTI()) { 692 MOSymbol = GetJTISymbol(MO.getIndex()); 693 } else if (MO.isBlockAddress()) { 694 MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress()); 695 } 696 697 if (GlobalToc || MO.isJTI() || MO.isBlockAddress() || 698 TM.getCodeModel() == CodeModel::Large) 699 MOSymbol = lookUpOrCreateTOCEntry(MOSymbol); 700 701 const MCExpr *Exp = 702 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_TOC_HA, 703 OutContext); 704 705 if (!MO.isJTI() && MO.getOffset()) 706 Exp = MCBinaryExpr::createAdd(Exp, 707 MCConstantExpr::create(MO.getOffset(), 708 OutContext), 709 OutContext); 710 711 TmpInst.getOperand(2) = MCOperand::createExpr(Exp); 712 EmitToStreamer(*OutStreamer, TmpInst); 713 return; 714 } 715 case PPC::LDtocL: { 716 // Transform %Xd = LDtocL <ga:@sym>, %Xs 717 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 718 719 // Change the opcode to LD. If the global address is external, has 720 // common linkage, or is a jump table address, then reference the 721 // associated TOC entry. Otherwise reference the symbol directly. 722 TmpInst.setOpcode(PPC::LD); 723 const MachineOperand &MO = MI->getOperand(1); 724 assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || 725 MO.isBlockAddress()) && 726 "Invalid operand for LDtocL!"); 727 MCSymbol *MOSymbol = nullptr; 728 729 if (MO.isJTI()) 730 MOSymbol = lookUpOrCreateTOCEntry(GetJTISymbol(MO.getIndex())); 731 else if (MO.isBlockAddress()) { 732 MOSymbol = GetBlockAddressSymbol(MO.getBlockAddress()); 733 MOSymbol = lookUpOrCreateTOCEntry(MOSymbol); 734 } 735 else if (MO.isCPI()) { 736 MOSymbol = GetCPISymbol(MO.getIndex()); 737 if (TM.getCodeModel() == CodeModel::Large) 738 MOSymbol = lookUpOrCreateTOCEntry(MOSymbol); 739 } 740 else if (MO.isGlobal()) { 741 const GlobalValue *GV = MO.getGlobal(); 742 MOSymbol = getSymbol(GV); 743 DEBUG( 744 unsigned char GVFlags = Subtarget->classifyGlobalReference(GV); 745 assert((GVFlags & PPCII::MO_NLP_FLAG) && 746 "LDtocL used on symbol that could be accessed directly is " 747 "invalid. Must match ADDIStocHA.")); 748 MOSymbol = lookUpOrCreateTOCEntry(MOSymbol); 749 } 750 751 const MCExpr *Exp = 752 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_TOC_LO, 753 OutContext); 754 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 755 EmitToStreamer(*OutStreamer, TmpInst); 756 return; 757 } 758 case PPC::ADDItocL: { 759 // Transform %Xd = ADDItocL %Xs, <ga:@sym> 760 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 761 762 // Change the opcode to ADDI8. If the global address is external, then 763 // generate a TOC entry and reference that. Otherwise reference the 764 // symbol directly. 765 TmpInst.setOpcode(PPC::ADDI8); 766 const MachineOperand &MO = MI->getOperand(2); 767 assert((MO.isGlobal() || MO.isCPI()) && "Invalid operand for ADDItocL"); 768 MCSymbol *MOSymbol = nullptr; 769 770 if (MO.isGlobal()) { 771 const GlobalValue *GV = MO.getGlobal(); 772 DEBUG( 773 unsigned char GVFlags = Subtarget->classifyGlobalReference(GV); 774 assert ( 775 !(GVFlags & PPCII::MO_NLP_FLAG) && 776 "Interposable definitions must use indirect access.")); 777 MOSymbol = getSymbol(GV); 778 } else if (MO.isCPI()) { 779 MOSymbol = GetCPISymbol(MO.getIndex()); 780 } 781 782 const MCExpr *Exp = 783 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_TOC_LO, 784 OutContext); 785 TmpInst.getOperand(2) = MCOperand::createExpr(Exp); 786 EmitToStreamer(*OutStreamer, TmpInst); 787 return; 788 } 789 case PPC::ADDISgotTprelHA: { 790 // Transform: %Xd = ADDISgotTprelHA %X2, <ga:@sym> 791 // Into: %Xd = ADDIS8 %X2, sym@got@tlsgd@ha 792 assert(Subtarget->isPPC64() && "Not supported for 32-bit PowerPC"); 793 const MachineOperand &MO = MI->getOperand(2); 794 const GlobalValue *GValue = MO.getGlobal(); 795 MCSymbol *MOSymbol = getSymbol(GValue); 796 const MCExpr *SymGotTprel = 797 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA, 798 OutContext); 799 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8) 800 .addReg(MI->getOperand(0).getReg()) 801 .addReg(MI->getOperand(1).getReg()) 802 .addExpr(SymGotTprel)); 803 return; 804 } 805 case PPC::LDgotTprelL: 806 case PPC::LDgotTprelL32: { 807 // Transform %Xd = LDgotTprelL <ga:@sym>, %Xs 808 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 809 810 // Change the opcode to LD. 811 TmpInst.setOpcode(isPPC64 ? PPC::LD : PPC::LWZ); 812 const MachineOperand &MO = MI->getOperand(1); 813 const GlobalValue *GValue = MO.getGlobal(); 814 MCSymbol *MOSymbol = getSymbol(GValue); 815 const MCExpr *Exp = 816 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO, 817 OutContext); 818 TmpInst.getOperand(1) = MCOperand::createExpr(Exp); 819 EmitToStreamer(*OutStreamer, TmpInst); 820 return; 821 } 822 823 case PPC::PPC32PICGOT: { 824 MCSymbol *GOTSymbol = OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); 825 MCSymbol *GOTRef = OutContext.createTempSymbol(); 826 MCSymbol *NextInstr = OutContext.createTempSymbol(); 827 828 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL) 829 // FIXME: We would like an efficient form for this, so we don't have to do 830 // a lot of extra uniquing. 831 .addExpr(MCSymbolRefExpr::create(NextInstr, OutContext))); 832 const MCExpr *OffsExpr = 833 MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol, OutContext), 834 MCSymbolRefExpr::create(GOTRef, OutContext), 835 OutContext); 836 OutStreamer->EmitLabel(GOTRef); 837 OutStreamer->EmitValue(OffsExpr, 4); 838 OutStreamer->EmitLabel(NextInstr); 839 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR) 840 .addReg(MI->getOperand(0).getReg())); 841 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LWZ) 842 .addReg(MI->getOperand(1).getReg()) 843 .addImm(0) 844 .addReg(MI->getOperand(0).getReg())); 845 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD4) 846 .addReg(MI->getOperand(0).getReg()) 847 .addReg(MI->getOperand(1).getReg()) 848 .addReg(MI->getOperand(0).getReg())); 849 return; 850 } 851 case PPC::PPC32GOT: { 852 MCSymbol *GOTSymbol = 853 OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); 854 const MCExpr *SymGotTlsL = MCSymbolRefExpr::create( 855 GOTSymbol, MCSymbolRefExpr::VK_PPC_LO, OutContext); 856 const MCExpr *SymGotTlsHA = MCSymbolRefExpr::create( 857 GOTSymbol, MCSymbolRefExpr::VK_PPC_HA, OutContext); 858 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI) 859 .addReg(MI->getOperand(0).getReg()) 860 .addExpr(SymGotTlsL)); 861 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS) 862 .addReg(MI->getOperand(0).getReg()) 863 .addReg(MI->getOperand(0).getReg()) 864 .addExpr(SymGotTlsHA)); 865 return; 866 } 867 case PPC::ADDIStlsgdHA: { 868 // Transform: %Xd = ADDIStlsgdHA %X2, <ga:@sym> 869 // Into: %Xd = ADDIS8 %X2, sym@got@tlsgd@ha 870 assert(Subtarget->isPPC64() && "Not supported for 32-bit PowerPC"); 871 const MachineOperand &MO = MI->getOperand(2); 872 const GlobalValue *GValue = MO.getGlobal(); 873 MCSymbol *MOSymbol = getSymbol(GValue); 874 const MCExpr *SymGotTlsGD = 875 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA, 876 OutContext); 877 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8) 878 .addReg(MI->getOperand(0).getReg()) 879 .addReg(MI->getOperand(1).getReg()) 880 .addExpr(SymGotTlsGD)); 881 return; 882 } 883 case PPC::ADDItlsgdL: 884 // Transform: %Xd = ADDItlsgdL %Xs, <ga:@sym> 885 // Into: %Xd = ADDI8 %Xs, sym@got@tlsgd@l 886 case PPC::ADDItlsgdL32: { 887 // Transform: %Rd = ADDItlsgdL32 %Rs, <ga:@sym> 888 // Into: %Rd = ADDI %Rs, sym@got@tlsgd 889 const MachineOperand &MO = MI->getOperand(2); 890 const GlobalValue *GValue = MO.getGlobal(); 891 MCSymbol *MOSymbol = getSymbol(GValue); 892 const MCExpr *SymGotTlsGD = MCSymbolRefExpr::create( 893 MOSymbol, Subtarget->isPPC64() ? MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO 894 : MCSymbolRefExpr::VK_PPC_GOT_TLSGD, 895 OutContext); 896 EmitToStreamer(*OutStreamer, 897 MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDI8 : PPC::ADDI) 898 .addReg(MI->getOperand(0).getReg()) 899 .addReg(MI->getOperand(1).getReg()) 900 .addExpr(SymGotTlsGD)); 901 return; 902 } 903 case PPC::GETtlsADDR: 904 // Transform: %X3 = GETtlsADDR %X3, <ga:@sym> 905 // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsgd) 906 case PPC::GETtlsADDR32: { 907 // Transform: %R3 = GETtlsADDR32 %R3, <ga:@sym> 908 // Into: BL_TLS __tls_get_addr(sym at tlsgd)@PLT 909 EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSGD); 910 return; 911 } 912 case PPC::ADDIStlsldHA: { 913 // Transform: %Xd = ADDIStlsldHA %X2, <ga:@sym> 914 // Into: %Xd = ADDIS8 %X2, sym@got@tlsld@ha 915 assert(Subtarget->isPPC64() && "Not supported for 32-bit PowerPC"); 916 const MachineOperand &MO = MI->getOperand(2); 917 const GlobalValue *GValue = MO.getGlobal(); 918 MCSymbol *MOSymbol = getSymbol(GValue); 919 const MCExpr *SymGotTlsLD = 920 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA, 921 OutContext); 922 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8) 923 .addReg(MI->getOperand(0).getReg()) 924 .addReg(MI->getOperand(1).getReg()) 925 .addExpr(SymGotTlsLD)); 926 return; 927 } 928 case PPC::ADDItlsldL: 929 // Transform: %Xd = ADDItlsldL %Xs, <ga:@sym> 930 // Into: %Xd = ADDI8 %Xs, sym@got@tlsld@l 931 case PPC::ADDItlsldL32: { 932 // Transform: %Rd = ADDItlsldL32 %Rs, <ga:@sym> 933 // Into: %Rd = ADDI %Rs, sym@got@tlsld 934 const MachineOperand &MO = MI->getOperand(2); 935 const GlobalValue *GValue = MO.getGlobal(); 936 MCSymbol *MOSymbol = getSymbol(GValue); 937 const MCExpr *SymGotTlsLD = MCSymbolRefExpr::create( 938 MOSymbol, Subtarget->isPPC64() ? MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO 939 : MCSymbolRefExpr::VK_PPC_GOT_TLSLD, 940 OutContext); 941 EmitToStreamer(*OutStreamer, 942 MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDI8 : PPC::ADDI) 943 .addReg(MI->getOperand(0).getReg()) 944 .addReg(MI->getOperand(1).getReg()) 945 .addExpr(SymGotTlsLD)); 946 return; 947 } 948 case PPC::GETtlsldADDR: 949 // Transform: %X3 = GETtlsldADDR %X3, <ga:@sym> 950 // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsld) 951 case PPC::GETtlsldADDR32: { 952 // Transform: %R3 = GETtlsldADDR32 %R3, <ga:@sym> 953 // Into: BL_TLS __tls_get_addr(sym at tlsld)@PLT 954 EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSLD); 955 return; 956 } 957 case PPC::ADDISdtprelHA: 958 // Transform: %Xd = ADDISdtprelHA %Xs, <ga:@sym> 959 // Into: %Xd = ADDIS8 %Xs, sym@dtprel@ha 960 case PPC::ADDISdtprelHA32: { 961 // Transform: %Rd = ADDISdtprelHA32 %Rs, <ga:@sym> 962 // Into: %Rd = ADDIS %Rs, sym@dtprel@ha 963 const MachineOperand &MO = MI->getOperand(2); 964 const GlobalValue *GValue = MO.getGlobal(); 965 MCSymbol *MOSymbol = getSymbol(GValue); 966 const MCExpr *SymDtprel = 967 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_HA, 968 OutContext); 969 EmitToStreamer( 970 *OutStreamer, 971 MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDIS8 : PPC::ADDIS) 972 .addReg(MI->getOperand(0).getReg()) 973 .addReg(MI->getOperand(1).getReg()) 974 .addExpr(SymDtprel)); 975 return; 976 } 977 case PPC::ADDIdtprelL: 978 // Transform: %Xd = ADDIdtprelL %Xs, <ga:@sym> 979 // Into: %Xd = ADDI8 %Xs, sym@dtprel@l 980 case PPC::ADDIdtprelL32: { 981 // Transform: %Rd = ADDIdtprelL32 %Rs, <ga:@sym> 982 // Into: %Rd = ADDI %Rs, sym@dtprel@l 983 const MachineOperand &MO = MI->getOperand(2); 984 const GlobalValue *GValue = MO.getGlobal(); 985 MCSymbol *MOSymbol = getSymbol(GValue); 986 const MCExpr *SymDtprel = 987 MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_LO, 988 OutContext); 989 EmitToStreamer(*OutStreamer, 990 MCInstBuilder(Subtarget->isPPC64() ? PPC::ADDI8 : PPC::ADDI) 991 .addReg(MI->getOperand(0).getReg()) 992 .addReg(MI->getOperand(1).getReg()) 993 .addExpr(SymDtprel)); 994 return; 995 } 996 case PPC::MFOCRF: 997 case PPC::MFOCRF8: 998 if (!Subtarget->hasMFOCRF()) { 999 // Transform: %R3 = MFOCRF %CR7 1000 // Into: %R3 = MFCR ;; cr7 1001 unsigned NewOpcode = 1002 MI->getOpcode() == PPC::MFOCRF ? PPC::MFCR : PPC::MFCR8; 1003 OutStreamer->AddComment(PPCInstPrinter:: 1004 getRegisterName(MI->getOperand(1).getReg())); 1005 EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode) 1006 .addReg(MI->getOperand(0).getReg())); 1007 return; 1008 } 1009 break; 1010 case PPC::MTOCRF: 1011 case PPC::MTOCRF8: 1012 if (!Subtarget->hasMFOCRF()) { 1013 // Transform: %CR7 = MTOCRF %R3 1014 // Into: MTCRF mask, %R3 ;; cr7 1015 unsigned NewOpcode = 1016 MI->getOpcode() == PPC::MTOCRF ? PPC::MTCRF : PPC::MTCRF8; 1017 unsigned Mask = 0x80 >> OutContext.getRegisterInfo() 1018 ->getEncodingValue(MI->getOperand(0).getReg()); 1019 OutStreamer->AddComment(PPCInstPrinter:: 1020 getRegisterName(MI->getOperand(0).getReg())); 1021 EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode) 1022 .addImm(Mask) 1023 .addReg(MI->getOperand(1).getReg())); 1024 return; 1025 } 1026 break; 1027 case PPC::LD: 1028 case PPC::STD: 1029 case PPC::LWA_32: 1030 case PPC::LWA: { 1031 // Verify alignment is legal, so we don't create relocations 1032 // that can't be supported. 1033 // FIXME: This test is currently disabled for Darwin. The test 1034 // suite shows a handful of test cases that fail this check for 1035 // Darwin. Those need to be investigated before this sanity test 1036 // can be enabled for those subtargets. 1037 if (!Subtarget->isDarwin()) { 1038 unsigned OpNum = (MI->getOpcode() == PPC::STD) ? 2 : 1; 1039 const MachineOperand &MO = MI->getOperand(OpNum); 1040 if (MO.isGlobal() && MO.getGlobal()->getAlignment() < 4) 1041 llvm_unreachable("Global must be word-aligned for LD, STD, LWA!"); 1042 } 1043 // Now process the instruction normally. 1044 break; 1045 } 1046 } 1047 1048 LowerPPCMachineInstrToMCInst(MI, TmpInst, *this, isDarwin); 1049 EmitToStreamer(*OutStreamer, TmpInst); 1050 } 1051 1052 void PPCLinuxAsmPrinter::EmitInstruction(const MachineInstr *MI) { 1053 if (!Subtarget->isPPC64()) 1054 return PPCAsmPrinter::EmitInstruction(MI); 1055 1056 switch (MI->getOpcode()) { 1057 default: 1058 return PPCAsmPrinter::EmitInstruction(MI); 1059 case TargetOpcode::PATCHABLE_FUNCTION_ENTER: { 1060 // .begin: 1061 // b .end # lis 0, FuncId[16..32] 1062 // nop # li 0, FuncId[0..15] 1063 // std 0, -8(1) 1064 // mflr 0 1065 // bl __xray_FunctionEntry 1066 // mtlr 0 1067 // .end: 1068 // 1069 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number 1070 // of instructions change. 1071 MCSymbol *BeginOfSled = OutContext.createTempSymbol(); 1072 MCSymbol *EndOfSled = OutContext.createTempSymbol(); 1073 OutStreamer->EmitLabel(BeginOfSled); 1074 EmitToStreamer(*OutStreamer, 1075 MCInstBuilder(PPC::B).addExpr( 1076 MCSymbolRefExpr::create(EndOfSled, OutContext))); 1077 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 1078 EmitToStreamer( 1079 *OutStreamer, 1080 MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1)); 1081 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0)); 1082 EmitToStreamer(*OutStreamer, 1083 MCInstBuilder(PPC::BL8_NOP) 1084 .addExpr(MCSymbolRefExpr::create( 1085 OutContext.getOrCreateSymbol("__xray_FunctionEntry"), 1086 OutContext))); 1087 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0)); 1088 OutStreamer->EmitLabel(EndOfSled); 1089 recordSled(BeginOfSled, *MI, SledKind::FUNCTION_ENTER); 1090 break; 1091 } 1092 case TargetOpcode::PATCHABLE_FUNCTION_EXIT: { 1093 // .p2align 3 1094 // .begin: 1095 // b(lr)? # lis 0, FuncId[16..32] 1096 // nop # li 0, FuncId[0..15] 1097 // std 0, -8(1) 1098 // mflr 0 1099 // bl __xray_FunctionExit 1100 // mtlr 0 1101 // .end: 1102 // b(lr)? 1103 // 1104 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number 1105 // of instructions change. 1106 const MachineInstr *Next = [&] { 1107 MachineBasicBlock::const_iterator It(MI); 1108 assert(It != MI->getParent()->end()); 1109 ++It; 1110 assert(It->isReturn()); 1111 return &*It; 1112 }(); 1113 OutStreamer->EmitCodeAlignment(8); 1114 MCSymbol *BeginOfSled = OutContext.createTempSymbol(); 1115 OutStreamer->EmitLabel(BeginOfSled); 1116 MCInst TmpInst; 1117 LowerPPCMachineInstrToMCInst(Next, TmpInst, *this, false); 1118 EmitToStreamer(*OutStreamer, TmpInst); 1119 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP)); 1120 EmitToStreamer( 1121 *OutStreamer, 1122 MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1)); 1123 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0)); 1124 EmitToStreamer(*OutStreamer, 1125 MCInstBuilder(PPC::BL8_NOP) 1126 .addExpr(MCSymbolRefExpr::create( 1127 OutContext.getOrCreateSymbol("__xray_FunctionExit"), 1128 OutContext))); 1129 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0)); 1130 recordSled(BeginOfSled, *MI, SledKind::FUNCTION_EXIT); 1131 break; 1132 } 1133 case TargetOpcode::PATCHABLE_TAIL_CALL: 1134 // TODO: Define a trampoline `__xray_FunctionTailExit` and differentiate a 1135 // normal function exit from a tail exit. 1136 case TargetOpcode::PATCHABLE_RET: 1137 // PPC's tail call instruction, e.g. PPC::TCRETURNdi8, doesn't really 1138 // lower to a PPC::B instruction. The PPC::B instruction is generated 1139 // before it, and handled by the normal case. 1140 llvm_unreachable("Tail call is handled in the normal case. See comments" 1141 "around this assert."); 1142 } 1143 } 1144 1145 void PPCLinuxAsmPrinter::EmitStartOfAsmFile(Module &M) { 1146 if (static_cast<const PPCTargetMachine &>(TM).isELFv2ABI()) { 1147 PPCTargetStreamer *TS = 1148 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 1149 1150 if (TS) 1151 TS->emitAbiVersion(2); 1152 } 1153 1154 if (static_cast<const PPCTargetMachine &>(TM).isPPC64() || 1155 !isPositionIndependent()) 1156 return AsmPrinter::EmitStartOfAsmFile(M); 1157 1158 if (M.getPICLevel() == PICLevel::SmallPIC) 1159 return AsmPrinter::EmitStartOfAsmFile(M); 1160 1161 OutStreamer->SwitchSection(OutContext.getELFSection( 1162 ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC)); 1163 1164 MCSymbol *TOCSym = OutContext.getOrCreateSymbol(Twine(".LTOC")); 1165 MCSymbol *CurrentPos = OutContext.createTempSymbol(); 1166 1167 OutStreamer->EmitLabel(CurrentPos); 1168 1169 // The GOT pointer points to the middle of the GOT, in order to reference the 1170 // entire 64kB range. 0x8000 is the midpoint. 1171 const MCExpr *tocExpr = 1172 MCBinaryExpr::createAdd(MCSymbolRefExpr::create(CurrentPos, OutContext), 1173 MCConstantExpr::create(0x8000, OutContext), 1174 OutContext); 1175 1176 OutStreamer->EmitAssignment(TOCSym, tocExpr); 1177 1178 OutStreamer->SwitchSection(getObjFileLowering().getTextSection()); 1179 } 1180 1181 void PPCLinuxAsmPrinter::EmitFunctionEntryLabel() { 1182 // linux/ppc32 - Normal entry label. 1183 if (!Subtarget->isPPC64() && 1184 (!isPositionIndependent() || 1185 MF->getFunction()->getParent()->getPICLevel() == PICLevel::SmallPIC)) 1186 return AsmPrinter::EmitFunctionEntryLabel(); 1187 1188 if (!Subtarget->isPPC64()) { 1189 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); 1190 if (PPCFI->usesPICBase()) { 1191 MCSymbol *RelocSymbol = PPCFI->getPICOffsetSymbol(); 1192 MCSymbol *PICBase = MF->getPICBaseSymbol(); 1193 OutStreamer->EmitLabel(RelocSymbol); 1194 1195 const MCExpr *OffsExpr = 1196 MCBinaryExpr::createSub( 1197 MCSymbolRefExpr::create(OutContext.getOrCreateSymbol(Twine(".LTOC")), 1198 OutContext), 1199 MCSymbolRefExpr::create(PICBase, OutContext), 1200 OutContext); 1201 OutStreamer->EmitValue(OffsExpr, 4); 1202 OutStreamer->EmitLabel(CurrentFnSym); 1203 return; 1204 } else 1205 return AsmPrinter::EmitFunctionEntryLabel(); 1206 } 1207 1208 // ELFv2 ABI - Normal entry label. 1209 if (Subtarget->isELFv2ABI()) { 1210 // In the Large code model, we allow arbitrary displacements between 1211 // the text section and its associated TOC section. We place the 1212 // full 8-byte offset to the TOC in memory immediatedly preceding 1213 // the function global entry point. 1214 if (TM.getCodeModel() == CodeModel::Large 1215 && !MF->getRegInfo().use_empty(PPC::X2)) { 1216 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); 1217 1218 MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC.")); 1219 MCSymbol *GlobalEPSymbol = PPCFI->getGlobalEPSymbol(); 1220 const MCExpr *TOCDeltaExpr = 1221 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext), 1222 MCSymbolRefExpr::create(GlobalEPSymbol, 1223 OutContext), 1224 OutContext); 1225 1226 OutStreamer->EmitLabel(PPCFI->getTOCOffsetSymbol()); 1227 OutStreamer->EmitValue(TOCDeltaExpr, 8); 1228 } 1229 return AsmPrinter::EmitFunctionEntryLabel(); 1230 } 1231 1232 // Emit an official procedure descriptor. 1233 MCSectionSubPair Current = OutStreamer->getCurrentSection(); 1234 MCSectionELF *Section = OutStreamer->getContext().getELFSection( 1235 ".opd", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC); 1236 OutStreamer->SwitchSection(Section); 1237 OutStreamer->EmitLabel(CurrentFnSym); 1238 OutStreamer->EmitValueToAlignment(8); 1239 MCSymbol *Symbol1 = CurrentFnSymForSize; 1240 // Generates a R_PPC64_ADDR64 (from FK_DATA_8) relocation for the function 1241 // entry point. 1242 OutStreamer->EmitValue(MCSymbolRefExpr::create(Symbol1, OutContext), 1243 8 /*size*/); 1244 MCSymbol *Symbol2 = OutContext.getOrCreateSymbol(StringRef(".TOC.")); 1245 // Generates a R_PPC64_TOC relocation for TOC base insertion. 1246 OutStreamer->EmitValue( 1247 MCSymbolRefExpr::create(Symbol2, MCSymbolRefExpr::VK_PPC_TOCBASE, OutContext), 1248 8/*size*/); 1249 // Emit a null environment pointer. 1250 OutStreamer->EmitIntValue(0, 8 /* size */); 1251 OutStreamer->SwitchSection(Current.first, Current.second); 1252 } 1253 1254 bool PPCLinuxAsmPrinter::doFinalization(Module &M) { 1255 const DataLayout &DL = getDataLayout(); 1256 1257 bool isPPC64 = DL.getPointerSizeInBits() == 64; 1258 1259 PPCTargetStreamer &TS = 1260 static_cast<PPCTargetStreamer &>(*OutStreamer->getTargetStreamer()); 1261 1262 if (!TOC.empty()) { 1263 MCSectionELF *Section; 1264 1265 if (isPPC64) 1266 Section = OutStreamer->getContext().getELFSection( 1267 ".toc", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC); 1268 else 1269 Section = OutStreamer->getContext().getELFSection( 1270 ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC); 1271 OutStreamer->SwitchSection(Section); 1272 1273 for (MapVector<MCSymbol*, MCSymbol*>::iterator I = TOC.begin(), 1274 E = TOC.end(); I != E; ++I) { 1275 OutStreamer->EmitLabel(I->second); 1276 MCSymbol *S = I->first; 1277 if (isPPC64) { 1278 TS.emitTCEntry(*S); 1279 } else { 1280 OutStreamer->EmitValueToAlignment(4); 1281 OutStreamer->EmitSymbolValue(S, 4); 1282 } 1283 } 1284 } 1285 1286 return AsmPrinter::doFinalization(M); 1287 } 1288 1289 /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2. 1290 void PPCLinuxAsmPrinter::EmitFunctionBodyStart() { 1291 // In the ELFv2 ABI, in functions that use the TOC register, we need to 1292 // provide two entry points. The ABI guarantees that when calling the 1293 // local entry point, r2 is set up by the caller to contain the TOC base 1294 // for this function, and when calling the global entry point, r12 is set 1295 // up by the caller to hold the address of the global entry point. We 1296 // thus emit a prefix sequence along the following lines: 1297 // 1298 // func: 1299 // .Lfunc_gepNN: 1300 // # global entry point 1301 // addis r2,r12,(.TOC.-.Lfunc_gepNN)@ha 1302 // addi r2,r2,(.TOC.-.Lfunc_gepNN)@l 1303 // .Lfunc_lepNN: 1304 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN 1305 // # local entry point, followed by function body 1306 // 1307 // For the Large code model, we create 1308 // 1309 // .Lfunc_tocNN: 1310 // .quad .TOC.-.Lfunc_gepNN # done by EmitFunctionEntryLabel 1311 // func: 1312 // .Lfunc_gepNN: 1313 // # global entry point 1314 // ld r2,.Lfunc_tocNN-.Lfunc_gepNN(r12) 1315 // add r2,r2,r12 1316 // .Lfunc_lepNN: 1317 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN 1318 // # local entry point, followed by function body 1319 // 1320 // This ensures we have r2 set up correctly while executing the function 1321 // body, no matter which entry point is called. 1322 if (Subtarget->isELFv2ABI() 1323 // Only do all that if the function uses r2 in the first place. 1324 && !MF->getRegInfo().use_empty(PPC::X2)) { 1325 // Note: The logic here must be synchronized with the code in the 1326 // branch-selection pass which sets the offset of the first block in the 1327 // function. This matters because it affects the alignment. 1328 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); 1329 1330 MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol(); 1331 OutStreamer->EmitLabel(GlobalEntryLabel); 1332 const MCSymbolRefExpr *GlobalEntryLabelExp = 1333 MCSymbolRefExpr::create(GlobalEntryLabel, OutContext); 1334 1335 if (TM.getCodeModel() != CodeModel::Large) { 1336 MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC.")); 1337 const MCExpr *TOCDeltaExpr = 1338 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext), 1339 GlobalEntryLabelExp, OutContext); 1340 1341 const MCExpr *TOCDeltaHi = 1342 PPCMCExpr::createHa(TOCDeltaExpr, false, OutContext); 1343 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS) 1344 .addReg(PPC::X2) 1345 .addReg(PPC::X12) 1346 .addExpr(TOCDeltaHi)); 1347 1348 const MCExpr *TOCDeltaLo = 1349 PPCMCExpr::createLo(TOCDeltaExpr, false, OutContext); 1350 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI) 1351 .addReg(PPC::X2) 1352 .addReg(PPC::X2) 1353 .addExpr(TOCDeltaLo)); 1354 } else { 1355 MCSymbol *TOCOffset = PPCFI->getTOCOffsetSymbol(); 1356 const MCExpr *TOCOffsetDeltaExpr = 1357 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCOffset, OutContext), 1358 GlobalEntryLabelExp, OutContext); 1359 1360 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD) 1361 .addReg(PPC::X2) 1362 .addExpr(TOCOffsetDeltaExpr) 1363 .addReg(PPC::X12)); 1364 EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD8) 1365 .addReg(PPC::X2) 1366 .addReg(PPC::X2) 1367 .addReg(PPC::X12)); 1368 } 1369 1370 MCSymbol *LocalEntryLabel = PPCFI->getLocalEPSymbol(); 1371 OutStreamer->EmitLabel(LocalEntryLabel); 1372 const MCSymbolRefExpr *LocalEntryLabelExp = 1373 MCSymbolRefExpr::create(LocalEntryLabel, OutContext); 1374 const MCExpr *LocalOffsetExp = 1375 MCBinaryExpr::createSub(LocalEntryLabelExp, 1376 GlobalEntryLabelExp, OutContext); 1377 1378 PPCTargetStreamer *TS = 1379 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 1380 1381 if (TS) 1382 TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), LocalOffsetExp); 1383 } 1384 } 1385 1386 /// EmitFunctionBodyEnd - Print the traceback table before the .size 1387 /// directive. 1388 /// 1389 void PPCLinuxAsmPrinter::EmitFunctionBodyEnd() { 1390 // Only the 64-bit target requires a traceback table. For now, 1391 // we only emit the word of zeroes that GDB requires to find 1392 // the end of the function, and zeroes for the eight-byte 1393 // mandatory fields. 1394 // FIXME: We should fill in the eight-byte mandatory fields as described in 1395 // the PPC64 ELF ABI (this is a low-priority item because GDB does not 1396 // currently make use of these fields). 1397 if (Subtarget->isPPC64()) { 1398 OutStreamer->EmitIntValue(0, 4/*size*/); 1399 OutStreamer->EmitIntValue(0, 8/*size*/); 1400 } 1401 } 1402 1403 void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module &M) { 1404 static const char *const CPUDirectives[] = { 1405 "", 1406 "ppc", 1407 "ppc440", 1408 "ppc601", 1409 "ppc602", 1410 "ppc603", 1411 "ppc7400", 1412 "ppc750", 1413 "ppc970", 1414 "ppcA2", 1415 "ppce500mc", 1416 "ppce5500", 1417 "power3", 1418 "power4", 1419 "power5", 1420 "power5x", 1421 "power6", 1422 "power6x", 1423 "power7", 1424 // FIXME: why is power8 missing here? 1425 "ppc64", 1426 "ppc64le", 1427 "power9" 1428 }; 1429 1430 // Get the numerically largest directive. 1431 // FIXME: How should we merge darwin directives? 1432 unsigned Directive = PPC::DIR_NONE; 1433 for (const Function &F : M) { 1434 const PPCSubtarget &STI = TM.getSubtarget<PPCSubtarget>(F); 1435 unsigned FDir = STI.getDarwinDirective(); 1436 Directive = Directive > FDir ? FDir : STI.getDarwinDirective(); 1437 if (STI.hasMFOCRF() && Directive < PPC::DIR_970) 1438 Directive = PPC::DIR_970; 1439 if (STI.hasAltivec() && Directive < PPC::DIR_7400) 1440 Directive = PPC::DIR_7400; 1441 if (STI.isPPC64() && Directive < PPC::DIR_64) 1442 Directive = PPC::DIR_64; 1443 } 1444 1445 assert(Directive <= PPC::DIR_64 && "Directive out of range."); 1446 1447 assert(Directive < array_lengthof(CPUDirectives) && 1448 "CPUDirectives[] might not be up-to-date!"); 1449 PPCTargetStreamer &TStreamer = 1450 *static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); 1451 TStreamer.emitMachine(CPUDirectives[Directive]); 1452 1453 // Prime text sections so they are adjacent. This reduces the likelihood a 1454 // large data or debug section causes a branch to exceed 16M limit. 1455 const TargetLoweringObjectFileMachO &TLOFMacho = 1456 static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering()); 1457 OutStreamer->SwitchSection(TLOFMacho.getTextCoalSection()); 1458 if (TM.getRelocationModel() == Reloc::PIC_) { 1459 OutStreamer->SwitchSection( 1460 OutContext.getMachOSection("__TEXT", "__picsymbolstub1", 1461 MachO::S_SYMBOL_STUBS | 1462 MachO::S_ATTR_PURE_INSTRUCTIONS, 1463 32, SectionKind::getText())); 1464 } else if (TM.getRelocationModel() == Reloc::DynamicNoPIC) { 1465 OutStreamer->SwitchSection( 1466 OutContext.getMachOSection("__TEXT","__symbol_stub1", 1467 MachO::S_SYMBOL_STUBS | 1468 MachO::S_ATTR_PURE_INSTRUCTIONS, 1469 16, SectionKind::getText())); 1470 } 1471 OutStreamer->SwitchSection(getObjFileLowering().getTextSection()); 1472 } 1473 1474 bool PPCDarwinAsmPrinter::doFinalization(Module &M) { 1475 bool isPPC64 = getDataLayout().getPointerSizeInBits() == 64; 1476 1477 // Darwin/PPC always uses mach-o. 1478 const TargetLoweringObjectFileMachO &TLOFMacho = 1479 static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering()); 1480 if (MMI) { 1481 MachineModuleInfoMachO &MMIMacho = 1482 MMI->getObjFileInfo<MachineModuleInfoMachO>(); 1483 1484 if (MAI->doesSupportExceptionHandling()) { 1485 // Add the (possibly multiple) personalities to the set of global values. 1486 // Only referenced functions get into the Personalities list. 1487 for (const Function *Personality : MMI->getPersonalities()) { 1488 if (Personality) { 1489 MCSymbol *NLPSym = 1490 getSymbolWithGlobalValueBase(Personality, "$non_lazy_ptr"); 1491 MachineModuleInfoImpl::StubValueTy &StubSym = 1492 MMIMacho.getGVStubEntry(NLPSym); 1493 StubSym = 1494 MachineModuleInfoImpl::StubValueTy(getSymbol(Personality), true); 1495 } 1496 } 1497 } 1498 1499 // Output stubs for dynamically-linked functions. 1500 MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetGVStubList(); 1501 1502 // Output macho stubs for external and common global variables. 1503 if (!Stubs.empty()) { 1504 // Switch with ".non_lazy_symbol_pointer" directive. 1505 OutStreamer->SwitchSection(TLOFMacho.getNonLazySymbolPointerSection()); 1506 EmitAlignment(isPPC64 ? 3 : 2); 1507 1508 for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 1509 // L_foo$stub: 1510 OutStreamer->EmitLabel(Stubs[i].first); 1511 // .indirect_symbol _foo 1512 MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second; 1513 OutStreamer->EmitSymbolAttribute(MCSym.getPointer(), 1514 MCSA_IndirectSymbol); 1515 1516 if (MCSym.getInt()) 1517 // External to current translation unit. 1518 OutStreamer->EmitIntValue(0, isPPC64 ? 8 : 4 /*size*/); 1519 else 1520 // Internal to current translation unit. 1521 // 1522 // When we place the LSDA into the TEXT section, the type info 1523 // pointers 1524 // need to be indirect and pc-rel. We accomplish this by using NLPs. 1525 // However, sometimes the types are local to the file. So we need to 1526 // fill in the value for the NLP in those cases. 1527 OutStreamer->EmitValue( 1528 MCSymbolRefExpr::create(MCSym.getPointer(), OutContext), 1529 isPPC64 ? 8 : 4 /*size*/); 1530 } 1531 1532 Stubs.clear(); 1533 OutStreamer->AddBlankLine(); 1534 } 1535 } 1536 1537 // Funny Darwin hack: This flag tells the linker that no global symbols 1538 // contain code that falls through to other global symbols (e.g. the obvious 1539 // implementation of multiple entry points). If this doesn't occur, the 1540 // linker can safely perform dead code stripping. Since LLVM never generates 1541 // code that does this, it is always safe to set. 1542 OutStreamer->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols); 1543 1544 return AsmPrinter::doFinalization(M); 1545 } 1546 1547 /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code 1548 /// for a MachineFunction to the given output stream, in a format that the 1549 /// Darwin assembler can deal with. 1550 /// 1551 static AsmPrinter * 1552 createPPCAsmPrinterPass(TargetMachine &tm, 1553 std::unique_ptr<MCStreamer> &&Streamer) { 1554 if (tm.getTargetTriple().isMacOSX()) 1555 return new PPCDarwinAsmPrinter(tm, std::move(Streamer)); 1556 return new PPCLinuxAsmPrinter(tm, std::move(Streamer)); 1557 } 1558 1559 // Force static initialization. 1560 extern "C" void LLVMInitializePowerPCAsmPrinter() { 1561 TargetRegistry::RegisterAsmPrinter(getThePPC32Target(), 1562 createPPCAsmPrinterPass); 1563 TargetRegistry::RegisterAsmPrinter(getThePPC64Target(), 1564 createPPCAsmPrinterPass); 1565 TargetRegistry::RegisterAsmPrinter(getThePPC64LETarget(), 1566 createPPCAsmPrinterPass); 1567 } 1568