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