PPCAsmPrinter.cpp revision 382f0022726bff5ed088a171005c1ebde3635925
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#define DEBUG_TYPE "asmprinter" 20#include "PPC.h" 21#include "PPCPredicates.h" 22#include "PPCTargetMachine.h" 23#include "PPCSubtarget.h" 24#include "llvm/Constants.h" 25#include "llvm/DerivedTypes.h" 26#include "llvm/Module.h" 27#include "llvm/Assembly/Writer.h" 28#include "llvm/CodeGen/AsmPrinter.h" 29#include "llvm/CodeGen/DwarfWriter.h" 30#include "llvm/CodeGen/MachineModuleInfo.h" 31#include "llvm/CodeGen/MachineFunctionPass.h" 32#include "llvm/CodeGen/MachineInstr.h" 33#include "llvm/CodeGen/MachineInstrBuilder.h" 34#include "llvm/Support/Mangler.h" 35#include "llvm/Support/MathExtras.h" 36#include "llvm/Support/CommandLine.h" 37#include "llvm/Support/Debug.h" 38#include "llvm/Support/Compiler.h" 39#include "llvm/Target/TargetAsmInfo.h" 40#include "llvm/Target/TargetRegisterInfo.h" 41#include "llvm/Target/TargetInstrInfo.h" 42#include "llvm/Target/TargetOptions.h" 43#include "llvm/ADT/Statistic.h" 44#include "llvm/ADT/StringExtras.h" 45#include <set> 46using namespace llvm; 47 48STATISTIC(EmittedInsts, "Number of machine instrs printed"); 49 50namespace { 51 struct VISIBILITY_HIDDEN PPCAsmPrinter : public AsmPrinter { 52 std::set<std::string> FnStubs, GVStubs; 53 const PPCSubtarget &Subtarget; 54 55 PPCAsmPrinter(std::ostream &O, TargetMachine &TM, const TargetAsmInfo *T) 56 : AsmPrinter(O, TM, T), Subtarget(TM.getSubtarget<PPCSubtarget>()) { 57 } 58 59 virtual const char *getPassName() const { 60 return "PowerPC Assembly Printer"; 61 } 62 63 PPCTargetMachine &getTM() { 64 return static_cast<PPCTargetMachine&>(TM); 65 } 66 67 unsigned enumRegToMachineReg(unsigned enumReg) { 68 switch (enumReg) { 69 default: assert(0 && "Unhandled register!"); break; 70 case PPC::CR0: return 0; 71 case PPC::CR1: return 1; 72 case PPC::CR2: return 2; 73 case PPC::CR3: return 3; 74 case PPC::CR4: return 4; 75 case PPC::CR5: return 5; 76 case PPC::CR6: return 6; 77 case PPC::CR7: return 7; 78 } 79 abort(); 80 } 81 82 /// printInstruction - This method is automatically generated by tablegen 83 /// from the instruction set description. This method returns true if the 84 /// machine instruction was sufficiently described to print it, otherwise it 85 /// returns false. 86 bool printInstruction(const MachineInstr *MI); 87 88 void printMachineInstruction(const MachineInstr *MI); 89 void printOp(const MachineOperand &MO); 90 91 /// stripRegisterPrefix - This method strips the character prefix from a 92 /// register name so that only the number is left. Used by for linux asm. 93 const char *stripRegisterPrefix(const char *RegName) { 94 switch (RegName[0]) { 95 case 'r': 96 case 'f': 97 case 'v': return RegName + 1; 98 case 'c': if (RegName[1] == 'r') return RegName + 2; 99 } 100 101 return RegName; 102 } 103 104 /// printRegister - Print register according to target requirements. 105 /// 106 void printRegister(const MachineOperand &MO, bool R0AsZero) { 107 unsigned RegNo = MO.getReg(); 108 assert(TargetRegisterInfo::isPhysicalRegister(RegNo) && "Not physreg??"); 109 110 // If we should use 0 for R0. 111 if (R0AsZero && RegNo == PPC::R0) { 112 O << "0"; 113 return; 114 } 115 116 const char *RegName = TM.getRegisterInfo()->get(RegNo).AsmName; 117 // Linux assembler (Others?) does not take register mnemonics. 118 // FIXME - What about special registers used in mfspr/mtspr? 119 if (!Subtarget.isDarwin()) RegName = stripRegisterPrefix(RegName); 120 O << RegName; 121 } 122 123 void printOperand(const MachineInstr *MI, unsigned OpNo) { 124 const MachineOperand &MO = MI->getOperand(OpNo); 125 if (MO.isRegister()) { 126 printRegister(MO, false); 127 } else if (MO.isImmediate()) { 128 O << MO.getImm(); 129 } else { 130 printOp(MO); 131 } 132 } 133 134 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 135 unsigned AsmVariant, const char *ExtraCode); 136 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 137 unsigned AsmVariant, const char *ExtraCode); 138 139 140 void printS5ImmOperand(const MachineInstr *MI, unsigned OpNo) { 141 char value = MI->getOperand(OpNo).getImm(); 142 value = (value << (32-5)) >> (32-5); 143 O << (int)value; 144 } 145 void printU5ImmOperand(const MachineInstr *MI, unsigned OpNo) { 146 unsigned char value = MI->getOperand(OpNo).getImm(); 147 assert(value <= 31 && "Invalid u5imm argument!"); 148 O << (unsigned int)value; 149 } 150 void printU6ImmOperand(const MachineInstr *MI, unsigned OpNo) { 151 unsigned char value = MI->getOperand(OpNo).getImm(); 152 assert(value <= 63 && "Invalid u6imm argument!"); 153 O << (unsigned int)value; 154 } 155 void printS16ImmOperand(const MachineInstr *MI, unsigned OpNo) { 156 O << (short)MI->getOperand(OpNo).getImm(); 157 } 158 void printU16ImmOperand(const MachineInstr *MI, unsigned OpNo) { 159 O << (unsigned short)MI->getOperand(OpNo).getImm(); 160 } 161 void printS16X4ImmOperand(const MachineInstr *MI, unsigned OpNo) { 162 if (MI->getOperand(OpNo).isImmediate()) { 163 O << (short)(MI->getOperand(OpNo).getImm()*4); 164 } else { 165 O << "lo16("; 166 printOp(MI->getOperand(OpNo)); 167 if (TM.getRelocationModel() == Reloc::PIC_) 168 O << "-\"L" << getFunctionNumber() << "$pb\")"; 169 else 170 O << ')'; 171 } 172 } 173 void printBranchOperand(const MachineInstr *MI, unsigned OpNo) { 174 // Branches can take an immediate operand. This is used by the branch 175 // selection pass to print $+8, an eight byte displacement from the PC. 176 if (MI->getOperand(OpNo).isImmediate()) { 177 O << "$+" << MI->getOperand(OpNo).getImm()*4; 178 } else { 179 printOp(MI->getOperand(OpNo)); 180 } 181 } 182 void printCallOperand(const MachineInstr *MI, unsigned OpNo) { 183 const MachineOperand &MO = MI->getOperand(OpNo); 184 if (TM.getRelocationModel() != Reloc::Static) { 185 if (MO.getType() == MachineOperand::MO_GlobalAddress) { 186 GlobalValue *GV = MO.getGlobal(); 187 if (((GV->isDeclaration() || GV->hasWeakLinkage() || 188 GV->hasLinkOnceLinkage() || GV->hasCommonLinkage()))) { 189 // Dynamically-resolved functions need a stub for the function. 190 std::string Name = Mang->getValueName(GV); 191 FnStubs.insert(Name); 192 printSuffixedName(Name, "$stub"); 193 if (GV->hasExternalWeakLinkage()) 194 ExtWeakSymbols.insert(GV); 195 return; 196 } 197 } 198 if (MO.getType() == MachineOperand::MO_ExternalSymbol) { 199 std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName(); 200 FnStubs.insert(Name); 201 printSuffixedName(Name, "$stub"); 202 return; 203 } 204 } 205 206 printOp(MI->getOperand(OpNo)); 207 } 208 void printAbsAddrOperand(const MachineInstr *MI, unsigned OpNo) { 209 O << (int)MI->getOperand(OpNo).getImm()*4; 210 } 211 void printPICLabel(const MachineInstr *MI, unsigned OpNo) { 212 O << "\"L" << getFunctionNumber() << "$pb\"\n"; 213 O << "\"L" << getFunctionNumber() << "$pb\":"; 214 } 215 void printSymbolHi(const MachineInstr *MI, unsigned OpNo) { 216 if (MI->getOperand(OpNo).isImmediate()) { 217 printS16ImmOperand(MI, OpNo); 218 } else { 219 if (Subtarget.isDarwin()) O << "ha16("; 220 printOp(MI->getOperand(OpNo)); 221 if (TM.getRelocationModel() == Reloc::PIC_) 222 O << "-\"L" << getFunctionNumber() << "$pb\""; 223 if (Subtarget.isDarwin()) 224 O << ')'; 225 else 226 O << "@ha"; 227 } 228 } 229 void printSymbolLo(const MachineInstr *MI, unsigned OpNo) { 230 if (MI->getOperand(OpNo).isImmediate()) { 231 printS16ImmOperand(MI, OpNo); 232 } else { 233 if (Subtarget.isDarwin()) O << "lo16("; 234 printOp(MI->getOperand(OpNo)); 235 if (TM.getRelocationModel() == Reloc::PIC_) 236 O << "-\"L" << getFunctionNumber() << "$pb\""; 237 if (Subtarget.isDarwin()) 238 O << ')'; 239 else 240 O << "@l"; 241 } 242 } 243 void printcrbitm(const MachineInstr *MI, unsigned OpNo) { 244 unsigned CCReg = MI->getOperand(OpNo).getReg(); 245 unsigned RegNo = enumRegToMachineReg(CCReg); 246 O << (0x80 >> RegNo); 247 } 248 // The new addressing mode printers. 249 void printMemRegImm(const MachineInstr *MI, unsigned OpNo) { 250 printSymbolLo(MI, OpNo); 251 O << '('; 252 if (MI->getOperand(OpNo+1).isRegister() && 253 MI->getOperand(OpNo+1).getReg() == PPC::R0) 254 O << "0"; 255 else 256 printOperand(MI, OpNo+1); 257 O << ')'; 258 } 259 void printMemRegImmShifted(const MachineInstr *MI, unsigned OpNo) { 260 if (MI->getOperand(OpNo).isImmediate()) 261 printS16X4ImmOperand(MI, OpNo); 262 else 263 printSymbolLo(MI, OpNo); 264 O << '('; 265 if (MI->getOperand(OpNo+1).isRegister() && 266 MI->getOperand(OpNo+1).getReg() == PPC::R0) 267 O << "0"; 268 else 269 printOperand(MI, OpNo+1); 270 O << ')'; 271 } 272 273 void printMemRegReg(const MachineInstr *MI, unsigned OpNo) { 274 // When used as the base register, r0 reads constant zero rather than 275 // the value contained in the register. For this reason, the darwin 276 // assembler requires that we print r0 as 0 (no r) when used as the base. 277 const MachineOperand &MO = MI->getOperand(OpNo); 278 printRegister(MO, true); 279 O << ", "; 280 printOperand(MI, OpNo+1); 281 } 282 283 void printPredicateOperand(const MachineInstr *MI, unsigned OpNo, 284 const char *Modifier); 285 286 virtual bool runOnMachineFunction(MachineFunction &F) = 0; 287 virtual bool doFinalization(Module &M) = 0; 288 289 virtual void EmitExternalGlobal(const GlobalVariable *GV); 290 }; 291 292 /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux 293 struct VISIBILITY_HIDDEN PPCLinuxAsmPrinter : public PPCAsmPrinter { 294 295 DwarfWriter DW; 296 MachineModuleInfo *MMI; 297 298 PPCLinuxAsmPrinter(std::ostream &O, PPCTargetMachine &TM, 299 const TargetAsmInfo *T) 300 : PPCAsmPrinter(O, TM, T), DW(O, this, T), MMI(0) { 301 } 302 303 virtual const char *getPassName() const { 304 return "Linux PPC Assembly Printer"; 305 } 306 307 bool runOnMachineFunction(MachineFunction &F); 308 bool doInitialization(Module &M); 309 bool doFinalization(Module &M); 310 311 void getAnalysisUsage(AnalysisUsage &AU) const { 312 AU.setPreservesAll(); 313 AU.addRequired<MachineModuleInfo>(); 314 PPCAsmPrinter::getAnalysisUsage(AU); 315 } 316 317 /// getSectionForFunction - Return the section that we should emit the 318 /// specified function body into. 319 virtual std::string getSectionForFunction(const Function &F) const; 320 void printModuleLevelGV(const GlobalVariable* GVar); 321 }; 322 323 /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac 324 /// OS X 325 struct VISIBILITY_HIDDEN PPCDarwinAsmPrinter : public PPCAsmPrinter { 326 327 DwarfWriter DW; 328 MachineModuleInfo *MMI; 329 330 PPCDarwinAsmPrinter(std::ostream &O, PPCTargetMachine &TM, 331 const TargetAsmInfo *T) 332 : PPCAsmPrinter(O, TM, T), DW(O, this, T), MMI(0) { 333 } 334 335 virtual const char *getPassName() const { 336 return "Darwin PPC Assembly Printer"; 337 } 338 339 bool runOnMachineFunction(MachineFunction &F); 340 bool doInitialization(Module &M); 341 bool doFinalization(Module &M); 342 343 void getAnalysisUsage(AnalysisUsage &AU) const { 344 AU.setPreservesAll(); 345 AU.addRequired<MachineModuleInfo>(); 346 PPCAsmPrinter::getAnalysisUsage(AU); 347 } 348 349 /// getSectionForFunction - Return the section that we should emit the 350 /// specified function body into. 351 virtual std::string getSectionForFunction(const Function &F) const; 352 void printModuleLevelGV(const GlobalVariable* GVar); 353 }; 354} // end of anonymous namespace 355 356// Include the auto-generated portion of the assembly writer 357#include "PPCGenAsmWriter.inc" 358 359void PPCAsmPrinter::printOp(const MachineOperand &MO) { 360 switch (MO.getType()) { 361 case MachineOperand::MO_Immediate: 362 cerr << "printOp() does not handle immediate values\n"; 363 abort(); 364 return; 365 366 case MachineOperand::MO_MachineBasicBlock: 367 printBasicBlockLabel(MO.getMBB()); 368 return; 369 case MachineOperand::MO_JumpTableIndex: 370 O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 371 << '_' << MO.getIndex(); 372 // FIXME: PIC relocation model 373 return; 374 case MachineOperand::MO_ConstantPoolIndex: 375 O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() 376 << '_' << MO.getIndex(); 377 return; 378 case MachineOperand::MO_ExternalSymbol: 379 // Computing the address of an external symbol, not calling it. 380 if (TM.getRelocationModel() != Reloc::Static) { 381 std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName(); 382 GVStubs.insert(Name); 383 printSuffixedName(Name, "$non_lazy_ptr"); 384 return; 385 } 386 O << TAI->getGlobalPrefix() << MO.getSymbolName(); 387 return; 388 case MachineOperand::MO_GlobalAddress: { 389 // Computing the address of a global symbol, not calling it. 390 GlobalValue *GV = MO.getGlobal(); 391 std::string Name = Mang->getValueName(GV); 392 393 // External or weakly linked global variables need non-lazily-resolved stubs 394 if (TM.getRelocationModel() != Reloc::Static) { 395 if (((GV->isDeclaration() || GV->hasWeakLinkage() || 396 GV->hasLinkOnceLinkage() || GV->hasCommonLinkage()))) { 397 GVStubs.insert(Name); 398 printSuffixedName(Name, "$non_lazy_ptr"); 399 if (GV->hasExternalWeakLinkage()) 400 ExtWeakSymbols.insert(GV); 401 return; 402 } 403 } 404 O << Name; 405 406 if (MO.getOffset() > 0) 407 O << "+" << MO.getOffset(); 408 else if (MO.getOffset() < 0) 409 O << MO.getOffset(); 410 411 if (GV->hasExternalWeakLinkage()) 412 ExtWeakSymbols.insert(GV); 413 return; 414 } 415 416 default: 417 O << "<unknown operand type: " << MO.getType() << ">"; 418 return; 419 } 420} 421 422/// EmitExternalGlobal - In this case we need to use the indirect symbol. 423/// 424void PPCAsmPrinter::EmitExternalGlobal(const GlobalVariable *GV) { 425 std::string Name = getGlobalLinkName(GV); 426 if (TM.getRelocationModel() != Reloc::Static) { 427 GVStubs.insert(Name); 428 printSuffixedName(Name, "$non_lazy_ptr"); 429 return; 430 } 431 O << Name; 432} 433 434/// PrintAsmOperand - Print out an operand for an inline asm expression. 435/// 436bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 437 unsigned AsmVariant, 438 const char *ExtraCode) { 439 // Does this asm operand have a single letter operand modifier? 440 if (ExtraCode && ExtraCode[0]) { 441 if (ExtraCode[1] != 0) return true; // Unknown modifier. 442 443 switch (ExtraCode[0]) { 444 default: return true; // Unknown modifier. 445 case 'c': // Don't print "$" before a global var name or constant. 446 // PPC never has a prefix. 447 printOperand(MI, OpNo); 448 return false; 449 case 'L': // Write second word of DImode reference. 450 // Verify that this operand has two consecutive registers. 451 if (!MI->getOperand(OpNo).isRegister() || 452 OpNo+1 == MI->getNumOperands() || 453 !MI->getOperand(OpNo+1).isRegister()) 454 return true; 455 ++OpNo; // Return the high-part. 456 break; 457 case 'I': 458 // Write 'i' if an integer constant, otherwise nothing. Used to print 459 // addi vs add, etc. 460 if (MI->getOperand(OpNo).isImmediate()) 461 O << "i"; 462 return false; 463 } 464 } 465 466 printOperand(MI, OpNo); 467 return false; 468} 469 470bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 471 unsigned AsmVariant, 472 const char *ExtraCode) { 473 if (ExtraCode && ExtraCode[0]) 474 return true; // Unknown modifier. 475 if (MI->getOperand(OpNo).isRegister()) 476 printMemRegReg(MI, OpNo); 477 else 478 printMemRegImm(MI, OpNo); 479 return false; 480} 481 482void PPCAsmPrinter::printPredicateOperand(const MachineInstr *MI, unsigned OpNo, 483 const char *Modifier) { 484 assert(Modifier && "Must specify 'cc' or 'reg' as predicate op modifier!"); 485 unsigned Code = MI->getOperand(OpNo).getImm(); 486 if (!strcmp(Modifier, "cc")) { 487 switch ((PPC::Predicate)Code) { 488 case PPC::PRED_ALWAYS: return; // Don't print anything for always. 489 case PPC::PRED_LT: O << "lt"; return; 490 case PPC::PRED_LE: O << "le"; return; 491 case PPC::PRED_EQ: O << "eq"; return; 492 case PPC::PRED_GE: O << "ge"; return; 493 case PPC::PRED_GT: O << "gt"; return; 494 case PPC::PRED_NE: O << "ne"; return; 495 case PPC::PRED_UN: O << "un"; return; 496 case PPC::PRED_NU: O << "nu"; return; 497 } 498 499 } else { 500 assert(!strcmp(Modifier, "reg") && 501 "Need to specify 'cc' or 'reg' as predicate op modifier!"); 502 // Don't print the register for 'always'. 503 if (Code == PPC::PRED_ALWAYS) return; 504 printOperand(MI, OpNo+1); 505 } 506} 507 508 509/// printMachineInstruction -- Print out a single PowerPC MI in Darwin syntax to 510/// the current output stream. 511/// 512void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) { 513 ++EmittedInsts; 514 515 // Check for slwi/srwi mnemonics. 516 if (MI->getOpcode() == PPC::RLWINM) { 517 bool FoundMnemonic = false; 518 unsigned char SH = MI->getOperand(2).getImm(); 519 unsigned char MB = MI->getOperand(3).getImm(); 520 unsigned char ME = MI->getOperand(4).getImm(); 521 if (SH <= 31 && MB == 0 && ME == (31-SH)) { 522 O << "\tslwi "; FoundMnemonic = true; 523 } 524 if (SH <= 31 && MB == (32-SH) && ME == 31) { 525 O << "\tsrwi "; FoundMnemonic = true; 526 SH = 32-SH; 527 } 528 if (FoundMnemonic) { 529 printOperand(MI, 0); 530 O << ", "; 531 printOperand(MI, 1); 532 O << ", " << (unsigned int)SH << '\n'; 533 return; 534 } 535 } else if (MI->getOpcode() == PPC::OR || MI->getOpcode() == PPC::OR8) { 536 if (MI->getOperand(1).getReg() == MI->getOperand(2).getReg()) { 537 O << "\tmr "; 538 printOperand(MI, 0); 539 O << ", "; 540 printOperand(MI, 1); 541 O << '\n'; 542 return; 543 } 544 } else if (MI->getOpcode() == PPC::RLDICR) { 545 unsigned char SH = MI->getOperand(2).getImm(); 546 unsigned char ME = MI->getOperand(3).getImm(); 547 // rldicr RA, RS, SH, 63-SH == sldi RA, RS, SH 548 if (63-SH == ME) { 549 O << "\tsldi "; 550 printOperand(MI, 0); 551 O << ", "; 552 printOperand(MI, 1); 553 O << ", " << (unsigned int)SH << '\n'; 554 return; 555 } 556 } 557 558 if (printInstruction(MI)) 559 return; // Printer was automatically generated 560 561 assert(0 && "Unhandled instruction in asm writer!"); 562 abort(); 563 return; 564} 565 566/// runOnMachineFunction - This uses the printMachineInstruction() 567/// method to print assembly for each instruction. 568/// 569bool PPCLinuxAsmPrinter::runOnMachineFunction(MachineFunction &MF) { 570 571 SetupMachineFunction(MF); 572 O << "\n\n"; 573 574 // Print out constants referenced by the function 575 EmitConstantPool(MF.getConstantPool()); 576 577 // Print out labels for the function. 578 const Function *F = MF.getFunction(); 579 SwitchToTextSection(getSectionForFunction(*F).c_str(), F); 580 581 switch (F->getLinkage()) { 582 default: assert(0 && "Unknown linkage type!"); 583 case Function::InternalLinkage: // Symbols default to internal. 584 break; 585 case Function::ExternalLinkage: 586 O << "\t.global\t" << CurrentFnName << '\n' 587 << "\t.type\t" << CurrentFnName << ", @function\n"; 588 break; 589 case Function::WeakLinkage: 590 case Function::LinkOnceLinkage: 591 O << "\t.global\t" << CurrentFnName << '\n'; 592 O << "\t.weak\t" << CurrentFnName << '\n'; 593 break; 594 } 595 596 if (F->hasHiddenVisibility()) 597 if (const char *Directive = TAI->getHiddenDirective()) 598 O << Directive << CurrentFnName << '\n'; 599 600 EmitAlignment(2, F); 601 O << CurrentFnName << ":\n"; 602 603 // Emit pre-function debug information. 604 DW.BeginFunction(&MF); 605 606 // Print out code for the function. 607 for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); 608 I != E; ++I) { 609 // Print a label for the basic block. 610 if (I != MF.begin()) { 611 printBasicBlockLabel(I, true, true); 612 O << '\n'; 613 } 614 for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end(); 615 II != E; ++II) { 616 // Print the assembly for the instruction. 617 printMachineInstruction(II); 618 } 619 } 620 621 O << "\t.size\t" << CurrentFnName << ",.-" << CurrentFnName << '\n'; 622 623 // Print out jump tables referenced by the function. 624 EmitJumpTableInfo(MF.getJumpTableInfo(), MF); 625 626 // Emit post-function debug information. 627 DW.EndFunction(); 628 629 // We didn't modify anything. 630 return false; 631} 632 633bool PPCLinuxAsmPrinter::doInitialization(Module &M) { 634 bool Result = AsmPrinter::doInitialization(M); 635 636 // Emit initial debug information. 637 DW.BeginModule(&M); 638 639 // AsmPrinter::doInitialization should have done this analysis. 640 MMI = getAnalysisToUpdate<MachineModuleInfo>(); 641 assert(MMI); 642 DW.SetModuleInfo(MMI); 643 644 // GNU as handles section names wrapped in quotes 645 Mang->setUseQuotes(true); 646 647 SwitchToTextSection(TAI->getTextSection()); 648 649 return Result; 650} 651 652/// PrintUnmangledNameSafely - Print out the printable characters in the name. 653/// Don't print things like \n or \0. 654static void PrintUnmangledNameSafely(const Value *V, std::ostream &OS) { 655 for (const char *Name = V->getNameStart(), *E = Name+V->getNameLen(); 656 Name != E; ++Name) 657 if (isprint(*Name)) 658 OS << *Name; 659} 660 661void PPCLinuxAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) { 662 const TargetData *TD = TM.getTargetData(); 663 664 if (!GVar->hasInitializer()) 665 return; // External global require no code 666 667 // Check to see if this is a special global used by LLVM, if so, emit it. 668 if (EmitSpecialLLVMGlobal(GVar)) 669 return; 670 671 std::string name = Mang->getValueName(GVar); 672 std::string SectionName = TAI->SectionForGlobal(GVar); 673 674 if (GVar->hasHiddenVisibility()) 675 if (const char *Directive = TAI->getHiddenDirective()) 676 O << Directive << name << '\n'; 677 678 Constant *C = GVar->getInitializer(); 679 const Type *Type = C->getType(); 680 unsigned Size = TD->getABITypeSize(Type); 681 unsigned Align = TD->getPreferredAlignmentLog(GVar); 682 683 SwitchToDataSection(SectionName.c_str()); 684 685 if (C->isNullValue() && /* FIXME: Verify correct */ 686 !GVar->hasSection() && 687 (GVar->hasInternalLinkage() || GVar->hasExternalLinkage() || 688 GVar->isWeakForLinker())) { 689 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. 690 691 if (GVar->hasExternalLinkage()) { 692 O << "\t.global " << name << '\n'; 693 O << "\t.type " << name << ", @object\n"; 694 O << name << ":\n"; 695 O << "\t.zero " << Size << '\n'; 696 } else if (GVar->hasInternalLinkage()) { 697 O << TAI->getLCOMMDirective() << name << ',' << Size; 698 } else { 699 O << ".comm " << name << ',' << Size; 700 } 701 O << "\t\t" << TAI->getCommentString() << " '"; 702 PrintUnmangledNameSafely(GVar, O); 703 O << "'\n"; 704 return; 705 } 706 707 switch (GVar->getLinkage()) { 708 case GlobalValue::LinkOnceLinkage: 709 case GlobalValue::WeakLinkage: 710 case GlobalValue::CommonLinkage: 711 O << "\t.global " << name << '\n' 712 << "\t.type " << name << ", @object\n" 713 << "\t.weak " << name << '\n'; 714 break; 715 case GlobalValue::AppendingLinkage: 716 // FIXME: appending linkage variables should go into a section of 717 // their name or something. For now, just emit them as external. 718 case GlobalValue::ExternalLinkage: 719 // If external or appending, declare as a global symbol 720 O << "\t.global " << name << '\n' 721 << "\t.type " << name << ", @object\n"; 722 // FALL THROUGH 723 case GlobalValue::InternalLinkage: 724 break; 725 default: 726 cerr << "Unknown linkage type!"; 727 abort(); 728 } 729 730 EmitAlignment(Align, GVar); 731 O << name << ":\t\t\t\t" << TAI->getCommentString() << " '"; 732 PrintUnmangledNameSafely(GVar, O); 733 O << "'\n"; 734 735 // If the initializer is a extern weak symbol, remember to emit the weak 736 // reference! 737 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C)) 738 if (GV->hasExternalWeakLinkage()) 739 ExtWeakSymbols.insert(GV); 740 741 EmitGlobalConstant(C); 742 O << '\n'; 743} 744 745bool PPCLinuxAsmPrinter::doFinalization(Module &M) { 746 // Print out module-level global variables here. 747 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 748 I != E; ++I) 749 printModuleLevelGV(I); 750 751 // TODO 752 753 // Emit initial debug information. 754 DW.EndModule(); 755 756 return AsmPrinter::doFinalization(M); 757} 758 759std::string PPCLinuxAsmPrinter::getSectionForFunction(const Function &F) const { 760 return TAI->SectionForGlobal(&F); 761} 762 763std::string PPCDarwinAsmPrinter::getSectionForFunction(const Function &F) const { 764 return TAI->SectionForGlobal(&F); 765} 766 767/// runOnMachineFunction - This uses the printMachineInstruction() 768/// method to print assembly for each instruction. 769/// 770bool PPCDarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { 771 SetupMachineFunction(MF); 772 O << "\n\n"; 773 774 // Print out constants referenced by the function 775 EmitConstantPool(MF.getConstantPool()); 776 777 // Print out labels for the function. 778 const Function *F = MF.getFunction(); 779 SwitchToTextSection(getSectionForFunction(*F).c_str(), F); 780 781 switch (F->getLinkage()) { 782 default: assert(0 && "Unknown linkage type!"); 783 case Function::InternalLinkage: // Symbols default to internal. 784 break; 785 case Function::ExternalLinkage: 786 O << "\t.globl\t" << CurrentFnName << '\n'; 787 break; 788 case Function::WeakLinkage: 789 case Function::LinkOnceLinkage: 790 O << "\t.globl\t" << CurrentFnName << '\n'; 791 O << "\t.weak_definition\t" << CurrentFnName << '\n'; 792 break; 793 } 794 795 if (F->hasHiddenVisibility()) 796 if (const char *Directive = TAI->getHiddenDirective()) 797 O << Directive << CurrentFnName << '\n'; 798 799 EmitAlignment(OptimizeForSize ? 2 : 4, F); 800 O << CurrentFnName << ":\n"; 801 802 // Emit pre-function debug information. 803 DW.BeginFunction(&MF); 804 805 // If the function is empty, then we need to emit *something*. Otherwise, the 806 // function's label might be associated with something that it wasn't meant to 807 // be associated with. We emit a noop in this situation. 808 MachineFunction::iterator I = MF.begin(); 809 810 if (++I == MF.end() && MF.front().empty()) 811 O << "\tnop\n"; 812 813 // Print out code for the function. 814 for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); 815 I != E; ++I) { 816 // Print a label for the basic block. 817 if (I != MF.begin()) { 818 printBasicBlockLabel(I, true, true); 819 O << '\n'; 820 } 821 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 822 II != IE; ++II) { 823 // Print the assembly for the instruction. 824 printMachineInstruction(II); 825 } 826 } 827 828 // Print out jump tables referenced by the function. 829 EmitJumpTableInfo(MF.getJumpTableInfo(), MF); 830 831 // Emit post-function debug information. 832 DW.EndFunction(); 833 834 // We didn't modify anything. 835 return false; 836} 837 838 839bool PPCDarwinAsmPrinter::doInitialization(Module &M) { 840 static const char *const CPUDirectives[] = { 841 "", 842 "ppc", 843 "ppc601", 844 "ppc602", 845 "ppc603", 846 "ppc7400", 847 "ppc750", 848 "ppc970", 849 "ppc64" 850 }; 851 852 unsigned Directive = Subtarget.getDarwinDirective(); 853 if (Subtarget.isGigaProcessor() && Directive < PPC::DIR_970) 854 Directive = PPC::DIR_970; 855 if (Subtarget.hasAltivec() && Directive < PPC::DIR_7400) 856 Directive = PPC::DIR_7400; 857 if (Subtarget.isPPC64() && Directive < PPC::DIR_970) 858 Directive = PPC::DIR_64; 859 assert(Directive <= PPC::DIR_64 && "Directive out of range."); 860 O << "\t.machine " << CPUDirectives[Directive] << '\n'; 861 862 bool Result = AsmPrinter::doInitialization(M); 863 864 // Emit initial debug information. 865 DW.BeginModule(&M); 866 867 // We need this for Personality functions. 868 // AsmPrinter::doInitialization should have done this analysis. 869 MMI = getAnalysisToUpdate<MachineModuleInfo>(); 870 assert(MMI); 871 DW.SetModuleInfo(MMI); 872 873 // Darwin wants symbols to be quoted if they have complex names. 874 Mang->setUseQuotes(true); 875 876 // Prime text sections so they are adjacent. This reduces the likelihood a 877 // large data or debug section causes a branch to exceed 16M limit. 878 SwitchToTextSection("\t.section __TEXT,__textcoal_nt,coalesced," 879 "pure_instructions"); 880 if (TM.getRelocationModel() == Reloc::PIC_) { 881 SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs," 882 "pure_instructions,32"); 883 } else if (TM.getRelocationModel() == Reloc::DynamicNoPIC) { 884 SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs," 885 "pure_instructions,16"); 886 } 887 SwitchToTextSection(TAI->getTextSection()); 888 889 return Result; 890} 891 892void PPCDarwinAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) { 893 const TargetData *TD = TM.getTargetData(); 894 895 if (!GVar->hasInitializer()) 896 return; // External global require no code 897 898 // Check to see if this is a special global used by LLVM, if so, emit it. 899 if (EmitSpecialLLVMGlobal(GVar)) { 900 if (TM.getRelocationModel() == Reloc::Static) { 901 if (GVar->getName() == "llvm.global_ctors") 902 O << ".reference .constructors_used\n"; 903 else if (GVar->getName() == "llvm.global_dtors") 904 O << ".reference .destructors_used\n"; 905 } 906 return; 907 } 908 909 std::string name = Mang->getValueName(GVar); 910 std::string SectionName = TAI->SectionForGlobal(GVar); 911 912 if (GVar->hasHiddenVisibility()) 913 if (const char *Directive = TAI->getHiddenDirective()) 914 O << Directive << name << '\n'; 915 916 Constant *C = GVar->getInitializer(); 917 const Type *Type = C->getType(); 918 unsigned Size = TD->getABITypeSize(Type); 919 unsigned Align = TD->getPreferredAlignmentLog(GVar); 920 921 SwitchToDataSection(SectionName.c_str()); 922 923 if (C->isNullValue() && /* FIXME: Verify correct */ 924 !GVar->hasSection() && 925 (GVar->hasInternalLinkage() || GVar->hasExternalLinkage() || 926 GVar->isWeakForLinker())) { 927 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. 928 929 if (GVar->hasExternalLinkage()) { 930 O << "\t.globl " << name << '\n'; 931 O << "\t.zerofill __DATA, __common, " << name << ", " 932 << Size << ", " << Align; 933 } else if (GVar->hasInternalLinkage()) { 934 O << TAI->getLCOMMDirective() << name << ',' << Size << ',' << Align; 935 } else if (!GVar->hasCommonLinkage()) { 936 O << "\t.globl " << name << '\n' 937 << TAI->getWeakDefDirective() << name << '\n'; 938 EmitAlignment(Align, GVar); 939 O << name << ":\t\t\t\t" << TAI->getCommentString() << " "; 940 PrintUnmangledNameSafely(GVar, O); 941 O << '\n'; 942 EmitGlobalConstant(C); 943 return; 944 } else { 945 O << ".comm " << name << ',' << Size; 946 // Darwin 9 and above support aligned common data. 947 if (Subtarget.isDarwin9()) 948 O << ',' << Align; 949 } 950 O << "\t\t" << TAI->getCommentString() << " '"; 951 PrintUnmangledNameSafely(GVar, O); 952 O << "'\n"; 953 return; 954 } 955 956 switch (GVar->getLinkage()) { 957 case GlobalValue::LinkOnceLinkage: 958 case GlobalValue::WeakLinkage: 959 case GlobalValue::CommonLinkage: 960 O << "\t.globl " << name << '\n' 961 << "\t.weak_definition " << name << '\n'; 962 break; 963 case GlobalValue::AppendingLinkage: 964 // FIXME: appending linkage variables should go into a section of 965 // their name or something. For now, just emit them as external. 966 case GlobalValue::ExternalLinkage: 967 // If external or appending, declare as a global symbol 968 O << "\t.globl " << name << '\n'; 969 // FALL THROUGH 970 case GlobalValue::InternalLinkage: 971 break; 972 default: 973 cerr << "Unknown linkage type!"; 974 abort(); 975 } 976 977 EmitAlignment(Align, GVar); 978 O << name << ":\t\t\t\t" << TAI->getCommentString() << " '"; 979 PrintUnmangledNameSafely(GVar, O); 980 O << "'\n"; 981 982 // If the initializer is a extern weak symbol, remember to emit the weak 983 // reference! 984 if (const GlobalValue *GV = dyn_cast<GlobalValue>(C)) 985 if (GV->hasExternalWeakLinkage()) 986 ExtWeakSymbols.insert(GV); 987 988 EmitGlobalConstant(C); 989 O << '\n'; 990} 991 992bool PPCDarwinAsmPrinter::doFinalization(Module &M) { 993 const TargetData *TD = TM.getTargetData(); 994 995 // Print out module-level global variables here. 996 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 997 I != E; ++I) 998 printModuleLevelGV(I); 999 1000 bool isPPC64 = TD->getPointerSizeInBits() == 64; 1001 1002 // Output stubs for dynamically-linked functions 1003 if (TM.getRelocationModel() == Reloc::PIC_) { 1004 for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end(); 1005 i != e; ++i) { 1006 SwitchToTextSection("\t.section __TEXT,__picsymbolstub1,symbol_stubs," 1007 "pure_instructions,32"); 1008 EmitAlignment(4); 1009 std::string p = *i; 1010 std::string L0p = (p[0]=='\"') ? "\"L0$" + p.substr(1) : "L0$" + p ; 1011 printSuffixedName(p, "$stub"); 1012 O << ":\n"; 1013 O << "\t.indirect_symbol " << *i << '\n'; 1014 O << "\tmflr r0\n"; 1015 O << "\tbcl 20,31," << L0p << '\n'; 1016 O << L0p << ":\n"; 1017 O << "\tmflr r11\n"; 1018 O << "\taddis r11,r11,ha16("; 1019 printSuffixedName(p, "$lazy_ptr"); 1020 O << "-" << L0p << ")\n"; 1021 O << "\tmtlr r0\n"; 1022 if (isPPC64) 1023 O << "\tldu r12,lo16("; 1024 else 1025 O << "\tlwzu r12,lo16("; 1026 printSuffixedName(p, "$lazy_ptr"); 1027 O << "-" << L0p << ")(r11)\n"; 1028 O << "\tmtctr r12\n"; 1029 O << "\tbctr\n"; 1030 SwitchToDataSection(".lazy_symbol_pointer"); 1031 printSuffixedName(p, "$lazy_ptr"); 1032 O << ":\n"; 1033 O << "\t.indirect_symbol " << *i << '\n'; 1034 if (isPPC64) 1035 O << "\t.quad dyld_stub_binding_helper\n"; 1036 else 1037 O << "\t.long dyld_stub_binding_helper\n"; 1038 } 1039 } else { 1040 for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end(); 1041 i != e; ++i) { 1042 SwitchToTextSection("\t.section __TEXT,__symbol_stub1,symbol_stubs," 1043 "pure_instructions,16"); 1044 EmitAlignment(4); 1045 std::string p = *i; 1046 printSuffixedName(p, "$stub"); 1047 O << ":\n"; 1048 O << "\t.indirect_symbol " << *i << '\n'; 1049 O << "\tlis r11,ha16("; 1050 printSuffixedName(p, "$lazy_ptr"); 1051 O << ")\n"; 1052 if (isPPC64) 1053 O << "\tldu r12,lo16("; 1054 else 1055 O << "\tlwzu r12,lo16("; 1056 printSuffixedName(p, "$lazy_ptr"); 1057 O << ")(r11)\n"; 1058 O << "\tmtctr r12\n"; 1059 O << "\tbctr\n"; 1060 SwitchToDataSection(".lazy_symbol_pointer"); 1061 printSuffixedName(p, "$lazy_ptr"); 1062 O << ":\n"; 1063 O << "\t.indirect_symbol " << *i << '\n'; 1064 if (isPPC64) 1065 O << "\t.quad dyld_stub_binding_helper\n"; 1066 else 1067 O << "\t.long dyld_stub_binding_helper\n"; 1068 } 1069 } 1070 1071 O << '\n'; 1072 1073 if (TAI->doesSupportExceptionHandling() && MMI) { 1074 // Add the (possibly multiple) personalities to the set of global values. 1075 // Only referenced functions get into the Personalities list. 1076 const std::vector<Function *>& Personalities = MMI->getPersonalities(); 1077 1078 for (std::vector<Function *>::const_iterator I = Personalities.begin(), 1079 E = Personalities.end(); I != E; ++I) 1080 if (*I) GVStubs.insert("_" + (*I)->getName()); 1081 } 1082 1083 // Output stubs for external and common global variables. 1084 if (!GVStubs.empty()) { 1085 SwitchToDataSection(".non_lazy_symbol_pointer"); 1086 for (std::set<std::string>::iterator I = GVStubs.begin(), 1087 E = GVStubs.end(); I != E; ++I) { 1088 std::string p = *I; 1089 printSuffixedName(p, "$non_lazy_ptr"); 1090 O << ":\n"; 1091 O << "\t.indirect_symbol " << *I << '\n'; 1092 if (isPPC64) 1093 O << "\t.quad\t0\n"; 1094 else 1095 O << "\t.long\t0\n"; 1096 } 1097 } 1098 1099 // Emit initial debug information. 1100 DW.EndModule(); 1101 1102 // Funny Darwin hack: This flag tells the linker that no global symbols 1103 // contain code that falls through to other global symbols (e.g. the obvious 1104 // implementation of multiple entry points). If this doesn't occur, the 1105 // linker can safely perform dead code stripping. Since LLVM never generates 1106 // code that does this, it is always safe to set. 1107 O << "\t.subsections_via_symbols\n"; 1108 1109 return AsmPrinter::doFinalization(M); 1110} 1111 1112 1113 1114/// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code 1115/// for a MachineFunction to the given output stream, in a format that the 1116/// Darwin assembler can deal with. 1117/// 1118FunctionPass *llvm::createPPCAsmPrinterPass(std::ostream &o, 1119 PPCTargetMachine &tm) { 1120 const PPCSubtarget *Subtarget = &tm.getSubtarget<PPCSubtarget>(); 1121 1122 if (Subtarget->isDarwin()) { 1123 return new PPCDarwinAsmPrinter(o, tm, tm.getTargetAsmInfo()); 1124 } else { 1125 return new PPCLinuxAsmPrinter(o, tm, tm.getTargetAsmInfo()); 1126 } 1127} 1128