AsmPrinter.cpp revision 6d718817f982b804ff516e43a47f38aa78d2a4a9
1//===-- AsmPrinter.cpp - Common AsmPrinter code ---------------------------===// 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 implements the AsmPrinter class. 11// 12//===----------------------------------------------------------------------===// 13 14#define DEBUG_TYPE "asm-printer" 15#include "llvm/CodeGen/AsmPrinter.h" 16#include "llvm/Assembly/Writer.h" 17#include "llvm/DerivedTypes.h" 18#include "llvm/Constants.h" 19#include "llvm/Module.h" 20#include "llvm/CodeGen/DwarfWriter.h" 21#include "llvm/CodeGen/GCMetadataPrinter.h" 22#include "llvm/CodeGen/MachineConstantPool.h" 23#include "llvm/CodeGen/MachineFrameInfo.h" 24#include "llvm/CodeGen/MachineFunction.h" 25#include "llvm/CodeGen/MachineJumpTableInfo.h" 26#include "llvm/CodeGen/MachineLoopInfo.h" 27#include "llvm/CodeGen/MachineModuleInfo.h" 28#include "llvm/Analysis/ConstantFolding.h" 29#include "llvm/Analysis/DebugInfo.h" 30#include "llvm/MC/MCContext.h" 31#include "llvm/MC/MCExpr.h" 32#include "llvm/MC/MCInst.h" 33#include "llvm/MC/MCSection.h" 34#include "llvm/MC/MCStreamer.h" 35#include "llvm/MC/MCSymbol.h" 36#include "llvm/MC/MCAsmInfo.h" 37#include "llvm/Target/Mangler.h" 38#include "llvm/Target/TargetData.h" 39#include "llvm/Target/TargetInstrInfo.h" 40#include "llvm/Target/TargetLowering.h" 41#include "llvm/Target/TargetLoweringObjectFile.h" 42#include "llvm/Target/TargetOptions.h" 43#include "llvm/Target/TargetRegisterInfo.h" 44#include "llvm/ADT/SmallPtrSet.h" 45#include "llvm/ADT/SmallString.h" 46#include "llvm/ADT/Statistic.h" 47#include "llvm/Support/CommandLine.h" 48#include "llvm/Support/Debug.h" 49#include "llvm/Support/ErrorHandling.h" 50#include "llvm/Support/Format.h" 51#include "llvm/Support/FormattedStream.h" 52#include <cerrno> 53using namespace llvm; 54 55STATISTIC(EmittedInsts, "Number of machine instrs printed"); 56 57char AsmPrinter::ID = 0; 58 59AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, 60 MCStreamer &Streamer) 61 : MachineFunctionPass(&ID), O(o), 62 TM(tm), MAI(tm.getMCAsmInfo()), TRI(tm.getRegisterInfo()), 63 OutContext(Streamer.getContext()), 64 OutStreamer(Streamer), 65 LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) { 66 DW = 0; MMI = 0; 67 VerboseAsm = Streamer.isVerboseAsm(); 68} 69 70AsmPrinter::~AsmPrinter() { 71 for (gcp_iterator I = GCMetadataPrinters.begin(), 72 E = GCMetadataPrinters.end(); I != E; ++I) 73 delete I->second; 74 75 delete &OutStreamer; 76} 77 78/// getFunctionNumber - Return a unique ID for the current function. 79/// 80unsigned AsmPrinter::getFunctionNumber() const { 81 return MF->getFunctionNumber(); 82} 83 84TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const { 85 return TM.getTargetLowering()->getObjFileLowering(); 86} 87 88/// getCurrentSection() - Return the current section we are emitting to. 89const MCSection *AsmPrinter::getCurrentSection() const { 90 return OutStreamer.getCurrentSection(); 91} 92 93 94void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { 95 AU.setPreservesAll(); 96 MachineFunctionPass::getAnalysisUsage(AU); 97 AU.addRequired<MachineModuleInfo>(); 98 AU.addRequired<GCModuleInfo>(); 99 if (VerboseAsm) 100 AU.addRequired<MachineLoopInfo>(); 101} 102 103bool AsmPrinter::doInitialization(Module &M) { 104 MMI = getAnalysisIfAvailable<MachineModuleInfo>(); 105 MMI->AnalyzeModule(M); 106 107 // Initialize TargetLoweringObjectFile. 108 const_cast<TargetLoweringObjectFile&>(getObjFileLowering()) 109 .Initialize(OutContext, TM); 110 111 Mang = new Mangler(OutContext, *TM.getTargetData()); 112 113 // Allow the target to emit any magic that it wants at the start of the file. 114 EmitStartOfAsmFile(M); 115 116 // Very minimal debug info. It is ignored if we emit actual debug info. If we 117 // don't, this at least helps the user find where a global came from. 118 if (MAI->hasSingleParameterDotFile()) { 119 // .file "foo.c" 120 OutStreamer.EmitFileDirective(M.getModuleIdentifier()); 121 } 122 123 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 124 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 125 for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I) 126 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) 127 MP->beginAssembly(O, *this, *MAI); 128 129 // Emit module-level inline asm if it exists. 130 if (!M.getModuleInlineAsm().empty()) { 131 OutStreamer.AddComment("Start of file scope inline assembly"); 132 OutStreamer.AddBlankLine(); 133 EmitInlineAsm(M.getModuleInlineAsm()); 134 OutStreamer.AddComment("End of file scope inline assembly"); 135 OutStreamer.AddBlankLine(); 136 } 137 138 DW = getAnalysisIfAvailable<DwarfWriter>(); 139 if (DW) 140 DW->BeginModule(&M, MMI, O, this, MAI); 141 142 return false; 143} 144 145void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const { 146 switch ((GlobalValue::LinkageTypes)Linkage) { 147 case GlobalValue::CommonLinkage: 148 case GlobalValue::LinkOnceAnyLinkage: 149 case GlobalValue::LinkOnceODRLinkage: 150 case GlobalValue::WeakAnyLinkage: 151 case GlobalValue::WeakODRLinkage: 152 case GlobalValue::LinkerPrivateLinkage: 153 if (MAI->getWeakDefDirective() != 0) { 154 // .globl _foo 155 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 156 // .weak_definition _foo 157 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition); 158 } else if (const char *LinkOnce = MAI->getLinkOnceDirective()) { 159 // .globl _foo 160 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 161 // FIXME: linkonce should be a section attribute, handled by COFF Section 162 // assignment. 163 // http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce 164 // .linkonce discard 165 // FIXME: It would be nice to use .linkonce samesize for non-common 166 // globals. 167 OutStreamer.EmitRawText(StringRef(LinkOnce)); 168 } else { 169 // .weak _foo 170 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Weak); 171 } 172 break; 173 case GlobalValue::DLLExportLinkage: 174 case GlobalValue::AppendingLinkage: 175 // FIXME: appending linkage variables should go into a section of 176 // their name or something. For now, just emit them as external. 177 case GlobalValue::ExternalLinkage: 178 // If external or appending, declare as a global symbol. 179 // .globl _foo 180 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 181 break; 182 case GlobalValue::PrivateLinkage: 183 case GlobalValue::InternalLinkage: 184 break; 185 default: 186 llvm_unreachable("Unknown linkage type!"); 187 } 188} 189 190 191/// EmitGlobalVariable - Emit the specified global variable to the .s file. 192void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { 193 if (!GV->hasInitializer()) // External globals require no code. 194 return; 195 196 // Check to see if this is a special global used by LLVM, if so, emit it. 197 if (EmitSpecialLLVMGlobal(GV)) 198 return; 199 200 MCSymbol *GVSym = Mang->getSymbol(GV); 201 EmitVisibility(GVSym, GV->getVisibility()); 202 203 if (MAI->hasDotTypeDotSizeDirective()) 204 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_ELF_TypeObject); 205 206 SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM); 207 208 const TargetData *TD = TM.getTargetData(); 209 unsigned Size = TD->getTypeAllocSize(GV->getType()->getElementType()); 210 unsigned AlignLog = TD->getPreferredAlignmentLog(GV); 211 212 // Handle common and BSS local symbols (.lcomm). 213 if (GVKind.isCommon() || GVKind.isBSSLocal()) { 214 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. 215 216 if (VerboseAsm) { 217 WriteAsOperand(OutStreamer.GetCommentOS(), GV, 218 /*PrintType=*/false, GV->getParent()); 219 OutStreamer.GetCommentOS() << '\n'; 220 } 221 222 // Handle common symbols. 223 if (GVKind.isCommon()) { 224 // .comm _foo, 42, 4 225 OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); 226 return; 227 } 228 229 // Handle local BSS symbols. 230 if (MAI->hasMachoZeroFillDirective()) { 231 const MCSection *TheSection = 232 getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM); 233 // .zerofill __DATA, __bss, _foo, 400, 5 234 OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog); 235 return; 236 } 237 238 if (MAI->hasLCOMMDirective()) { 239 // .lcomm _foo, 42 240 OutStreamer.EmitLocalCommonSymbol(GVSym, Size); 241 return; 242 } 243 244 // .local _foo 245 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Local); 246 // .comm _foo, 42, 4 247 OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); 248 return; 249 } 250 251 const MCSection *TheSection = 252 getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM); 253 254 // Handle the zerofill directive on darwin, which is a special form of BSS 255 // emission. 256 if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) { 257 // .globl _foo 258 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 259 // .zerofill __DATA, __common, _foo, 400, 5 260 OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog); 261 return; 262 } 263 264 OutStreamer.SwitchSection(TheSection); 265 266 EmitLinkage(GV->getLinkage(), GVSym); 267 EmitAlignment(AlignLog, GV); 268 269 if (VerboseAsm) { 270 WriteAsOperand(OutStreamer.GetCommentOS(), GV, 271 /*PrintType=*/false, GV->getParent()); 272 OutStreamer.GetCommentOS() << '\n'; 273 } 274 OutStreamer.EmitLabel(GVSym); 275 276 EmitGlobalConstant(GV->getInitializer()); 277 278 if (MAI->hasDotTypeDotSizeDirective()) 279 // .size foo, 42 280 OutStreamer.EmitELFSize(GVSym, MCConstantExpr::Create(Size, OutContext)); 281 282 OutStreamer.AddBlankLine(); 283} 284 285/// EmitFunctionHeader - This method emits the header for the current 286/// function. 287void AsmPrinter::EmitFunctionHeader() { 288 // Print out constants referenced by the function 289 EmitConstantPool(); 290 291 // Print the 'header' of function. 292 const Function *F = MF->getFunction(); 293 294 OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM)); 295 EmitVisibility(CurrentFnSym, F->getVisibility()); 296 297 EmitLinkage(F->getLinkage(), CurrentFnSym); 298 EmitAlignment(MF->getAlignment(), F); 299 300 if (MAI->hasDotTypeDotSizeDirective()) 301 OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction); 302 303 if (VerboseAsm) { 304 WriteAsOperand(OutStreamer.GetCommentOS(), F, 305 /*PrintType=*/false, F->getParent()); 306 OutStreamer.GetCommentOS() << '\n'; 307 } 308 309 // Emit the CurrentFnSym. This is a virtual function to allow targets to 310 // do their wild and crazy things as required. 311 EmitFunctionEntryLabel(); 312 313 // If the function had address-taken blocks that got deleted, then we have 314 // references to the dangling symbols. Emit them at the start of the function 315 // so that we don't get references to undefined symbols. 316 std::vector<MCSymbol*> DeadBlockSyms; 317 MMI->takeDeletedSymbolsForFunction(F, DeadBlockSyms); 318 for (unsigned i = 0, e = DeadBlockSyms.size(); i != e; ++i) { 319 OutStreamer.AddComment("Address taken block that was later removed"); 320 OutStreamer.EmitLabel(DeadBlockSyms[i]); 321 } 322 323 // Add some workaround for linkonce linkage on Cygwin\MinGW. 324 if (MAI->getLinkOnceDirective() != 0 && 325 (F->hasLinkOnceLinkage() || F->hasWeakLinkage())) { 326 // FIXME: What is this? 327 MCSymbol *FakeStub = 328 OutContext.GetOrCreateSymbol(Twine("Lllvm$workaround$fake$stub$")+ 329 CurrentFnSym->getName()); 330 OutStreamer.EmitLabel(FakeStub); 331 } 332 333 // Emit pre-function debug and/or EH information. 334 if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) 335 DW->BeginFunction(MF); 336} 337 338/// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the 339/// function. This can be overridden by targets as required to do custom stuff. 340void AsmPrinter::EmitFunctionEntryLabel() { 341 OutStreamer.EmitLabel(CurrentFnSym); 342} 343 344 345/// EmitComments - Pretty-print comments for instructions. 346static void EmitComments(const MachineInstr &MI, raw_ostream &CommentOS) { 347 const MachineFunction *MF = MI.getParent()->getParent(); 348 const TargetMachine &TM = MF->getTarget(); 349 350 DebugLoc DL = MI.getDebugLoc(); 351 if (!DL.isUnknown()) { // Print source line info. 352 DIScope Scope(DL.getScope(MF->getFunction()->getContext())); 353 // Omit the directory, because it's likely to be long and uninteresting. 354 if (Scope.Verify()) 355 CommentOS << Scope.getFilename(); 356 else 357 CommentOS << "<unknown>"; 358 CommentOS << ':' << DL.getLine(); 359 if (DL.getCol() != 0) 360 CommentOS << ':' << DL.getCol(); 361 CommentOS << '\n'; 362 } 363 364 // Check for spills and reloads 365 int FI; 366 367 const MachineFrameInfo *FrameInfo = MF->getFrameInfo(); 368 369 // We assume a single instruction only has a spill or reload, not 370 // both. 371 const MachineMemOperand *MMO; 372 if (TM.getInstrInfo()->isLoadFromStackSlotPostFE(&MI, FI)) { 373 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 374 MMO = *MI.memoperands_begin(); 375 CommentOS << MMO->getSize() << "-byte Reload\n"; 376 } 377 } else if (TM.getInstrInfo()->hasLoadFromStackSlot(&MI, MMO, FI)) { 378 if (FrameInfo->isSpillSlotObjectIndex(FI)) 379 CommentOS << MMO->getSize() << "-byte Folded Reload\n"; 380 } else if (TM.getInstrInfo()->isStoreToStackSlotPostFE(&MI, FI)) { 381 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 382 MMO = *MI.memoperands_begin(); 383 CommentOS << MMO->getSize() << "-byte Spill\n"; 384 } 385 } else if (TM.getInstrInfo()->hasStoreToStackSlot(&MI, MMO, FI)) { 386 if (FrameInfo->isSpillSlotObjectIndex(FI)) 387 CommentOS << MMO->getSize() << "-byte Folded Spill\n"; 388 } 389 390 // Check for spill-induced copies 391 unsigned SrcReg, DstReg, SrcSubIdx, DstSubIdx; 392 if (TM.getInstrInfo()->isMoveInstr(MI, SrcReg, DstReg, 393 SrcSubIdx, DstSubIdx)) { 394 if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse)) 395 CommentOS << " Reload Reuse\n"; 396 } 397} 398 399 400 401/// EmitFunctionBody - This method emits the body and trailer for a 402/// function. 403void AsmPrinter::EmitFunctionBody() { 404 // Emit target-specific gunk before the function body. 405 EmitFunctionBodyStart(); 406 407 // Print out code for the function. 408 bool HasAnyRealCode = false; 409 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 410 I != E; ++I) { 411 // Print a label for the basic block. 412 EmitBasicBlockStart(I); 413 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 414 II != IE; ++II) { 415 // Print the assembly for the instruction. 416 if (!II->isLabel()) 417 HasAnyRealCode = true; 418 419 ++EmittedInsts; 420 421 // FIXME: Clean up processDebugLoc. 422 processDebugLoc(II, true); 423 424 if (VerboseAsm) 425 EmitComments(*II, OutStreamer.GetCommentOS()); 426 427 switch (II->getOpcode()) { 428 case TargetOpcode::DBG_LABEL: 429 case TargetOpcode::EH_LABEL: 430 case TargetOpcode::GC_LABEL: 431 printLabelInst(II); 432 break; 433 case TargetOpcode::INLINEASM: 434 printInlineAsm(II); 435 break; 436 case TargetOpcode::IMPLICIT_DEF: 437 printImplicitDef(II); 438 break; 439 case TargetOpcode::KILL: 440 printKill(II); 441 break; 442 default: 443 EmitInstruction(II); 444 break; 445 } 446 447 // FIXME: Clean up processDebugLoc. 448 processDebugLoc(II, false); 449 } 450 } 451 452 // If the function is empty and the object file uses .subsections_via_symbols, 453 // then we need to emit *something* to the function body to prevent the 454 // labels from collapsing together. Just emit a 0 byte. 455 if (MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) 456 OutStreamer.EmitIntValue(0, 1, 0/*addrspace*/); 457 458 // Emit target-specific gunk after the function body. 459 EmitFunctionBodyEnd(); 460 461 // If the target wants a .size directive for the size of the function, emit 462 // it. 463 if (MAI->hasDotTypeDotSizeDirective()) { 464 // Create a symbol for the end of function, so we can get the size as 465 // difference between the function label and the temp label. 466 MCSymbol *FnEndLabel = OutContext.CreateTempSymbol(); 467 OutStreamer.EmitLabel(FnEndLabel); 468 469 const MCExpr *SizeExp = 470 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel, OutContext), 471 MCSymbolRefExpr::Create(CurrentFnSym, OutContext), 472 OutContext); 473 OutStreamer.EmitELFSize(CurrentFnSym, SizeExp); 474 } 475 476 // Emit post-function debug information. 477 if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) 478 DW->EndFunction(MF); 479 480 // Print out jump tables referenced by the function. 481 EmitJumpTableInfo(); 482 483 OutStreamer.AddBlankLine(); 484} 485 486 487bool AsmPrinter::doFinalization(Module &M) { 488 // Emit global variables. 489 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 490 I != E; ++I) 491 EmitGlobalVariable(I); 492 493 // Emit final debug information. 494 if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) 495 DW->EndModule(); 496 497 // If the target wants to know about weak references, print them all. 498 if (MAI->getWeakRefDirective()) { 499 // FIXME: This is not lazy, it would be nice to only print weak references 500 // to stuff that is actually used. Note that doing so would require targets 501 // to notice uses in operands (due to constant exprs etc). This should 502 // happen with the MC stuff eventually. 503 504 // Print out module-level global variables here. 505 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 506 I != E; ++I) { 507 if (!I->hasExternalWeakLinkage()) continue; 508 OutStreamer.EmitSymbolAttribute(Mang->getSymbol(I), MCSA_WeakReference); 509 } 510 511 for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { 512 if (!I->hasExternalWeakLinkage()) continue; 513 OutStreamer.EmitSymbolAttribute(Mang->getSymbol(I), MCSA_WeakReference); 514 } 515 } 516 517 if (MAI->hasSetDirective()) { 518 OutStreamer.AddBlankLine(); 519 for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); 520 I != E; ++I) { 521 MCSymbol *Name = Mang->getSymbol(I); 522 523 const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal()); 524 MCSymbol *Target = Mang->getSymbol(GV); 525 526 if (I->hasExternalLinkage() || !MAI->getWeakRefDirective()) 527 OutStreamer.EmitSymbolAttribute(Name, MCSA_Global); 528 else if (I->hasWeakLinkage()) 529 OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference); 530 else 531 assert(I->hasLocalLinkage() && "Invalid alias linkage"); 532 533 EmitVisibility(Name, I->getVisibility()); 534 535 // Emit the directives as assignments aka .set: 536 OutStreamer.EmitAssignment(Name, 537 MCSymbolRefExpr::Create(Target, OutContext)); 538 } 539 } 540 541 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 542 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 543 for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) 544 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I)) 545 MP->finishAssembly(O, *this, *MAI); 546 547 // If we don't have any trampolines, then we don't require stack memory 548 // to be executable. Some targets have a directive to declare this. 549 Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); 550 if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) 551 if (MCSection *S = MAI->getNonexecutableStackSection(OutContext)) 552 OutStreamer.SwitchSection(S); 553 554 // Allow the target to emit any magic that it wants at the end of the file, 555 // after everything else has gone out. 556 EmitEndOfAsmFile(M); 557 558 delete Mang; Mang = 0; 559 DW = 0; MMI = 0; 560 561 OutStreamer.Finish(); 562 return false; 563} 564 565void AsmPrinter::SetupMachineFunction(MachineFunction &MF) { 566 this->MF = &MF; 567 // Get the function symbol. 568 CurrentFnSym = Mang->getSymbol(MF.getFunction()); 569 570 if (VerboseAsm) 571 LI = &getAnalysis<MachineLoopInfo>(); 572} 573 574namespace { 575 // SectionCPs - Keep track the alignment, constpool entries per Section. 576 struct SectionCPs { 577 const MCSection *S; 578 unsigned Alignment; 579 SmallVector<unsigned, 4> CPEs; 580 SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {} 581 }; 582} 583 584/// EmitConstantPool - Print to the current output stream assembly 585/// representations of the constants in the constant pool MCP. This is 586/// used to print out constants which have been "spilled to memory" by 587/// the code generator. 588/// 589void AsmPrinter::EmitConstantPool() { 590 const MachineConstantPool *MCP = MF->getConstantPool(); 591 const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants(); 592 if (CP.empty()) return; 593 594 // Calculate sections for constant pool entries. We collect entries to go into 595 // the same section together to reduce amount of section switch statements. 596 SmallVector<SectionCPs, 4> CPSections; 597 for (unsigned i = 0, e = CP.size(); i != e; ++i) { 598 const MachineConstantPoolEntry &CPE = CP[i]; 599 unsigned Align = CPE.getAlignment(); 600 601 SectionKind Kind; 602 switch (CPE.getRelocationInfo()) { 603 default: llvm_unreachable("Unknown section kind"); 604 case 2: Kind = SectionKind::getReadOnlyWithRel(); break; 605 case 1: 606 Kind = SectionKind::getReadOnlyWithRelLocal(); 607 break; 608 case 0: 609 switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { 610 case 4: Kind = SectionKind::getMergeableConst4(); break; 611 case 8: Kind = SectionKind::getMergeableConst8(); break; 612 case 16: Kind = SectionKind::getMergeableConst16();break; 613 default: Kind = SectionKind::getMergeableConst(); break; 614 } 615 } 616 617 const MCSection *S = getObjFileLowering().getSectionForConstant(Kind); 618 619 // The number of sections are small, just do a linear search from the 620 // last section to the first. 621 bool Found = false; 622 unsigned SecIdx = CPSections.size(); 623 while (SecIdx != 0) { 624 if (CPSections[--SecIdx].S == S) { 625 Found = true; 626 break; 627 } 628 } 629 if (!Found) { 630 SecIdx = CPSections.size(); 631 CPSections.push_back(SectionCPs(S, Align)); 632 } 633 634 if (Align > CPSections[SecIdx].Alignment) 635 CPSections[SecIdx].Alignment = Align; 636 CPSections[SecIdx].CPEs.push_back(i); 637 } 638 639 // Now print stuff into the calculated sections. 640 for (unsigned i = 0, e = CPSections.size(); i != e; ++i) { 641 OutStreamer.SwitchSection(CPSections[i].S); 642 EmitAlignment(Log2_32(CPSections[i].Alignment)); 643 644 unsigned Offset = 0; 645 for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) { 646 unsigned CPI = CPSections[i].CPEs[j]; 647 MachineConstantPoolEntry CPE = CP[CPI]; 648 649 // Emit inter-object padding for alignment. 650 unsigned AlignMask = CPE.getAlignment() - 1; 651 unsigned NewOffset = (Offset + AlignMask) & ~AlignMask; 652 OutStreamer.EmitFill(NewOffset - Offset, 0/*fillval*/, 0/*addrspace*/); 653 654 const Type *Ty = CPE.getType(); 655 Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty); 656 657 // Emit the label with a comment on it. 658 if (VerboseAsm) { 659 OutStreamer.GetCommentOS() << "constant pool "; 660 WriteTypeSymbolic(OutStreamer.GetCommentOS(), CPE.getType(), 661 MF->getFunction()->getParent()); 662 OutStreamer.GetCommentOS() << '\n'; 663 } 664 OutStreamer.EmitLabel(GetCPISymbol(CPI)); 665 666 if (CPE.isMachineConstantPoolEntry()) 667 EmitMachineConstantPoolValue(CPE.Val.MachineCPVal); 668 else 669 EmitGlobalConstant(CPE.Val.ConstVal); 670 } 671 } 672} 673 674/// EmitJumpTableInfo - Print assembly representations of the jump tables used 675/// by the current function to the current output stream. 676/// 677void AsmPrinter::EmitJumpTableInfo() { 678 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); 679 if (MJTI == 0) return; 680 if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline) return; 681 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 682 if (JT.empty()) return; 683 684 // Pick the directive to use to print the jump table entries, and switch to 685 // the appropriate section. 686 const Function *F = MF->getFunction(); 687 bool JTInDiffSection = false; 688 if (// In PIC mode, we need to emit the jump table to the same section as the 689 // function body itself, otherwise the label differences won't make sense. 690 // FIXME: Need a better predicate for this: what about custom entries? 691 MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 || 692 // We should also do if the section name is NULL or function is declared 693 // in discardable section 694 // FIXME: this isn't the right predicate, should be based on the MCSection 695 // for the function. 696 F->isWeakForLinker()) { 697 OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F,Mang,TM)); 698 } else { 699 // Otherwise, drop it in the readonly section. 700 const MCSection *ReadOnlySection = 701 getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly()); 702 OutStreamer.SwitchSection(ReadOnlySection); 703 JTInDiffSection = true; 704 } 705 706 EmitAlignment(Log2_32(MJTI->getEntryAlignment(*TM.getTargetData()))); 707 708 for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) { 709 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; 710 711 // If this jump table was deleted, ignore it. 712 if (JTBBs.empty()) continue; 713 714 // For the EK_LabelDifference32 entry, if the target supports .set, emit a 715 // .set directive for each unique entry. This reduces the number of 716 // relocations the assembler will generate for the jump table. 717 if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 && 718 MAI->hasSetDirective()) { 719 SmallPtrSet<const MachineBasicBlock*, 16> EmittedSets; 720 const TargetLowering *TLI = TM.getTargetLowering(); 721 const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext); 722 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { 723 const MachineBasicBlock *MBB = JTBBs[ii]; 724 if (!EmittedSets.insert(MBB)) continue; 725 726 // .set LJTSet, LBB32-base 727 const MCExpr *LHS = 728 MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); 729 OutStreamer.EmitAssignment(GetJTSetSymbol(JTI, MBB->getNumber()), 730 MCBinaryExpr::CreateSub(LHS, Base, OutContext)); 731 } 732 } 733 734 // On some targets (e.g. Darwin) we want to emit two consequtive labels 735 // before each jump table. The first label is never referenced, but tells 736 // the assembler and linker the extents of the jump table object. The 737 // second label is actually referenced by the code. 738 if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) 739 // FIXME: This doesn't have to have any specific name, just any randomly 740 // named and numbered 'l' label would work. Simplify GetJTISymbol. 741 OutStreamer.EmitLabel(GetJTISymbol(JTI, true)); 742 743 OutStreamer.EmitLabel(GetJTISymbol(JTI)); 744 745 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) 746 EmitJumpTableEntry(MJTI, JTBBs[ii], JTI); 747 } 748} 749 750/// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the 751/// current stream. 752void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, 753 const MachineBasicBlock *MBB, 754 unsigned UID) const { 755 const MCExpr *Value = 0; 756 switch (MJTI->getEntryKind()) { 757 case MachineJumpTableInfo::EK_Inline: 758 llvm_unreachable("Cannot emit EK_Inline jump table entry"); break; 759 case MachineJumpTableInfo::EK_Custom32: 760 Value = TM.getTargetLowering()->LowerCustomJumpTableEntry(MJTI, MBB, UID, 761 OutContext); 762 break; 763 case MachineJumpTableInfo::EK_BlockAddress: 764 // EK_BlockAddress - Each entry is a plain address of block, e.g.: 765 // .word LBB123 766 Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); 767 break; 768 case MachineJumpTableInfo::EK_GPRel32BlockAddress: { 769 // EK_GPRel32BlockAddress - Each entry is an address of block, encoded 770 // with a relocation as gp-relative, e.g.: 771 // .gprel32 LBB123 772 MCSymbol *MBBSym = MBB->getSymbol(); 773 OutStreamer.EmitGPRel32Value(MCSymbolRefExpr::Create(MBBSym, OutContext)); 774 return; 775 } 776 777 case MachineJumpTableInfo::EK_LabelDifference32: { 778 // EK_LabelDifference32 - Each entry is the address of the block minus 779 // the address of the jump table. This is used for PIC jump tables where 780 // gprel32 is not supported. e.g.: 781 // .word LBB123 - LJTI1_2 782 // If the .set directive is supported, this is emitted as: 783 // .set L4_5_set_123, LBB123 - LJTI1_2 784 // .word L4_5_set_123 785 786 // If we have emitted set directives for the jump table entries, print 787 // them rather than the entries themselves. If we're emitting PIC, then 788 // emit the table entries as differences between two text section labels. 789 if (MAI->hasSetDirective()) { 790 // If we used .set, reference the .set's symbol. 791 Value = MCSymbolRefExpr::Create(GetJTSetSymbol(UID, MBB->getNumber()), 792 OutContext); 793 break; 794 } 795 // Otherwise, use the difference as the jump table entry. 796 Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); 797 const MCExpr *JTI = MCSymbolRefExpr::Create(GetJTISymbol(UID), OutContext); 798 Value = MCBinaryExpr::CreateSub(Value, JTI, OutContext); 799 break; 800 } 801 } 802 803 assert(Value && "Unknown entry kind!"); 804 805 unsigned EntrySize = MJTI->getEntrySize(*TM.getTargetData()); 806 OutStreamer.EmitValue(Value, EntrySize, /*addrspace*/0); 807} 808 809 810/// EmitSpecialLLVMGlobal - Check to see if the specified global is a 811/// special global used by LLVM. If so, emit it and return true, otherwise 812/// do nothing and return false. 813bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { 814 if (GV->getName() == "llvm.used") { 815 if (MAI->hasNoDeadStrip()) // No need to emit this at all. 816 EmitLLVMUsedList(GV->getInitializer()); 817 return true; 818 } 819 820 // Ignore debug and non-emitted data. This handles llvm.compiler.used. 821 if (GV->getSection() == "llvm.metadata" || 822 GV->hasAvailableExternallyLinkage()) 823 return true; 824 825 if (!GV->hasAppendingLinkage()) return false; 826 827 assert(GV->hasInitializer() && "Not a special LLVM global!"); 828 829 const TargetData *TD = TM.getTargetData(); 830 unsigned Align = Log2_32(TD->getPointerPrefAlignment()); 831 if (GV->getName() == "llvm.global_ctors") { 832 OutStreamer.SwitchSection(getObjFileLowering().getStaticCtorSection()); 833 EmitAlignment(Align, 0); 834 EmitXXStructorList(GV->getInitializer()); 835 836 if (TM.getRelocationModel() == Reloc::Static && 837 MAI->hasStaticCtorDtorReferenceInStaticMode()) { 838 StringRef Sym(".constructors_used"); 839 OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym), 840 MCSA_Reference); 841 } 842 return true; 843 } 844 845 if (GV->getName() == "llvm.global_dtors") { 846 OutStreamer.SwitchSection(getObjFileLowering().getStaticDtorSection()); 847 EmitAlignment(Align, 0); 848 EmitXXStructorList(GV->getInitializer()); 849 850 if (TM.getRelocationModel() == Reloc::Static && 851 MAI->hasStaticCtorDtorReferenceInStaticMode()) { 852 StringRef Sym(".destructors_used"); 853 OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym), 854 MCSA_Reference); 855 } 856 return true; 857 } 858 859 return false; 860} 861 862/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each 863/// global in the specified llvm.used list for which emitUsedDirectiveFor 864/// is true, as being used with this directive. 865void AsmPrinter::EmitLLVMUsedList(Constant *List) { 866 // Should be an array of 'i8*'. 867 ConstantArray *InitList = dyn_cast<ConstantArray>(List); 868 if (InitList == 0) return; 869 870 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 871 const GlobalValue *GV = 872 dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts()); 873 if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang)) 874 OutStreamer.EmitSymbolAttribute(Mang->getSymbol(GV), MCSA_NoDeadStrip); 875 } 876} 877 878/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the 879/// function pointers, ignoring the init priority. 880void AsmPrinter::EmitXXStructorList(Constant *List) { 881 // Should be an array of '{ int, void ()* }' structs. The first value is the 882 // init priority, which we ignore. 883 if (!isa<ConstantArray>(List)) return; 884 ConstantArray *InitList = cast<ConstantArray>(List); 885 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 886 if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){ 887 if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. 888 889 if (CS->getOperand(1)->isNullValue()) 890 return; // Found a null terminator, exit printing. 891 // Emit the function pointer. 892 EmitGlobalConstant(CS->getOperand(1)); 893 } 894} 895 896/// EmitInlineAsm - Emit a blob of inline asm to the output streamer. 897void AsmPrinter::EmitInlineAsm(StringRef Str) const { 898 assert(!Str.empty() && "Can't emit empty inline asm block"); 899 900 // If the output streamer is actually a .s file, just emit the blob textually. 901 // This is useful in case the asm parser doesn't handle something but the 902 // system assembler does. 903 if (OutStreamer.hasRawTextSupport()) { 904 OutStreamer.EmitRawText(Str); 905 return; 906 } 907 908 errs() << "Inline asm not supported by this streamer!\n"; 909} 910 911 912//===--------------------------------------------------------------------===// 913// Emission and print routines 914// 915 916/// EmitInt8 - Emit a byte directive and value. 917/// 918void AsmPrinter::EmitInt8(int Value) const { 919 OutStreamer.EmitIntValue(Value, 1, 0/*addrspace*/); 920} 921 922/// EmitInt16 - Emit a short directive and value. 923/// 924void AsmPrinter::EmitInt16(int Value) const { 925 OutStreamer.EmitIntValue(Value, 2, 0/*addrspace*/); 926} 927 928/// EmitInt32 - Emit a long directive and value. 929/// 930void AsmPrinter::EmitInt32(int Value) const { 931 OutStreamer.EmitIntValue(Value, 4, 0/*addrspace*/); 932} 933 934/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size 935/// in bytes of the directive is specified by Size and Hi/Lo specify the 936/// labels. This implicitly uses .set if it is available. 937void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, 938 unsigned Size) const { 939 // Get the Hi-Lo expression. 940 const MCExpr *Diff = 941 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi, OutContext), 942 MCSymbolRefExpr::Create(Lo, OutContext), 943 OutContext); 944 945 if (!MAI->hasSetDirective()) { 946 OutStreamer.EmitValue(Diff, Size, 0/*AddrSpace*/); 947 return; 948 } 949 950 // Otherwise, emit with .set (aka assignment). 951 MCSymbol *SetLabel = 952 OutContext.GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix()) + 953 "set" + Twine(SetCounter++)); 954 OutStreamer.EmitAssignment(SetLabel, Diff); 955 OutStreamer.EmitSymbolValue(SetLabel, Size, 0/*AddrSpace*/); 956} 957 958 959//===----------------------------------------------------------------------===// 960 961// EmitAlignment - Emit an alignment directive to the specified power of 962// two boundary. For example, if you pass in 3 here, you will get an 8 963// byte alignment. If a global value is specified, and if that global has 964// an explicit alignment requested, it will unconditionally override the 965// alignment request. However, if ForcedAlignBits is specified, this value 966// has final say: the ultimate alignment will be the max of ForcedAlignBits 967// and the alignment computed with NumBits and the global. 968// 969// The algorithm is: 970// Align = NumBits; 971// if (GV && GV->hasalignment) Align = GV->getalignment(); 972// Align = std::max(Align, ForcedAlignBits); 973// 974void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, 975 unsigned ForcedAlignBits, 976 bool UseFillExpr) const { 977 if (GV && GV->getAlignment()) 978 NumBits = Log2_32(GV->getAlignment()); 979 NumBits = std::max(NumBits, ForcedAlignBits); 980 981 if (NumBits == 0) return; // No need to emit alignment. 982 983 if (getCurrentSection()->getKind().isText()) 984 OutStreamer.EmitCodeAlignment(1 << NumBits); 985 else 986 OutStreamer.EmitValueToAlignment(1 << NumBits, 0, 1, 0); 987} 988 989/// LowerConstant - Lower the specified LLVM Constant to an MCExpr. 990/// 991static const MCExpr *LowerConstant(const Constant *CV, AsmPrinter &AP) { 992 MCContext &Ctx = AP.OutContext; 993 994 if (CV->isNullValue() || isa<UndefValue>(CV)) 995 return MCConstantExpr::Create(0, Ctx); 996 997 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) 998 return MCConstantExpr::Create(CI->getZExtValue(), Ctx); 999 1000 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) 1001 return MCSymbolRefExpr::Create(AP.Mang->getSymbol(GV), Ctx); 1002 if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV)) 1003 return MCSymbolRefExpr::Create(AP.GetBlockAddressSymbol(BA), Ctx); 1004 1005 const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV); 1006 if (CE == 0) { 1007 llvm_unreachable("Unknown constant value to lower!"); 1008 return MCConstantExpr::Create(0, Ctx); 1009 } 1010 1011 switch (CE->getOpcode()) { 1012 default: 1013 // If the code isn't optimized, there may be outstanding folding 1014 // opportunities. Attempt to fold the expression using TargetData as a 1015 // last resort before giving up. 1016 if (Constant *C = 1017 ConstantFoldConstantExpression(CE, AP.TM.getTargetData())) 1018 if (C != CE) 1019 return LowerConstant(C, AP); 1020#ifndef NDEBUG 1021 CE->dump(); 1022#endif 1023 llvm_unreachable("FIXME: Don't support this constant expr"); 1024 case Instruction::GetElementPtr: { 1025 const TargetData &TD = *AP.TM.getTargetData(); 1026 // Generate a symbolic expression for the byte address 1027 const Constant *PtrVal = CE->getOperand(0); 1028 SmallVector<Value*, 8> IdxVec(CE->op_begin()+1, CE->op_end()); 1029 int64_t Offset = TD.getIndexedOffset(PtrVal->getType(), &IdxVec[0], 1030 IdxVec.size()); 1031 1032 const MCExpr *Base = LowerConstant(CE->getOperand(0), AP); 1033 if (Offset == 0) 1034 return Base; 1035 1036 // Truncate/sext the offset to the pointer size. 1037 if (TD.getPointerSizeInBits() != 64) { 1038 int SExtAmount = 64-TD.getPointerSizeInBits(); 1039 Offset = (Offset << SExtAmount) >> SExtAmount; 1040 } 1041 1042 return MCBinaryExpr::CreateAdd(Base, MCConstantExpr::Create(Offset, Ctx), 1043 Ctx); 1044 } 1045 1046 case Instruction::Trunc: 1047 // We emit the value and depend on the assembler to truncate the generated 1048 // expression properly. This is important for differences between 1049 // blockaddress labels. Since the two labels are in the same function, it 1050 // is reasonable to treat their delta as a 32-bit value. 1051 // FALL THROUGH. 1052 case Instruction::BitCast: 1053 return LowerConstant(CE->getOperand(0), AP); 1054 1055 case Instruction::IntToPtr: { 1056 const TargetData &TD = *AP.TM.getTargetData(); 1057 // Handle casts to pointers by changing them into casts to the appropriate 1058 // integer type. This promotes constant folding and simplifies this code. 1059 Constant *Op = CE->getOperand(0); 1060 Op = ConstantExpr::getIntegerCast(Op, TD.getIntPtrType(CV->getContext()), 1061 false/*ZExt*/); 1062 return LowerConstant(Op, AP); 1063 } 1064 1065 case Instruction::PtrToInt: { 1066 const TargetData &TD = *AP.TM.getTargetData(); 1067 // Support only foldable casts to/from pointers that can be eliminated by 1068 // changing the pointer to the appropriately sized integer type. 1069 Constant *Op = CE->getOperand(0); 1070 const Type *Ty = CE->getType(); 1071 1072 const MCExpr *OpExpr = LowerConstant(Op, AP); 1073 1074 // We can emit the pointer value into this slot if the slot is an 1075 // integer slot equal to the size of the pointer. 1076 if (TD.getTypeAllocSize(Ty) == TD.getTypeAllocSize(Op->getType())) 1077 return OpExpr; 1078 1079 // Otherwise the pointer is smaller than the resultant integer, mask off 1080 // the high bits so we are sure to get a proper truncation if the input is 1081 // a constant expr. 1082 unsigned InBits = TD.getTypeAllocSizeInBits(Op->getType()); 1083 const MCExpr *MaskExpr = MCConstantExpr::Create(~0ULL >> (64-InBits), Ctx); 1084 return MCBinaryExpr::CreateAnd(OpExpr, MaskExpr, Ctx); 1085 } 1086 1087 // The MC library also has a right-shift operator, but it isn't consistently 1088 // signed or unsigned between different targets. 1089 case Instruction::Add: 1090 case Instruction::Sub: 1091 case Instruction::Mul: 1092 case Instruction::SDiv: 1093 case Instruction::SRem: 1094 case Instruction::Shl: 1095 case Instruction::And: 1096 case Instruction::Or: 1097 case Instruction::Xor: { 1098 const MCExpr *LHS = LowerConstant(CE->getOperand(0), AP); 1099 const MCExpr *RHS = LowerConstant(CE->getOperand(1), AP); 1100 switch (CE->getOpcode()) { 1101 default: llvm_unreachable("Unknown binary operator constant cast expr"); 1102 case Instruction::Add: return MCBinaryExpr::CreateAdd(LHS, RHS, Ctx); 1103 case Instruction::Sub: return MCBinaryExpr::CreateSub(LHS, RHS, Ctx); 1104 case Instruction::Mul: return MCBinaryExpr::CreateMul(LHS, RHS, Ctx); 1105 case Instruction::SDiv: return MCBinaryExpr::CreateDiv(LHS, RHS, Ctx); 1106 case Instruction::SRem: return MCBinaryExpr::CreateMod(LHS, RHS, Ctx); 1107 case Instruction::Shl: return MCBinaryExpr::CreateShl(LHS, RHS, Ctx); 1108 case Instruction::And: return MCBinaryExpr::CreateAnd(LHS, RHS, Ctx); 1109 case Instruction::Or: return MCBinaryExpr::CreateOr (LHS, RHS, Ctx); 1110 case Instruction::Xor: return MCBinaryExpr::CreateXor(LHS, RHS, Ctx); 1111 } 1112 } 1113 } 1114} 1115 1116static void EmitGlobalConstantArray(const ConstantArray *CA, unsigned AddrSpace, 1117 AsmPrinter &AP) { 1118 if (AddrSpace != 0 || !CA->isString()) { 1119 // Not a string. Print the values in successive locations 1120 for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) 1121 AP.EmitGlobalConstant(CA->getOperand(i), AddrSpace); 1122 return; 1123 } 1124 1125 // Otherwise, it can be emitted as .ascii. 1126 SmallVector<char, 128> TmpVec; 1127 TmpVec.reserve(CA->getNumOperands()); 1128 for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) 1129 TmpVec.push_back(cast<ConstantInt>(CA->getOperand(i))->getZExtValue()); 1130 1131 AP.OutStreamer.EmitBytes(StringRef(TmpVec.data(), TmpVec.size()), AddrSpace); 1132} 1133 1134static void EmitGlobalConstantVector(const ConstantVector *CV, 1135 unsigned AddrSpace, AsmPrinter &AP) { 1136 for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i) 1137 AP.EmitGlobalConstant(CV->getOperand(i), AddrSpace); 1138} 1139 1140static void EmitGlobalConstantStruct(const ConstantStruct *CS, 1141 unsigned AddrSpace, AsmPrinter &AP) { 1142 // Print the fields in successive locations. Pad to align if needed! 1143 const TargetData *TD = AP.TM.getTargetData(); 1144 unsigned Size = TD->getTypeAllocSize(CS->getType()); 1145 const StructLayout *Layout = TD->getStructLayout(CS->getType()); 1146 uint64_t SizeSoFar = 0; 1147 for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i) { 1148 const Constant *Field = CS->getOperand(i); 1149 1150 // Check if padding is needed and insert one or more 0s. 1151 uint64_t FieldSize = TD->getTypeAllocSize(Field->getType()); 1152 uint64_t PadSize = ((i == e-1 ? Size : Layout->getElementOffset(i+1)) 1153 - Layout->getElementOffset(i)) - FieldSize; 1154 SizeSoFar += FieldSize + PadSize; 1155 1156 // Now print the actual field value. 1157 AP.EmitGlobalConstant(Field, AddrSpace); 1158 1159 // Insert padding - this may include padding to increase the size of the 1160 // current field up to the ABI size (if the struct is not packed) as well 1161 // as padding to ensure that the next field starts at the right offset. 1162 AP.OutStreamer.EmitZeros(PadSize, AddrSpace); 1163 } 1164 assert(SizeSoFar == Layout->getSizeInBytes() && 1165 "Layout of constant struct may be incorrect!"); 1166} 1167 1168static void EmitGlobalConstantUnion(const ConstantUnion *CU, 1169 unsigned AddrSpace, AsmPrinter &AP) { 1170 const TargetData *TD = AP.TM.getTargetData(); 1171 unsigned Size = TD->getTypeAllocSize(CU->getType()); 1172 1173 const Constant *Contents = CU->getOperand(0); 1174 unsigned FilledSize = TD->getTypeAllocSize(Contents->getType()); 1175 1176 // Print the actually filled part 1177 AP.EmitGlobalConstant(Contents, AddrSpace); 1178 1179 // And pad with enough zeroes 1180 AP.OutStreamer.EmitZeros(Size-FilledSize, AddrSpace); 1181} 1182 1183static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace, 1184 AsmPrinter &AP) { 1185 // FP Constants are printed as integer constants to avoid losing 1186 // precision. 1187 if (CFP->getType()->isDoubleTy()) { 1188 if (AP.VerboseAsm) { 1189 double Val = CFP->getValueAPF().convertToDouble(); 1190 AP.OutStreamer.GetCommentOS() << "double " << Val << '\n'; 1191 } 1192 1193 uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1194 AP.OutStreamer.EmitIntValue(Val, 8, AddrSpace); 1195 return; 1196 } 1197 1198 if (CFP->getType()->isFloatTy()) { 1199 if (AP.VerboseAsm) { 1200 float Val = CFP->getValueAPF().convertToFloat(); 1201 AP.OutStreamer.GetCommentOS() << "float " << Val << '\n'; 1202 } 1203 uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1204 AP.OutStreamer.EmitIntValue(Val, 4, AddrSpace); 1205 return; 1206 } 1207 1208 if (CFP->getType()->isX86_FP80Ty()) { 1209 // all long double variants are printed as hex 1210 // api needed to prevent premature destruction 1211 APInt API = CFP->getValueAPF().bitcastToAPInt(); 1212 const uint64_t *p = API.getRawData(); 1213 if (AP.VerboseAsm) { 1214 // Convert to double so we can print the approximate val as a comment. 1215 APFloat DoubleVal = CFP->getValueAPF(); 1216 bool ignored; 1217 DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, 1218 &ignored); 1219 AP.OutStreamer.GetCommentOS() << "x86_fp80 ~= " 1220 << DoubleVal.convertToDouble() << '\n'; 1221 } 1222 1223 if (AP.TM.getTargetData()->isBigEndian()) { 1224 AP.OutStreamer.EmitIntValue(p[1], 2, AddrSpace); 1225 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1226 } else { 1227 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1228 AP.OutStreamer.EmitIntValue(p[1], 2, AddrSpace); 1229 } 1230 1231 // Emit the tail padding for the long double. 1232 const TargetData &TD = *AP.TM.getTargetData(); 1233 AP.OutStreamer.EmitZeros(TD.getTypeAllocSize(CFP->getType()) - 1234 TD.getTypeStoreSize(CFP->getType()), AddrSpace); 1235 return; 1236 } 1237 1238 assert(CFP->getType()->isPPC_FP128Ty() && 1239 "Floating point constant type not handled"); 1240 // All long double variants are printed as hex api needed to prevent 1241 // premature destruction. 1242 APInt API = CFP->getValueAPF().bitcastToAPInt(); 1243 const uint64_t *p = API.getRawData(); 1244 if (AP.TM.getTargetData()->isBigEndian()) { 1245 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1246 AP.OutStreamer.EmitIntValue(p[1], 8, AddrSpace); 1247 } else { 1248 AP.OutStreamer.EmitIntValue(p[1], 8, AddrSpace); 1249 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1250 } 1251} 1252 1253static void EmitGlobalConstantLargeInt(const ConstantInt *CI, 1254 unsigned AddrSpace, AsmPrinter &AP) { 1255 const TargetData *TD = AP.TM.getTargetData(); 1256 unsigned BitWidth = CI->getBitWidth(); 1257 assert((BitWidth & 63) == 0 && "only support multiples of 64-bits"); 1258 1259 // We don't expect assemblers to support integer data directives 1260 // for more than 64 bits, so we emit the data in at most 64-bit 1261 // quantities at a time. 1262 const uint64_t *RawData = CI->getValue().getRawData(); 1263 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) { 1264 uint64_t Val = TD->isBigEndian() ? RawData[e - i - 1] : RawData[i]; 1265 AP.OutStreamer.EmitIntValue(Val, 8, AddrSpace); 1266 } 1267} 1268 1269/// EmitGlobalConstant - Print a general LLVM constant to the .s file. 1270void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { 1271 if (isa<ConstantAggregateZero>(CV) || isa<UndefValue>(CV)) { 1272 uint64_t Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); 1273 if (Size == 0) Size = 1; // An empty "_foo:" followed by a section is undef. 1274 return OutStreamer.EmitZeros(Size, AddrSpace); 1275 } 1276 1277 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1278 unsigned Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); 1279 switch (Size) { 1280 case 1: 1281 case 2: 1282 case 4: 1283 case 8: 1284 if (VerboseAsm) 1285 OutStreamer.GetCommentOS() << format("0x%llx\n", CI->getZExtValue()); 1286 OutStreamer.EmitIntValue(CI->getZExtValue(), Size, AddrSpace); 1287 return; 1288 default: 1289 EmitGlobalConstantLargeInt(CI, AddrSpace, *this); 1290 return; 1291 } 1292 } 1293 1294 if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) 1295 return EmitGlobalConstantArray(CVA, AddrSpace, *this); 1296 1297 if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) 1298 return EmitGlobalConstantStruct(CVS, AddrSpace, *this); 1299 1300 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) 1301 return EmitGlobalConstantFP(CFP, AddrSpace, *this); 1302 1303 if (isa<ConstantPointerNull>(CV)) { 1304 unsigned Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); 1305 OutStreamer.EmitIntValue(0, Size, AddrSpace); 1306 return; 1307 } 1308 1309 if (const ConstantUnion *CVU = dyn_cast<ConstantUnion>(CV)) 1310 return EmitGlobalConstantUnion(CVU, AddrSpace, *this); 1311 1312 if (const ConstantVector *V = dyn_cast<ConstantVector>(CV)) 1313 return EmitGlobalConstantVector(V, AddrSpace, *this); 1314 1315 // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it 1316 // thread the streamer with EmitValue. 1317 OutStreamer.EmitValue(LowerConstant(CV, *this), 1318 TM.getTargetData()->getTypeAllocSize(CV->getType()), 1319 AddrSpace); 1320} 1321 1322void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1323 // Target doesn't support this yet! 1324 llvm_unreachable("Target does not support EmitMachineConstantPoolValue"); 1325} 1326 1327/// PrintSpecial - Print information related to the specified machine instr 1328/// that is independent of the operand, and may be independent of the instr 1329/// itself. This can be useful for portably encoding the comment character 1330/// or other bits of target-specific knowledge into the asmstrings. The 1331/// syntax used is ${:comment}. Targets can override this to add support 1332/// for their own strange codes. 1333void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const { 1334 if (!strcmp(Code, "private")) { 1335 O << MAI->getPrivateGlobalPrefix(); 1336 } else if (!strcmp(Code, "comment")) { 1337 if (VerboseAsm) 1338 O << MAI->getCommentString(); 1339 } else if (!strcmp(Code, "uid")) { 1340 // Comparing the address of MI isn't sufficient, because machineinstrs may 1341 // be allocated to the same address across functions. 1342 const Function *ThisF = MI->getParent()->getParent()->getFunction(); 1343 1344 // If this is a new LastFn instruction, bump the counter. 1345 if (LastMI != MI || LastFn != ThisF) { 1346 ++Counter; 1347 LastMI = MI; 1348 LastFn = ThisF; 1349 } 1350 O << Counter; 1351 } else { 1352 std::string msg; 1353 raw_string_ostream Msg(msg); 1354 Msg << "Unknown special formatter '" << Code 1355 << "' for machine instr: " << *MI; 1356 llvm_report_error(Msg.str()); 1357 } 1358} 1359 1360/// processDebugLoc - Processes the debug information of each machine 1361/// instruction's DebugLoc. 1362void AsmPrinter::processDebugLoc(const MachineInstr *MI, 1363 bool BeforePrintingInsn) { 1364 if (!MAI || !DW || !MAI->doesSupportDebugInformation() 1365 || !DW->ShouldEmitDwarfDebug()) 1366 return; 1367 1368 if (!BeforePrintingInsn) 1369 // After printing instruction 1370 DW->EndScope(MI); 1371 else 1372 DW->BeginScope(MI); 1373} 1374 1375 1376/// printInlineAsm - This method formats and prints the specified machine 1377/// instruction that is an inline asm. 1378void AsmPrinter::printInlineAsm(const MachineInstr *MI) const { 1379 assert(MI->isInlineAsm() && "printInlineAsm only works on inline asms"); 1380 1381 unsigned NumOperands = MI->getNumOperands(); 1382 1383 // Count the number of register definitions to find the asm string. 1384 unsigned NumDefs = 0; 1385 for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef(); 1386 ++NumDefs) 1387 assert(NumDefs != NumOperands-1 && "No asm string?"); 1388 1389 assert(MI->getOperand(NumDefs).isSymbol() && "No asm string?"); 1390 1391 // Disassemble the AsmStr, printing out the literal pieces, the operands, etc. 1392 const char *AsmStr = MI->getOperand(NumDefs).getSymbolName(); 1393 1394 // If this asmstr is empty, just print the #APP/#NOAPP markers. 1395 // These are useful to see where empty asm's wound up. 1396 if (AsmStr[0] == 0) { 1397 if (!OutStreamer.hasRawTextSupport()) return; 1398 1399 OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+ 1400 MAI->getInlineAsmStart()); 1401 OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+ 1402 MAI->getInlineAsmEnd()); 1403 return; 1404 } 1405 1406 // Emit the #APP start marker. This has to happen even if verbose-asm isn't 1407 // enabled, so we use EmitRawText. 1408 if (OutStreamer.hasRawTextSupport()) 1409 OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+ 1410 MAI->getInlineAsmStart()); 1411 1412 // Emit the inline asm to a temporary string so we can emit it through 1413 // EmitInlineAsm. 1414#if 0 1415 SmallString<256> StringData; 1416 raw_svector_ostream O(StringData); 1417#endif 1418 1419 O << '\t'; 1420 1421 // The variant of the current asmprinter. 1422 int AsmPrinterVariant = MAI->getAssemblerDialect(); 1423 1424 int CurVariant = -1; // The number of the {.|.|.} region we are in. 1425 const char *LastEmitted = AsmStr; // One past the last character emitted. 1426 1427 while (*LastEmitted) { 1428 switch (*LastEmitted) { 1429 default: { 1430 // Not a special case, emit the string section literally. 1431 const char *LiteralEnd = LastEmitted+1; 1432 while (*LiteralEnd && *LiteralEnd != '{' && *LiteralEnd != '|' && 1433 *LiteralEnd != '}' && *LiteralEnd != '$' && *LiteralEnd != '\n') 1434 ++LiteralEnd; 1435 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 1436 O.write(LastEmitted, LiteralEnd-LastEmitted); 1437 LastEmitted = LiteralEnd; 1438 break; 1439 } 1440 case '\n': 1441 ++LastEmitted; // Consume newline character. 1442 O << '\n'; // Indent code with newline. 1443 break; 1444 case '$': { 1445 ++LastEmitted; // Consume '$' character. 1446 bool Done = true; 1447 1448 // Handle escapes. 1449 switch (*LastEmitted) { 1450 default: Done = false; break; 1451 case '$': // $$ -> $ 1452 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 1453 O << '$'; 1454 ++LastEmitted; // Consume second '$' character. 1455 break; 1456 case '(': // $( -> same as GCC's { character. 1457 ++LastEmitted; // Consume '(' character. 1458 if (CurVariant != -1) { 1459 llvm_report_error("Nested variants found in inline asm string: '" 1460 + std::string(AsmStr) + "'"); 1461 } 1462 CurVariant = 0; // We're in the first variant now. 1463 break; 1464 case '|': 1465 ++LastEmitted; // consume '|' character. 1466 if (CurVariant == -1) 1467 O << '|'; // this is gcc's behavior for | outside a variant 1468 else 1469 ++CurVariant; // We're in the next variant. 1470 break; 1471 case ')': // $) -> same as GCC's } char. 1472 ++LastEmitted; // consume ')' character. 1473 if (CurVariant == -1) 1474 O << '}'; // this is gcc's behavior for } outside a variant 1475 else 1476 CurVariant = -1; 1477 break; 1478 } 1479 if (Done) break; 1480 1481 bool HasCurlyBraces = false; 1482 if (*LastEmitted == '{') { // ${variable} 1483 ++LastEmitted; // Consume '{' character. 1484 HasCurlyBraces = true; 1485 } 1486 1487 // If we have ${:foo}, then this is not a real operand reference, it is a 1488 // "magic" string reference, just like in .td files. Arrange to call 1489 // PrintSpecial. 1490 if (HasCurlyBraces && *LastEmitted == ':') { 1491 ++LastEmitted; 1492 const char *StrStart = LastEmitted; 1493 const char *StrEnd = strchr(StrStart, '}'); 1494 if (StrEnd == 0) { 1495 llvm_report_error("Unterminated ${:foo} operand in inline asm string: '" 1496 + std::string(AsmStr) + "'"); 1497 } 1498 1499 std::string Val(StrStart, StrEnd); 1500 PrintSpecial(MI, Val.c_str()); 1501 LastEmitted = StrEnd+1; 1502 break; 1503 } 1504 1505 const char *IDStart = LastEmitted; 1506 char *IDEnd; 1507 errno = 0; 1508 long Val = strtol(IDStart, &IDEnd, 10); // We only accept numbers for IDs. 1509 if (!isdigit(*IDStart) || (Val == 0 && errno == EINVAL)) { 1510 llvm_report_error("Bad $ operand number in inline asm string: '" 1511 + std::string(AsmStr) + "'"); 1512 } 1513 LastEmitted = IDEnd; 1514 1515 char Modifier[2] = { 0, 0 }; 1516 1517 if (HasCurlyBraces) { 1518 // If we have curly braces, check for a modifier character. This 1519 // supports syntax like ${0:u}, which correspond to "%u0" in GCC asm. 1520 if (*LastEmitted == ':') { 1521 ++LastEmitted; // Consume ':' character. 1522 if (*LastEmitted == 0) { 1523 llvm_report_error("Bad ${:} expression in inline asm string: '" 1524 + std::string(AsmStr) + "'"); 1525 } 1526 1527 Modifier[0] = *LastEmitted; 1528 ++LastEmitted; // Consume modifier character. 1529 } 1530 1531 if (*LastEmitted != '}') { 1532 llvm_report_error("Bad ${} expression in inline asm string: '" 1533 + std::string(AsmStr) + "'"); 1534 } 1535 ++LastEmitted; // Consume '}' character. 1536 } 1537 1538 if ((unsigned)Val >= NumOperands-1) { 1539 llvm_report_error("Invalid $ operand number in inline asm string: '" 1540 + std::string(AsmStr) + "'"); 1541 } 1542 1543 // Okay, we finally have a value number. Ask the target to print this 1544 // operand! 1545 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) { 1546 unsigned OpNo = 1; 1547 1548 bool Error = false; 1549 1550 // Scan to find the machine operand number for the operand. 1551 for (; Val; --Val) { 1552 if (OpNo >= MI->getNumOperands()) break; 1553 unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1554 OpNo += InlineAsm::getNumOperandRegisters(OpFlags) + 1; 1555 } 1556 1557 if (OpNo >= MI->getNumOperands()) { 1558 Error = true; 1559 } else { 1560 unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1561 ++OpNo; // Skip over the ID number. 1562 1563 if (Modifier[0] == 'l') // labels are target independent 1564 O << *MI->getOperand(OpNo).getMBB()->getSymbol(); 1565 else { 1566 AsmPrinter *AP = const_cast<AsmPrinter*>(this); 1567 if ((OpFlags & 7) == 4) { 1568 Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, 1569 Modifier[0] ? Modifier : 0); 1570 } else { 1571 Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, 1572 Modifier[0] ? Modifier : 0); 1573 } 1574 } 1575 } 1576 if (Error) { 1577 std::string msg; 1578 raw_string_ostream Msg(msg); 1579 Msg << "Invalid operand found in inline asm: '" << AsmStr << "'\n"; 1580 MI->print(Msg); 1581 llvm_report_error(Msg.str()); 1582 } 1583 } 1584 break; 1585 } 1586 } 1587 } 1588 O << "\n"; 1589 1590#if 0 1591 EmitInlineAsm(O.str()); 1592#endif 1593 1594 // Emit the #NOAPP end marker. This has to happen even if verbose-asm isn't 1595 // enabled, so we use EmitRawText. 1596 if (OutStreamer.hasRawTextSupport()) 1597 OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+ 1598 MAI->getInlineAsmEnd()); 1599} 1600 1601/// printImplicitDef - This method prints the specified machine instruction 1602/// that is an implicit def. 1603void AsmPrinter::printImplicitDef(const MachineInstr *MI) const { 1604 if (!VerboseAsm) return; 1605 OutStreamer.AddComment(Twine("implicit-def: ") + 1606 TRI->getName(MI->getOperand(0).getReg())); 1607 OutStreamer.AddBlankLine(); 1608} 1609 1610void AsmPrinter::printKill(const MachineInstr *MI) const { 1611 if (!VerboseAsm) return; 1612 O.PadToColumn(MAI->getCommentColumn()); 1613 1614 std::string Str = "kill:"; 1615 for (unsigned n = 0, e = MI->getNumOperands(); n != e; ++n) { 1616 const MachineOperand &Op = MI->getOperand(n); 1617 assert(Op.isReg() && "KILL instruction must have only register operands"); 1618 Str += ' '; 1619 Str += TRI->getName(Op.getReg()); 1620 Str += (Op.isDef() ? "<def>" : "<kill>"); 1621 } 1622 OutStreamer.AddComment(Str); 1623 OutStreamer.AddBlankLine(); 1624} 1625 1626/// printLabel - This method prints a local label used by debug and 1627/// exception handling tables. 1628void AsmPrinter::printLabelInst(const MachineInstr *MI) const { 1629 OutStreamer.EmitLabel(MI->getOperand(0).getMCSymbol()); 1630} 1631 1632/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 1633/// instruction, using the specified assembler variant. Targets should 1634/// override this to format as appropriate. 1635bool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 1636 unsigned AsmVariant, const char *ExtraCode) { 1637 // Target doesn't support this yet! 1638 return true; 1639} 1640 1641bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 1642 unsigned AsmVariant, 1643 const char *ExtraCode) { 1644 // Target doesn't support this yet! 1645 return true; 1646} 1647 1648MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const { 1649 return MMI->getAddrLabelSymbol(BA->getBasicBlock()); 1650} 1651 1652MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const { 1653 return MMI->getAddrLabelSymbol(BB); 1654} 1655 1656/// GetCPISymbol - Return the symbol for the specified constant pool entry. 1657MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const { 1658 return OutContext.GetOrCreateSymbol 1659 (Twine(MAI->getPrivateGlobalPrefix()) + "CPI" + Twine(getFunctionNumber()) 1660 + "_" + Twine(CPID)); 1661} 1662 1663/// GetJTISymbol - Return the symbol for the specified jump table entry. 1664MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const { 1665 return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate); 1666} 1667 1668/// GetJTSetSymbol - Return the symbol for the specified jump table .set 1669/// FIXME: privatize to AsmPrinter. 1670MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const { 1671 return OutContext.GetOrCreateSymbol 1672 (Twine(MAI->getPrivateGlobalPrefix()) + Twine(getFunctionNumber()) + "_" + 1673 Twine(UID) + "_set_" + Twine(MBBID)); 1674} 1675 1676/// GetSymbolWithGlobalValueBase - Return the MCSymbol for a symbol with 1677/// global value name as its base, with the specified suffix, and where the 1678/// symbol is forced to have private linkage if ForcePrivate is true. 1679MCSymbol *AsmPrinter::GetSymbolWithGlobalValueBase(const GlobalValue *GV, 1680 StringRef Suffix, 1681 bool ForcePrivate) const { 1682 SmallString<60> NameStr; 1683 Mang->getNameWithPrefix(NameStr, GV, ForcePrivate); 1684 NameStr.append(Suffix.begin(), Suffix.end()); 1685 return OutContext.GetOrCreateSymbol(NameStr.str()); 1686} 1687 1688/// GetExternalSymbolSymbol - Return the MCSymbol for the specified 1689/// ExternalSymbol. 1690MCSymbol *AsmPrinter::GetExternalSymbolSymbol(StringRef Sym) const { 1691 SmallString<60> NameStr; 1692 Mang->getNameWithPrefix(NameStr, Sym); 1693 return OutContext.GetOrCreateSymbol(NameStr.str()); 1694} 1695 1696 1697 1698/// PrintParentLoopComment - Print comments about parent loops of this one. 1699static void PrintParentLoopComment(raw_ostream &OS, const MachineLoop *Loop, 1700 unsigned FunctionNumber) { 1701 if (Loop == 0) return; 1702 PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber); 1703 OS.indent(Loop->getLoopDepth()*2) 1704 << "Parent Loop BB" << FunctionNumber << "_" 1705 << Loop->getHeader()->getNumber() 1706 << " Depth=" << Loop->getLoopDepth() << '\n'; 1707} 1708 1709 1710/// PrintChildLoopComment - Print comments about child loops within 1711/// the loop for this basic block, with nesting. 1712static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop, 1713 unsigned FunctionNumber) { 1714 // Add child loop information 1715 for (MachineLoop::iterator CL = Loop->begin(), E = Loop->end();CL != E; ++CL){ 1716 OS.indent((*CL)->getLoopDepth()*2) 1717 << "Child Loop BB" << FunctionNumber << "_" 1718 << (*CL)->getHeader()->getNumber() << " Depth " << (*CL)->getLoopDepth() 1719 << '\n'; 1720 PrintChildLoopComment(OS, *CL, FunctionNumber); 1721 } 1722} 1723 1724/// PrintBasicBlockLoopComments - Pretty-print comments for basic blocks. 1725static void PrintBasicBlockLoopComments(const MachineBasicBlock &MBB, 1726 const MachineLoopInfo *LI, 1727 const AsmPrinter &AP) { 1728 // Add loop depth information 1729 const MachineLoop *Loop = LI->getLoopFor(&MBB); 1730 if (Loop == 0) return; 1731 1732 MachineBasicBlock *Header = Loop->getHeader(); 1733 assert(Header && "No header for loop"); 1734 1735 // If this block is not a loop header, just print out what is the loop header 1736 // and return. 1737 if (Header != &MBB) { 1738 AP.OutStreamer.AddComment(" in Loop: Header=BB" + 1739 Twine(AP.getFunctionNumber())+"_" + 1740 Twine(Loop->getHeader()->getNumber())+ 1741 " Depth="+Twine(Loop->getLoopDepth())); 1742 return; 1743 } 1744 1745 // Otherwise, it is a loop header. Print out information about child and 1746 // parent loops. 1747 raw_ostream &OS = AP.OutStreamer.GetCommentOS(); 1748 1749 PrintParentLoopComment(OS, Loop->getParentLoop(), AP.getFunctionNumber()); 1750 1751 OS << "=>"; 1752 OS.indent(Loop->getLoopDepth()*2-2); 1753 1754 OS << "This "; 1755 if (Loop->empty()) 1756 OS << "Inner "; 1757 OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n'; 1758 1759 PrintChildLoopComment(OS, Loop, AP.getFunctionNumber()); 1760} 1761 1762 1763/// EmitBasicBlockStart - This method prints the label for the specified 1764/// MachineBasicBlock, an alignment (if present) and a comment describing 1765/// it if appropriate. 1766void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const { 1767 // Emit an alignment directive for this block, if needed. 1768 if (unsigned Align = MBB->getAlignment()) 1769 EmitAlignment(Log2_32(Align)); 1770 1771 // If the block has its address taken, emit any labels that were used to 1772 // reference the block. It is possible that there is more than one label 1773 // here, because multiple LLVM BB's may have been RAUW'd to this block after 1774 // the references were generated. 1775 if (MBB->hasAddressTaken()) { 1776 const BasicBlock *BB = MBB->getBasicBlock(); 1777 if (VerboseAsm) 1778 OutStreamer.AddComment("Block address taken"); 1779 1780 std::vector<MCSymbol*> Syms = MMI->getAddrLabelSymbolToEmit(BB); 1781 1782 for (unsigned i = 0, e = Syms.size(); i != e; ++i) 1783 OutStreamer.EmitLabel(Syms[i]); 1784 } 1785 1786 // Print the main label for the block. 1787 if (MBB->pred_empty() || isBlockOnlyReachableByFallthrough(MBB)) { 1788 if (VerboseAsm && OutStreamer.hasRawTextSupport()) { 1789 if (const BasicBlock *BB = MBB->getBasicBlock()) 1790 if (BB->hasName()) 1791 OutStreamer.AddComment("%" + BB->getName()); 1792 1793 PrintBasicBlockLoopComments(*MBB, LI, *this); 1794 1795 // NOTE: Want this comment at start of line, don't emit with AddComment. 1796 OutStreamer.EmitRawText(Twine(MAI->getCommentString()) + " BB#" + 1797 Twine(MBB->getNumber()) + ":"); 1798 } 1799 } else { 1800 if (VerboseAsm) { 1801 if (const BasicBlock *BB = MBB->getBasicBlock()) 1802 if (BB->hasName()) 1803 OutStreamer.AddComment("%" + BB->getName()); 1804 PrintBasicBlockLoopComments(*MBB, LI, *this); 1805 } 1806 1807 OutStreamer.EmitLabel(MBB->getSymbol()); 1808 } 1809} 1810 1811void AsmPrinter::EmitVisibility(MCSymbol *Sym, unsigned Visibility) const { 1812 MCSymbolAttr Attr = MCSA_Invalid; 1813 1814 switch (Visibility) { 1815 default: break; 1816 case GlobalValue::HiddenVisibility: 1817 Attr = MAI->getHiddenVisibilityAttr(); 1818 break; 1819 case GlobalValue::ProtectedVisibility: 1820 Attr = MAI->getProtectedVisibilityAttr(); 1821 break; 1822 } 1823 1824 if (Attr != MCSA_Invalid) 1825 OutStreamer.EmitSymbolAttribute(Sym, Attr); 1826} 1827 1828void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const { 1829 if (Offset > 0) 1830 OS << '+' << Offset; 1831 else if (Offset < 0) 1832 OS << Offset; 1833} 1834 1835/// isBlockOnlyReachableByFallthough - Return true if the basic block has 1836/// exactly one predecessor and the control transfer mechanism between 1837/// the predecessor and this block is a fall-through. 1838bool AsmPrinter::isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) 1839 const { 1840 // If this is a landing pad, it isn't a fall through. If it has no preds, 1841 // then nothing falls through to it. 1842 if (MBB->isLandingPad() || MBB->pred_empty()) 1843 return false; 1844 1845 // If there isn't exactly one predecessor, it can't be a fall through. 1846 MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI; 1847 ++PI2; 1848 if (PI2 != MBB->pred_end()) 1849 return false; 1850 1851 // The predecessor has to be immediately before this block. 1852 const MachineBasicBlock *Pred = *PI; 1853 1854 if (!Pred->isLayoutSuccessor(MBB)) 1855 return false; 1856 1857 // If the block is completely empty, then it definitely does fall through. 1858 if (Pred->empty()) 1859 return true; 1860 1861 // Otherwise, check the last instruction. 1862 const MachineInstr &LastInst = Pred->back(); 1863 return !LastInst.getDesc().isBarrier(); 1864} 1865 1866 1867 1868GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) { 1869 if (!S->usesMetadata()) 1870 return 0; 1871 1872 gcp_iterator GCPI = GCMetadataPrinters.find(S); 1873 if (GCPI != GCMetadataPrinters.end()) 1874 return GCPI->second; 1875 1876 const char *Name = S->getName().c_str(); 1877 1878 for (GCMetadataPrinterRegistry::iterator 1879 I = GCMetadataPrinterRegistry::begin(), 1880 E = GCMetadataPrinterRegistry::end(); I != E; ++I) 1881 if (strcmp(Name, I->getName()) == 0) { 1882 GCMetadataPrinter *GMP = I->instantiate(); 1883 GMP->S = S; 1884 GCMetadataPrinters.insert(std::make_pair(S, GMP)); 1885 return GMP; 1886 } 1887 1888 llvm_report_error("no GCMetadataPrinter registered for GC: " + Twine(Name)); 1889 return 0; 1890} 1891 1892