AsmPrinter.cpp revision 21e42d0ea55c31ac4d57578f5116fa606d5c87ee
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 "DwarfDebug.h" 17#include "DwarfException.h" 18#include "llvm/Module.h" 19#include "llvm/CodeGen/GCMetadataPrinter.h" 20#include "llvm/CodeGen/MachineConstantPool.h" 21#include "llvm/CodeGen/MachineFrameInfo.h" 22#include "llvm/CodeGen/MachineFunction.h" 23#include "llvm/CodeGen/MachineJumpTableInfo.h" 24#include "llvm/CodeGen/MachineLoopInfo.h" 25#include "llvm/CodeGen/MachineModuleInfo.h" 26#include "llvm/Analysis/ConstantFolding.h" 27#include "llvm/Analysis/DebugInfo.h" 28#include "llvm/MC/MCAsmInfo.h" 29#include "llvm/MC/MCContext.h" 30#include "llvm/MC/MCExpr.h" 31#include "llvm/MC/MCInst.h" 32#include "llvm/MC/MCSection.h" 33#include "llvm/MC/MCStreamer.h" 34#include "llvm/MC/MCSymbol.h" 35#include "llvm/Target/Mangler.h" 36#include "llvm/Target/TargetData.h" 37#include "llvm/Target/TargetInstrInfo.h" 38#include "llvm/Target/TargetLowering.h" 39#include "llvm/Target/TargetLoweringObjectFile.h" 40#include "llvm/Target/TargetOptions.h" 41#include "llvm/Target/TargetRegisterInfo.h" 42#include "llvm/Assembly/Writer.h" 43#include "llvm/ADT/SmallString.h" 44#include "llvm/ADT/Statistic.h" 45#include "llvm/Support/ErrorHandling.h" 46#include "llvm/Support/Format.h" 47#include "llvm/Support/MathExtras.h" 48#include "llvm/Support/Timer.h" 49using namespace llvm; 50 51static const char *DWARFGroupName = "DWARF Emission"; 52static const char *DbgTimerName = "DWARF Debug Writer"; 53static const char *EHTimerName = "DWARF Exception Writer"; 54 55STATISTIC(EmittedInsts, "Number of machine instrs printed"); 56 57char AsmPrinter::ID = 0; 58 59typedef DenseMap<GCStrategy*,GCMetadataPrinter*> gcp_map_type; 60static gcp_map_type &getGCMap(void *&P) { 61 if (P == 0) 62 P = new gcp_map_type(); 63 return *(gcp_map_type*)P; 64} 65 66 67/// getGVAlignmentLog2 - Return the alignment to use for the specified global 68/// value in log2 form. This rounds up to the preferred alignment if possible 69/// and legal. 70static unsigned getGVAlignmentLog2(const GlobalValue *GV, const TargetData &TD, 71 unsigned InBits = 0) { 72 unsigned NumBits = 0; 73 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) 74 NumBits = TD.getPreferredAlignmentLog(GVar); 75 76 // If InBits is specified, round it to it. 77 if (InBits > NumBits) 78 NumBits = InBits; 79 80 // If the GV has a specified alignment, take it into account. 81 if (GV->getAlignment() == 0) 82 return NumBits; 83 84 unsigned GVAlign = Log2_32(GV->getAlignment()); 85 86 // If the GVAlign is larger than NumBits, or if we are required to obey 87 // NumBits because the GV has an assigned section, obey it. 88 if (GVAlign > NumBits || GV->hasSection()) 89 NumBits = GVAlign; 90 return NumBits; 91} 92 93 94 95 96AsmPrinter::AsmPrinter(TargetMachine &tm, MCStreamer &Streamer) 97 : MachineFunctionPass(ID), 98 TM(tm), MAI(tm.getMCAsmInfo()), 99 OutContext(Streamer.getContext()), 100 OutStreamer(Streamer), 101 LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) { 102 DD = 0; DE = 0; MMI = 0; LI = 0; 103 CurrentFnSym = CurrentFnSymForSize = 0; 104 GCMetadataPrinters = 0; 105 VerboseAsm = Streamer.isVerboseAsm(); 106} 107 108AsmPrinter::~AsmPrinter() { 109 assert(DD == 0 && DE == 0 && "Debug/EH info didn't get finalized"); 110 111 if (GCMetadataPrinters != 0) { 112 gcp_map_type &GCMap = getGCMap(GCMetadataPrinters); 113 114 for (gcp_map_type::iterator I = GCMap.begin(), E = GCMap.end(); I != E; ++I) 115 delete I->second; 116 delete &GCMap; 117 GCMetadataPrinters = 0; 118 } 119 120 delete &OutStreamer; 121} 122 123/// getFunctionNumber - Return a unique ID for the current function. 124/// 125unsigned AsmPrinter::getFunctionNumber() const { 126 return MF->getFunctionNumber(); 127} 128 129const TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const { 130 return TM.getTargetLowering()->getObjFileLowering(); 131} 132 133 134/// getTargetData - Return information about data layout. 135const TargetData &AsmPrinter::getTargetData() const { 136 return *TM.getTargetData(); 137} 138 139/// getCurrentSection() - Return the current section we are emitting to. 140const MCSection *AsmPrinter::getCurrentSection() const { 141 return OutStreamer.getCurrentSection(); 142} 143 144 145 146void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { 147 AU.setPreservesAll(); 148 MachineFunctionPass::getAnalysisUsage(AU); 149 AU.addRequired<MachineModuleInfo>(); 150 AU.addRequired<GCModuleInfo>(); 151 if (isVerbose()) 152 AU.addRequired<MachineLoopInfo>(); 153} 154 155bool AsmPrinter::doInitialization(Module &M) { 156 MMI = getAnalysisIfAvailable<MachineModuleInfo>(); 157 MMI->AnalyzeModule(M); 158 159 // Initialize TargetLoweringObjectFile. 160 const_cast<TargetLoweringObjectFile&>(getObjFileLowering()) 161 .Initialize(OutContext, TM); 162 163 Mang = new Mangler(OutContext, *TM.getTargetData()); 164 165 // Allow the target to emit any magic that it wants at the start of the file. 166 EmitStartOfAsmFile(M); 167 168 // Very minimal debug info. It is ignored if we emit actual debug info. If we 169 // don't, this at least helps the user find where a global came from. 170 if (MAI->hasSingleParameterDotFile()) { 171 // .file "foo.c" 172 OutStreamer.EmitFileDirective(M.getModuleIdentifier()); 173 } 174 175 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 176 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 177 for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I) 178 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) 179 MP->beginAssembly(*this); 180 181 // Emit module-level inline asm if it exists. 182 if (!M.getModuleInlineAsm().empty()) { 183 OutStreamer.AddComment("Start of file scope inline assembly"); 184 OutStreamer.AddBlankLine(); 185 EmitInlineAsm(M.getModuleInlineAsm()+"\n"); 186 OutStreamer.AddComment("End of file scope inline assembly"); 187 OutStreamer.AddBlankLine(); 188 } 189 190 if (MAI->doesSupportDebugInformation()) 191 DD = new DwarfDebug(this, &M); 192 193 switch (MAI->getExceptionHandlingType()) { 194 case ExceptionHandling::None: 195 return false; 196 case ExceptionHandling::SjLj: 197 case ExceptionHandling::DwarfCFI: 198 DE = new DwarfCFIException(this); 199 return false; 200 case ExceptionHandling::ARM: 201 DE = new ARMException(this); 202 return false; 203 case ExceptionHandling::Win64: 204 DE = new Win64Exception(this); 205 return false; 206 } 207 208 llvm_unreachable("Unknown exception type."); 209} 210 211void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const { 212 switch ((GlobalValue::LinkageTypes)Linkage) { 213 case GlobalValue::CommonLinkage: 214 case GlobalValue::LinkOnceAnyLinkage: 215 case GlobalValue::LinkOnceODRLinkage: 216 case GlobalValue::WeakAnyLinkage: 217 case GlobalValue::WeakODRLinkage: 218 case GlobalValue::LinkerPrivateWeakLinkage: 219 case GlobalValue::LinkerPrivateWeakDefAutoLinkage: 220 if (MAI->getWeakDefDirective() != 0) { 221 // .globl _foo 222 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 223 224 if ((GlobalValue::LinkageTypes)Linkage != 225 GlobalValue::LinkerPrivateWeakDefAutoLinkage) 226 // .weak_definition _foo 227 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition); 228 else 229 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate); 230 } else if (MAI->getLinkOnceDirective() != 0) { 231 // .globl _foo 232 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 233 //NOTE: linkonce is handled by the section the symbol was assigned to. 234 } else { 235 // .weak _foo 236 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Weak); 237 } 238 break; 239 case GlobalValue::DLLExportLinkage: 240 case GlobalValue::AppendingLinkage: 241 // FIXME: appending linkage variables should go into a section of 242 // their name or something. For now, just emit them as external. 243 case GlobalValue::ExternalLinkage: 244 // If external or appending, declare as a global symbol. 245 // .globl _foo 246 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 247 break; 248 case GlobalValue::PrivateLinkage: 249 case GlobalValue::InternalLinkage: 250 case GlobalValue::LinkerPrivateLinkage: 251 break; 252 default: 253 llvm_unreachable("Unknown linkage type!"); 254 } 255} 256 257 258/// EmitGlobalVariable - Emit the specified global variable to the .s file. 259void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { 260 if (GV->hasInitializer()) { 261 // Check to see if this is a special global used by LLVM, if so, emit it. 262 if (EmitSpecialLLVMGlobal(GV)) 263 return; 264 265 if (isVerbose()) { 266 WriteAsOperand(OutStreamer.GetCommentOS(), GV, 267 /*PrintType=*/false, GV->getParent()); 268 OutStreamer.GetCommentOS() << '\n'; 269 } 270 } 271 272 MCSymbol *GVSym = Mang->getSymbol(GV); 273 EmitVisibility(GVSym, GV->getVisibility(), !GV->isDeclaration()); 274 275 if (!GV->hasInitializer()) // External globals require no extra code. 276 return; 277 278 if (MAI->hasDotTypeDotSizeDirective()) 279 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_ELF_TypeObject); 280 281 SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM); 282 283 const TargetData *TD = TM.getTargetData(); 284 uint64_t Size = TD->getTypeAllocSize(GV->getType()->getElementType()); 285 286 // If the alignment is specified, we *must* obey it. Overaligning a global 287 // with a specified alignment is a prompt way to break globals emitted to 288 // sections and expected to be contiguous (e.g. ObjC metadata). 289 unsigned AlignLog = getGVAlignmentLog2(GV, *TD); 290 291 // Handle common and BSS local symbols (.lcomm). 292 if (GVKind.isCommon() || GVKind.isBSSLocal()) { 293 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. 294 unsigned Align = 1 << AlignLog; 295 296 // Handle common symbols. 297 if (GVKind.isCommon()) { 298 if (!getObjFileLowering().getCommDirectiveSupportsAlignment()) 299 Align = 0; 300 301 // .comm _foo, 42, 4 302 OutStreamer.EmitCommonSymbol(GVSym, Size, Align); 303 return; 304 } 305 306 // Handle local BSS symbols. 307 if (MAI->hasMachoZeroFillDirective()) { 308 const MCSection *TheSection = 309 getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM); 310 // .zerofill __DATA, __bss, _foo, 400, 5 311 OutStreamer.EmitZerofill(TheSection, GVSym, Size, Align); 312 return; 313 } 314 315 if (MAI->getLCOMMDirectiveType() != LCOMM::None && 316 (MAI->getLCOMMDirectiveType() != LCOMM::NoAlignment || Align == 1)) { 317 // .lcomm _foo, 42 318 OutStreamer.EmitLocalCommonSymbol(GVSym, Size, Align); 319 return; 320 } 321 322 if (!getObjFileLowering().getCommDirectiveSupportsAlignment()) 323 Align = 0; 324 325 // .local _foo 326 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Local); 327 // .comm _foo, 42, 4 328 OutStreamer.EmitCommonSymbol(GVSym, Size, Align); 329 return; 330 } 331 332 const MCSection *TheSection = 333 getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM); 334 335 // Handle the zerofill directive on darwin, which is a special form of BSS 336 // emission. 337 if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) { 338 if (Size == 0) Size = 1; // zerofill of 0 bytes is undefined. 339 340 // .globl _foo 341 OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global); 342 // .zerofill __DATA, __common, _foo, 400, 5 343 OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog); 344 return; 345 } 346 347 // Handle thread local data for mach-o which requires us to output an 348 // additional structure of data and mangle the original symbol so that we 349 // can reference it later. 350 // 351 // TODO: This should become an "emit thread local global" method on TLOF. 352 // All of this macho specific stuff should be sunk down into TLOFMachO and 353 // stuff like "TLSExtraDataSection" should no longer be part of the parent 354 // TLOF class. This will also make it more obvious that stuff like 355 // MCStreamer::EmitTBSSSymbol is macho specific and only called from macho 356 // specific code. 357 if (GVKind.isThreadLocal() && MAI->hasMachoTBSSDirective()) { 358 // Emit the .tbss symbol 359 MCSymbol *MangSym = 360 OutContext.GetOrCreateSymbol(GVSym->getName() + Twine("$tlv$init")); 361 362 if (GVKind.isThreadBSS()) 363 OutStreamer.EmitTBSSSymbol(TheSection, MangSym, Size, 1 << AlignLog); 364 else if (GVKind.isThreadData()) { 365 OutStreamer.SwitchSection(TheSection); 366 367 EmitAlignment(AlignLog, GV); 368 OutStreamer.EmitLabel(MangSym); 369 370 EmitGlobalConstant(GV->getInitializer()); 371 } 372 373 OutStreamer.AddBlankLine(); 374 375 // Emit the variable struct for the runtime. 376 const MCSection *TLVSect 377 = getObjFileLowering().getTLSExtraDataSection(); 378 379 OutStreamer.SwitchSection(TLVSect); 380 // Emit the linkage here. 381 EmitLinkage(GV->getLinkage(), GVSym); 382 OutStreamer.EmitLabel(GVSym); 383 384 // Three pointers in size: 385 // - __tlv_bootstrap - used to make sure support exists 386 // - spare pointer, used when mapped by the runtime 387 // - pointer to mangled symbol above with initializer 388 unsigned PtrSize = TD->getPointerSizeInBits()/8; 389 OutStreamer.EmitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"), 390 PtrSize, 0); 391 OutStreamer.EmitIntValue(0, PtrSize, 0); 392 OutStreamer.EmitSymbolValue(MangSym, PtrSize, 0); 393 394 OutStreamer.AddBlankLine(); 395 return; 396 } 397 398 OutStreamer.SwitchSection(TheSection); 399 400 EmitLinkage(GV->getLinkage(), GVSym); 401 EmitAlignment(AlignLog, GV); 402 403 OutStreamer.EmitLabel(GVSym); 404 405 EmitGlobalConstant(GV->getInitializer()); 406 407 if (MAI->hasDotTypeDotSizeDirective()) 408 // .size foo, 42 409 OutStreamer.EmitELFSize(GVSym, MCConstantExpr::Create(Size, OutContext)); 410 411 OutStreamer.AddBlankLine(); 412} 413 414/// EmitFunctionHeader - This method emits the header for the current 415/// function. 416void AsmPrinter::EmitFunctionHeader() { 417 // Print out constants referenced by the function 418 EmitConstantPool(); 419 420 // Print the 'header' of function. 421 const Function *F = MF->getFunction(); 422 423 OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM)); 424 EmitVisibility(CurrentFnSym, F->getVisibility()); 425 426 EmitLinkage(F->getLinkage(), CurrentFnSym); 427 EmitAlignment(MF->getAlignment(), F); 428 429 if (MAI->hasDotTypeDotSizeDirective()) 430 OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction); 431 432 if (isVerbose()) { 433 WriteAsOperand(OutStreamer.GetCommentOS(), F, 434 /*PrintType=*/false, F->getParent()); 435 OutStreamer.GetCommentOS() << '\n'; 436 } 437 438 // Emit the CurrentFnSym. This is a virtual function to allow targets to 439 // do their wild and crazy things as required. 440 EmitFunctionEntryLabel(); 441 442 // If the function had address-taken blocks that got deleted, then we have 443 // references to the dangling symbols. Emit them at the start of the function 444 // so that we don't get references to undefined symbols. 445 std::vector<MCSymbol*> DeadBlockSyms; 446 MMI->takeDeletedSymbolsForFunction(F, DeadBlockSyms); 447 for (unsigned i = 0, e = DeadBlockSyms.size(); i != e; ++i) { 448 OutStreamer.AddComment("Address taken block that was later removed"); 449 OutStreamer.EmitLabel(DeadBlockSyms[i]); 450 } 451 452 // Add some workaround for linkonce linkage on Cygwin\MinGW. 453 if (MAI->getLinkOnceDirective() != 0 && 454 (F->hasLinkOnceLinkage() || F->hasWeakLinkage())) { 455 // FIXME: What is this? 456 MCSymbol *FakeStub = 457 OutContext.GetOrCreateSymbol(Twine("Lllvm$workaround$fake$stub$")+ 458 CurrentFnSym->getName()); 459 OutStreamer.EmitLabel(FakeStub); 460 } 461 462 // Emit pre-function debug and/or EH information. 463 if (DE) { 464 NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled); 465 DE->BeginFunction(MF); 466 } 467 if (DD) { 468 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 469 DD->beginFunction(MF); 470 } 471} 472 473/// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the 474/// function. This can be overridden by targets as required to do custom stuff. 475void AsmPrinter::EmitFunctionEntryLabel() { 476 // The function label could have already been emitted if two symbols end up 477 // conflicting due to asm renaming. Detect this and emit an error. 478 if (CurrentFnSym->isUndefined()) { 479 OutStreamer.ForceCodeRegion(); 480 return OutStreamer.EmitLabel(CurrentFnSym); 481 } 482 483 report_fatal_error("'" + Twine(CurrentFnSym->getName()) + 484 "' label emitted multiple times to assembly file"); 485} 486 487 488/// EmitComments - Pretty-print comments for instructions. 489static void EmitComments(const MachineInstr &MI, raw_ostream &CommentOS) { 490 const MachineFunction *MF = MI.getParent()->getParent(); 491 const TargetMachine &TM = MF->getTarget(); 492 493 // Check for spills and reloads 494 int FI; 495 496 const MachineFrameInfo *FrameInfo = MF->getFrameInfo(); 497 498 // We assume a single instruction only has a spill or reload, not 499 // both. 500 const MachineMemOperand *MMO; 501 if (TM.getInstrInfo()->isLoadFromStackSlotPostFE(&MI, FI)) { 502 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 503 MMO = *MI.memoperands_begin(); 504 CommentOS << MMO->getSize() << "-byte Reload\n"; 505 } 506 } else if (TM.getInstrInfo()->hasLoadFromStackSlot(&MI, MMO, FI)) { 507 if (FrameInfo->isSpillSlotObjectIndex(FI)) 508 CommentOS << MMO->getSize() << "-byte Folded Reload\n"; 509 } else if (TM.getInstrInfo()->isStoreToStackSlotPostFE(&MI, FI)) { 510 if (FrameInfo->isSpillSlotObjectIndex(FI)) { 511 MMO = *MI.memoperands_begin(); 512 CommentOS << MMO->getSize() << "-byte Spill\n"; 513 } 514 } else if (TM.getInstrInfo()->hasStoreToStackSlot(&MI, MMO, FI)) { 515 if (FrameInfo->isSpillSlotObjectIndex(FI)) 516 CommentOS << MMO->getSize() << "-byte Folded Spill\n"; 517 } 518 519 // Check for spill-induced copies 520 if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse)) 521 CommentOS << " Reload Reuse\n"; 522} 523 524/// EmitImplicitDef - This method emits the specified machine instruction 525/// that is an implicit def. 526static void EmitImplicitDef(const MachineInstr *MI, AsmPrinter &AP) { 527 unsigned RegNo = MI->getOperand(0).getReg(); 528 AP.OutStreamer.AddComment(Twine("implicit-def: ") + 529 AP.TM.getRegisterInfo()->getName(RegNo)); 530 AP.OutStreamer.AddBlankLine(); 531} 532 533static void EmitKill(const MachineInstr *MI, AsmPrinter &AP) { 534 std::string Str = "kill:"; 535 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 536 const MachineOperand &Op = MI->getOperand(i); 537 assert(Op.isReg() && "KILL instruction must have only register operands"); 538 Str += ' '; 539 Str += AP.TM.getRegisterInfo()->getName(Op.getReg()); 540 Str += (Op.isDef() ? "<def>" : "<kill>"); 541 } 542 AP.OutStreamer.AddComment(Str); 543 AP.OutStreamer.AddBlankLine(); 544} 545 546/// EmitDebugValueComment - This method handles the target-independent form 547/// of DBG_VALUE, returning true if it was able to do so. A false return 548/// means the target will need to handle MI in EmitInstruction. 549static bool EmitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) { 550 // This code handles only the 3-operand target-independent form. 551 if (MI->getNumOperands() != 3) 552 return false; 553 554 SmallString<128> Str; 555 raw_svector_ostream OS(Str); 556 OS << '\t' << AP.MAI->getCommentString() << "DEBUG_VALUE: "; 557 558 // cast away const; DIetc do not take const operands for some reason. 559 DIVariable V(const_cast<MDNode*>(MI->getOperand(2).getMetadata())); 560 if (V.getContext().isSubprogram()) 561 OS << DISubprogram(V.getContext()).getDisplayName() << ":"; 562 OS << V.getName() << " <- "; 563 564 // Register or immediate value. Register 0 means undef. 565 if (MI->getOperand(0).isFPImm()) { 566 APFloat APF = APFloat(MI->getOperand(0).getFPImm()->getValueAPF()); 567 if (MI->getOperand(0).getFPImm()->getType()->isFloatTy()) { 568 OS << (double)APF.convertToFloat(); 569 } else if (MI->getOperand(0).getFPImm()->getType()->isDoubleTy()) { 570 OS << APF.convertToDouble(); 571 } else { 572 // There is no good way to print long double. Convert a copy to 573 // double. Ah well, it's only a comment. 574 bool ignored; 575 APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, 576 &ignored); 577 OS << "(long double) " << APF.convertToDouble(); 578 } 579 } else if (MI->getOperand(0).isImm()) { 580 OS << MI->getOperand(0).getImm(); 581 } else if (MI->getOperand(0).isCImm()) { 582 MI->getOperand(0).getCImm()->getValue().print(OS, false /*isSigned*/); 583 } else { 584 assert(MI->getOperand(0).isReg() && "Unknown operand type"); 585 if (MI->getOperand(0).getReg() == 0) { 586 // Suppress offset, it is not meaningful here. 587 OS << "undef"; 588 // NOTE: Want this comment at start of line, don't emit with AddComment. 589 AP.OutStreamer.EmitRawText(OS.str()); 590 return true; 591 } 592 OS << AP.TM.getRegisterInfo()->getName(MI->getOperand(0).getReg()); 593 } 594 595 OS << '+' << MI->getOperand(1).getImm(); 596 // NOTE: Want this comment at start of line, don't emit with AddComment. 597 AP.OutStreamer.EmitRawText(OS.str()); 598 return true; 599} 600 601AsmPrinter::CFIMoveType AsmPrinter::needsCFIMoves() { 602 if (MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI && 603 MF->getFunction()->needsUnwindTableEntry()) 604 return CFI_M_EH; 605 606 if (MMI->hasDebugInfo()) 607 return CFI_M_Debug; 608 609 return CFI_M_None; 610} 611 612bool AsmPrinter::needsSEHMoves() { 613 return MAI->getExceptionHandlingType() == ExceptionHandling::Win64 && 614 MF->getFunction()->needsUnwindTableEntry(); 615} 616 617bool AsmPrinter::needsRelocationsForDwarfStringPool() const { 618 return MAI->doesDwarfUseRelocationsForStringPool(); 619} 620 621void AsmPrinter::emitPrologLabel(const MachineInstr &MI) { 622 MCSymbol *Label = MI.getOperand(0).getMCSymbol(); 623 624 if (MAI->getExceptionHandlingType() != ExceptionHandling::DwarfCFI) 625 return; 626 627 if (needsCFIMoves() == CFI_M_None) 628 return; 629 630 if (MMI->getCompactUnwindEncoding() != 0) 631 OutStreamer.EmitCompactUnwindEncoding(MMI->getCompactUnwindEncoding()); 632 633 MachineModuleInfo &MMI = MF->getMMI(); 634 std::vector<MachineMove> &Moves = MMI.getFrameMoves(); 635 bool FoundOne = false; 636 (void)FoundOne; 637 for (std::vector<MachineMove>::iterator I = Moves.begin(), 638 E = Moves.end(); I != E; ++I) { 639 if (I->getLabel() == Label) { 640 EmitCFIFrameMove(*I); 641 FoundOne = true; 642 } 643 } 644 assert(FoundOne); 645} 646 647/// EmitFunctionBody - This method emits the body and trailer for a 648/// function. 649void AsmPrinter::EmitFunctionBody() { 650 // Emit target-specific gunk before the function body. 651 EmitFunctionBodyStart(); 652 653 bool ShouldPrintDebugScopes = DD && MMI->hasDebugInfo(); 654 655 // Print out code for the function. 656 bool HasAnyRealCode = false; 657 const MachineInstr *LastMI = 0; 658 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); 659 I != E; ++I) { 660 // Print a label for the basic block. 661 EmitBasicBlockStart(I); 662 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end(); 663 II != IE; ++II) { 664 LastMI = II; 665 666 // Print the assembly for the instruction. 667 if (!II->isLabel() && !II->isImplicitDef() && !II->isKill() && 668 !II->isDebugValue()) { 669 HasAnyRealCode = true; 670 ++EmittedInsts; 671 } 672 673 if (ShouldPrintDebugScopes) { 674 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 675 DD->beginInstruction(II); 676 } 677 678 if (isVerbose()) 679 EmitComments(*II, OutStreamer.GetCommentOS()); 680 681 switch (II->getOpcode()) { 682 case TargetOpcode::PROLOG_LABEL: 683 emitPrologLabel(*II); 684 break; 685 686 case TargetOpcode::EH_LABEL: 687 case TargetOpcode::GC_LABEL: 688 OutStreamer.EmitLabel(II->getOperand(0).getMCSymbol()); 689 break; 690 case TargetOpcode::INLINEASM: 691 EmitInlineAsm(II); 692 break; 693 case TargetOpcode::DBG_VALUE: 694 if (isVerbose()) { 695 if (!EmitDebugValueComment(II, *this)) 696 EmitInstruction(II); 697 } 698 break; 699 case TargetOpcode::IMPLICIT_DEF: 700 if (isVerbose()) EmitImplicitDef(II, *this); 701 break; 702 case TargetOpcode::KILL: 703 if (isVerbose()) EmitKill(II, *this); 704 break; 705 default: 706 if (!TM.hasMCUseLoc()) 707 MCLineEntry::Make(&OutStreamer, getCurrentSection()); 708 709 EmitInstruction(II); 710 break; 711 } 712 713 if (ShouldPrintDebugScopes) { 714 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 715 DD->endInstruction(II); 716 } 717 } 718 } 719 720 // If the last instruction was a prolog label, then we have a situation where 721 // we emitted a prolog but no function body. This results in the ending prolog 722 // label equaling the end of function label and an invalid "row" in the 723 // FDE. We need to emit a noop in this situation so that the FDE's rows are 724 // valid. 725 bool RequiresNoop = LastMI && LastMI->isPrologLabel(); 726 727 // If the function is empty and the object file uses .subsections_via_symbols, 728 // then we need to emit *something* to the function body to prevent the 729 // labels from collapsing together. Just emit a noop. 730 if ((MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) || RequiresNoop) { 731 MCInst Noop; 732 TM.getInstrInfo()->getNoopForMachoTarget(Noop); 733 if (Noop.getOpcode()) { 734 OutStreamer.AddComment("avoids zero-length function"); 735 OutStreamer.EmitInstruction(Noop); 736 } else // Target not mc-ized yet. 737 OutStreamer.EmitRawText(StringRef("\tnop\n")); 738 } 739 740 const Function *F = MF->getFunction(); 741 for (Function::const_iterator i = F->begin(), e = F->end(); i != e; ++i) { 742 const BasicBlock *BB = i; 743 if (!BB->hasAddressTaken()) 744 continue; 745 MCSymbol *Sym = GetBlockAddressSymbol(BB); 746 if (Sym->isDefined()) 747 continue; 748 OutStreamer.AddComment("Address of block that was removed by CodeGen"); 749 OutStreamer.EmitLabel(Sym); 750 } 751 752 // Emit target-specific gunk after the function body. 753 EmitFunctionBodyEnd(); 754 755 // If the target wants a .size directive for the size of the function, emit 756 // it. 757 if (MAI->hasDotTypeDotSizeDirective()) { 758 // Create a symbol for the end of function, so we can get the size as 759 // difference between the function label and the temp label. 760 MCSymbol *FnEndLabel = OutContext.CreateTempSymbol(); 761 OutStreamer.EmitLabel(FnEndLabel); 762 763 const MCExpr *SizeExp = 764 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel, OutContext), 765 MCSymbolRefExpr::Create(CurrentFnSymForSize, 766 OutContext), 767 OutContext); 768 OutStreamer.EmitELFSize(CurrentFnSym, SizeExp); 769 } 770 771 // Emit post-function debug information. 772 if (DD) { 773 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 774 DD->endFunction(MF); 775 } 776 if (DE) { 777 NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled); 778 DE->EndFunction(); 779 } 780 MMI->EndFunction(); 781 782 // Print out jump tables referenced by the function. 783 EmitJumpTableInfo(); 784 785 OutStreamer.AddBlankLine(); 786} 787 788/// getDebugValueLocation - Get location information encoded by DBG_VALUE 789/// operands. 790MachineLocation AsmPrinter:: 791getDebugValueLocation(const MachineInstr *MI) const { 792 // Target specific DBG_VALUE instructions are handled by each target. 793 return MachineLocation(); 794} 795 796/// EmitDwarfRegOp - Emit dwarf register operation. 797void AsmPrinter::EmitDwarfRegOp(const MachineLocation &MLoc) const { 798 const TargetRegisterInfo *TRI = TM.getRegisterInfo(); 799 int Reg = TRI->getDwarfRegNum(MLoc.getReg(), false); 800 801 for (const uint16_t *SR = TRI->getSuperRegisters(MLoc.getReg()); 802 *SR && Reg < 0; ++SR) { 803 Reg = TRI->getDwarfRegNum(*SR, false); 804 // FIXME: Get the bit range this register uses of the superregister 805 // so that we can produce a DW_OP_bit_piece 806 } 807 808 // FIXME: Handle cases like a super register being encoded as 809 // DW_OP_reg 32 DW_OP_piece 4 DW_OP_reg 33 810 811 // FIXME: We have no reasonable way of handling errors in here. The 812 // caller might be in the middle of an dwarf expression. We should 813 // probably assert that Reg >= 0 once debug info generation is more mature. 814 815 if (int Offset = MLoc.getOffset()) { 816 if (Reg < 32) { 817 OutStreamer.AddComment( 818 dwarf::OperationEncodingString(dwarf::DW_OP_breg0 + Reg)); 819 EmitInt8(dwarf::DW_OP_breg0 + Reg); 820 } else { 821 OutStreamer.AddComment("DW_OP_bregx"); 822 EmitInt8(dwarf::DW_OP_bregx); 823 OutStreamer.AddComment(Twine(Reg)); 824 EmitULEB128(Reg); 825 } 826 EmitSLEB128(Offset); 827 } else { 828 if (Reg < 32) { 829 OutStreamer.AddComment( 830 dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg)); 831 EmitInt8(dwarf::DW_OP_reg0 + Reg); 832 } else { 833 OutStreamer.AddComment("DW_OP_regx"); 834 EmitInt8(dwarf::DW_OP_regx); 835 OutStreamer.AddComment(Twine(Reg)); 836 EmitULEB128(Reg); 837 } 838 } 839 840 // FIXME: Produce a DW_OP_bit_piece if we used a superregister 841} 842 843bool AsmPrinter::doFinalization(Module &M) { 844 // Emit global variables. 845 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 846 I != E; ++I) 847 EmitGlobalVariable(I); 848 849 // Emit visibility info for declarations 850 for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { 851 const Function &F = *I; 852 if (!F.isDeclaration()) 853 continue; 854 GlobalValue::VisibilityTypes V = F.getVisibility(); 855 if (V == GlobalValue::DefaultVisibility) 856 continue; 857 858 MCSymbol *Name = Mang->getSymbol(&F); 859 EmitVisibility(Name, V, false); 860 } 861 862 // Emit module flags. 863 SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags; 864 M.getModuleFlagsMetadata(ModuleFlags); 865 if (!ModuleFlags.empty()) 866 getObjFileLowering().emitModuleFlags(OutStreamer, ModuleFlags, Mang, TM); 867 868 // Finalize debug and EH information. 869 if (DE) { 870 { 871 NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled); 872 DE->EndModule(); 873 } 874 delete DE; DE = 0; 875 } 876 if (DD) { 877 { 878 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 879 DD->endModule(); 880 } 881 delete DD; DD = 0; 882 } 883 884 // If the target wants to know about weak references, print them all. 885 if (MAI->getWeakRefDirective()) { 886 // FIXME: This is not lazy, it would be nice to only print weak references 887 // to stuff that is actually used. Note that doing so would require targets 888 // to notice uses in operands (due to constant exprs etc). This should 889 // happen with the MC stuff eventually. 890 891 // Print out module-level global variables here. 892 for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 893 I != E; ++I) { 894 if (!I->hasExternalWeakLinkage()) continue; 895 OutStreamer.EmitSymbolAttribute(Mang->getSymbol(I), MCSA_WeakReference); 896 } 897 898 for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { 899 if (!I->hasExternalWeakLinkage()) continue; 900 OutStreamer.EmitSymbolAttribute(Mang->getSymbol(I), MCSA_WeakReference); 901 } 902 } 903 904 if (MAI->hasSetDirective()) { 905 OutStreamer.AddBlankLine(); 906 for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); 907 I != E; ++I) { 908 MCSymbol *Name = Mang->getSymbol(I); 909 910 const GlobalValue *GV = I->getAliasedGlobal(); 911 MCSymbol *Target = Mang->getSymbol(GV); 912 913 if (I->hasExternalLinkage() || !MAI->getWeakRefDirective()) 914 OutStreamer.EmitSymbolAttribute(Name, MCSA_Global); 915 else if (I->hasWeakLinkage()) 916 OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference); 917 else 918 assert(I->hasLocalLinkage() && "Invalid alias linkage"); 919 920 EmitVisibility(Name, I->getVisibility()); 921 922 // Emit the directives as assignments aka .set: 923 OutStreamer.EmitAssignment(Name, 924 MCSymbolRefExpr::Create(Target, OutContext)); 925 } 926 } 927 928 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 929 assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 930 for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) 931 if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I)) 932 MP->finishAssembly(*this); 933 934 // If we don't have any trampolines, then we don't require stack memory 935 // to be executable. Some targets have a directive to declare this. 936 Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); 937 if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) 938 if (const MCSection *S = MAI->getNonexecutableStackSection(OutContext)) 939 OutStreamer.SwitchSection(S); 940 941 // Allow the target to emit any magic that it wants at the end of the file, 942 // after everything else has gone out. 943 EmitEndOfAsmFile(M); 944 945 delete Mang; Mang = 0; 946 MMI = 0; 947 948 OutStreamer.Finish(); 949 return false; 950} 951 952void AsmPrinter::SetupMachineFunction(MachineFunction &MF) { 953 this->MF = &MF; 954 // Get the function symbol. 955 CurrentFnSym = Mang->getSymbol(MF.getFunction()); 956 CurrentFnSymForSize = CurrentFnSym; 957 958 if (isVerbose()) 959 LI = &getAnalysis<MachineLoopInfo>(); 960} 961 962namespace { 963 // SectionCPs - Keep track the alignment, constpool entries per Section. 964 struct SectionCPs { 965 const MCSection *S; 966 unsigned Alignment; 967 SmallVector<unsigned, 4> CPEs; 968 SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {} 969 }; 970} 971 972/// EmitConstantPool - Print to the current output stream assembly 973/// representations of the constants in the constant pool MCP. This is 974/// used to print out constants which have been "spilled to memory" by 975/// the code generator. 976/// 977void AsmPrinter::EmitConstantPool() { 978 const MachineConstantPool *MCP = MF->getConstantPool(); 979 const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants(); 980 if (CP.empty()) return; 981 982 // Calculate sections for constant pool entries. We collect entries to go into 983 // the same section together to reduce amount of section switch statements. 984 SmallVector<SectionCPs, 4> CPSections; 985 for (unsigned i = 0, e = CP.size(); i != e; ++i) { 986 const MachineConstantPoolEntry &CPE = CP[i]; 987 unsigned Align = CPE.getAlignment(); 988 989 SectionKind Kind; 990 switch (CPE.getRelocationInfo()) { 991 default: llvm_unreachable("Unknown section kind"); 992 case 2: Kind = SectionKind::getReadOnlyWithRel(); break; 993 case 1: 994 Kind = SectionKind::getReadOnlyWithRelLocal(); 995 break; 996 case 0: 997 switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { 998 case 4: Kind = SectionKind::getMergeableConst4(); break; 999 case 8: Kind = SectionKind::getMergeableConst8(); break; 1000 case 16: Kind = SectionKind::getMergeableConst16();break; 1001 default: Kind = SectionKind::getMergeableConst(); break; 1002 } 1003 } 1004 1005 const MCSection *S = getObjFileLowering().getSectionForConstant(Kind); 1006 1007 // The number of sections are small, just do a linear search from the 1008 // last section to the first. 1009 bool Found = false; 1010 unsigned SecIdx = CPSections.size(); 1011 while (SecIdx != 0) { 1012 if (CPSections[--SecIdx].S == S) { 1013 Found = true; 1014 break; 1015 } 1016 } 1017 if (!Found) { 1018 SecIdx = CPSections.size(); 1019 CPSections.push_back(SectionCPs(S, Align)); 1020 } 1021 1022 if (Align > CPSections[SecIdx].Alignment) 1023 CPSections[SecIdx].Alignment = Align; 1024 CPSections[SecIdx].CPEs.push_back(i); 1025 } 1026 1027 // Now print stuff into the calculated sections. 1028 for (unsigned i = 0, e = CPSections.size(); i != e; ++i) { 1029 OutStreamer.SwitchSection(CPSections[i].S); 1030 EmitAlignment(Log2_32(CPSections[i].Alignment)); 1031 1032 unsigned Offset = 0; 1033 for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) { 1034 unsigned CPI = CPSections[i].CPEs[j]; 1035 MachineConstantPoolEntry CPE = CP[CPI]; 1036 1037 // Emit inter-object padding for alignment. 1038 unsigned AlignMask = CPE.getAlignment() - 1; 1039 unsigned NewOffset = (Offset + AlignMask) & ~AlignMask; 1040 OutStreamer.EmitFill(NewOffset - Offset, 0/*fillval*/, 0/*addrspace*/); 1041 1042 Type *Ty = CPE.getType(); 1043 Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty); 1044 OutStreamer.EmitLabel(GetCPISymbol(CPI)); 1045 1046 if (CPE.isMachineConstantPoolEntry()) 1047 EmitMachineConstantPoolValue(CPE.Val.MachineCPVal); 1048 else 1049 EmitGlobalConstant(CPE.Val.ConstVal); 1050 } 1051 } 1052} 1053 1054/// EmitJumpTableInfo - Print assembly representations of the jump tables used 1055/// by the current function to the current output stream. 1056/// 1057void AsmPrinter::EmitJumpTableInfo() { 1058 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo(); 1059 if (MJTI == 0) return; 1060 if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline) return; 1061 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 1062 if (JT.empty()) return; 1063 1064 // Pick the directive to use to print the jump table entries, and switch to 1065 // the appropriate section. 1066 const Function *F = MF->getFunction(); 1067 bool JTInDiffSection = false; 1068 if (// In PIC mode, we need to emit the jump table to the same section as the 1069 // function body itself, otherwise the label differences won't make sense. 1070 // FIXME: Need a better predicate for this: what about custom entries? 1071 MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 || 1072 // We should also do if the section name is NULL or function is declared 1073 // in discardable section 1074 // FIXME: this isn't the right predicate, should be based on the MCSection 1075 // for the function. 1076 F->isWeakForLinker()) { 1077 OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F,Mang,TM)); 1078 } else { 1079 // Otherwise, drop it in the readonly section. 1080 const MCSection *ReadOnlySection = 1081 getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly()); 1082 OutStreamer.SwitchSection(ReadOnlySection); 1083 JTInDiffSection = true; 1084 } 1085 1086 EmitAlignment(Log2_32(MJTI->getEntryAlignment(*TM.getTargetData()))); 1087 1088 // If we know the form of the jump table, go ahead and tag it as such. 1089 if (!JTInDiffSection) { 1090 if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32) { 1091 OutStreamer.EmitJumpTable32Region(); 1092 } else { 1093 OutStreamer.EmitDataRegion(); 1094 } 1095 } 1096 1097 for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) { 1098 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs; 1099 1100 // If this jump table was deleted, ignore it. 1101 if (JTBBs.empty()) continue; 1102 1103 // For the EK_LabelDifference32 entry, if the target supports .set, emit a 1104 // .set directive for each unique entry. This reduces the number of 1105 // relocations the assembler will generate for the jump table. 1106 if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 && 1107 MAI->hasSetDirective()) { 1108 SmallPtrSet<const MachineBasicBlock*, 16> EmittedSets; 1109 const TargetLowering *TLI = TM.getTargetLowering(); 1110 const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext); 1111 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { 1112 const MachineBasicBlock *MBB = JTBBs[ii]; 1113 if (!EmittedSets.insert(MBB)) continue; 1114 1115 // .set LJTSet, LBB32-base 1116 const MCExpr *LHS = 1117 MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); 1118 OutStreamer.EmitAssignment(GetJTSetSymbol(JTI, MBB->getNumber()), 1119 MCBinaryExpr::CreateSub(LHS, Base, OutContext)); 1120 } 1121 } 1122 1123 // On some targets (e.g. Darwin) we want to emit two consecutive labels 1124 // before each jump table. The first label is never referenced, but tells 1125 // the assembler and linker the extents of the jump table object. The 1126 // second label is actually referenced by the code. 1127 if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) 1128 // FIXME: This doesn't have to have any specific name, just any randomly 1129 // named and numbered 'l' label would work. Simplify GetJTISymbol. 1130 OutStreamer.EmitLabel(GetJTISymbol(JTI, true)); 1131 1132 OutStreamer.EmitLabel(GetJTISymbol(JTI)); 1133 1134 for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) 1135 EmitJumpTableEntry(MJTI, JTBBs[ii], JTI); 1136 } 1137} 1138 1139/// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the 1140/// current stream. 1141void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, 1142 const MachineBasicBlock *MBB, 1143 unsigned UID) const { 1144 assert(MBB && MBB->getNumber() >= 0 && "Invalid basic block"); 1145 const MCExpr *Value = 0; 1146 switch (MJTI->getEntryKind()) { 1147 case MachineJumpTableInfo::EK_Inline: 1148 llvm_unreachable("Cannot emit EK_Inline jump table entry"); 1149 case MachineJumpTableInfo::EK_Custom32: 1150 Value = TM.getTargetLowering()->LowerCustomJumpTableEntry(MJTI, MBB, UID, 1151 OutContext); 1152 break; 1153 case MachineJumpTableInfo::EK_BlockAddress: 1154 // EK_BlockAddress - Each entry is a plain address of block, e.g.: 1155 // .word LBB123 1156 Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); 1157 break; 1158 case MachineJumpTableInfo::EK_GPRel32BlockAddress: { 1159 // EK_GPRel32BlockAddress - Each entry is an address of block, encoded 1160 // with a relocation as gp-relative, e.g.: 1161 // .gprel32 LBB123 1162 MCSymbol *MBBSym = MBB->getSymbol(); 1163 OutStreamer.EmitGPRel32Value(MCSymbolRefExpr::Create(MBBSym, OutContext)); 1164 return; 1165 } 1166 1167 case MachineJumpTableInfo::EK_GPRel64BlockAddress: { 1168 // EK_GPRel64BlockAddress - Each entry is an address of block, encoded 1169 // with a relocation as gp-relative, e.g.: 1170 // .gpdword LBB123 1171 MCSymbol *MBBSym = MBB->getSymbol(); 1172 OutStreamer.EmitGPRel64Value(MCSymbolRefExpr::Create(MBBSym, OutContext)); 1173 return; 1174 } 1175 1176 case MachineJumpTableInfo::EK_LabelDifference32: { 1177 // EK_LabelDifference32 - Each entry is the address of the block minus 1178 // the address of the jump table. This is used for PIC jump tables where 1179 // gprel32 is not supported. e.g.: 1180 // .word LBB123 - LJTI1_2 1181 // If the .set directive is supported, this is emitted as: 1182 // .set L4_5_set_123, LBB123 - LJTI1_2 1183 // .word L4_5_set_123 1184 1185 // If we have emitted set directives for the jump table entries, print 1186 // them rather than the entries themselves. If we're emitting PIC, then 1187 // emit the table entries as differences between two text section labels. 1188 if (MAI->hasSetDirective()) { 1189 // If we used .set, reference the .set's symbol. 1190 Value = MCSymbolRefExpr::Create(GetJTSetSymbol(UID, MBB->getNumber()), 1191 OutContext); 1192 break; 1193 } 1194 // Otherwise, use the difference as the jump table entry. 1195 Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); 1196 const MCExpr *JTI = MCSymbolRefExpr::Create(GetJTISymbol(UID), OutContext); 1197 Value = MCBinaryExpr::CreateSub(Value, JTI, OutContext); 1198 break; 1199 } 1200 } 1201 1202 assert(Value && "Unknown entry kind!"); 1203 1204 unsigned EntrySize = MJTI->getEntrySize(*TM.getTargetData()); 1205 OutStreamer.EmitValue(Value, EntrySize, /*addrspace*/0); 1206} 1207 1208 1209/// EmitSpecialLLVMGlobal - Check to see if the specified global is a 1210/// special global used by LLVM. If so, emit it and return true, otherwise 1211/// do nothing and return false. 1212bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { 1213 if (GV->getName() == "llvm.used") { 1214 if (MAI->hasNoDeadStrip()) // No need to emit this at all. 1215 EmitLLVMUsedList(GV->getInitializer()); 1216 return true; 1217 } 1218 1219 // Ignore debug and non-emitted data. This handles llvm.compiler.used. 1220 if (GV->getSection() == "llvm.metadata" || 1221 GV->hasAvailableExternallyLinkage()) 1222 return true; 1223 1224 if (!GV->hasAppendingLinkage()) return false; 1225 1226 assert(GV->hasInitializer() && "Not a special LLVM global!"); 1227 1228 if (GV->getName() == "llvm.global_ctors") { 1229 EmitXXStructorList(GV->getInitializer(), /* isCtor */ true); 1230 1231 if (TM.getRelocationModel() == Reloc::Static && 1232 MAI->hasStaticCtorDtorReferenceInStaticMode()) { 1233 StringRef Sym(".constructors_used"); 1234 OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym), 1235 MCSA_Reference); 1236 } 1237 return true; 1238 } 1239 1240 if (GV->getName() == "llvm.global_dtors") { 1241 EmitXXStructorList(GV->getInitializer(), /* isCtor */ false); 1242 1243 if (TM.getRelocationModel() == Reloc::Static && 1244 MAI->hasStaticCtorDtorReferenceInStaticMode()) { 1245 StringRef Sym(".destructors_used"); 1246 OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym), 1247 MCSA_Reference); 1248 } 1249 return true; 1250 } 1251 1252 return false; 1253} 1254 1255/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each 1256/// global in the specified llvm.used list for which emitUsedDirectiveFor 1257/// is true, as being used with this directive. 1258void AsmPrinter::EmitLLVMUsedList(const Constant *List) { 1259 // Should be an array of 'i8*'. 1260 const ConstantArray *InitList = dyn_cast<ConstantArray>(List); 1261 if (InitList == 0) return; 1262 1263 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 1264 const GlobalValue *GV = 1265 dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts()); 1266 if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang)) 1267 OutStreamer.EmitSymbolAttribute(Mang->getSymbol(GV), MCSA_NoDeadStrip); 1268 } 1269} 1270 1271typedef std::pair<unsigned, Constant*> Structor; 1272 1273static bool priority_order(const Structor& lhs, const Structor& rhs) { 1274 return lhs.first < rhs.first; 1275} 1276 1277/// EmitXXStructorList - Emit the ctor or dtor list taking into account the init 1278/// priority. 1279void AsmPrinter::EmitXXStructorList(const Constant *List, bool isCtor) { 1280 // Should be an array of '{ int, void ()* }' structs. The first value is the 1281 // init priority. 1282 if (!isa<ConstantArray>(List)) return; 1283 1284 // Sanity check the structors list. 1285 const ConstantArray *InitList = dyn_cast<ConstantArray>(List); 1286 if (!InitList) return; // Not an array! 1287 StructType *ETy = dyn_cast<StructType>(InitList->getType()->getElementType()); 1288 if (!ETy || ETy->getNumElements() != 2) return; // Not an array of pairs! 1289 if (!isa<IntegerType>(ETy->getTypeAtIndex(0U)) || 1290 !isa<PointerType>(ETy->getTypeAtIndex(1U))) return; // Not (int, ptr). 1291 1292 // Gather the structors in a form that's convenient for sorting by priority. 1293 SmallVector<Structor, 8> Structors; 1294 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 1295 ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i)); 1296 if (!CS) continue; // Malformed. 1297 if (CS->getOperand(1)->isNullValue()) 1298 break; // Found a null terminator, skip the rest. 1299 ConstantInt *Priority = dyn_cast<ConstantInt>(CS->getOperand(0)); 1300 if (!Priority) continue; // Malformed. 1301 Structors.push_back(std::make_pair(Priority->getLimitedValue(65535), 1302 CS->getOperand(1))); 1303 } 1304 1305 // Emit the function pointers in the target-specific order 1306 const TargetData *TD = TM.getTargetData(); 1307 unsigned Align = Log2_32(TD->getPointerPrefAlignment()); 1308 std::stable_sort(Structors.begin(), Structors.end(), priority_order); 1309 for (unsigned i = 0, e = Structors.size(); i != e; ++i) { 1310 const MCSection *OutputSection = 1311 (isCtor ? 1312 getObjFileLowering().getStaticCtorSection(Structors[i].first) : 1313 getObjFileLowering().getStaticDtorSection(Structors[i].first)); 1314 OutStreamer.SwitchSection(OutputSection); 1315 if (OutStreamer.getCurrentSection() != OutStreamer.getPreviousSection()) 1316 EmitAlignment(Align); 1317 EmitXXStructor(Structors[i].second); 1318 } 1319} 1320 1321//===--------------------------------------------------------------------===// 1322// Emission and print routines 1323// 1324 1325/// EmitInt8 - Emit a byte directive and value. 1326/// 1327void AsmPrinter::EmitInt8(int Value) const { 1328 OutStreamer.EmitIntValue(Value, 1, 0/*addrspace*/); 1329} 1330 1331/// EmitInt16 - Emit a short directive and value. 1332/// 1333void AsmPrinter::EmitInt16(int Value) const { 1334 OutStreamer.EmitIntValue(Value, 2, 0/*addrspace*/); 1335} 1336 1337/// EmitInt32 - Emit a long directive and value. 1338/// 1339void AsmPrinter::EmitInt32(int Value) const { 1340 OutStreamer.EmitIntValue(Value, 4, 0/*addrspace*/); 1341} 1342 1343/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size 1344/// in bytes of the directive is specified by Size and Hi/Lo specify the 1345/// labels. This implicitly uses .set if it is available. 1346void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, 1347 unsigned Size) const { 1348 // Get the Hi-Lo expression. 1349 const MCExpr *Diff = 1350 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi, OutContext), 1351 MCSymbolRefExpr::Create(Lo, OutContext), 1352 OutContext); 1353 1354 if (!MAI->hasSetDirective()) { 1355 OutStreamer.EmitValue(Diff, Size, 0/*AddrSpace*/); 1356 return; 1357 } 1358 1359 // Otherwise, emit with .set (aka assignment). 1360 MCSymbol *SetLabel = GetTempSymbol("set", SetCounter++); 1361 OutStreamer.EmitAssignment(SetLabel, Diff); 1362 OutStreamer.EmitSymbolValue(SetLabel, Size, 0/*AddrSpace*/); 1363} 1364 1365/// EmitLabelOffsetDifference - Emit something like ".long Hi+Offset-Lo" 1366/// where the size in bytes of the directive is specified by Size and Hi/Lo 1367/// specify the labels. This implicitly uses .set if it is available. 1368void AsmPrinter::EmitLabelOffsetDifference(const MCSymbol *Hi, uint64_t Offset, 1369 const MCSymbol *Lo, unsigned Size) 1370 const { 1371 1372 // Emit Hi+Offset - Lo 1373 // Get the Hi+Offset expression. 1374 const MCExpr *Plus = 1375 MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Hi, OutContext), 1376 MCConstantExpr::Create(Offset, OutContext), 1377 OutContext); 1378 1379 // Get the Hi+Offset-Lo expression. 1380 const MCExpr *Diff = 1381 MCBinaryExpr::CreateSub(Plus, 1382 MCSymbolRefExpr::Create(Lo, OutContext), 1383 OutContext); 1384 1385 if (!MAI->hasSetDirective()) 1386 OutStreamer.EmitValue(Diff, 4, 0/*AddrSpace*/); 1387 else { 1388 // Otherwise, emit with .set (aka assignment). 1389 MCSymbol *SetLabel = GetTempSymbol("set", SetCounter++); 1390 OutStreamer.EmitAssignment(SetLabel, Diff); 1391 OutStreamer.EmitSymbolValue(SetLabel, 4, 0/*AddrSpace*/); 1392 } 1393} 1394 1395/// EmitLabelPlusOffset - Emit something like ".long Label+Offset" 1396/// where the size in bytes of the directive is specified by Size and Label 1397/// specifies the label. This implicitly uses .set if it is available. 1398void AsmPrinter::EmitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, 1399 unsigned Size) 1400 const { 1401 1402 // Emit Label+Offset 1403 const MCExpr *Plus = 1404 MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Label, OutContext), 1405 MCConstantExpr::Create(Offset, OutContext), 1406 OutContext); 1407 1408 OutStreamer.EmitValue(Plus, 4, 0/*AddrSpace*/); 1409} 1410 1411 1412//===----------------------------------------------------------------------===// 1413 1414// EmitAlignment - Emit an alignment directive to the specified power of 1415// two boundary. For example, if you pass in 3 here, you will get an 8 1416// byte alignment. If a global value is specified, and if that global has 1417// an explicit alignment requested, it will override the alignment request 1418// if required for correctness. 1419// 1420void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV) const { 1421 if (GV) NumBits = getGVAlignmentLog2(GV, *TM.getTargetData(), NumBits); 1422 1423 if (NumBits == 0) return; // 1-byte aligned: no need to emit alignment. 1424 1425 if (getCurrentSection()->getKind().isText()) 1426 OutStreamer.EmitCodeAlignment(1 << NumBits); 1427 else 1428 OutStreamer.EmitValueToAlignment(1 << NumBits, 0, 1, 0); 1429} 1430 1431//===----------------------------------------------------------------------===// 1432// Constant emission. 1433//===----------------------------------------------------------------------===// 1434 1435/// LowerConstant - Lower the specified LLVM Constant to an MCExpr. 1436/// 1437static const MCExpr *LowerConstant(const Constant *CV, AsmPrinter &AP) { 1438 MCContext &Ctx = AP.OutContext; 1439 1440 if (CV->isNullValue() || isa<UndefValue>(CV)) 1441 return MCConstantExpr::Create(0, Ctx); 1442 1443 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) 1444 return MCConstantExpr::Create(CI->getZExtValue(), Ctx); 1445 1446 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) 1447 return MCSymbolRefExpr::Create(AP.Mang->getSymbol(GV), Ctx); 1448 1449 if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV)) 1450 return MCSymbolRefExpr::Create(AP.GetBlockAddressSymbol(BA), Ctx); 1451 1452 const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV); 1453 if (CE == 0) { 1454 llvm_unreachable("Unknown constant value to lower!"); 1455 } 1456 1457 switch (CE->getOpcode()) { 1458 default: 1459 // If the code isn't optimized, there may be outstanding folding 1460 // opportunities. Attempt to fold the expression using TargetData as a 1461 // last resort before giving up. 1462 if (Constant *C = 1463 ConstantFoldConstantExpression(CE, AP.TM.getTargetData())) 1464 if (C != CE) 1465 return LowerConstant(C, AP); 1466 1467 // Otherwise report the problem to the user. 1468 { 1469 std::string S; 1470 raw_string_ostream OS(S); 1471 OS << "Unsupported expression in static initializer: "; 1472 WriteAsOperand(OS, CE, /*PrintType=*/false, 1473 !AP.MF ? 0 : AP.MF->getFunction()->getParent()); 1474 report_fatal_error(OS.str()); 1475 } 1476 case Instruction::GetElementPtr: { 1477 const TargetData &TD = *AP.TM.getTargetData(); 1478 // Generate a symbolic expression for the byte address 1479 const Constant *PtrVal = CE->getOperand(0); 1480 SmallVector<Value*, 8> IdxVec(CE->op_begin()+1, CE->op_end()); 1481 int64_t Offset = TD.getIndexedOffset(PtrVal->getType(), IdxVec); 1482 1483 const MCExpr *Base = LowerConstant(CE->getOperand(0), AP); 1484 if (Offset == 0) 1485 return Base; 1486 1487 // Truncate/sext the offset to the pointer size. 1488 if (TD.getPointerSizeInBits() != 64) { 1489 int SExtAmount = 64-TD.getPointerSizeInBits(); 1490 Offset = (Offset << SExtAmount) >> SExtAmount; 1491 } 1492 1493 return MCBinaryExpr::CreateAdd(Base, MCConstantExpr::Create(Offset, Ctx), 1494 Ctx); 1495 } 1496 1497 case Instruction::Trunc: 1498 // We emit the value and depend on the assembler to truncate the generated 1499 // expression properly. This is important for differences between 1500 // blockaddress labels. Since the two labels are in the same function, it 1501 // is reasonable to treat their delta as a 32-bit value. 1502 // FALL THROUGH. 1503 case Instruction::BitCast: 1504 return LowerConstant(CE->getOperand(0), AP); 1505 1506 case Instruction::IntToPtr: { 1507 const TargetData &TD = *AP.TM.getTargetData(); 1508 // Handle casts to pointers by changing them into casts to the appropriate 1509 // integer type. This promotes constant folding and simplifies this code. 1510 Constant *Op = CE->getOperand(0); 1511 Op = ConstantExpr::getIntegerCast(Op, TD.getIntPtrType(CV->getContext()), 1512 false/*ZExt*/); 1513 return LowerConstant(Op, AP); 1514 } 1515 1516 case Instruction::PtrToInt: { 1517 const TargetData &TD = *AP.TM.getTargetData(); 1518 // Support only foldable casts to/from pointers that can be eliminated by 1519 // changing the pointer to the appropriately sized integer type. 1520 Constant *Op = CE->getOperand(0); 1521 Type *Ty = CE->getType(); 1522 1523 const MCExpr *OpExpr = LowerConstant(Op, AP); 1524 1525 // We can emit the pointer value into this slot if the slot is an 1526 // integer slot equal to the size of the pointer. 1527 if (TD.getTypeAllocSize(Ty) == TD.getTypeAllocSize(Op->getType())) 1528 return OpExpr; 1529 1530 // Otherwise the pointer is smaller than the resultant integer, mask off 1531 // the high bits so we are sure to get a proper truncation if the input is 1532 // a constant expr. 1533 unsigned InBits = TD.getTypeAllocSizeInBits(Op->getType()); 1534 const MCExpr *MaskExpr = MCConstantExpr::Create(~0ULL >> (64-InBits), Ctx); 1535 return MCBinaryExpr::CreateAnd(OpExpr, MaskExpr, Ctx); 1536 } 1537 1538 // The MC library also has a right-shift operator, but it isn't consistently 1539 // signed or unsigned between different targets. 1540 case Instruction::Add: 1541 case Instruction::Sub: 1542 case Instruction::Mul: 1543 case Instruction::SDiv: 1544 case Instruction::SRem: 1545 case Instruction::Shl: 1546 case Instruction::And: 1547 case Instruction::Or: 1548 case Instruction::Xor: { 1549 const MCExpr *LHS = LowerConstant(CE->getOperand(0), AP); 1550 const MCExpr *RHS = LowerConstant(CE->getOperand(1), AP); 1551 switch (CE->getOpcode()) { 1552 default: llvm_unreachable("Unknown binary operator constant cast expr"); 1553 case Instruction::Add: return MCBinaryExpr::CreateAdd(LHS, RHS, Ctx); 1554 case Instruction::Sub: return MCBinaryExpr::CreateSub(LHS, RHS, Ctx); 1555 case Instruction::Mul: return MCBinaryExpr::CreateMul(LHS, RHS, Ctx); 1556 case Instruction::SDiv: return MCBinaryExpr::CreateDiv(LHS, RHS, Ctx); 1557 case Instruction::SRem: return MCBinaryExpr::CreateMod(LHS, RHS, Ctx); 1558 case Instruction::Shl: return MCBinaryExpr::CreateShl(LHS, RHS, Ctx); 1559 case Instruction::And: return MCBinaryExpr::CreateAnd(LHS, RHS, Ctx); 1560 case Instruction::Or: return MCBinaryExpr::CreateOr (LHS, RHS, Ctx); 1561 case Instruction::Xor: return MCBinaryExpr::CreateXor(LHS, RHS, Ctx); 1562 } 1563 } 1564 } 1565} 1566 1567static void EmitGlobalConstantImpl(const Constant *C, unsigned AddrSpace, 1568 AsmPrinter &AP); 1569 1570/// isRepeatedByteSequence - Determine whether the given value is 1571/// composed of a repeated sequence of identical bytes and return the 1572/// byte value. If it is not a repeated sequence, return -1. 1573static int isRepeatedByteSequence(const ConstantDataSequential *V) { 1574 StringRef Data = V->getRawDataValues(); 1575 assert(!Data.empty() && "Empty aggregates should be CAZ node"); 1576 char C = Data[0]; 1577 for (unsigned i = 1, e = Data.size(); i != e; ++i) 1578 if (Data[i] != C) return -1; 1579 return static_cast<uint8_t>(C); // Ensure 255 is not returned as -1. 1580} 1581 1582 1583/// isRepeatedByteSequence - Determine whether the given value is 1584/// composed of a repeated sequence of identical bytes and return the 1585/// byte value. If it is not a repeated sequence, return -1. 1586static int isRepeatedByteSequence(const Value *V, TargetMachine &TM) { 1587 1588 if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) { 1589 if (CI->getBitWidth() > 64) return -1; 1590 1591 uint64_t Size = TM.getTargetData()->getTypeAllocSize(V->getType()); 1592 uint64_t Value = CI->getZExtValue(); 1593 1594 // Make sure the constant is at least 8 bits long and has a power 1595 // of 2 bit width. This guarantees the constant bit width is 1596 // always a multiple of 8 bits, avoiding issues with padding out 1597 // to Size and other such corner cases. 1598 if (CI->getBitWidth() < 8 || !isPowerOf2_64(CI->getBitWidth())) return -1; 1599 1600 uint8_t Byte = static_cast<uint8_t>(Value); 1601 1602 for (unsigned i = 1; i < Size; ++i) { 1603 Value >>= 8; 1604 if (static_cast<uint8_t>(Value) != Byte) return -1; 1605 } 1606 return Byte; 1607 } 1608 if (const ConstantArray *CA = dyn_cast<ConstantArray>(V)) { 1609 // Make sure all array elements are sequences of the same repeated 1610 // byte. 1611 assert(CA->getNumOperands() != 0 && "Should be a CAZ"); 1612 int Byte = isRepeatedByteSequence(CA->getOperand(0), TM); 1613 if (Byte == -1) return -1; 1614 1615 for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i) { 1616 int ThisByte = isRepeatedByteSequence(CA->getOperand(i), TM); 1617 if (ThisByte == -1) return -1; 1618 if (Byte != ThisByte) return -1; 1619 } 1620 return Byte; 1621 } 1622 1623 if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(V)) 1624 return isRepeatedByteSequence(CDS); 1625 1626 return -1; 1627} 1628 1629static void EmitGlobalConstantDataSequential(const ConstantDataSequential *CDS, 1630 unsigned AddrSpace,AsmPrinter &AP){ 1631 1632 // See if we can aggregate this into a .fill, if so, emit it as such. 1633 int Value = isRepeatedByteSequence(CDS, AP.TM); 1634 if (Value != -1) { 1635 uint64_t Bytes = AP.TM.getTargetData()->getTypeAllocSize(CDS->getType()); 1636 // Don't emit a 1-byte object as a .fill. 1637 if (Bytes > 1) 1638 return AP.OutStreamer.EmitFill(Bytes, Value, AddrSpace); 1639 } 1640 1641 // If this can be emitted with .ascii/.asciz, emit it as such. 1642 if (CDS->isString()) 1643 return AP.OutStreamer.EmitBytes(CDS->getAsString(), AddrSpace); 1644 1645 // Otherwise, emit the values in successive locations. 1646 unsigned ElementByteSize = CDS->getElementByteSize(); 1647 if (isa<IntegerType>(CDS->getElementType())) { 1648 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { 1649 if (AP.isVerbose()) 1650 AP.OutStreamer.GetCommentOS() << format("0x%" PRIx64 "\n", 1651 CDS->getElementAsInteger(i)); 1652 AP.OutStreamer.EmitIntValue(CDS->getElementAsInteger(i), 1653 ElementByteSize, AddrSpace); 1654 } 1655 } else if (ElementByteSize == 4) { 1656 // FP Constants are printed as integer constants to avoid losing 1657 // precision. 1658 assert(CDS->getElementType()->isFloatTy()); 1659 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { 1660 union { 1661 float F; 1662 uint32_t I; 1663 }; 1664 1665 F = CDS->getElementAsFloat(i); 1666 if (AP.isVerbose()) 1667 AP.OutStreamer.GetCommentOS() << "float " << F << '\n'; 1668 AP.OutStreamer.EmitIntValue(I, 4, AddrSpace); 1669 } 1670 } else { 1671 assert(CDS->getElementType()->isDoubleTy()); 1672 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { 1673 union { 1674 double F; 1675 uint64_t I; 1676 }; 1677 1678 F = CDS->getElementAsDouble(i); 1679 if (AP.isVerbose()) 1680 AP.OutStreamer.GetCommentOS() << "double " << F << '\n'; 1681 AP.OutStreamer.EmitIntValue(I, 8, AddrSpace); 1682 } 1683 } 1684 1685 const TargetData &TD = *AP.TM.getTargetData(); 1686 unsigned Size = TD.getTypeAllocSize(CDS->getType()); 1687 unsigned EmittedSize = TD.getTypeAllocSize(CDS->getType()->getElementType()) * 1688 CDS->getNumElements(); 1689 if (unsigned Padding = Size - EmittedSize) 1690 AP.OutStreamer.EmitZeros(Padding, AddrSpace); 1691 1692} 1693 1694static void EmitGlobalConstantArray(const ConstantArray *CA, unsigned AddrSpace, 1695 AsmPrinter &AP) { 1696 // See if we can aggregate some values. Make sure it can be 1697 // represented as a series of bytes of the constant value. 1698 int Value = isRepeatedByteSequence(CA, AP.TM); 1699 1700 if (Value != -1) { 1701 uint64_t Bytes = AP.TM.getTargetData()->getTypeAllocSize(CA->getType()); 1702 AP.OutStreamer.EmitFill(Bytes, Value, AddrSpace); 1703 } 1704 else { 1705 for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) 1706 EmitGlobalConstantImpl(CA->getOperand(i), AddrSpace, AP); 1707 } 1708} 1709 1710static void EmitGlobalConstantVector(const ConstantVector *CV, 1711 unsigned AddrSpace, AsmPrinter &AP) { 1712 for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i) 1713 EmitGlobalConstantImpl(CV->getOperand(i), AddrSpace, AP); 1714 1715 const TargetData &TD = *AP.TM.getTargetData(); 1716 unsigned Size = TD.getTypeAllocSize(CV->getType()); 1717 unsigned EmittedSize = TD.getTypeAllocSize(CV->getType()->getElementType()) * 1718 CV->getType()->getNumElements(); 1719 if (unsigned Padding = Size - EmittedSize) 1720 AP.OutStreamer.EmitZeros(Padding, AddrSpace); 1721} 1722 1723static void EmitGlobalConstantStruct(const ConstantStruct *CS, 1724 unsigned AddrSpace, AsmPrinter &AP) { 1725 // Print the fields in successive locations. Pad to align if needed! 1726 const TargetData *TD = AP.TM.getTargetData(); 1727 unsigned Size = TD->getTypeAllocSize(CS->getType()); 1728 const StructLayout *Layout = TD->getStructLayout(CS->getType()); 1729 uint64_t SizeSoFar = 0; 1730 for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i) { 1731 const Constant *Field = CS->getOperand(i); 1732 1733 // Check if padding is needed and insert one or more 0s. 1734 uint64_t FieldSize = TD->getTypeAllocSize(Field->getType()); 1735 uint64_t PadSize = ((i == e-1 ? Size : Layout->getElementOffset(i+1)) 1736 - Layout->getElementOffset(i)) - FieldSize; 1737 SizeSoFar += FieldSize + PadSize; 1738 1739 // Now print the actual field value. 1740 EmitGlobalConstantImpl(Field, AddrSpace, AP); 1741 1742 // Insert padding - this may include padding to increase the size of the 1743 // current field up to the ABI size (if the struct is not packed) as well 1744 // as padding to ensure that the next field starts at the right offset. 1745 AP.OutStreamer.EmitZeros(PadSize, AddrSpace); 1746 } 1747 assert(SizeSoFar == Layout->getSizeInBytes() && 1748 "Layout of constant struct may be incorrect!"); 1749} 1750 1751static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace, 1752 AsmPrinter &AP) { 1753 if (CFP->getType()->isHalfTy()) { 1754 if (AP.isVerbose()) { 1755 SmallString<10> Str; 1756 CFP->getValueAPF().toString(Str); 1757 AP.OutStreamer.GetCommentOS() << "half " << Str << '\n'; 1758 } 1759 uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1760 AP.OutStreamer.EmitIntValue(Val, 2, AddrSpace); 1761 return; 1762 } 1763 1764 if (CFP->getType()->isFloatTy()) { 1765 if (AP.isVerbose()) { 1766 float Val = CFP->getValueAPF().convertToFloat(); 1767 AP.OutStreamer.GetCommentOS() << "float " << Val << '\n'; 1768 } 1769 uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1770 AP.OutStreamer.EmitIntValue(Val, 4, AddrSpace); 1771 return; 1772 } 1773 1774 // FP Constants are printed as integer constants to avoid losing 1775 // precision. 1776 if (CFP->getType()->isDoubleTy()) { 1777 if (AP.isVerbose()) { 1778 double Val = CFP->getValueAPF().convertToDouble(); 1779 AP.OutStreamer.GetCommentOS() << "double " << Val << '\n'; 1780 } 1781 1782 uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1783 AP.OutStreamer.EmitIntValue(Val, 8, AddrSpace); 1784 return; 1785 } 1786 1787 if (CFP->getType()->isX86_FP80Ty()) { 1788 // all long double variants are printed as hex 1789 // API needed to prevent premature destruction 1790 APInt API = CFP->getValueAPF().bitcastToAPInt(); 1791 const uint64_t *p = API.getRawData(); 1792 if (AP.isVerbose()) { 1793 // Convert to double so we can print the approximate val as a comment. 1794 APFloat DoubleVal = CFP->getValueAPF(); 1795 bool ignored; 1796 DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, 1797 &ignored); 1798 AP.OutStreamer.GetCommentOS() << "x86_fp80 ~= " 1799 << DoubleVal.convertToDouble() << '\n'; 1800 } 1801 1802 if (AP.TM.getTargetData()->isBigEndian()) { 1803 AP.OutStreamer.EmitIntValue(p[1], 2, AddrSpace); 1804 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1805 } else { 1806 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1807 AP.OutStreamer.EmitIntValue(p[1], 2, AddrSpace); 1808 } 1809 1810 // Emit the tail padding for the long double. 1811 const TargetData &TD = *AP.TM.getTargetData(); 1812 AP.OutStreamer.EmitZeros(TD.getTypeAllocSize(CFP->getType()) - 1813 TD.getTypeStoreSize(CFP->getType()), AddrSpace); 1814 return; 1815 } 1816 1817 assert(CFP->getType()->isPPC_FP128Ty() && 1818 "Floating point constant type not handled"); 1819 // All long double variants are printed as hex 1820 // API needed to prevent premature destruction. 1821 APInt API = CFP->getValueAPF().bitcastToAPInt(); 1822 const uint64_t *p = API.getRawData(); 1823 if (AP.TM.getTargetData()->isBigEndian()) { 1824 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1825 AP.OutStreamer.EmitIntValue(p[1], 8, AddrSpace); 1826 } else { 1827 AP.OutStreamer.EmitIntValue(p[1], 8, AddrSpace); 1828 AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace); 1829 } 1830} 1831 1832static void EmitGlobalConstantLargeInt(const ConstantInt *CI, 1833 unsigned AddrSpace, AsmPrinter &AP) { 1834 const TargetData *TD = AP.TM.getTargetData(); 1835 unsigned BitWidth = CI->getBitWidth(); 1836 assert((BitWidth & 63) == 0 && "only support multiples of 64-bits"); 1837 1838 // We don't expect assemblers to support integer data directives 1839 // for more than 64 bits, so we emit the data in at most 64-bit 1840 // quantities at a time. 1841 const uint64_t *RawData = CI->getValue().getRawData(); 1842 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) { 1843 uint64_t Val = TD->isBigEndian() ? RawData[e - i - 1] : RawData[i]; 1844 AP.OutStreamer.EmitIntValue(Val, 8, AddrSpace); 1845 } 1846} 1847 1848static void EmitGlobalConstantImpl(const Constant *CV, unsigned AddrSpace, 1849 AsmPrinter &AP) { 1850 const TargetData *TD = AP.TM.getTargetData(); 1851 uint64_t Size = TD->getTypeAllocSize(CV->getType()); 1852 if (isa<ConstantAggregateZero>(CV) || isa<UndefValue>(CV)) 1853 return AP.OutStreamer.EmitZeros(Size, AddrSpace); 1854 1855 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1856 switch (Size) { 1857 case 1: 1858 case 2: 1859 case 4: 1860 case 8: 1861 if (AP.isVerbose()) 1862 AP.OutStreamer.GetCommentOS() << format("0x%" PRIx64 "\n", 1863 CI->getZExtValue()); 1864 AP.OutStreamer.EmitIntValue(CI->getZExtValue(), Size, AddrSpace); 1865 return; 1866 default: 1867 EmitGlobalConstantLargeInt(CI, AddrSpace, AP); 1868 return; 1869 } 1870 } 1871 1872 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) 1873 return EmitGlobalConstantFP(CFP, AddrSpace, AP); 1874 1875 if (isa<ConstantPointerNull>(CV)) { 1876 AP.OutStreamer.EmitIntValue(0, Size, AddrSpace); 1877 return; 1878 } 1879 1880 if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(CV)) 1881 return EmitGlobalConstantDataSequential(CDS, AddrSpace, AP); 1882 1883 if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) 1884 return EmitGlobalConstantArray(CVA, AddrSpace, AP); 1885 1886 if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) 1887 return EmitGlobalConstantStruct(CVS, AddrSpace, AP); 1888 1889 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) { 1890 // Look through bitcasts, which might not be able to be MCExpr'ized (e.g. of 1891 // vectors). 1892 if (CE->getOpcode() == Instruction::BitCast) 1893 return EmitGlobalConstantImpl(CE->getOperand(0), AddrSpace, AP); 1894 1895 if (Size > 8) { 1896 // If the constant expression's size is greater than 64-bits, then we have 1897 // to emit the value in chunks. Try to constant fold the value and emit it 1898 // that way. 1899 Constant *New = ConstantFoldConstantExpression(CE, TD); 1900 if (New && New != CE) 1901 return EmitGlobalConstantImpl(New, AddrSpace, AP); 1902 } 1903 } 1904 1905 if (const ConstantVector *V = dyn_cast<ConstantVector>(CV)) 1906 return EmitGlobalConstantVector(V, AddrSpace, AP); 1907 1908 // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it 1909 // thread the streamer with EmitValue. 1910 AP.OutStreamer.EmitValue(LowerConstant(CV, AP), Size, AddrSpace); 1911} 1912 1913/// EmitGlobalConstant - Print a general LLVM constant to the .s file. 1914void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { 1915 uint64_t Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); 1916 if (Size) 1917 EmitGlobalConstantImpl(CV, AddrSpace, *this); 1918 else if (MAI->hasSubsectionsViaSymbols()) { 1919 // If the global has zero size, emit a single byte so that two labels don't 1920 // look like they are at the same location. 1921 OutStreamer.EmitIntValue(0, 1, AddrSpace); 1922 } 1923} 1924 1925void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1926 // Target doesn't support this yet! 1927 llvm_unreachable("Target does not support EmitMachineConstantPoolValue"); 1928} 1929 1930void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const { 1931 if (Offset > 0) 1932 OS << '+' << Offset; 1933 else if (Offset < 0) 1934 OS << Offset; 1935} 1936 1937//===----------------------------------------------------------------------===// 1938// Symbol Lowering Routines. 1939//===----------------------------------------------------------------------===// 1940 1941/// GetTempSymbol - Return the MCSymbol corresponding to the assembler 1942/// temporary label with the specified stem and unique ID. 1943MCSymbol *AsmPrinter::GetTempSymbol(StringRef Name, unsigned ID) const { 1944 return OutContext.GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix()) + 1945 Name + Twine(ID)); 1946} 1947 1948/// GetTempSymbol - Return an assembler temporary label with the specified 1949/// stem. 1950MCSymbol *AsmPrinter::GetTempSymbol(StringRef Name) const { 1951 return OutContext.GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix())+ 1952 Name); 1953} 1954 1955 1956MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const { 1957 return MMI->getAddrLabelSymbol(BA->getBasicBlock()); 1958} 1959 1960MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const { 1961 return MMI->getAddrLabelSymbol(BB); 1962} 1963 1964/// GetCPISymbol - Return the symbol for the specified constant pool entry. 1965MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const { 1966 return OutContext.GetOrCreateSymbol 1967 (Twine(MAI->getPrivateGlobalPrefix()) + "CPI" + Twine(getFunctionNumber()) 1968 + "_" + Twine(CPID)); 1969} 1970 1971/// GetJTISymbol - Return the symbol for the specified jump table entry. 1972MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const { 1973 return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate); 1974} 1975 1976/// GetJTSetSymbol - Return the symbol for the specified jump table .set 1977/// FIXME: privatize to AsmPrinter. 1978MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const { 1979 return OutContext.GetOrCreateSymbol 1980 (Twine(MAI->getPrivateGlobalPrefix()) + Twine(getFunctionNumber()) + "_" + 1981 Twine(UID) + "_set_" + Twine(MBBID)); 1982} 1983 1984/// GetSymbolWithGlobalValueBase - Return the MCSymbol for a symbol with 1985/// global value name as its base, with the specified suffix, and where the 1986/// symbol is forced to have private linkage if ForcePrivate is true. 1987MCSymbol *AsmPrinter::GetSymbolWithGlobalValueBase(const GlobalValue *GV, 1988 StringRef Suffix, 1989 bool ForcePrivate) const { 1990 SmallString<60> NameStr; 1991 Mang->getNameWithPrefix(NameStr, GV, ForcePrivate); 1992 NameStr.append(Suffix.begin(), Suffix.end()); 1993 return OutContext.GetOrCreateSymbol(NameStr.str()); 1994} 1995 1996/// GetExternalSymbolSymbol - Return the MCSymbol for the specified 1997/// ExternalSymbol. 1998MCSymbol *AsmPrinter::GetExternalSymbolSymbol(StringRef Sym) const { 1999 SmallString<60> NameStr; 2000 Mang->getNameWithPrefix(NameStr, Sym); 2001 return OutContext.GetOrCreateSymbol(NameStr.str()); 2002} 2003 2004 2005 2006/// PrintParentLoopComment - Print comments about parent loops of this one. 2007static void PrintParentLoopComment(raw_ostream &OS, const MachineLoop *Loop, 2008 unsigned FunctionNumber) { 2009 if (Loop == 0) return; 2010 PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber); 2011 OS.indent(Loop->getLoopDepth()*2) 2012 << "Parent Loop BB" << FunctionNumber << "_" 2013 << Loop->getHeader()->getNumber() 2014 << " Depth=" << Loop->getLoopDepth() << '\n'; 2015} 2016 2017 2018/// PrintChildLoopComment - Print comments about child loops within 2019/// the loop for this basic block, with nesting. 2020static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop, 2021 unsigned FunctionNumber) { 2022 // Add child loop information 2023 for (MachineLoop::iterator CL = Loop->begin(), E = Loop->end();CL != E; ++CL){ 2024 OS.indent((*CL)->getLoopDepth()*2) 2025 << "Child Loop BB" << FunctionNumber << "_" 2026 << (*CL)->getHeader()->getNumber() << " Depth " << (*CL)->getLoopDepth() 2027 << '\n'; 2028 PrintChildLoopComment(OS, *CL, FunctionNumber); 2029 } 2030} 2031 2032/// EmitBasicBlockLoopComments - Pretty-print comments for basic blocks. 2033static void EmitBasicBlockLoopComments(const MachineBasicBlock &MBB, 2034 const MachineLoopInfo *LI, 2035 const AsmPrinter &AP) { 2036 // Add loop depth information 2037 const MachineLoop *Loop = LI->getLoopFor(&MBB); 2038 if (Loop == 0) return; 2039 2040 MachineBasicBlock *Header = Loop->getHeader(); 2041 assert(Header && "No header for loop"); 2042 2043 // If this block is not a loop header, just print out what is the loop header 2044 // and return. 2045 if (Header != &MBB) { 2046 AP.OutStreamer.AddComment(" in Loop: Header=BB" + 2047 Twine(AP.getFunctionNumber())+"_" + 2048 Twine(Loop->getHeader()->getNumber())+ 2049 " Depth="+Twine(Loop->getLoopDepth())); 2050 return; 2051 } 2052 2053 // Otherwise, it is a loop header. Print out information about child and 2054 // parent loops. 2055 raw_ostream &OS = AP.OutStreamer.GetCommentOS(); 2056 2057 PrintParentLoopComment(OS, Loop->getParentLoop(), AP.getFunctionNumber()); 2058 2059 OS << "=>"; 2060 OS.indent(Loop->getLoopDepth()*2-2); 2061 2062 OS << "This "; 2063 if (Loop->empty()) 2064 OS << "Inner "; 2065 OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n'; 2066 2067 PrintChildLoopComment(OS, Loop, AP.getFunctionNumber()); 2068} 2069 2070 2071/// EmitBasicBlockStart - This method prints the label for the specified 2072/// MachineBasicBlock, an alignment (if present) and a comment describing 2073/// it if appropriate. 2074void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const { 2075 // Emit an alignment directive for this block, if needed. 2076 if (unsigned Align = MBB->getAlignment()) 2077 EmitAlignment(Align); 2078 2079 // If the block has its address taken, emit any labels that were used to 2080 // reference the block. It is possible that there is more than one label 2081 // here, because multiple LLVM BB's may have been RAUW'd to this block after 2082 // the references were generated. 2083 if (MBB->hasAddressTaken()) { 2084 const BasicBlock *BB = MBB->getBasicBlock(); 2085 if (isVerbose()) 2086 OutStreamer.AddComment("Block address taken"); 2087 2088 std::vector<MCSymbol*> Syms = MMI->getAddrLabelSymbolToEmit(BB); 2089 2090 for (unsigned i = 0, e = Syms.size(); i != e; ++i) 2091 OutStreamer.EmitLabel(Syms[i]); 2092 } 2093 2094 // Print some verbose block comments. 2095 if (isVerbose()) { 2096 if (const BasicBlock *BB = MBB->getBasicBlock()) 2097 if (BB->hasName()) 2098 OutStreamer.AddComment("%" + BB->getName()); 2099 EmitBasicBlockLoopComments(*MBB, LI, *this); 2100 } 2101 2102 // Print the main label for the block. 2103 if (MBB->pred_empty() || isBlockOnlyReachableByFallthrough(MBB)) { 2104 if (isVerbose() && OutStreamer.hasRawTextSupport()) { 2105 // NOTE: Want this comment at start of line, don't emit with AddComment. 2106 OutStreamer.EmitRawText(Twine(MAI->getCommentString()) + " BB#" + 2107 Twine(MBB->getNumber()) + ":"); 2108 } 2109 } else { 2110 OutStreamer.EmitLabel(MBB->getSymbol()); 2111 } 2112} 2113 2114void AsmPrinter::EmitVisibility(MCSymbol *Sym, unsigned Visibility, 2115 bool IsDefinition) const { 2116 MCSymbolAttr Attr = MCSA_Invalid; 2117 2118 switch (Visibility) { 2119 default: break; 2120 case GlobalValue::HiddenVisibility: 2121 if (IsDefinition) 2122 Attr = MAI->getHiddenVisibilityAttr(); 2123 else 2124 Attr = MAI->getHiddenDeclarationVisibilityAttr(); 2125 break; 2126 case GlobalValue::ProtectedVisibility: 2127 Attr = MAI->getProtectedVisibilityAttr(); 2128 break; 2129 } 2130 2131 if (Attr != MCSA_Invalid) 2132 OutStreamer.EmitSymbolAttribute(Sym, Attr); 2133} 2134 2135/// isBlockOnlyReachableByFallthough - Return true if the basic block has 2136/// exactly one predecessor and the control transfer mechanism between 2137/// the predecessor and this block is a fall-through. 2138bool AsmPrinter:: 2139isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const { 2140 // If this is a landing pad, it isn't a fall through. If it has no preds, 2141 // then nothing falls through to it. 2142 if (MBB->isLandingPad() || MBB->pred_empty()) 2143 return false; 2144 2145 // If there isn't exactly one predecessor, it can't be a fall through. 2146 MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI; 2147 ++PI2; 2148 if (PI2 != MBB->pred_end()) 2149 return false; 2150 2151 // The predecessor has to be immediately before this block. 2152 MachineBasicBlock *Pred = *PI; 2153 2154 if (!Pred->isLayoutSuccessor(MBB)) 2155 return false; 2156 2157 // If the block is completely empty, then it definitely does fall through. 2158 if (Pred->empty()) 2159 return true; 2160 2161 // Check the terminators in the previous blocks 2162 for (MachineBasicBlock::iterator II = Pred->getFirstTerminator(), 2163 IE = Pred->end(); II != IE; ++II) { 2164 MachineInstr &MI = *II; 2165 2166 // If it is not a simple branch, we are in a table somewhere. 2167 if (!MI.isBranch() || MI.isIndirectBranch()) 2168 return false; 2169 2170 // If we are the operands of one of the branches, this is not 2171 // a fall through. 2172 for (MachineInstr::mop_iterator OI = MI.operands_begin(), 2173 OE = MI.operands_end(); OI != OE; ++OI) { 2174 const MachineOperand& OP = *OI; 2175 if (OP.isJTI()) 2176 return false; 2177 if (OP.isMBB() && OP.getMBB() == MBB) 2178 return false; 2179 } 2180 } 2181 2182 return true; 2183} 2184 2185 2186 2187GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) { 2188 if (!S->usesMetadata()) 2189 return 0; 2190 2191 gcp_map_type &GCMap = getGCMap(GCMetadataPrinters); 2192 gcp_map_type::iterator GCPI = GCMap.find(S); 2193 if (GCPI != GCMap.end()) 2194 return GCPI->second; 2195 2196 const char *Name = S->getName().c_str(); 2197 2198 for (GCMetadataPrinterRegistry::iterator 2199 I = GCMetadataPrinterRegistry::begin(), 2200 E = GCMetadataPrinterRegistry::end(); I != E; ++I) 2201 if (strcmp(Name, I->getName()) == 0) { 2202 GCMetadataPrinter *GMP = I->instantiate(); 2203 GMP->S = S; 2204 GCMap.insert(std::make_pair(S, GMP)); 2205 return GMP; 2206 } 2207 2208 report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name)); 2209} 2210