AsmPrinter.cpp revision 814819f6ea7fb0638fe73920299fda0da941a59e
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#include "llvm/CodeGen/AsmPrinter.h" 15#include "llvm/Assembly/Writer.h" 16#include "llvm/DerivedTypes.h" 17#include "llvm/Constants.h" 18#include "llvm/Module.h" 19#include "llvm/CodeGen/DwarfWriter.h" 20#include "llvm/CodeGen/GCMetadataPrinter.h" 21#include "llvm/CodeGen/MachineConstantPool.h" 22#include "llvm/CodeGen/MachineFrameInfo.h" 23#include "llvm/CodeGen/MachineFunction.h" 24#include "llvm/CodeGen/MachineJumpTableInfo.h" 25#include "llvm/CodeGen/MachineLoopInfo.h" 26#include "llvm/CodeGen/MachineModuleInfo.h" 27#include "llvm/Analysis/DebugInfo.h" 28#include "llvm/MC/MCContext.h" 29#include "llvm/MC/MCInst.h" 30#include "llvm/MC/MCSection.h" 31#include "llvm/MC/MCStreamer.h" 32#include "llvm/MC/MCSymbol.h" 33#include "llvm/Support/CommandLine.h" 34#include "llvm/Support/ErrorHandling.h" 35#include "llvm/Support/FormattedStream.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 <cerrno> 47using namespace llvm; 48 49static cl::opt<cl::boolOrDefault> 50AsmVerbose("asm-verbose", cl::desc("Add comments to directives."), 51 cl::init(cl::BOU_UNSET)); 52 53char AsmPrinter::ID = 0; 54AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, 55 const MCAsmInfo *T, bool VDef) 56 : MachineFunctionPass(&ID), FunctionNumber(0), O(o), 57 TM(tm), MAI(T), TRI(tm.getRegisterInfo()), 58 59 OutContext(*new MCContext()), 60 // FIXME: Pass instprinter to streamer. 61 OutStreamer(*createAsmStreamer(OutContext, O, *T, 0)), 62 63 LastMI(0), LastFn(0), Counter(~0U), PrevDLT(NULL) { 64 DW = 0; MMI = 0; 65 switch (AsmVerbose) { 66 case cl::BOU_UNSET: VerboseAsm = VDef; break; 67 case cl::BOU_TRUE: VerboseAsm = true; break; 68 case cl::BOU_FALSE: VerboseAsm = false; break; 69 } 70} 71 72AsmPrinter::~AsmPrinter() { 73 for (gcp_iterator I = GCMetadataPrinters.begin(), 74 E = GCMetadataPrinters.end(); I != E; ++I) 75 delete I->second; 76 77 delete &OutStreamer; 78 delete &OutContext; 79} 80 81TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const { 82 return TM.getTargetLowering()->getObjFileLowering(); 83} 84 85/// getCurrentSection() - Return the current section we are emitting to. 86const MCSection *AsmPrinter::getCurrentSection() const { 87 return OutStreamer.getCurrentSection(); 88} 89 90 91void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { 92 AU.setPreservesAll(); 93 MachineFunctionPass::getAnalysisUsage(AU); 94 AU.addRequired<GCModuleInfo>(); 95 if (VerboseAsm) 96 AU.addRequired<MachineLoopInfo>(); 97} 98 99bool AsmPrinter::doInitialization(Module &M) { 100 // Initialize TargetLoweringObjectFile. 101 const_cast<TargetLoweringObjectFile&>(getObjFileLowering()) 102 .Initialize(OutContext, TM); 103 104 Mang = new Mangler(*MAI); 105 106 // Allow the target to emit any magic that it wants at the start of the file. 107 EmitStartOfAsmFile(M); 108 109 if (MAI->hasSingleParameterDotFile()) { 110 /* Very minimal debug info. It is ignored if we emit actual 111 debug info. If we don't, this at least helps the user find where 112 a function came from. */ 113 O << "\t.file\t\"" << M.getModuleIdentifier() << "\"\n"; 114 } 115 116 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 117 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 118 for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I) 119 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) 120 MP->beginAssembly(O, *this, *MAI); 121 122 if (!M.getModuleInlineAsm().empty()) 123 O << MAI->getCommentString() << " Start of file scope inline assembly\n" 124 << M.getModuleInlineAsm() 125 << '\n' << MAI->getCommentString() 126 << " End of file scope inline assembly\n"; 127 128 MMI = getAnalysisIfAvailable<MachineModuleInfo>(); 129 if (MMI) 130 MMI->AnalyzeModule(M); 131 DW = getAnalysisIfAvailable<DwarfWriter>(); 132 if (DW) 133 DW->BeginModule(&M, MMI, O, this, MAI); 134 135 return false; 136} 137 138/// EmitGlobalVariable - Emit the specified global variable to the .s file. 139void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { 140 if (!GV->hasInitializer()) // External globals require no code. 141 return; 142 143 // Check to see if this is a special global used by LLVM, if so, emit it. 144 if (EmitSpecialLLVMGlobal(GV)) 145 return; 146 147 MCSymbol *GVSym = GetGlobalValueSymbol(GV); 148 printVisibility(GVSym, GV->getVisibility()); 149 150 if (MAI->hasDotTypeDotSizeDirective()) { 151 O << "\t.type\t" << *GVSym; 152 if (MAI->getCommentString()[0] != '@') 153 O << ",@object\n"; 154 else 155 O << ",%object\n"; 156 } 157 158 SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM); 159 160 const TargetData *TD = TM.getTargetData(); 161 unsigned Size = TD->getTypeAllocSize(GV->getType()->getElementType()); 162 unsigned AlignLog = TD->getPreferredAlignmentLog(GV); 163 164 // Handle common and BSS local symbols (.lcomm). 165 if (GVKind.isCommon() || GVKind.isBSSLocal()) { 166 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. 167 168 if (VerboseAsm) { 169 O.PadToColumn(MAI->getCommentColumn()); 170 O << MAI->getCommentString() << ' '; 171 WriteAsOperand(O, GV, /*PrintType=*/false, GV->getParent()); 172 O << '\n'; 173 } 174 175 // Handle common symbols. 176 if (GVKind.isCommon()) { 177 // .comm _foo, 42, 4 178 OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); 179 return; 180 } 181 182 // Handle local BSS symbols. 183 if (MAI->hasMachoZeroFillDirective()) { 184 const MCSection *TheSection = 185 getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM); 186 // .zerofill __DATA, __bss, _foo, 400, 5 187 OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog); 188 return; 189 } 190 191 if (const char *LComm = MAI->getLCOMMDirective()) { 192 // .lcomm _foo, 42 193 O << LComm << *GVSym << ',' << Size; 194 O << '\n'; 195 return; 196 } 197 198 // .local _foo 199 O << "\t.local\t" << *GVSym << '\n'; 200 // .comm _foo, 42, 4 201 OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); 202 return; 203 } 204 205 const MCSection *TheSection = 206 getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM); 207 208 // Handle the zerofill directive on darwin, which is a special form of BSS 209 // emission. 210 if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) { 211 // .globl _foo 212 OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global); 213 // .zerofill __DATA, __common, _foo, 400, 5 214 OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog); 215 return; 216 } 217 218 OutStreamer.SwitchSection(TheSection); 219 220 // TODO: Factor into an 'emit linkage' thing that is shared with function 221 // bodies. 222 switch (GV->getLinkage()) { 223 case GlobalValue::CommonLinkage: 224 case GlobalValue::LinkOnceAnyLinkage: 225 case GlobalValue::LinkOnceODRLinkage: 226 case GlobalValue::WeakAnyLinkage: 227 case GlobalValue::WeakODRLinkage: 228 case GlobalValue::LinkerPrivateLinkage: 229 if (const char *WeakDef = MAI->getWeakDefDirective()) { 230 // .globl _foo 231 OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global); 232 // .weak_definition _foo 233 O << WeakDef << *GVSym << '\n'; 234 } else if (const char *LinkOnce = MAI->getLinkOnceDirective()) { 235 // .globl _foo 236 OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global); 237 // .linkonce same_size 238 O << LinkOnce; 239 } else 240 O << "\t.weak\t" << *GVSym << '\n'; 241 break; 242 case GlobalValue::DLLExportLinkage: 243 case GlobalValue::AppendingLinkage: 244 // FIXME: appending linkage variables should go into a section of 245 // their name or something. For now, just emit them as external. 246 case GlobalValue::ExternalLinkage: 247 // If external or appending, declare as a global symbol. 248 // .globl _foo 249 OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global); 250 break; 251 case GlobalValue::PrivateLinkage: 252 case GlobalValue::InternalLinkage: 253 break; 254 default: 255 llvm_unreachable("Unknown linkage type!"); 256 } 257 258 EmitAlignment(AlignLog, GV); 259 O << *GVSym << ":"; 260 if (VerboseAsm) { 261 O.PadToColumn(MAI->getCommentColumn()); 262 O << MAI->getCommentString() << ' '; 263 WriteAsOperand(O, GV, /*PrintType=*/false, GV->getParent()); 264 } 265 O << '\n'; 266 267 EmitGlobalConstant(GV->getInitializer()); 268 269 if (MAI->hasDotTypeDotSizeDirective()) 270 O << "\t.size\t" << *GVSym << ", " << Size << '\n'; 271} 272 273 274bool AsmPrinter::doFinalization(Module &M) { 275 // Emit global variables. 276 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 277 I != E; ++I) 278 EmitGlobalVariable(I); 279 280 // Emit final debug information. 281 if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) 282 DW->EndModule(); 283 284 // If the target wants to know about weak references, print them all. 285 if (MAI->getWeakRefDirective()) { 286 // FIXME: This is not lazy, it would be nice to only print weak references 287 // to stuff that is actually used. Note that doing so would require targets 288 // to notice uses in operands (due to constant exprs etc). This should 289 // happen with the MC stuff eventually. 290 291 // Print out module-level global variables here. 292 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 293 I != E; ++I) { 294 if (!I->hasExternalWeakLinkage()) continue; 295 O << MAI->getWeakRefDirective() << *GetGlobalValueSymbol(I) << '\n'; 296 } 297 298 for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { 299 if (!I->hasExternalWeakLinkage()) continue; 300 O << MAI->getWeakRefDirective() << *GetGlobalValueSymbol(I) << '\n'; 301 } 302 } 303 304 if (MAI->getSetDirective()) { 305 O << '\n'; 306 for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); 307 I != E; ++I) { 308 MCSymbol *Name = GetGlobalValueSymbol(I); 309 310 const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal()); 311 MCSymbol *Target = GetGlobalValueSymbol(GV); 312 313 if (I->hasExternalLinkage() || !MAI->getWeakRefDirective()) 314 O << "\t.globl\t" << *Name << '\n'; 315 else if (I->hasWeakLinkage()) 316 O << MAI->getWeakRefDirective() << *Name << '\n'; 317 else 318 assert(I->hasLocalLinkage() && "Invalid alias linkage"); 319 320 printVisibility(Name, I->getVisibility()); 321 322 O << MAI->getSetDirective() << ' ' << *Name << ", " << *Target << '\n'; 323 } 324 } 325 326 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 327 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 328 for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) 329 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I)) 330 MP->finishAssembly(O, *this, *MAI); 331 332 // If we don't have any trampolines, then we don't require stack memory 333 // to be executable. Some targets have a directive to declare this. 334 Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); 335 if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) 336 if (MAI->getNonexecutableStackDirective()) 337 O << MAI->getNonexecutableStackDirective() << '\n'; 338 339 340 // Allow the target to emit any magic that it wants at the end of the file, 341 // after everything else has gone out. 342 EmitEndOfAsmFile(M); 343 344 delete Mang; Mang = 0; 345 DW = 0; MMI = 0; 346 347 OutStreamer.Finish(); 348 return false; 349} 350 351void AsmPrinter::SetupMachineFunction(MachineFunction &MF) { 352 // Get the function symbol. 353 CurrentFnSym = GetGlobalValueSymbol(MF.getFunction()); 354 IncrementFunctionNumber(); 355 356 if (VerboseAsm) 357 LI = &getAnalysis<MachineLoopInfo>(); 358} 359 360namespace { 361 // SectionCPs - Keep track the alignment, constpool entries per Section. 362 struct SectionCPs { 363 const MCSection *S; 364 unsigned Alignment; 365 SmallVector<unsigned, 4> CPEs; 366 SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {} 367 }; 368} 369 370/// EmitConstantPool - Print to the current output stream assembly 371/// representations of the constants in the constant pool MCP. This is 372/// used to print out constants which have been "spilled to memory" by 373/// the code generator. 374/// 375void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) { 376 const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants(); 377 if (CP.empty()) return; 378 379 // Calculate sections for constant pool entries. We collect entries to go into 380 // the same section together to reduce amount of section switch statements. 381 SmallVector<SectionCPs, 4> CPSections; 382 for (unsigned i = 0, e = CP.size(); i != e; ++i) { 383 const MachineConstantPoolEntry &CPE = CP[i]; 384 unsigned Align = CPE.getAlignment(); 385 386 SectionKind Kind; 387 switch (CPE.getRelocationInfo()) { 388 default: llvm_unreachable("Unknown section kind"); 389 case 2: Kind = SectionKind::getReadOnlyWithRel(); break; 390 case 1: 391 Kind = SectionKind::getReadOnlyWithRelLocal(); 392 break; 393 case 0: 394 switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { 395 case 4: Kind = SectionKind::getMergeableConst4(); break; 396 case 8: Kind = SectionKind::getMergeableConst8(); break; 397 case 16: Kind = SectionKind::getMergeableConst16();break; 398 default: Kind = SectionKind::getMergeableConst(); break; 399 } 400 } 401 402 const MCSection *S = getObjFileLowering().getSectionForConstant(Kind); 403 404 // The number of sections are small, just do a linear search from the 405 // last section to the first. 406 bool Found = false; 407 unsigned SecIdx = CPSections.size(); 408 while (SecIdx != 0) { 409 if (CPSections[--SecIdx].S == S) { 410 Found = true; 411 break; 412 } 413 } 414 if (!Found) { 415 SecIdx = CPSections.size(); 416 CPSections.push_back(SectionCPs(S, Align)); 417 } 418 419 if (Align > CPSections[SecIdx].Alignment) 420 CPSections[SecIdx].Alignment = Align; 421 CPSections[SecIdx].CPEs.push_back(i); 422 } 423 424 // Now print stuff into the calculated sections. 425 for (unsigned i = 0, e = CPSections.size(); i != e; ++i) { 426 OutStreamer.SwitchSection(CPSections[i].S); 427 EmitAlignment(Log2_32(CPSections[i].Alignment)); 428 429 unsigned Offset = 0; 430 for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) { 431 unsigned CPI = CPSections[i].CPEs[j]; 432 MachineConstantPoolEntry CPE = CP[CPI]; 433 434 // Emit inter-object padding for alignment. 435 unsigned AlignMask = CPE.getAlignment() - 1; 436 unsigned NewOffset = (Offset + AlignMask) & ~AlignMask; 437 EmitZeros(NewOffset - Offset); 438 439 const Type *Ty = CPE.getType(); 440 Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty); 441 442 O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' 443 << CPI << ':'; 444 if (VerboseAsm) { 445 O.PadToColumn(MAI->getCommentColumn()); 446 O << MAI->getCommentString() << " constant "; 447 WriteTypeSymbolic(O, CPE.getType(), MF->getFunction()->getParent()); 448 } 449 O << '\n'; 450 if (CPE.isMachineConstantPoolEntry()) 451 EmitMachineConstantPoolValue(CPE.Val.MachineCPVal); 452 else 453 EmitGlobalConstant(CPE.Val.ConstVal); 454 } 455 } 456} 457 458/// EmitJumpTableInfo - Print assembly representations of the jump tables used 459/// by the current function to the current output stream. 460/// 461void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI, 462 MachineFunction &MF) { 463 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 464 if (JT.empty()) return; 465 466 bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 467 468 // Pick the directive to use to print the jump table entries, and switch to 469 // the appropriate section. 470 TargetLowering *LoweringInfo = TM.getTargetLowering(); 471 472 const Function *F = MF.getFunction(); 473 bool JTInDiffSection = false; 474 if (F->isWeakForLinker() || 475 (IsPic && !LoweringInfo->usesGlobalOffsetTable())) { 476 // In PIC mode, we need to emit the jump table to the same section as the 477 // function body itself, otherwise the label differences won't make sense. 478 // We should also do if the section name is NULL or function is declared in 479 // discardable section. 480 OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, 481 TM)); 482 } else { 483 // Otherwise, drop it in the readonly section. 484 const MCSection *ReadOnlySection = 485 getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly()); 486 OutStreamer.SwitchSection(ReadOnlySection); 487 JTInDiffSection = true; 488 } 489 490 EmitAlignment(Log2_32(MJTI->getAlignment())); 491 492 for (unsigned i = 0, e = JT.size(); i != e; ++i) { 493 const std::vector<MachineBasicBlock*> &JTBBs = JT[i].MBBs; 494 495 // If this jump table was deleted, ignore it. 496 if (JTBBs.empty()) continue; 497 498 // For PIC codegen, if possible we want to use the SetDirective to reduce 499 // the number of relocations the assembler will generate for the jump table. 500 // Set directives are all printed before the jump table itself. 501 SmallPtrSet<MachineBasicBlock*, 16> EmittedSets; 502 if (MAI->getSetDirective() && IsPic) 503 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) 504 if (EmittedSets.insert(JTBBs[ii])) 505 printPICJumpTableSetLabel(i, JTBBs[ii]); 506 507 // On some targets (e.g. Darwin) we want to emit two consequtive labels 508 // before each jump table. The first label is never referenced, but tells 509 // the assembler and linker the extents of the jump table object. The 510 // second label is actually referenced by the code. 511 if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) { 512 O << MAI->getLinkerPrivateGlobalPrefix() 513 << "JTI" << getFunctionNumber() << '_' << i << ":\n"; 514 } 515 516 O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 517 << '_' << i << ":\n"; 518 519 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { 520 printPICJumpTableEntry(MJTI, JTBBs[ii], i); 521 O << '\n'; 522 } 523 } 524} 525 526void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 527 const MachineBasicBlock *MBB, 528 unsigned uid) const { 529 bool isPIC = TM.getRelocationModel() == Reloc::PIC_; 530 531 // Use JumpTableDirective otherwise honor the entry size from the jump table 532 // info. 533 const char *JTEntryDirective = MAI->getJumpTableDirective(isPIC); 534 bool HadJTEntryDirective = JTEntryDirective != NULL; 535 if (!HadJTEntryDirective) { 536 JTEntryDirective = MJTI->getEntrySize() == 4 ? 537 MAI->getData32bitsDirective() : MAI->getData64bitsDirective(); 538 } 539 540 O << JTEntryDirective << ' '; 541 542 // If we have emitted set directives for the jump table entries, print 543 // them rather than the entries themselves. If we're emitting PIC, then 544 // emit the table entries as differences between two text section labels. 545 // If we're emitting non-PIC code, then emit the entries as direct 546 // references to the target basic blocks. 547 if (!isPIC) { 548 O << *GetMBBSymbol(MBB->getNumber()); 549 } else if (MAI->getSetDirective()) { 550 O << MAI->getPrivateGlobalPrefix() << getFunctionNumber() 551 << '_' << uid << "_set_" << MBB->getNumber(); 552 } else { 553 O << *GetMBBSymbol(MBB->getNumber()); 554 // If the arch uses custom Jump Table directives, don't calc relative to 555 // JT 556 if (!HadJTEntryDirective) 557 O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" 558 << getFunctionNumber() << '_' << uid; 559 } 560} 561 562 563/// EmitSpecialLLVMGlobal - Check to see if the specified global is a 564/// special global used by LLVM. If so, emit it and return true, otherwise 565/// do nothing and return false. 566bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { 567 if (GV->getName() == "llvm.used") { 568 if (MAI->getUsedDirective() != 0) // No need to emit this at all. 569 EmitLLVMUsedList(GV->getInitializer()); 570 return true; 571 } 572 573 // Ignore debug and non-emitted data. This handles llvm.compiler.used. 574 if (GV->getSection() == "llvm.metadata" || 575 GV->hasAvailableExternallyLinkage()) 576 return true; 577 578 if (!GV->hasAppendingLinkage()) return false; 579 580 assert(GV->hasInitializer() && "Not a special LLVM global!"); 581 582 const TargetData *TD = TM.getTargetData(); 583 unsigned Align = Log2_32(TD->getPointerPrefAlignment()); 584 if (GV->getName() == "llvm.global_ctors") { 585 OutStreamer.SwitchSection(getObjFileLowering().getStaticCtorSection()); 586 EmitAlignment(Align, 0); 587 EmitXXStructorList(GV->getInitializer()); 588 589 if (TM.getRelocationModel() == Reloc::Static && 590 MAI->hasStaticCtorDtorReferenceInStaticMode()) 591 O << ".reference .constructors_used\n"; 592 return true; 593 } 594 595 if (GV->getName() == "llvm.global_dtors") { 596 OutStreamer.SwitchSection(getObjFileLowering().getStaticDtorSection()); 597 EmitAlignment(Align, 0); 598 EmitXXStructorList(GV->getInitializer()); 599 600 if (TM.getRelocationModel() == Reloc::Static && 601 MAI->hasStaticCtorDtorReferenceInStaticMode()) 602 O << ".reference .destructors_used\n"; 603 return true; 604 } 605 606 return false; 607} 608 609/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each 610/// global in the specified llvm.used list for which emitUsedDirectiveFor 611/// is true, as being used with this directive. 612void AsmPrinter::EmitLLVMUsedList(Constant *List) { 613 const char *Directive = MAI->getUsedDirective(); 614 615 // Should be an array of 'i8*'. 616 ConstantArray *InitList = dyn_cast<ConstantArray>(List); 617 if (InitList == 0) return; 618 619 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 620 const GlobalValue *GV = 621 dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts()); 622 if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang)) { 623 O << Directive; 624 EmitConstantValueOnly(InitList->getOperand(i)); 625 O << '\n'; 626 } 627 } 628} 629 630/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the 631/// function pointers, ignoring the init priority. 632void AsmPrinter::EmitXXStructorList(Constant *List) { 633 // Should be an array of '{ int, void ()* }' structs. The first value is the 634 // init priority, which we ignore. 635 if (!isa<ConstantArray>(List)) return; 636 ConstantArray *InitList = cast<ConstantArray>(List); 637 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 638 if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){ 639 if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. 640 641 if (CS->getOperand(1)->isNullValue()) 642 return; // Found a null terminator, exit printing. 643 // Emit the function pointer. 644 EmitGlobalConstant(CS->getOperand(1)); 645 } 646} 647 648 649//===----------------------------------------------------------------------===// 650/// LEB 128 number encoding. 651 652/// PrintULEB128 - Print a series of hexadecimal values (separated by commas) 653/// representing an unsigned leb128 value. 654void AsmPrinter::PrintULEB128(unsigned Value) const { 655 do { 656 unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 657 Value >>= 7; 658 if (Value) Byte |= 0x80; 659 PrintHex(Byte); 660 if (Value) O << ", "; 661 } while (Value); 662} 663 664/// PrintSLEB128 - Print a series of hexadecimal values (separated by commas) 665/// representing a signed leb128 value. 666void AsmPrinter::PrintSLEB128(int Value) const { 667 int Sign = Value >> (8 * sizeof(Value) - 1); 668 bool IsMore; 669 670 do { 671 unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 672 Value >>= 7; 673 IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 674 if (IsMore) Byte |= 0x80; 675 PrintHex(Byte); 676 if (IsMore) O << ", "; 677 } while (IsMore); 678} 679 680//===--------------------------------------------------------------------===// 681// Emission and print routines 682// 683 684/// PrintHex - Print a value as a hexadecimal value. 685/// 686void AsmPrinter::PrintHex(uint64_t Value) const { 687 O << "0x"; 688 O.write_hex(Value); 689} 690 691/// EOL - Print a newline character to asm stream. If a comment is present 692/// then it will be printed first. Comments should not contain '\n'. 693void AsmPrinter::EOL() const { 694 O << '\n'; 695} 696 697void AsmPrinter::EOL(const Twine &Comment) const { 698 if (VerboseAsm && !Comment.isTriviallyEmpty()) { 699 O.PadToColumn(MAI->getCommentColumn()); 700 O << MAI->getCommentString() 701 << ' ' 702 << Comment; 703 } 704 O << '\n'; 705} 706 707static const char *DecodeDWARFEncoding(unsigned Encoding) { 708 switch (Encoding) { 709 case dwarf::DW_EH_PE_absptr: 710 return "absptr"; 711 case dwarf::DW_EH_PE_omit: 712 return "omit"; 713 case dwarf::DW_EH_PE_pcrel: 714 return "pcrel"; 715 case dwarf::DW_EH_PE_udata4: 716 return "udata4"; 717 case dwarf::DW_EH_PE_udata8: 718 return "udata8"; 719 case dwarf::DW_EH_PE_sdata4: 720 return "sdata4"; 721 case dwarf::DW_EH_PE_sdata8: 722 return "sdata8"; 723 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4: 724 return "pcrel udata4"; 725 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4: 726 return "pcrel sdata4"; 727 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8: 728 return "pcrel udata8"; 729 case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8: 730 return "pcrel sdata8"; 731 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata4: 732 return "indirect pcrel udata4"; 733 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata4: 734 return "indirect pcrel sdata4"; 735 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata8: 736 return "indirect pcrel udata8"; 737 case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata8: 738 return "indirect pcrel sdata8"; 739 } 740 741 return 0; 742} 743 744void AsmPrinter::EOL(const Twine &Comment, unsigned Encoding) const { 745 if (VerboseAsm && !Comment.isTriviallyEmpty()) { 746 O.PadToColumn(MAI->getCommentColumn()); 747 O << MAI->getCommentString() 748 << ' ' 749 << Comment; 750 751 if (const char *EncStr = DecodeDWARFEncoding(Encoding)) 752 O << " (" << EncStr << ')'; 753 } 754 O << '\n'; 755} 756 757/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 758/// unsigned leb128 value. 759void AsmPrinter::EmitULEB128Bytes(unsigned Value) const { 760 if (MAI->hasLEB128()) { 761 O << "\t.uleb128\t" 762 << Value; 763 } else { 764 O << MAI->getData8bitsDirective(); 765 PrintULEB128(Value); 766 } 767} 768 769/// EmitSLEB128Bytes - print an assembler byte data directive to compose a 770/// signed leb128 value. 771void AsmPrinter::EmitSLEB128Bytes(int Value) const { 772 if (MAI->hasLEB128()) { 773 O << "\t.sleb128\t" 774 << Value; 775 } else { 776 O << MAI->getData8bitsDirective(); 777 PrintSLEB128(Value); 778 } 779} 780 781/// EmitInt8 - Emit a byte directive and value. 782/// 783void AsmPrinter::EmitInt8(int Value) const { 784 O << MAI->getData8bitsDirective(); 785 PrintHex(Value & 0xFF); 786} 787 788/// EmitInt16 - Emit a short directive and value. 789/// 790void AsmPrinter::EmitInt16(int Value) const { 791 O << MAI->getData16bitsDirective(); 792 PrintHex(Value & 0xFFFF); 793} 794 795/// EmitInt32 - Emit a long directive and value. 796/// 797void AsmPrinter::EmitInt32(int Value) const { 798 O << MAI->getData32bitsDirective(); 799 PrintHex(Value); 800} 801 802/// EmitInt64 - Emit a long long directive and value. 803/// 804void AsmPrinter::EmitInt64(uint64_t Value) const { 805 if (MAI->getData64bitsDirective()) { 806 O << MAI->getData64bitsDirective(); 807 PrintHex(Value); 808 } else { 809 if (TM.getTargetData()->isBigEndian()) { 810 EmitInt32(unsigned(Value >> 32)); O << '\n'; 811 EmitInt32(unsigned(Value)); 812 } else { 813 EmitInt32(unsigned(Value)); O << '\n'; 814 EmitInt32(unsigned(Value >> 32)); 815 } 816 } 817} 818 819/// toOctal - Convert the low order bits of X into an octal digit. 820/// 821static inline char toOctal(int X) { 822 return (X&7)+'0'; 823} 824 825/// printStringChar - Print a char, escaped if necessary. 826/// 827static void printStringChar(formatted_raw_ostream &O, unsigned char C) { 828 if (C == '"') { 829 O << "\\\""; 830 } else if (C == '\\') { 831 O << "\\\\"; 832 } else if (isprint((unsigned char)C)) { 833 O << C; 834 } else { 835 switch(C) { 836 case '\b': O << "\\b"; break; 837 case '\f': O << "\\f"; break; 838 case '\n': O << "\\n"; break; 839 case '\r': O << "\\r"; break; 840 case '\t': O << "\\t"; break; 841 default: 842 O << '\\'; 843 O << toOctal(C >> 6); 844 O << toOctal(C >> 3); 845 O << toOctal(C >> 0); 846 break; 847 } 848 } 849} 850 851/// EmitString - Emit a string with quotes and a null terminator. 852/// Special characters are emitted properly. 853/// \literal (Eg. '\t') \endliteral 854void AsmPrinter::EmitString(const StringRef String) const { 855 EmitString(String.data(), String.size()); 856} 857 858void AsmPrinter::EmitString(const char *String, unsigned Size) const { 859 const char* AscizDirective = MAI->getAscizDirective(); 860 if (AscizDirective) 861 O << AscizDirective; 862 else 863 O << MAI->getAsciiDirective(); 864 O << '\"'; 865 for (unsigned i = 0; i < Size; ++i) 866 printStringChar(O, String[i]); 867 if (AscizDirective) 868 O << '\"'; 869 else 870 O << "\\0\""; 871} 872 873 874/// EmitFile - Emit a .file directive. 875void AsmPrinter::EmitFile(unsigned Number, StringRef Name) const { 876 O << "\t.file\t" << Number << " \""; 877 for (unsigned i = 0, N = Name.size(); i < N; ++i) 878 printStringChar(O, Name[i]); 879 O << '\"'; 880} 881 882 883//===----------------------------------------------------------------------===// 884 885// EmitAlignment - Emit an alignment directive to the specified power of 886// two boundary. For example, if you pass in 3 here, you will get an 8 887// byte alignment. If a global value is specified, and if that global has 888// an explicit alignment requested, it will unconditionally override the 889// alignment request. However, if ForcedAlignBits is specified, this value 890// has final say: the ultimate alignment will be the max of ForcedAlignBits 891// and the alignment computed with NumBits and the global. 892// 893// The algorithm is: 894// Align = NumBits; 895// if (GV && GV->hasalignment) Align = GV->getalignment(); 896// Align = std::max(Align, ForcedAlignBits); 897// 898void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, 899 unsigned ForcedAlignBits, 900 bool UseFillExpr) const { 901 if (GV && GV->getAlignment()) 902 NumBits = Log2_32(GV->getAlignment()); 903 NumBits = std::max(NumBits, ForcedAlignBits); 904 905 if (NumBits == 0) return; // No need to emit alignment. 906 907 unsigned FillValue = 0; 908 if (getCurrentSection()->getKind().isText()) 909 FillValue = MAI->getTextAlignFillValue(); 910 911 OutStreamer.EmitValueToAlignment(1 << NumBits, FillValue, 1, 0); 912} 913 914/// EmitZeros - Emit a block of zeros. 915/// 916void AsmPrinter::EmitZeros(uint64_t NumZeros, unsigned AddrSpace) const { 917 if (NumZeros) { 918 if (MAI->getZeroDirective()) { 919 O << MAI->getZeroDirective() << NumZeros; 920 if (MAI->getZeroDirectiveSuffix()) 921 O << MAI->getZeroDirectiveSuffix(); 922 O << '\n'; 923 } else { 924 for (; NumZeros; --NumZeros) 925 O << MAI->getData8bitsDirective(AddrSpace) << "0\n"; 926 } 927 } 928} 929 930// Print out the specified constant, without a storage class. Only the 931// constants valid in constant expressions can occur here. 932void AsmPrinter::EmitConstantValueOnly(const Constant *CV) { 933 if (CV->isNullValue() || isa<UndefValue>(CV)) { 934 O << '0'; 935 return; 936 } 937 938 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 939 O << CI->getZExtValue(); 940 return; 941 } 942 943 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) { 944 // This is a constant address for a global variable or function. Use the 945 // name of the variable or function as the address value. 946 O << *GetGlobalValueSymbol(GV); 947 return; 948 } 949 950 if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV)) { 951 O << *GetBlockAddressSymbol(BA); 952 return; 953 } 954 955 const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV); 956 if (CE == 0) { 957 llvm_unreachable("Unknown constant value!"); 958 O << '0'; 959 return; 960 } 961 962 switch (CE->getOpcode()) { 963 case Instruction::ZExt: 964 case Instruction::SExt: 965 case Instruction::FPTrunc: 966 case Instruction::FPExt: 967 case Instruction::UIToFP: 968 case Instruction::SIToFP: 969 case Instruction::FPToUI: 970 case Instruction::FPToSI: 971 default: 972 llvm_unreachable("FIXME: Don't support this constant cast expr"); 973 case Instruction::GetElementPtr: { 974 // generate a symbolic expression for the byte address 975 const TargetData *TD = TM.getTargetData(); 976 const Constant *ptrVal = CE->getOperand(0); 977 SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end()); 978 int64_t Offset = TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], 979 idxVec.size()); 980 if (Offset == 0) 981 return EmitConstantValueOnly(ptrVal); 982 983 // Truncate/sext the offset to the pointer size. 984 if (TD->getPointerSizeInBits() != 64) { 985 int SExtAmount = 64-TD->getPointerSizeInBits(); 986 Offset = (Offset << SExtAmount) >> SExtAmount; 987 } 988 989 if (Offset) 990 O << '('; 991 EmitConstantValueOnly(ptrVal); 992 if (Offset > 0) 993 O << ") + " << Offset; 994 else 995 O << ") - " << -Offset; 996 return; 997 } 998 case Instruction::BitCast: 999 return EmitConstantValueOnly(CE->getOperand(0)); 1000 1001 case Instruction::IntToPtr: { 1002 // Handle casts to pointers by changing them into casts to the appropriate 1003 // integer type. This promotes constant folding and simplifies this code. 1004 const TargetData *TD = TM.getTargetData(); 1005 Constant *Op = CE->getOperand(0); 1006 Op = ConstantExpr::getIntegerCast(Op, TD->getIntPtrType(CV->getContext()), 1007 false/*ZExt*/); 1008 return EmitConstantValueOnly(Op); 1009 } 1010 1011 case Instruction::PtrToInt: { 1012 // Support only foldable casts to/from pointers that can be eliminated by 1013 // changing the pointer to the appropriately sized integer type. 1014 Constant *Op = CE->getOperand(0); 1015 const Type *Ty = CE->getType(); 1016 const TargetData *TD = TM.getTargetData(); 1017 1018 // We can emit the pointer value into this slot if the slot is an 1019 // integer slot greater or equal to the size of the pointer. 1020 if (TD->getTypeAllocSize(Ty) == TD->getTypeAllocSize(Op->getType())) 1021 return EmitConstantValueOnly(Op); 1022 1023 O << "(("; 1024 EmitConstantValueOnly(Op); 1025 APInt ptrMask = 1026 APInt::getAllOnesValue(TD->getTypeAllocSizeInBits(Op->getType())); 1027 1028 SmallString<40> S; 1029 ptrMask.toStringUnsigned(S); 1030 O << ") & " << S.str() << ')'; 1031 return; 1032 } 1033 1034 case Instruction::Trunc: 1035 // We emit the value and depend on the assembler to truncate the generated 1036 // expression properly. This is important for differences between 1037 // blockaddress labels. Since the two labels are in the same function, it 1038 // is reasonable to treat their delta as a 32-bit value. 1039 return EmitConstantValueOnly(CE->getOperand(0)); 1040 1041 case Instruction::Add: 1042 case Instruction::Sub: 1043 case Instruction::And: 1044 case Instruction::Or: 1045 case Instruction::Xor: 1046 O << '('; 1047 EmitConstantValueOnly(CE->getOperand(0)); 1048 O << ')'; 1049 switch (CE->getOpcode()) { 1050 case Instruction::Add: 1051 O << " + "; 1052 break; 1053 case Instruction::Sub: 1054 O << " - "; 1055 break; 1056 case Instruction::And: 1057 O << " & "; 1058 break; 1059 case Instruction::Or: 1060 O << " | "; 1061 break; 1062 case Instruction::Xor: 1063 O << " ^ "; 1064 break; 1065 default: 1066 break; 1067 } 1068 O << '('; 1069 EmitConstantValueOnly(CE->getOperand(1)); 1070 O << ')'; 1071 break; 1072 } 1073} 1074 1075/// printAsCString - Print the specified array as a C compatible string, only if 1076/// the predicate isString is true. 1077/// 1078static void printAsCString(formatted_raw_ostream &O, const ConstantArray *CVA, 1079 unsigned LastElt) { 1080 assert(CVA->isString() && "Array is not string compatible!"); 1081 1082 O << '\"'; 1083 for (unsigned i = 0; i != LastElt; ++i) { 1084 unsigned char C = 1085 (unsigned char)cast<ConstantInt>(CVA->getOperand(i))->getZExtValue(); 1086 printStringChar(O, C); 1087 } 1088 O << '\"'; 1089} 1090 1091/// EmitString - Emit a zero-byte-terminated string constant. 1092/// 1093void AsmPrinter::EmitString(const ConstantArray *CVA) const { 1094 unsigned NumElts = CVA->getNumOperands(); 1095 if (MAI->getAscizDirective() && NumElts && 1096 cast<ConstantInt>(CVA->getOperand(NumElts-1))->getZExtValue() == 0) { 1097 O << MAI->getAscizDirective(); 1098 printAsCString(O, CVA, NumElts-1); 1099 } else { 1100 O << MAI->getAsciiDirective(); 1101 printAsCString(O, CVA, NumElts); 1102 } 1103 O << '\n'; 1104} 1105 1106void AsmPrinter::EmitGlobalConstantArray(const ConstantArray *CVA, 1107 unsigned AddrSpace) { 1108 if (CVA->isString()) { 1109 EmitString(CVA); 1110 } else { // Not a string. Print the values in successive locations 1111 for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i) 1112 EmitGlobalConstant(CVA->getOperand(i), AddrSpace); 1113 } 1114} 1115 1116void AsmPrinter::EmitGlobalConstantVector(const ConstantVector *CP) { 1117 const VectorType *PTy = CP->getType(); 1118 1119 for (unsigned I = 0, E = PTy->getNumElements(); I < E; ++I) 1120 EmitGlobalConstant(CP->getOperand(I)); 1121} 1122 1123void AsmPrinter::EmitGlobalConstantStruct(const ConstantStruct *CVS, 1124 unsigned AddrSpace) { 1125 // Print the fields in successive locations. Pad to align if needed! 1126 const TargetData *TD = TM.getTargetData(); 1127 unsigned Size = TD->getTypeAllocSize(CVS->getType()); 1128 const StructLayout *cvsLayout = TD->getStructLayout(CVS->getType()); 1129 uint64_t sizeSoFar = 0; 1130 for (unsigned i = 0, e = CVS->getNumOperands(); i != e; ++i) { 1131 const Constant* field = CVS->getOperand(i); 1132 1133 // Check if padding is needed and insert one or more 0s. 1134 uint64_t fieldSize = TD->getTypeAllocSize(field->getType()); 1135 uint64_t padSize = ((i == e-1 ? Size : cvsLayout->getElementOffset(i+1)) 1136 - cvsLayout->getElementOffset(i)) - fieldSize; 1137 sizeSoFar += fieldSize + padSize; 1138 1139 // Now print the actual field value. 1140 EmitGlobalConstant(field, AddrSpace); 1141 1142 // Insert padding - this may include padding to increase the size of the 1143 // current field up to the ABI size (if the struct is not packed) as well 1144 // as padding to ensure that the next field starts at the right offset. 1145 EmitZeros(padSize, AddrSpace); 1146 } 1147 assert(sizeSoFar == cvsLayout->getSizeInBytes() && 1148 "Layout of constant struct may be incorrect!"); 1149} 1150 1151void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP, 1152 unsigned AddrSpace) { 1153 // FP Constants are printed as integer constants to avoid losing 1154 // precision... 1155 LLVMContext &Context = CFP->getContext(); 1156 const TargetData *TD = TM.getTargetData(); 1157 if (CFP->getType()->isDoubleTy()) { 1158 double Val = CFP->getValueAPF().convertToDouble(); // for comment only 1159 uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1160 if (MAI->getData64bitsDirective(AddrSpace)) { 1161 O << MAI->getData64bitsDirective(AddrSpace) << i; 1162 if (VerboseAsm) { 1163 O.PadToColumn(MAI->getCommentColumn()); 1164 O << MAI->getCommentString() << " double " << Val; 1165 } 1166 O << '\n'; 1167 } else if (TD->isBigEndian()) { 1168 O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1169 if (VerboseAsm) { 1170 O.PadToColumn(MAI->getCommentColumn()); 1171 O << MAI->getCommentString() 1172 << " most significant word of double " << Val; 1173 } 1174 O << '\n'; 1175 O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1176 if (VerboseAsm) { 1177 O.PadToColumn(MAI->getCommentColumn()); 1178 O << MAI->getCommentString() 1179 << " least significant word of double " << Val; 1180 } 1181 O << '\n'; 1182 } else { 1183 O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1184 if (VerboseAsm) { 1185 O.PadToColumn(MAI->getCommentColumn()); 1186 O << MAI->getCommentString() 1187 << " least significant word of double " << Val; 1188 } 1189 O << '\n'; 1190 O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1191 if (VerboseAsm) { 1192 O.PadToColumn(MAI->getCommentColumn()); 1193 O << MAI->getCommentString() 1194 << " most significant word of double " << Val; 1195 } 1196 O << '\n'; 1197 } 1198 return; 1199 } 1200 1201 if (CFP->getType()->isFloatTy()) { 1202 float Val = CFP->getValueAPF().convertToFloat(); // for comment only 1203 O << MAI->getData32bitsDirective(AddrSpace) 1204 << CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1205 if (VerboseAsm) { 1206 O.PadToColumn(MAI->getCommentColumn()); 1207 O << MAI->getCommentString() << " float " << Val; 1208 } 1209 O << '\n'; 1210 return; 1211 } 1212 1213 if (CFP->getType()->isX86_FP80Ty()) { 1214 // all long double variants are printed as hex 1215 // api needed to prevent premature destruction 1216 APInt api = CFP->getValueAPF().bitcastToAPInt(); 1217 const uint64_t *p = api.getRawData(); 1218 // Convert to double so we can print the approximate val as a comment. 1219 APFloat DoubleVal = CFP->getValueAPF(); 1220 bool ignored; 1221 DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, 1222 &ignored); 1223 if (TD->isBigEndian()) { 1224 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1225 if (VerboseAsm) { 1226 O.PadToColumn(MAI->getCommentColumn()); 1227 O << MAI->getCommentString() 1228 << " most significant halfword of x86_fp80 ~" 1229 << DoubleVal.convertToDouble(); 1230 } 1231 O << '\n'; 1232 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1233 if (VerboseAsm) { 1234 O.PadToColumn(MAI->getCommentColumn()); 1235 O << MAI->getCommentString() << " next halfword"; 1236 } 1237 O << '\n'; 1238 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1239 if (VerboseAsm) { 1240 O.PadToColumn(MAI->getCommentColumn()); 1241 O << MAI->getCommentString() << " next halfword"; 1242 } 1243 O << '\n'; 1244 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1245 if (VerboseAsm) { 1246 O.PadToColumn(MAI->getCommentColumn()); 1247 O << MAI->getCommentString() << " next halfword"; 1248 } 1249 O << '\n'; 1250 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1251 if (VerboseAsm) { 1252 O.PadToColumn(MAI->getCommentColumn()); 1253 O << MAI->getCommentString() 1254 << " least significant halfword"; 1255 } 1256 O << '\n'; 1257 } else { 1258 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1259 if (VerboseAsm) { 1260 O.PadToColumn(MAI->getCommentColumn()); 1261 O << MAI->getCommentString() 1262 << " least significant halfword of x86_fp80 ~" 1263 << DoubleVal.convertToDouble(); 1264 } 1265 O << '\n'; 1266 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1267 if (VerboseAsm) { 1268 O.PadToColumn(MAI->getCommentColumn()); 1269 O << MAI->getCommentString() 1270 << " next halfword"; 1271 } 1272 O << '\n'; 1273 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1274 if (VerboseAsm) { 1275 O.PadToColumn(MAI->getCommentColumn()); 1276 O << MAI->getCommentString() 1277 << " next halfword"; 1278 } 1279 O << '\n'; 1280 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1281 if (VerboseAsm) { 1282 O.PadToColumn(MAI->getCommentColumn()); 1283 O << MAI->getCommentString() 1284 << " next halfword"; 1285 } 1286 O << '\n'; 1287 O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1288 if (VerboseAsm) { 1289 O.PadToColumn(MAI->getCommentColumn()); 1290 O << MAI->getCommentString() 1291 << " most significant halfword"; 1292 } 1293 O << '\n'; 1294 } 1295 EmitZeros(TD->getTypeAllocSize(Type::getX86_FP80Ty(Context)) - 1296 TD->getTypeStoreSize(Type::getX86_FP80Ty(Context)), AddrSpace); 1297 return; 1298 } 1299 1300 if (CFP->getType()->isPPC_FP128Ty()) { 1301 // all long double variants are printed as hex 1302 // api needed to prevent premature destruction 1303 APInt api = CFP->getValueAPF().bitcastToAPInt(); 1304 const uint64_t *p = api.getRawData(); 1305 if (TD->isBigEndian()) { 1306 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1307 if (VerboseAsm) { 1308 O.PadToColumn(MAI->getCommentColumn()); 1309 O << MAI->getCommentString() 1310 << " most significant word of ppc_fp128"; 1311 } 1312 O << '\n'; 1313 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1314 if (VerboseAsm) { 1315 O.PadToColumn(MAI->getCommentColumn()); 1316 O << MAI->getCommentString() 1317 << " next word"; 1318 } 1319 O << '\n'; 1320 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1321 if (VerboseAsm) { 1322 O.PadToColumn(MAI->getCommentColumn()); 1323 O << MAI->getCommentString() 1324 << " next word"; 1325 } 1326 O << '\n'; 1327 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1328 if (VerboseAsm) { 1329 O.PadToColumn(MAI->getCommentColumn()); 1330 O << MAI->getCommentString() 1331 << " least significant word"; 1332 } 1333 O << '\n'; 1334 } else { 1335 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1336 if (VerboseAsm) { 1337 O.PadToColumn(MAI->getCommentColumn()); 1338 O << MAI->getCommentString() 1339 << " least significant word of ppc_fp128"; 1340 } 1341 O << '\n'; 1342 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1343 if (VerboseAsm) { 1344 O.PadToColumn(MAI->getCommentColumn()); 1345 O << MAI->getCommentString() 1346 << " next word"; 1347 } 1348 O << '\n'; 1349 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1350 if (VerboseAsm) { 1351 O.PadToColumn(MAI->getCommentColumn()); 1352 O << MAI->getCommentString() 1353 << " next word"; 1354 } 1355 O << '\n'; 1356 O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1357 if (VerboseAsm) { 1358 O.PadToColumn(MAI->getCommentColumn()); 1359 O << MAI->getCommentString() 1360 << " most significant word"; 1361 } 1362 O << '\n'; 1363 } 1364 return; 1365 } else llvm_unreachable("Floating point constant type not handled"); 1366} 1367 1368void AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI, 1369 unsigned AddrSpace) { 1370 const TargetData *TD = TM.getTargetData(); 1371 unsigned BitWidth = CI->getBitWidth(); 1372 assert((BitWidth & 63) == 0 && "only support multiples of 64-bits"); 1373 1374 // We don't expect assemblers to support integer data directives 1375 // for more than 64 bits, so we emit the data in at most 64-bit 1376 // quantities at a time. 1377 const uint64_t *RawData = CI->getValue().getRawData(); 1378 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) { 1379 uint64_t Val; 1380 if (TD->isBigEndian()) 1381 Val = RawData[e - i - 1]; 1382 else 1383 Val = RawData[i]; 1384 1385 if (MAI->getData64bitsDirective(AddrSpace)) { 1386 O << MAI->getData64bitsDirective(AddrSpace) << Val << '\n'; 1387 continue; 1388 } 1389 1390 // Emit two 32-bit chunks, order depends on endianness. 1391 unsigned FirstChunk = unsigned(Val), SecondChunk = unsigned(Val >> 32); 1392 const char *FirstName = " least", *SecondName = " most"; 1393 if (TD->isBigEndian()) { 1394 std::swap(FirstChunk, SecondChunk); 1395 std::swap(FirstName, SecondName); 1396 } 1397 1398 O << MAI->getData32bitsDirective(AddrSpace) << FirstChunk; 1399 if (VerboseAsm) { 1400 O.PadToColumn(MAI->getCommentColumn()); 1401 O << MAI->getCommentString() 1402 << FirstName << " significant half of i64 " << Val; 1403 } 1404 O << '\n'; 1405 1406 O << MAI->getData32bitsDirective(AddrSpace) << SecondChunk; 1407 if (VerboseAsm) { 1408 O.PadToColumn(MAI->getCommentColumn()); 1409 O << MAI->getCommentString() 1410 << SecondName << " significant half of i64 " << Val; 1411 } 1412 O << '\n'; 1413 } 1414} 1415 1416/// EmitGlobalConstant - Print a general LLVM constant to the .s file. 1417void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { 1418 const TargetData *TD = TM.getTargetData(); 1419 const Type *type = CV->getType(); 1420 unsigned Size = TD->getTypeAllocSize(type); 1421 1422 if (CV->isNullValue() || isa<UndefValue>(CV)) { 1423 EmitZeros(Size, AddrSpace); 1424 return; 1425 } 1426 1427 if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) { 1428 EmitGlobalConstantArray(CVA , AddrSpace); 1429 return; 1430 } 1431 1432 if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) { 1433 EmitGlobalConstantStruct(CVS, AddrSpace); 1434 return; 1435 } 1436 1437 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) { 1438 EmitGlobalConstantFP(CFP, AddrSpace); 1439 return; 1440 } 1441 1442 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1443 // If we can directly emit an 8-byte constant, do it. 1444 if (Size == 8) 1445 if (const char *Data64Dir = MAI->getData64bitsDirective(AddrSpace)) { 1446 O << Data64Dir << CI->getZExtValue() << '\n'; 1447 return; 1448 } 1449 1450 // Small integers are handled below; large integers are handled here. 1451 if (Size > 4) { 1452 EmitGlobalConstantLargeInt(CI, AddrSpace); 1453 return; 1454 } 1455 } 1456 1457 if (const ConstantVector *CP = dyn_cast<ConstantVector>(CV)) { 1458 EmitGlobalConstantVector(CP); 1459 return; 1460 } 1461 1462 printDataDirective(type, AddrSpace); 1463 EmitConstantValueOnly(CV); 1464 if (VerboseAsm) { 1465 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1466 SmallString<40> S; 1467 CI->getValue().toStringUnsigned(S, 16); 1468 O.PadToColumn(MAI->getCommentColumn()); 1469 O << MAI->getCommentString() << " 0x" << S.str(); 1470 } 1471 } 1472 O << '\n'; 1473} 1474 1475void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1476 // Target doesn't support this yet! 1477 llvm_unreachable("Target does not support EmitMachineConstantPoolValue"); 1478} 1479 1480/// PrintSpecial - Print information related to the specified machine instr 1481/// that is independent of the operand, and may be independent of the instr 1482/// itself. This can be useful for portably encoding the comment character 1483/// or other bits of target-specific knowledge into the asmstrings. The 1484/// syntax used is ${:comment}. Targets can override this to add support 1485/// for their own strange codes. 1486void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const { 1487 if (!strcmp(Code, "private")) { 1488 O << MAI->getPrivateGlobalPrefix(); 1489 } else if (!strcmp(Code, "comment")) { 1490 if (VerboseAsm) 1491 O << MAI->getCommentString(); 1492 } else if (!strcmp(Code, "uid")) { 1493 // Comparing the address of MI isn't sufficient, because machineinstrs may 1494 // be allocated to the same address across functions. 1495 const Function *ThisF = MI->getParent()->getParent()->getFunction(); 1496 1497 // If this is a new LastFn instruction, bump the counter. 1498 if (LastMI != MI || LastFn != ThisF) { 1499 ++Counter; 1500 LastMI = MI; 1501 LastFn = ThisF; 1502 } 1503 O << Counter; 1504 } else { 1505 std::string msg; 1506 raw_string_ostream Msg(msg); 1507 Msg << "Unknown special formatter '" << Code 1508 << "' for machine instr: " << *MI; 1509 llvm_report_error(Msg.str()); 1510 } 1511} 1512 1513/// processDebugLoc - Processes the debug information of each machine 1514/// instruction's DebugLoc. 1515void AsmPrinter::processDebugLoc(const MachineInstr *MI, 1516 bool BeforePrintingInsn) { 1517 if (!MAI || !DW || !MAI->doesSupportDebugInformation() 1518 || !DW->ShouldEmitDwarfDebug()) 1519 return; 1520 DebugLoc DL = MI->getDebugLoc(); 1521 if (DL.isUnknown()) 1522 return; 1523 DILocation CurDLT = MF->getDILocation(DL); 1524 if (CurDLT.getScope().isNull()) 1525 return; 1526 1527 if (BeforePrintingInsn) { 1528 if (CurDLT.getNode() != PrevDLT) { 1529 unsigned L = DW->RecordSourceLine(CurDLT.getLineNumber(), 1530 CurDLT.getColumnNumber(), 1531 CurDLT.getScope().getNode()); 1532 printLabel(L); 1533 O << '\n'; 1534 DW->BeginScope(MI, L); 1535 PrevDLT = CurDLT.getNode(); 1536 } 1537 } else { 1538 // After printing instruction 1539 DW->EndScope(MI); 1540 } 1541} 1542 1543 1544/// printInlineAsm - This method formats and prints the specified machine 1545/// instruction that is an inline asm. 1546void AsmPrinter::printInlineAsm(const MachineInstr *MI) const { 1547 unsigned NumOperands = MI->getNumOperands(); 1548 1549 // Count the number of register definitions. 1550 unsigned NumDefs = 0; 1551 for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef(); 1552 ++NumDefs) 1553 assert(NumDefs != NumOperands-1 && "No asm string?"); 1554 1555 assert(MI->getOperand(NumDefs).isSymbol() && "No asm string?"); 1556 1557 // Disassemble the AsmStr, printing out the literal pieces, the operands, etc. 1558 const char *AsmStr = MI->getOperand(NumDefs).getSymbolName(); 1559 1560 O << '\t'; 1561 1562 // If this asmstr is empty, just print the #APP/#NOAPP markers. 1563 // These are useful to see where empty asm's wound up. 1564 if (AsmStr[0] == 0) { 1565 O << MAI->getCommentString() << MAI->getInlineAsmStart() << "\n\t"; 1566 O << MAI->getCommentString() << MAI->getInlineAsmEnd() << '\n'; 1567 return; 1568 } 1569 1570 O << MAI->getCommentString() << MAI->getInlineAsmStart() << "\n\t"; 1571 1572 // The variant of the current asmprinter. 1573 int AsmPrinterVariant = MAI->getAssemblerDialect(); 1574 1575 int CurVariant = -1; // The number of the {.|.|.} region we are in. 1576 const char *LastEmitted = AsmStr; // One past the last character emitted. 1577 1578 while (*LastEmitted) { 1579 switch (*LastEmitted) { 1580 default: { 1581 // Not a special case, emit the string section literally. 1582 const char *LiteralEnd = LastEmitted+1; 1583 while (*LiteralEnd && *LiteralEnd != '{' && *LiteralEnd != '|' && 1584 *LiteralEnd != '}' && *LiteralEnd != '$' && *LiteralEnd != '\n') 1585 ++LiteralEnd; 1586 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 1587 O.write(LastEmitted, LiteralEnd-LastEmitted); 1588 LastEmitted = LiteralEnd; 1589 break; 1590 } 1591 case '\n': 1592 ++LastEmitted; // Consume newline character. 1593 O << '\n'; // Indent code with newline. 1594 break; 1595 case '$': { 1596 ++LastEmitted; // Consume '$' character. 1597 bool Done = true; 1598 1599 // Handle escapes. 1600 switch (*LastEmitted) { 1601 default: Done = false; break; 1602 case '$': // $$ -> $ 1603 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 1604 O << '$'; 1605 ++LastEmitted; // Consume second '$' character. 1606 break; 1607 case '(': // $( -> same as GCC's { character. 1608 ++LastEmitted; // Consume '(' character. 1609 if (CurVariant != -1) { 1610 llvm_report_error("Nested variants found in inline asm string: '" 1611 + std::string(AsmStr) + "'"); 1612 } 1613 CurVariant = 0; // We're in the first variant now. 1614 break; 1615 case '|': 1616 ++LastEmitted; // consume '|' character. 1617 if (CurVariant == -1) 1618 O << '|'; // this is gcc's behavior for | outside a variant 1619 else 1620 ++CurVariant; // We're in the next variant. 1621 break; 1622 case ')': // $) -> same as GCC's } char. 1623 ++LastEmitted; // consume ')' character. 1624 if (CurVariant == -1) 1625 O << '}'; // this is gcc's behavior for } outside a variant 1626 else 1627 CurVariant = -1; 1628 break; 1629 } 1630 if (Done) break; 1631 1632 bool HasCurlyBraces = false; 1633 if (*LastEmitted == '{') { // ${variable} 1634 ++LastEmitted; // Consume '{' character. 1635 HasCurlyBraces = true; 1636 } 1637 1638 // If we have ${:foo}, then this is not a real operand reference, it is a 1639 // "magic" string reference, just like in .td files. Arrange to call 1640 // PrintSpecial. 1641 if (HasCurlyBraces && *LastEmitted == ':') { 1642 ++LastEmitted; 1643 const char *StrStart = LastEmitted; 1644 const char *StrEnd = strchr(StrStart, '}'); 1645 if (StrEnd == 0) { 1646 llvm_report_error("Unterminated ${:foo} operand in inline asm string: '" 1647 + std::string(AsmStr) + "'"); 1648 } 1649 1650 std::string Val(StrStart, StrEnd); 1651 PrintSpecial(MI, Val.c_str()); 1652 LastEmitted = StrEnd+1; 1653 break; 1654 } 1655 1656 const char *IDStart = LastEmitted; 1657 char *IDEnd; 1658 errno = 0; 1659 long Val = strtol(IDStart, &IDEnd, 10); // We only accept numbers for IDs. 1660 if (!isdigit(*IDStart) || (Val == 0 && errno == EINVAL)) { 1661 llvm_report_error("Bad $ operand number in inline asm string: '" 1662 + std::string(AsmStr) + "'"); 1663 } 1664 LastEmitted = IDEnd; 1665 1666 char Modifier[2] = { 0, 0 }; 1667 1668 if (HasCurlyBraces) { 1669 // If we have curly braces, check for a modifier character. This 1670 // supports syntax like ${0:u}, which correspond to "%u0" in GCC asm. 1671 if (*LastEmitted == ':') { 1672 ++LastEmitted; // Consume ':' character. 1673 if (*LastEmitted == 0) { 1674 llvm_report_error("Bad ${:} expression in inline asm string: '" 1675 + std::string(AsmStr) + "'"); 1676 } 1677 1678 Modifier[0] = *LastEmitted; 1679 ++LastEmitted; // Consume modifier character. 1680 } 1681 1682 if (*LastEmitted != '}') { 1683 llvm_report_error("Bad ${} expression in inline asm string: '" 1684 + std::string(AsmStr) + "'"); 1685 } 1686 ++LastEmitted; // Consume '}' character. 1687 } 1688 1689 if ((unsigned)Val >= NumOperands-1) { 1690 llvm_report_error("Invalid $ operand number in inline asm string: '" 1691 + std::string(AsmStr) + "'"); 1692 } 1693 1694 // Okay, we finally have a value number. Ask the target to print this 1695 // operand! 1696 if (CurVariant == -1 || CurVariant == AsmPrinterVariant) { 1697 unsigned OpNo = 1; 1698 1699 bool Error = false; 1700 1701 // Scan to find the machine operand number for the operand. 1702 for (; Val; --Val) { 1703 if (OpNo >= MI->getNumOperands()) break; 1704 unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1705 OpNo += InlineAsm::getNumOperandRegisters(OpFlags) + 1; 1706 } 1707 1708 if (OpNo >= MI->getNumOperands()) { 1709 Error = true; 1710 } else { 1711 unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1712 ++OpNo; // Skip over the ID number. 1713 1714 if (Modifier[0] == 'l') // labels are target independent 1715 O << *GetMBBSymbol(MI->getOperand(OpNo).getMBB()->getNumber()); 1716 else { 1717 AsmPrinter *AP = const_cast<AsmPrinter*>(this); 1718 if ((OpFlags & 7) == 4) { 1719 Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, 1720 Modifier[0] ? Modifier : 0); 1721 } else { 1722 Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, 1723 Modifier[0] ? Modifier : 0); 1724 } 1725 } 1726 } 1727 if (Error) { 1728 std::string msg; 1729 raw_string_ostream Msg(msg); 1730 Msg << "Invalid operand found in inline asm: '" << AsmStr << "'\n"; 1731 MI->print(Msg); 1732 llvm_report_error(Msg.str()); 1733 } 1734 } 1735 break; 1736 } 1737 } 1738 } 1739 O << "\n\t" << MAI->getCommentString() << MAI->getInlineAsmEnd(); 1740} 1741 1742/// printImplicitDef - This method prints the specified machine instruction 1743/// that is an implicit def. 1744void AsmPrinter::printImplicitDef(const MachineInstr *MI) const { 1745 if (!VerboseAsm) return; 1746 O.PadToColumn(MAI->getCommentColumn()); 1747 O << MAI->getCommentString() << " implicit-def: " 1748 << TRI->getName(MI->getOperand(0).getReg()); 1749} 1750 1751void AsmPrinter::printKill(const MachineInstr *MI) const { 1752 if (!VerboseAsm) return; 1753 O.PadToColumn(MAI->getCommentColumn()); 1754 O << MAI->getCommentString() << " kill:"; 1755 for (unsigned n = 0, e = MI->getNumOperands(); n != e; ++n) { 1756 const MachineOperand &op = MI->getOperand(n); 1757 assert(op.isReg() && "KILL instruction must have only register operands"); 1758 O << ' ' << TRI->getName(op.getReg()) << (op.isDef() ? "<def>" : "<kill>"); 1759 } 1760} 1761 1762/// printLabel - This method prints a local label used by debug and 1763/// exception handling tables. 1764void AsmPrinter::printLabel(const MachineInstr *MI) const { 1765 printLabel(MI->getOperand(0).getImm()); 1766} 1767 1768void AsmPrinter::printLabel(unsigned Id) const { 1769 O << MAI->getPrivateGlobalPrefix() << "label" << Id << ':'; 1770} 1771 1772/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 1773/// instruction, using the specified assembler variant. Targets should 1774/// override this to format as appropriate. 1775bool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 1776 unsigned AsmVariant, const char *ExtraCode) { 1777 // Target doesn't support this yet! 1778 return true; 1779} 1780 1781bool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 1782 unsigned AsmVariant, 1783 const char *ExtraCode) { 1784 // Target doesn't support this yet! 1785 return true; 1786} 1787 1788MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA, 1789 const char *Suffix) const { 1790 return GetBlockAddressSymbol(BA->getFunction(), BA->getBasicBlock(), Suffix); 1791} 1792 1793MCSymbol *AsmPrinter::GetBlockAddressSymbol(const Function *F, 1794 const BasicBlock *BB, 1795 const char *Suffix) const { 1796 assert(BB->hasName() && 1797 "Address of anonymous basic block not supported yet!"); 1798 1799 // This code must use the function name itself, and not the function number, 1800 // since it must be possible to generate the label name from within other 1801 // functions. 1802 SmallString<60> FnName; 1803 Mang->getNameWithPrefix(FnName, F, false); 1804 1805 // FIXME: THIS IS BROKEN IF THE LLVM BASIC BLOCK DOESN'T HAVE A NAME! 1806 SmallString<60> NameResult; 1807 Mang->getNameWithPrefix(NameResult, 1808 StringRef("BA") + Twine((unsigned)FnName.size()) + 1809 "_" + FnName.str() + "_" + BB->getName() + Suffix, 1810 Mangler::Private); 1811 1812 return OutContext.GetOrCreateSymbol(NameResult.str()); 1813} 1814 1815MCSymbol *AsmPrinter::GetMBBSymbol(unsigned MBBID) const { 1816 SmallString<60> Name; 1817 raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "BB" 1818 << getFunctionNumber() << '_' << MBBID; 1819 1820 return OutContext.GetOrCreateSymbol(Name.str()); 1821} 1822 1823/// GetGlobalValueSymbol - Return the MCSymbol for the specified global 1824/// value. 1825MCSymbol *AsmPrinter::GetGlobalValueSymbol(const GlobalValue *GV) const { 1826 SmallString<60> NameStr; 1827 Mang->getNameWithPrefix(NameStr, GV, false); 1828 return OutContext.GetOrCreateSymbol(NameStr.str()); 1829} 1830 1831/// GetSymbolWithGlobalValueBase - Return the MCSymbol for a symbol with 1832/// global value name as its base, with the specified suffix, and where the 1833/// symbol is forced to have private linkage if ForcePrivate is true. 1834MCSymbol *AsmPrinter::GetSymbolWithGlobalValueBase(const GlobalValue *GV, 1835 StringRef Suffix, 1836 bool ForcePrivate) const { 1837 SmallString<60> NameStr; 1838 Mang->getNameWithPrefix(NameStr, GV, ForcePrivate); 1839 NameStr.append(Suffix.begin(), Suffix.end()); 1840 return OutContext.GetOrCreateSymbol(NameStr.str()); 1841} 1842 1843/// GetExternalSymbolSymbol - Return the MCSymbol for the specified 1844/// ExternalSymbol. 1845MCSymbol *AsmPrinter::GetExternalSymbolSymbol(StringRef Sym) const { 1846 SmallString<60> NameStr; 1847 Mang->getNameWithPrefix(NameStr, Sym); 1848 return OutContext.GetOrCreateSymbol(NameStr.str()); 1849} 1850 1851 1852/// EmitBasicBlockStart - This method prints the label for the specified 1853/// MachineBasicBlock, an alignment (if present) and a comment describing 1854/// it if appropriate. 1855void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const { 1856 // Emit an alignment directive for this block, if needed. 1857 if (unsigned Align = MBB->getAlignment()) 1858 EmitAlignment(Log2_32(Align)); 1859 1860 // If the block has its address taken, emit a special label to satisfy 1861 // references to the block. This is done so that we don't need to 1862 // remember the number of this label, and so that we can make 1863 // forward references to labels without knowing what their numbers 1864 // will be. 1865 if (MBB->hasAddressTaken()) { 1866 O << *GetBlockAddressSymbol(MBB->getBasicBlock()->getParent(), 1867 MBB->getBasicBlock()); 1868 O << ':'; 1869 if (VerboseAsm) { 1870 O.PadToColumn(MAI->getCommentColumn()); 1871 O << MAI->getCommentString() << " Address Taken"; 1872 } 1873 O << '\n'; 1874 } 1875 1876 // Print the main label for the block. 1877 if (MBB->pred_empty() || MBB->isOnlyReachableByFallthrough()) { 1878 if (VerboseAsm) 1879 O << MAI->getCommentString() << " BB#" << MBB->getNumber() << ':'; 1880 } else { 1881 O << *GetMBBSymbol(MBB->getNumber()) << ':'; 1882 if (!VerboseAsm) 1883 O << '\n'; 1884 } 1885 1886 // Print some comments to accompany the label. 1887 if (VerboseAsm) { 1888 if (const BasicBlock *BB = MBB->getBasicBlock()) 1889 if (BB->hasName()) { 1890 O.PadToColumn(MAI->getCommentColumn()); 1891 O << MAI->getCommentString() << ' '; 1892 WriteAsOperand(O, BB, /*PrintType=*/false); 1893 } 1894 1895 EmitComments(*MBB); 1896 O << '\n'; 1897 } 1898} 1899 1900/// printPICJumpTableSetLabel - This method prints a set label for the 1901/// specified MachineBasicBlock for a jumptable entry. 1902void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, 1903 const MachineBasicBlock *MBB) const { 1904 if (!MAI->getSetDirective()) 1905 return; 1906 1907 O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix() 1908 << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',' 1909 << *GetMBBSymbol(MBB->getNumber()) 1910 << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1911 << '_' << uid << '\n'; 1912} 1913 1914void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 1915 const MachineBasicBlock *MBB) const { 1916 if (!MAI->getSetDirective()) 1917 return; 1918 1919 O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix() 1920 << getFunctionNumber() << '_' << uid << '_' << uid2 1921 << "_set_" << MBB->getNumber() << ',' 1922 << *GetMBBSymbol(MBB->getNumber()) 1923 << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1924 << '_' << uid << '_' << uid2 << '\n'; 1925} 1926 1927/// printDataDirective - This method prints the asm directive for the 1928/// specified type. 1929void AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) { 1930 const TargetData *TD = TM.getTargetData(); 1931 switch (type->getTypeID()) { 1932 case Type::FloatTyID: case Type::DoubleTyID: 1933 case Type::X86_FP80TyID: case Type::FP128TyID: case Type::PPC_FP128TyID: 1934 assert(0 && "Should have already output floating point constant."); 1935 default: 1936 assert(0 && "Can't handle printing this type of thing"); 1937 case Type::IntegerTyID: { 1938 unsigned BitWidth = cast<IntegerType>(type)->getBitWidth(); 1939 if (BitWidth <= 8) 1940 O << MAI->getData8bitsDirective(AddrSpace); 1941 else if (BitWidth <= 16) 1942 O << MAI->getData16bitsDirective(AddrSpace); 1943 else if (BitWidth <= 32) 1944 O << MAI->getData32bitsDirective(AddrSpace); 1945 else if (BitWidth <= 64) { 1946 assert(MAI->getData64bitsDirective(AddrSpace) && 1947 "Target cannot handle 64-bit constant exprs!"); 1948 O << MAI->getData64bitsDirective(AddrSpace); 1949 } else { 1950 llvm_unreachable("Target cannot handle given data directive width!"); 1951 } 1952 break; 1953 } 1954 case Type::PointerTyID: 1955 if (TD->getPointerSize() == 8) { 1956 assert(MAI->getData64bitsDirective(AddrSpace) && 1957 "Target cannot handle 64-bit pointer exprs!"); 1958 O << MAI->getData64bitsDirective(AddrSpace); 1959 } else if (TD->getPointerSize() == 2) { 1960 O << MAI->getData16bitsDirective(AddrSpace); 1961 } else if (TD->getPointerSize() == 1) { 1962 O << MAI->getData8bitsDirective(AddrSpace); 1963 } else { 1964 O << MAI->getData32bitsDirective(AddrSpace); 1965 } 1966 break; 1967 } 1968} 1969 1970void AsmPrinter::printVisibility(const MCSymbol *Sym, 1971 unsigned Visibility) const { 1972 if (Visibility == GlobalValue::HiddenVisibility) { 1973 if (const char *Directive = MAI->getHiddenDirective()) 1974 O << Directive << *Sym << '\n'; 1975 } else if (Visibility == GlobalValue::ProtectedVisibility) { 1976 if (const char *Directive = MAI->getProtectedDirective()) 1977 O << Directive << *Sym << '\n'; 1978 } 1979} 1980 1981void AsmPrinter::printOffset(int64_t Offset) const { 1982 if (Offset > 0) 1983 O << '+' << Offset; 1984 else if (Offset < 0) 1985 O << Offset; 1986} 1987 1988GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) { 1989 if (!S->usesMetadata()) 1990 return 0; 1991 1992 gcp_iterator GCPI = GCMetadataPrinters.find(S); 1993 if (GCPI != GCMetadataPrinters.end()) 1994 return GCPI->second; 1995 1996 const char *Name = S->getName().c_str(); 1997 1998 for (GCMetadataPrinterRegistry::iterator 1999 I = GCMetadataPrinterRegistry::begin(), 2000 E = GCMetadataPrinterRegistry::end(); I != E; ++I) 2001 if (strcmp(Name, I->getName()) == 0) { 2002 GCMetadataPrinter *GMP = I->instantiate(); 2003 GMP->S = S; 2004 GCMetadataPrinters.insert(std::make_pair(S, GMP)); 2005 return GMP; 2006 } 2007 2008 errs() << "no GCMetadataPrinter registered for GC: " << Name << "\n"; 2009 llvm_unreachable(0); 2010} 2011 2012/// EmitComments - Pretty-print comments for instructions 2013void AsmPrinter::EmitComments(const MachineInstr &MI) const { 2014 if (!VerboseAsm) 2015 return; 2016 2017 bool Newline = false; 2018 2019 if (!MI.getDebugLoc().isUnknown()) { 2020 DILocation DLT = MF->getDILocation(MI.getDebugLoc()); 2021 2022 // Print source line info. 2023 O.PadToColumn(MAI->getCommentColumn()); 2024 O << MAI->getCommentString() << ' '; 2025 DIScope Scope = DLT.getScope(); 2026 // Omit the directory, because it's likely to be long and uninteresting. 2027 if (!Scope.isNull()) 2028 O << Scope.getFilename(); 2029 else 2030 O << "<unknown>"; 2031 O << ':' << DLT.getLineNumber(); 2032 if (DLT.getColumnNumber() != 0) 2033 O << ':' << DLT.getColumnNumber(); 2034 Newline = true; 2035 } 2036 2037 // Check for spills and reloads 2038 int FI; 2039 2040 const MachineFrameInfo *FrameInfo = 2041 MI.getParent()->getParent()->getFrameInfo(); 2042 2043 // We assume a single instruction only has a spill or reload, not 2044 // both. 2045 const MachineMemOperand *MMO; 2046 if (TM.getInstrInfo()->isLoadFromStackSlotPostFE(&MI, FI)) { 2047 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 2048 MMO = *MI.memoperands_begin(); 2049 if (Newline) O << '\n'; 2050 O.PadToColumn(MAI->getCommentColumn()); 2051 O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Reload"; 2052 Newline = true; 2053 } 2054 } 2055 else if (TM.getInstrInfo()->hasLoadFromStackSlot(&MI, MMO, FI)) { 2056 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 2057 if (Newline) O << '\n'; 2058 O.PadToColumn(MAI->getCommentColumn()); 2059 O << MAI->getCommentString() << ' ' 2060 << MMO->getSize() << "-byte Folded Reload"; 2061 Newline = true; 2062 } 2063 } 2064 else if (TM.getInstrInfo()->isStoreToStackSlotPostFE(&MI, FI)) { 2065 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 2066 MMO = *MI.memoperands_begin(); 2067 if (Newline) O << '\n'; 2068 O.PadToColumn(MAI->getCommentColumn()); 2069 O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Spill"; 2070 Newline = true; 2071 } 2072 } 2073 else if (TM.getInstrInfo()->hasStoreToStackSlot(&MI, MMO, FI)) { 2074 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 2075 if (Newline) O << '\n'; 2076 O.PadToColumn(MAI->getCommentColumn()); 2077 O << MAI->getCommentString() << ' ' 2078 << MMO->getSize() << "-byte Folded Spill"; 2079 Newline = true; 2080 } 2081 } 2082 2083 // Check for spill-induced copies 2084 unsigned SrcReg, DstReg, SrcSubIdx, DstSubIdx; 2085 if (TM.getInstrInfo()->isMoveInstr(MI, SrcReg, DstReg, 2086 SrcSubIdx, DstSubIdx)) { 2087 if (MI.getAsmPrinterFlag(ReloadReuse)) { 2088 if (Newline) O << '\n'; 2089 O.PadToColumn(MAI->getCommentColumn()); 2090 O << MAI->getCommentString() << " Reload Reuse"; 2091 } 2092 } 2093} 2094 2095/// PrintChildLoopComment - Print comments about child loops within 2096/// the loop for this basic block, with nesting. 2097/// 2098static void PrintChildLoopComment(formatted_raw_ostream &O, 2099 const MachineLoop *loop, 2100 const MCAsmInfo *MAI, 2101 int FunctionNumber) { 2102 // Add child loop information 2103 for(MachineLoop::iterator cl = loop->begin(), 2104 clend = loop->end(); 2105 cl != clend; 2106 ++cl) { 2107 MachineBasicBlock *Header = (*cl)->getHeader(); 2108 assert(Header && "No header for loop"); 2109 2110 O << '\n'; 2111 O.PadToColumn(MAI->getCommentColumn()); 2112 2113 O << MAI->getCommentString(); 2114 O.indent(((*cl)->getLoopDepth()-1)*2) 2115 << " Child Loop BB" << FunctionNumber << "_" 2116 << Header->getNumber() << " Depth " << (*cl)->getLoopDepth(); 2117 2118 PrintChildLoopComment(O, *cl, MAI, FunctionNumber); 2119 } 2120} 2121 2122/// EmitComments - Pretty-print comments for basic blocks 2123void AsmPrinter::EmitComments(const MachineBasicBlock &MBB) const { 2124 if (VerboseAsm) { 2125 // Add loop depth information 2126 const MachineLoop *loop = LI->getLoopFor(&MBB); 2127 2128 if (loop) { 2129 // Print a newline after bb# annotation. 2130 O << "\n"; 2131 O.PadToColumn(MAI->getCommentColumn()); 2132 O << MAI->getCommentString() << " Loop Depth " << loop->getLoopDepth() 2133 << '\n'; 2134 2135 O.PadToColumn(MAI->getCommentColumn()); 2136 2137 MachineBasicBlock *Header = loop->getHeader(); 2138 assert(Header && "No header for loop"); 2139 2140 if (Header == &MBB) { 2141 O << MAI->getCommentString() << " Loop Header"; 2142 PrintChildLoopComment(O, loop, MAI, getFunctionNumber()); 2143 } 2144 else { 2145 O << MAI->getCommentString() << " Loop Header is BB" 2146 << getFunctionNumber() << "_" << loop->getHeader()->getNumber(); 2147 } 2148 2149 if (loop->empty()) { 2150 O << '\n'; 2151 O.PadToColumn(MAI->getCommentColumn()); 2152 O << MAI->getCommentString() << " Inner Loop"; 2153 } 2154 2155 // Add parent loop information 2156 for (const MachineLoop *CurLoop = loop->getParentLoop(); 2157 CurLoop; 2158 CurLoop = CurLoop->getParentLoop()) { 2159 MachineBasicBlock *Header = CurLoop->getHeader(); 2160 assert(Header && "No header for loop"); 2161 2162 O << '\n'; 2163 O.PadToColumn(MAI->getCommentColumn()); 2164 O << MAI->getCommentString(); 2165 O.indent((CurLoop->getLoopDepth()-1)*2) 2166 << " Inside Loop BB" << getFunctionNumber() << "_" 2167 << Header->getNumber() << " Depth " << CurLoop->getLoopDepth(); 2168 } 2169 } 2170 } 2171} 2172