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