1 //===-- AsmPrinter.cpp - Common AsmPrinter code ---------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the AsmPrinter class.
12 //===----------------------------------------------------------------------===//
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/TargetAsmInfo.h"
37 #include "llvm/Target/TargetData.h"
38 #include "llvm/Target/TargetInstrInfo.h"
39 #include "llvm/Target/TargetLowering.h"
40 #include "llvm/Target/TargetLoweringObjectFile.h"
41 #include "llvm/Target/TargetOptions.h"
42 #include "llvm/Target/TargetRegisterInfo.h"
43 #include "llvm/Assembly/Writer.h"
44 #include "llvm/ADT/SmallString.h"
45 #include "llvm/ADT/Statistic.h"
46 #include "llvm/Support/ErrorHandling.h"
47 #include "llvm/Support/Format.h"
48 #include "llvm/Support/Timer.h"
51 static const char *DWARFGroupName
= "DWARF Emission";
52 static const char *DbgTimerName
= "DWARF Debug Writer";
53 static const char *EHTimerName
= "DWARF Exception Writer";
55 STATISTIC(EmittedInsts
, "Number of machine instrs printed");
57 char AsmPrinter::ID
= 0;
59 typedef DenseMap
<GCStrategy
*,GCMetadataPrinter
*> gcp_map_type
;
60 static gcp_map_type
&getGCMap(void *&P
) {
62 P
= new gcp_map_type();
63 return *(gcp_map_type
*)P
;
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
70 static unsigned getGVAlignmentLog2(const GlobalValue
*GV
, const TargetData
&TD
,
71 unsigned InBits
= 0) {
73 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GV
))
74 NumBits
= TD
.getPreferredAlignmentLog(GVar
);
76 // If InBits is specified, round it to it.
80 // If the GV has a specified alignment, take it into account.
81 if (GV
->getAlignment() == 0)
84 unsigned GVAlign
= Log2_32(GV
->getAlignment());
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())
96 AsmPrinter::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 GCMetadataPrinters
= 0;
104 VerboseAsm
= Streamer
.isVerboseAsm();
107 AsmPrinter::~AsmPrinter() {
108 assert(DD
== 0 && DE
== 0 && "Debug/EH info didn't get finalized");
110 if (GCMetadataPrinters
!= 0) {
111 gcp_map_type
&GCMap
= getGCMap(GCMetadataPrinters
);
113 for (gcp_map_type::iterator I
= GCMap
.begin(), E
= GCMap
.end(); I
!= E
; ++I
)
116 GCMetadataPrinters
= 0;
122 /// getFunctionNumber - Return a unique ID for the current function.
124 unsigned AsmPrinter::getFunctionNumber() const {
125 return MF
->getFunctionNumber();
128 const TargetLoweringObjectFile
&AsmPrinter::getObjFileLowering() const {
129 return TM
.getTargetLowering()->getObjFileLowering();
133 /// getTargetData - Return information about data layout.
134 const TargetData
&AsmPrinter::getTargetData() const {
135 return *TM
.getTargetData();
138 /// getCurrentSection() - Return the current section we are emitting to.
139 const MCSection
*AsmPrinter::getCurrentSection() const {
140 return OutStreamer
.getCurrentSection();
145 void AsmPrinter::getAnalysisUsage(AnalysisUsage
&AU
) const {
146 AU
.setPreservesAll();
147 MachineFunctionPass::getAnalysisUsage(AU
);
148 AU
.addRequired
<MachineModuleInfo
>();
149 AU
.addRequired
<GCModuleInfo
>();
151 AU
.addRequired
<MachineLoopInfo
>();
154 bool AsmPrinter::doInitialization(Module
&M
) {
155 MMI
= getAnalysisIfAvailable
<MachineModuleInfo
>();
156 MMI
->AnalyzeModule(M
);
158 // Initialize TargetLoweringObjectFile.
159 const_cast<TargetLoweringObjectFile
&>(getObjFileLowering())
160 .Initialize(OutContext
, TM
);
162 Mang
= new Mangler(OutContext
, *TM
.getTargetData());
164 // Allow the target to emit any magic that it wants at the start of the file.
165 EmitStartOfAsmFile(M
);
167 // Very minimal debug info. It is ignored if we emit actual debug info. If we
168 // don't, this at least helps the user find where a global came from.
169 if (MAI
->hasSingleParameterDotFile()) {
171 OutStreamer
.EmitFileDirective(M
.getModuleIdentifier());
174 GCModuleInfo
*MI
= getAnalysisIfAvailable
<GCModuleInfo
>();
175 assert(MI
&& "AsmPrinter didn't require GCModuleInfo?");
176 for (GCModuleInfo::iterator I
= MI
->begin(), E
= MI
->end(); I
!= E
; ++I
)
177 if (GCMetadataPrinter
*MP
= GetOrCreateGCPrinter(*I
))
178 MP
->beginAssembly(*this);
180 // Emit module-level inline asm if it exists.
181 if (!M
.getModuleInlineAsm().empty()) {
182 OutStreamer
.AddComment("Start of file scope inline assembly");
183 OutStreamer
.AddBlankLine();
184 EmitInlineAsm(M
.getModuleInlineAsm()+"\n");
185 OutStreamer
.AddComment("End of file scope inline assembly");
186 OutStreamer
.AddBlankLine();
189 if (MAI
->doesSupportDebugInformation())
190 DD
= new DwarfDebug(this, &M
);
192 switch (MAI
->getExceptionHandlingType()) {
193 case ExceptionHandling::None
:
195 case ExceptionHandling::SjLj
:
196 case ExceptionHandling::DwarfCFI
:
197 DE
= new DwarfCFIException(this);
199 case ExceptionHandling::ARM
:
200 DE
= new ARMException(this);
202 case ExceptionHandling::Win64
:
203 DE
= new Win64Exception(this);
207 llvm_unreachable("Unknown exception type.");
210 void AsmPrinter::EmitLinkage(unsigned Linkage
, MCSymbol
*GVSym
) const {
211 switch ((GlobalValue::LinkageTypes
)Linkage
) {
212 case GlobalValue::CommonLinkage
:
213 case GlobalValue::LinkOnceAnyLinkage
:
214 case GlobalValue::LinkOnceODRLinkage
:
215 case GlobalValue::WeakAnyLinkage
:
216 case GlobalValue::WeakODRLinkage
:
217 case GlobalValue::LinkerPrivateWeakLinkage
:
218 case GlobalValue::LinkerPrivateWeakDefAutoLinkage
:
219 if (MAI
->getWeakDefDirective() != 0) {
221 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_Global
);
223 if ((GlobalValue::LinkageTypes
)Linkage
!=
224 GlobalValue::LinkerPrivateWeakDefAutoLinkage
)
225 // .weak_definition _foo
226 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_WeakDefinition
);
228 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_WeakDefAutoPrivate
);
229 } else if (MAI
->getLinkOnceDirective() != 0) {
231 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_Global
);
232 //NOTE: linkonce is handled by the section the symbol was assigned to.
235 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_Weak
);
238 case GlobalValue::DLLExportLinkage
:
239 case GlobalValue::AppendingLinkage
:
240 // FIXME: appending linkage variables should go into a section of
241 // their name or something. For now, just emit them as external.
242 case GlobalValue::ExternalLinkage
:
243 // If external or appending, declare as a global symbol.
245 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_Global
);
247 case GlobalValue::PrivateLinkage
:
248 case GlobalValue::InternalLinkage
:
249 case GlobalValue::LinkerPrivateLinkage
:
252 llvm_unreachable("Unknown linkage type!");
257 /// EmitGlobalVariable - Emit the specified global variable to the .s file.
258 void AsmPrinter::EmitGlobalVariable(const GlobalVariable
*GV
) {
259 if (GV
->hasInitializer()) {
260 // Check to see if this is a special global used by LLVM, if so, emit it.
261 if (EmitSpecialLLVMGlobal(GV
))
265 WriteAsOperand(OutStreamer
.GetCommentOS(), GV
,
266 /*PrintType=*/false, GV
->getParent());
267 OutStreamer
.GetCommentOS() << '\n';
271 MCSymbol
*GVSym
= Mang
->getSymbol(GV
);
272 EmitVisibility(GVSym
, GV
->getVisibility(), !GV
->isDeclaration());
274 if (!GV
->hasInitializer()) // External globals require no extra code.
277 if (MAI
->hasDotTypeDotSizeDirective())
278 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_ELF_TypeObject
);
280 SectionKind GVKind
= TargetLoweringObjectFile::getKindForGlobal(GV
, TM
);
282 const TargetData
*TD
= TM
.getTargetData();
283 uint64_t Size
= TD
->getTypeAllocSize(GV
->getType()->getElementType());
285 // If the alignment is specified, we *must* obey it. Overaligning a global
286 // with a specified alignment is a prompt way to break globals emitted to
287 // sections and expected to be contiguous (e.g. ObjC metadata).
288 unsigned AlignLog
= getGVAlignmentLog2(GV
, *TD
);
290 // Handle common and BSS local symbols (.lcomm).
291 if (GVKind
.isCommon() || GVKind
.isBSSLocal()) {
292 if (Size
== 0) Size
= 1; // .comm Foo, 0 is undefined, avoid it.
294 // Handle common symbols.
295 if (GVKind
.isCommon()) {
296 unsigned Align
= 1 << AlignLog
;
297 if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
301 OutStreamer
.EmitCommonSymbol(GVSym
, Size
, Align
);
305 // Handle local BSS symbols.
306 if (MAI
->hasMachoZeroFillDirective()) {
307 const MCSection
*TheSection
=
308 getObjFileLowering().SectionForGlobal(GV
, GVKind
, Mang
, TM
);
309 // .zerofill __DATA, __bss, _foo, 400, 5
310 OutStreamer
.EmitZerofill(TheSection
, GVSym
, Size
, 1 << AlignLog
);
314 if (MAI
->hasLCOMMDirective()) {
316 OutStreamer
.EmitLocalCommonSymbol(GVSym
, Size
);
320 unsigned Align
= 1 << AlignLog
;
321 if (!getObjFileLowering().getCommDirectiveSupportsAlignment())
325 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_Local
);
327 OutStreamer
.EmitCommonSymbol(GVSym
, Size
, Align
);
331 const MCSection
*TheSection
=
332 getObjFileLowering().SectionForGlobal(GV
, GVKind
, Mang
, TM
);
334 // Handle the zerofill directive on darwin, which is a special form of BSS
336 if (GVKind
.isBSSExtern() && MAI
->hasMachoZeroFillDirective()) {
337 if (Size
== 0) Size
= 1; // zerofill of 0 bytes is undefined.
340 OutStreamer
.EmitSymbolAttribute(GVSym
, MCSA_Global
);
341 // .zerofill __DATA, __common, _foo, 400, 5
342 OutStreamer
.EmitZerofill(TheSection
, GVSym
, Size
, 1 << AlignLog
);
346 // Handle thread local data for mach-o which requires us to output an
347 // additional structure of data and mangle the original symbol so that we
348 // can reference it later.
350 // TODO: This should become an "emit thread local global" method on TLOF.
351 // All of this macho specific stuff should be sunk down into TLOFMachO and
352 // stuff like "TLSExtraDataSection" should no longer be part of the parent
353 // TLOF class. This will also make it more obvious that stuff like
354 // MCStreamer::EmitTBSSSymbol is macho specific and only called from macho
356 if (GVKind
.isThreadLocal() && MAI
->hasMachoTBSSDirective()) {
357 // Emit the .tbss symbol
359 OutContext
.GetOrCreateSymbol(GVSym
->getName() + Twine("$tlv$init"));
361 if (GVKind
.isThreadBSS())
362 OutStreamer
.EmitTBSSSymbol(TheSection
, MangSym
, Size
, 1 << AlignLog
);
363 else if (GVKind
.isThreadData()) {
364 OutStreamer
.SwitchSection(TheSection
);
366 EmitAlignment(AlignLog
, GV
);
367 OutStreamer
.EmitLabel(MangSym
);
369 EmitGlobalConstant(GV
->getInitializer());
372 OutStreamer
.AddBlankLine();
374 // Emit the variable struct for the runtime.
375 const MCSection
*TLVSect
376 = getObjFileLowering().getTLSExtraDataSection();
378 OutStreamer
.SwitchSection(TLVSect
);
379 // Emit the linkage here.
380 EmitLinkage(GV
->getLinkage(), GVSym
);
381 OutStreamer
.EmitLabel(GVSym
);
383 // Three pointers in size:
384 // - __tlv_bootstrap - used to make sure support exists
385 // - spare pointer, used when mapped by the runtime
386 // - pointer to mangled symbol above with initializer
387 unsigned PtrSize
= TD
->getPointerSizeInBits()/8;
388 OutStreamer
.EmitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"),
390 OutStreamer
.EmitIntValue(0, PtrSize
, 0);
391 OutStreamer
.EmitSymbolValue(MangSym
, PtrSize
, 0);
393 OutStreamer
.AddBlankLine();
397 OutStreamer
.SwitchSection(TheSection
);
399 EmitLinkage(GV
->getLinkage(), GVSym
);
400 EmitAlignment(AlignLog
, GV
);
402 OutStreamer
.EmitLabel(GVSym
);
404 EmitGlobalConstant(GV
->getInitializer());
406 if (MAI
->hasDotTypeDotSizeDirective())
408 OutStreamer
.EmitELFSize(GVSym
, MCConstantExpr::Create(Size
, OutContext
));
410 OutStreamer
.AddBlankLine();
413 /// EmitFunctionHeader - This method emits the header for the current
415 void AsmPrinter::EmitFunctionHeader() {
416 // Print out constants referenced by the function
419 // Print the 'header' of function.
420 const Function
*F
= MF
->getFunction();
422 OutStreamer
.SwitchSection(getObjFileLowering().SectionForGlobal(F
, Mang
, TM
));
423 EmitVisibility(CurrentFnSym
, F
->getVisibility());
425 EmitLinkage(F
->getLinkage(), CurrentFnSym
);
426 EmitAlignment(MF
->getAlignment(), F
);
428 if (MAI
->hasDotTypeDotSizeDirective())
429 OutStreamer
.EmitSymbolAttribute(CurrentFnSym
, MCSA_ELF_TypeFunction
);
432 WriteAsOperand(OutStreamer
.GetCommentOS(), F
,
433 /*PrintType=*/false, F
->getParent());
434 OutStreamer
.GetCommentOS() << '\n';
437 // Emit the CurrentFnSym. This is a virtual function to allow targets to
438 // do their wild and crazy things as required.
439 EmitFunctionEntryLabel();
441 // If the function had address-taken blocks that got deleted, then we have
442 // references to the dangling symbols. Emit them at the start of the function
443 // so that we don't get references to undefined symbols.
444 std::vector
<MCSymbol
*> DeadBlockSyms
;
445 MMI
->takeDeletedSymbolsForFunction(F
, DeadBlockSyms
);
446 for (unsigned i
= 0, e
= DeadBlockSyms
.size(); i
!= e
; ++i
) {
447 OutStreamer
.AddComment("Address taken block that was later removed");
448 OutStreamer
.EmitLabel(DeadBlockSyms
[i
]);
451 // Add some workaround for linkonce linkage on Cygwin\MinGW.
452 if (MAI
->getLinkOnceDirective() != 0 &&
453 (F
->hasLinkOnceLinkage() || F
->hasWeakLinkage())) {
454 // FIXME: What is this?
456 OutContext
.GetOrCreateSymbol(Twine("Lllvm$workaround$fake$stub$")+
457 CurrentFnSym
->getName());
458 OutStreamer
.EmitLabel(FakeStub
);
461 // Emit pre-function debug and/or EH information.
463 NamedRegionTimer
T(EHTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
464 DE
->BeginFunction(MF
);
467 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
468 DD
->beginFunction(MF
);
472 /// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
473 /// function. This can be overridden by targets as required to do custom stuff.
474 void AsmPrinter::EmitFunctionEntryLabel() {
475 // The function label could have already been emitted if two symbols end up
476 // conflicting due to asm renaming. Detect this and emit an error.
477 if (CurrentFnSym
->isUndefined())
478 return OutStreamer
.EmitLabel(CurrentFnSym
);
480 report_fatal_error("'" + Twine(CurrentFnSym
->getName()) +
481 "' label emitted multiple times to assembly file");
485 /// EmitComments - Pretty-print comments for instructions.
486 static void EmitComments(const MachineInstr
&MI
, raw_ostream
&CommentOS
) {
487 const MachineFunction
*MF
= MI
.getParent()->getParent();
488 const TargetMachine
&TM
= MF
->getTarget();
490 // Check for spills and reloads
493 const MachineFrameInfo
*FrameInfo
= MF
->getFrameInfo();
495 // We assume a single instruction only has a spill or reload, not
497 const MachineMemOperand
*MMO
;
498 if (TM
.getInstrInfo()->isLoadFromStackSlotPostFE(&MI
, FI
)) {
499 if (FrameInfo
->isSpillSlotObjectIndex(FI
)) {
500 MMO
= *MI
.memoperands_begin();
501 CommentOS
<< MMO
->getSize() << "-byte Reload\n";
503 } else if (TM
.getInstrInfo()->hasLoadFromStackSlot(&MI
, MMO
, FI
)) {
504 if (FrameInfo
->isSpillSlotObjectIndex(FI
))
505 CommentOS
<< MMO
->getSize() << "-byte Folded Reload\n";
506 } else if (TM
.getInstrInfo()->isStoreToStackSlotPostFE(&MI
, FI
)) {
507 if (FrameInfo
->isSpillSlotObjectIndex(FI
)) {
508 MMO
= *MI
.memoperands_begin();
509 CommentOS
<< MMO
->getSize() << "-byte Spill\n";
511 } else if (TM
.getInstrInfo()->hasStoreToStackSlot(&MI
, MMO
, FI
)) {
512 if (FrameInfo
->isSpillSlotObjectIndex(FI
))
513 CommentOS
<< MMO
->getSize() << "-byte Folded Spill\n";
516 // Check for spill-induced copies
517 if (MI
.getAsmPrinterFlag(MachineInstr::ReloadReuse
))
518 CommentOS
<< " Reload Reuse\n";
521 /// EmitImplicitDef - This method emits the specified machine instruction
522 /// that is an implicit def.
523 static void EmitImplicitDef(const MachineInstr
*MI
, AsmPrinter
&AP
) {
524 unsigned RegNo
= MI
->getOperand(0).getReg();
525 AP
.OutStreamer
.AddComment(Twine("implicit-def: ") +
526 AP
.TM
.getRegisterInfo()->getName(RegNo
));
527 AP
.OutStreamer
.AddBlankLine();
530 static void EmitKill(const MachineInstr
*MI
, AsmPrinter
&AP
) {
531 std::string Str
= "kill:";
532 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
533 const MachineOperand
&Op
= MI
->getOperand(i
);
534 assert(Op
.isReg() && "KILL instruction must have only register operands");
536 Str
+= AP
.TM
.getRegisterInfo()->getName(Op
.getReg());
537 Str
+= (Op
.isDef() ? "<def>" : "<kill>");
539 AP
.OutStreamer
.AddComment(Str
);
540 AP
.OutStreamer
.AddBlankLine();
543 /// EmitDebugValueComment - This method handles the target-independent form
544 /// of DBG_VALUE, returning true if it was able to do so. A false return
545 /// means the target will need to handle MI in EmitInstruction.
546 static bool EmitDebugValueComment(const MachineInstr
*MI
, AsmPrinter
&AP
) {
547 // This code handles only the 3-operand target-independent form.
548 if (MI
->getNumOperands() != 3)
551 SmallString
<128> Str
;
552 raw_svector_ostream
OS(Str
);
553 OS
<< '\t' << AP
.MAI
->getCommentString() << "DEBUG_VALUE: ";
555 // cast away const; DIetc do not take const operands for some reason.
556 DIVariable
V(const_cast<MDNode
*>(MI
->getOperand(2).getMetadata()));
557 if (V
.getContext().isSubprogram())
558 OS
<< DISubprogram(V
.getContext()).getDisplayName() << ":";
559 OS
<< V
.getName() << " <- ";
561 // Register or immediate value. Register 0 means undef.
562 if (MI
->getOperand(0).isFPImm()) {
563 APFloat APF
= APFloat(MI
->getOperand(0).getFPImm()->getValueAPF());
564 if (MI
->getOperand(0).getFPImm()->getType()->isFloatTy()) {
565 OS
<< (double)APF
.convertToFloat();
566 } else if (MI
->getOperand(0).getFPImm()->getType()->isDoubleTy()) {
567 OS
<< APF
.convertToDouble();
569 // There is no good way to print long double. Convert a copy to
570 // double. Ah well, it's only a comment.
572 APF
.convert(APFloat::IEEEdouble
, APFloat::rmNearestTiesToEven
,
574 OS
<< "(long double) " << APF
.convertToDouble();
576 } else if (MI
->getOperand(0).isImm()) {
577 OS
<< MI
->getOperand(0).getImm();
578 } else if (MI
->getOperand(0).isCImm()) {
579 MI
->getOperand(0).getCImm()->getValue().print(OS
, false /*isSigned*/);
581 assert(MI
->getOperand(0).isReg() && "Unknown operand type");
582 if (MI
->getOperand(0).getReg() == 0) {
583 // Suppress offset, it is not meaningful here.
585 // NOTE: Want this comment at start of line, don't emit with AddComment.
586 AP
.OutStreamer
.EmitRawText(OS
.str());
589 OS
<< AP
.TM
.getRegisterInfo()->getName(MI
->getOperand(0).getReg());
592 OS
<< '+' << MI
->getOperand(1).getImm();
593 // NOTE: Want this comment at start of line, don't emit with AddComment.
594 AP
.OutStreamer
.EmitRawText(OS
.str());
598 AsmPrinter::CFIMoveType
AsmPrinter::needsCFIMoves() {
599 if (MAI
->getExceptionHandlingType() == ExceptionHandling::DwarfCFI
&&
600 MF
->getFunction()->needsUnwindTableEntry())
603 if (MMI
->hasDebugInfo())
609 bool AsmPrinter::needsSEHMoves() {
610 return MAI
->getExceptionHandlingType() == ExceptionHandling::Win64
&&
611 MF
->getFunction()->needsUnwindTableEntry();
614 void AsmPrinter::emitPrologLabel(const MachineInstr
&MI
) {
615 MCSymbol
*Label
= MI
.getOperand(0).getMCSymbol();
617 if (MAI
->getExceptionHandlingType() != ExceptionHandling::DwarfCFI
)
620 if (needsCFIMoves() == CFI_M_None
)
623 MachineModuleInfo
&MMI
= MF
->getMMI();
624 std::vector
<MachineMove
> &Moves
= MMI
.getFrameMoves();
625 bool FoundOne
= false;
627 for (std::vector
<MachineMove
>::iterator I
= Moves
.begin(),
628 E
= Moves
.end(); I
!= E
; ++I
) {
629 if (I
->getLabel() == Label
) {
630 EmitCFIFrameMove(*I
);
637 /// EmitFunctionBody - This method emits the body and trailer for a
639 void AsmPrinter::EmitFunctionBody() {
640 // Emit target-specific gunk before the function body.
641 EmitFunctionBodyStart();
643 bool ShouldPrintDebugScopes
= DD
&& MMI
->hasDebugInfo();
645 // Print out code for the function.
646 bool HasAnyRealCode
= false;
647 const MachineInstr
*LastMI
= 0;
648 for (MachineFunction::const_iterator I
= MF
->begin(), E
= MF
->end();
650 // Print a label for the basic block.
651 EmitBasicBlockStart(I
);
652 for (MachineBasicBlock::const_iterator II
= I
->begin(), IE
= I
->end();
656 // Print the assembly for the instruction.
657 if (!II
->isLabel() && !II
->isImplicitDef() && !II
->isKill() &&
658 !II
->isDebugValue()) {
659 HasAnyRealCode
= true;
663 if (ShouldPrintDebugScopes
) {
664 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
665 DD
->beginInstruction(II
);
669 EmitComments(*II
, OutStreamer
.GetCommentOS());
671 switch (II
->getOpcode()) {
672 case TargetOpcode::PROLOG_LABEL
:
673 emitPrologLabel(*II
);
676 case TargetOpcode::EH_LABEL
:
677 case TargetOpcode::GC_LABEL
:
678 OutStreamer
.EmitLabel(II
->getOperand(0).getMCSymbol());
680 case TargetOpcode::INLINEASM
:
683 case TargetOpcode::DBG_VALUE
:
685 if (!EmitDebugValueComment(II
, *this))
689 case TargetOpcode::IMPLICIT_DEF
:
690 if (isVerbose()) EmitImplicitDef(II
, *this);
692 case TargetOpcode::KILL
:
693 if (isVerbose()) EmitKill(II
, *this);
696 if (!TM
.hasMCUseLoc())
697 MCLineEntry::Make(&OutStreamer
, getCurrentSection());
703 if (ShouldPrintDebugScopes
) {
704 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
705 DD
->endInstruction(II
);
710 // If the last instruction was a prolog label, then we have a situation where
711 // we emitted a prolog but no function body. This results in the ending prolog
712 // label equaling the end of function label and an invalid "row" in the
713 // FDE. We need to emit a noop in this situation so that the FDE's rows are
715 bool RequiresNoop
= LastMI
&& LastMI
->isPrologLabel();
717 // If the function is empty and the object file uses .subsections_via_symbols,
718 // then we need to emit *something* to the function body to prevent the
719 // labels from collapsing together. Just emit a noop.
720 if ((MAI
->hasSubsectionsViaSymbols() && !HasAnyRealCode
) || RequiresNoop
) {
722 TM
.getInstrInfo()->getNoopForMachoTarget(Noop
);
723 if (Noop
.getOpcode()) {
724 OutStreamer
.AddComment("avoids zero-length function");
725 OutStreamer
.EmitInstruction(Noop
);
726 } else // Target not mc-ized yet.
727 OutStreamer
.EmitRawText(StringRef("\tnop\n"));
730 // Emit target-specific gunk after the function body.
731 EmitFunctionBodyEnd();
733 // If the target wants a .size directive for the size of the function, emit
735 if (MAI
->hasDotTypeDotSizeDirective()) {
736 // Create a symbol for the end of function, so we can get the size as
737 // difference between the function label and the temp label.
738 MCSymbol
*FnEndLabel
= OutContext
.CreateTempSymbol();
739 OutStreamer
.EmitLabel(FnEndLabel
);
741 const MCExpr
*SizeExp
=
742 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel
, OutContext
),
743 MCSymbolRefExpr::Create(CurrentFnSym
, OutContext
),
745 OutStreamer
.EmitELFSize(CurrentFnSym
, SizeExp
);
748 // Emit post-function debug information.
750 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
754 NamedRegionTimer
T(EHTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
759 // Print out jump tables referenced by the function.
762 OutStreamer
.AddBlankLine();
765 /// getDebugValueLocation - Get location information encoded by DBG_VALUE
767 MachineLocation
AsmPrinter::
768 getDebugValueLocation(const MachineInstr
*MI
) const {
769 // Target specific DBG_VALUE instructions are handled by each target.
770 return MachineLocation();
773 /// EmitDwarfRegOp - Emit dwarf register operation.
774 void AsmPrinter::EmitDwarfRegOp(const MachineLocation
&MLoc
) const {
775 const TargetRegisterInfo
*TRI
= TM
.getRegisterInfo();
776 int Reg
= TRI
->getDwarfRegNum(MLoc
.getReg(), false);
778 for (const unsigned *SR
= TRI
->getSuperRegisters(MLoc
.getReg());
779 *SR
&& Reg
< 0; ++SR
) {
780 Reg
= TRI
->getDwarfRegNum(*SR
, false);
781 // FIXME: Get the bit range this register uses of the superregister
782 // so that we can produce a DW_OP_bit_piece
785 // FIXME: Handle cases like a super register being encoded as
786 // DW_OP_reg 32 DW_OP_piece 4 DW_OP_reg 33
788 // FIXME: We have no reasonable way of handling errors in here. The
789 // caller might be in the middle of an dwarf expression. We should
790 // probably assert that Reg >= 0 once debug info generation is more mature.
792 if (int Offset
= MLoc
.getOffset()) {
794 OutStreamer
.AddComment(
795 dwarf::OperationEncodingString(dwarf::DW_OP_breg0
+ Reg
));
796 EmitInt8(dwarf::DW_OP_breg0
+ Reg
);
798 OutStreamer
.AddComment("DW_OP_bregx");
799 EmitInt8(dwarf::DW_OP_bregx
);
800 OutStreamer
.AddComment(Twine(Reg
));
806 OutStreamer
.AddComment(
807 dwarf::OperationEncodingString(dwarf::DW_OP_reg0
+ Reg
));
808 EmitInt8(dwarf::DW_OP_reg0
+ Reg
);
810 OutStreamer
.AddComment("DW_OP_regx");
811 EmitInt8(dwarf::DW_OP_regx
);
812 OutStreamer
.AddComment(Twine(Reg
));
817 // FIXME: Produce a DW_OP_bit_piece if we used a superregister
820 bool AsmPrinter::doFinalization(Module
&M
) {
821 // Emit global variables.
822 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
824 EmitGlobalVariable(I
);
826 // Emit visibility info for declarations
827 for (Module::const_iterator I
= M
.begin(), E
= M
.end(); I
!= E
; ++I
) {
828 const Function
&F
= *I
;
829 if (!F
.isDeclaration())
831 GlobalValue::VisibilityTypes V
= F
.getVisibility();
832 if (V
== GlobalValue::DefaultVisibility
)
835 MCSymbol
*Name
= Mang
->getSymbol(&F
);
836 EmitVisibility(Name
, V
, false);
839 // Finalize debug and EH information.
842 NamedRegionTimer
T(EHTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
849 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
855 // If the target wants to know about weak references, print them all.
856 if (MAI
->getWeakRefDirective()) {
857 // FIXME: This is not lazy, it would be nice to only print weak references
858 // to stuff that is actually used. Note that doing so would require targets
859 // to notice uses in operands (due to constant exprs etc). This should
860 // happen with the MC stuff eventually.
862 // Print out module-level global variables here.
863 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
865 if (!I
->hasExternalWeakLinkage()) continue;
866 OutStreamer
.EmitSymbolAttribute(Mang
->getSymbol(I
), MCSA_WeakReference
);
869 for (Module::const_iterator I
= M
.begin(), E
= M
.end(); I
!= E
; ++I
) {
870 if (!I
->hasExternalWeakLinkage()) continue;
871 OutStreamer
.EmitSymbolAttribute(Mang
->getSymbol(I
), MCSA_WeakReference
);
875 if (MAI
->hasSetDirective()) {
876 OutStreamer
.AddBlankLine();
877 for (Module::const_alias_iterator I
= M
.alias_begin(), E
= M
.alias_end();
879 MCSymbol
*Name
= Mang
->getSymbol(I
);
881 const GlobalValue
*GV
= cast
<GlobalValue
>(I
->getAliasedGlobal());
882 MCSymbol
*Target
= Mang
->getSymbol(GV
);
884 if (I
->hasExternalLinkage() || !MAI
->getWeakRefDirective())
885 OutStreamer
.EmitSymbolAttribute(Name
, MCSA_Global
);
886 else if (I
->hasWeakLinkage())
887 OutStreamer
.EmitSymbolAttribute(Name
, MCSA_WeakReference
);
889 assert(I
->hasLocalLinkage() && "Invalid alias linkage");
891 EmitVisibility(Name
, I
->getVisibility());
893 // Emit the directives as assignments aka .set:
894 OutStreamer
.EmitAssignment(Name
,
895 MCSymbolRefExpr::Create(Target
, OutContext
));
899 GCModuleInfo
*MI
= getAnalysisIfAvailable
<GCModuleInfo
>();
900 assert(MI
&& "AsmPrinter didn't require GCModuleInfo?");
901 for (GCModuleInfo::iterator I
= MI
->end(), E
= MI
->begin(); I
!= E
; )
902 if (GCMetadataPrinter
*MP
= GetOrCreateGCPrinter(*--I
))
903 MP
->finishAssembly(*this);
905 // If we don't have any trampolines, then we don't require stack memory
906 // to be executable. Some targets have a directive to declare this.
907 Function
*InitTrampolineIntrinsic
= M
.getFunction("llvm.init.trampoline");
908 if (!InitTrampolineIntrinsic
|| InitTrampolineIntrinsic
->use_empty())
909 if (const MCSection
*S
= MAI
->getNonexecutableStackSection(OutContext
))
910 OutStreamer
.SwitchSection(S
);
912 // Allow the target to emit any magic that it wants at the end of the file,
913 // after everything else has gone out.
916 delete Mang
; Mang
= 0;
919 OutStreamer
.Finish();
923 void AsmPrinter::SetupMachineFunction(MachineFunction
&MF
) {
925 // Get the function symbol.
926 CurrentFnSym
= Mang
->getSymbol(MF
.getFunction());
929 LI
= &getAnalysis
<MachineLoopInfo
>();
933 // SectionCPs - Keep track the alignment, constpool entries per Section.
937 SmallVector
<unsigned, 4> CPEs
;
938 SectionCPs(const MCSection
*s
, unsigned a
) : S(s
), Alignment(a
) {}
942 /// EmitConstantPool - Print to the current output stream assembly
943 /// representations of the constants in the constant pool MCP. This is
944 /// used to print out constants which have been "spilled to memory" by
945 /// the code generator.
947 void AsmPrinter::EmitConstantPool() {
948 const MachineConstantPool
*MCP
= MF
->getConstantPool();
949 const std::vector
<MachineConstantPoolEntry
> &CP
= MCP
->getConstants();
950 if (CP
.empty()) return;
952 // Calculate sections for constant pool entries. We collect entries to go into
953 // the same section together to reduce amount of section switch statements.
954 SmallVector
<SectionCPs
, 4> CPSections
;
955 for (unsigned i
= 0, e
= CP
.size(); i
!= e
; ++i
) {
956 const MachineConstantPoolEntry
&CPE
= CP
[i
];
957 unsigned Align
= CPE
.getAlignment();
960 switch (CPE
.getRelocationInfo()) {
961 default: llvm_unreachable("Unknown section kind");
962 case 2: Kind
= SectionKind::getReadOnlyWithRel(); break;
964 Kind
= SectionKind::getReadOnlyWithRelLocal();
967 switch (TM
.getTargetData()->getTypeAllocSize(CPE
.getType())) {
968 case 4: Kind
= SectionKind::getMergeableConst4(); break;
969 case 8: Kind
= SectionKind::getMergeableConst8(); break;
970 case 16: Kind
= SectionKind::getMergeableConst16();break;
971 default: Kind
= SectionKind::getMergeableConst(); break;
975 const MCSection
*S
= getObjFileLowering().getSectionForConstant(Kind
);
977 // The number of sections are small, just do a linear search from the
978 // last section to the first.
980 unsigned SecIdx
= CPSections
.size();
981 while (SecIdx
!= 0) {
982 if (CPSections
[--SecIdx
].S
== S
) {
988 SecIdx
= CPSections
.size();
989 CPSections
.push_back(SectionCPs(S
, Align
));
992 if (Align
> CPSections
[SecIdx
].Alignment
)
993 CPSections
[SecIdx
].Alignment
= Align
;
994 CPSections
[SecIdx
].CPEs
.push_back(i
);
997 // Now print stuff into the calculated sections.
998 for (unsigned i
= 0, e
= CPSections
.size(); i
!= e
; ++i
) {
999 OutStreamer
.SwitchSection(CPSections
[i
].S
);
1000 EmitAlignment(Log2_32(CPSections
[i
].Alignment
));
1002 unsigned Offset
= 0;
1003 for (unsigned j
= 0, ee
= CPSections
[i
].CPEs
.size(); j
!= ee
; ++j
) {
1004 unsigned CPI
= CPSections
[i
].CPEs
[j
];
1005 MachineConstantPoolEntry CPE
= CP
[CPI
];
1007 // Emit inter-object padding for alignment.
1008 unsigned AlignMask
= CPE
.getAlignment() - 1;
1009 unsigned NewOffset
= (Offset
+ AlignMask
) & ~AlignMask
;
1010 OutStreamer
.EmitFill(NewOffset
- Offset
, 0/*fillval*/, 0/*addrspace*/);
1012 const Type
*Ty
= CPE
.getType();
1013 Offset
= NewOffset
+ TM
.getTargetData()->getTypeAllocSize(Ty
);
1014 OutStreamer
.EmitLabel(GetCPISymbol(CPI
));
1016 if (CPE
.isMachineConstantPoolEntry())
1017 EmitMachineConstantPoolValue(CPE
.Val
.MachineCPVal
);
1019 EmitGlobalConstant(CPE
.Val
.ConstVal
);
1024 /// EmitJumpTableInfo - Print assembly representations of the jump tables used
1025 /// by the current function to the current output stream.
1027 void AsmPrinter::EmitJumpTableInfo() {
1028 const MachineJumpTableInfo
*MJTI
= MF
->getJumpTableInfo();
1029 if (MJTI
== 0) return;
1030 if (MJTI
->getEntryKind() == MachineJumpTableInfo::EK_Inline
) return;
1031 const std::vector
<MachineJumpTableEntry
> &JT
= MJTI
->getJumpTables();
1032 if (JT
.empty()) return;
1034 // Pick the directive to use to print the jump table entries, and switch to
1035 // the appropriate section.
1036 const Function
*F
= MF
->getFunction();
1037 bool JTInDiffSection
= false;
1038 if (// In PIC mode, we need to emit the jump table to the same section as the
1039 // function body itself, otherwise the label differences won't make sense.
1040 // FIXME: Need a better predicate for this: what about custom entries?
1041 MJTI
->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32
||
1042 // We should also do if the section name is NULL or function is declared
1043 // in discardable section
1044 // FIXME: this isn't the right predicate, should be based on the MCSection
1045 // for the function.
1046 F
->isWeakForLinker()) {
1047 OutStreamer
.SwitchSection(getObjFileLowering().SectionForGlobal(F
,Mang
,TM
));
1049 // Otherwise, drop it in the readonly section.
1050 const MCSection
*ReadOnlySection
=
1051 getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly());
1052 OutStreamer
.SwitchSection(ReadOnlySection
);
1053 JTInDiffSection
= true;
1056 EmitAlignment(Log2_32(MJTI
->getEntryAlignment(*TM
.getTargetData())));
1058 for (unsigned JTI
= 0, e
= JT
.size(); JTI
!= e
; ++JTI
) {
1059 const std::vector
<MachineBasicBlock
*> &JTBBs
= JT
[JTI
].MBBs
;
1061 // If this jump table was deleted, ignore it.
1062 if (JTBBs
.empty()) continue;
1064 // For the EK_LabelDifference32 entry, if the target supports .set, emit a
1065 // .set directive for each unique entry. This reduces the number of
1066 // relocations the assembler will generate for the jump table.
1067 if (MJTI
->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32
&&
1068 MAI
->hasSetDirective()) {
1069 SmallPtrSet
<const MachineBasicBlock
*, 16> EmittedSets
;
1070 const TargetLowering
*TLI
= TM
.getTargetLowering();
1071 const MCExpr
*Base
= TLI
->getPICJumpTableRelocBaseExpr(MF
,JTI
,OutContext
);
1072 for (unsigned ii
= 0, ee
= JTBBs
.size(); ii
!= ee
; ++ii
) {
1073 const MachineBasicBlock
*MBB
= JTBBs
[ii
];
1074 if (!EmittedSets
.insert(MBB
)) continue;
1076 // .set LJTSet, LBB32-base
1078 MCSymbolRefExpr::Create(MBB
->getSymbol(), OutContext
);
1079 OutStreamer
.EmitAssignment(GetJTSetSymbol(JTI
, MBB
->getNumber()),
1080 MCBinaryExpr::CreateSub(LHS
, Base
, OutContext
));
1084 // On some targets (e.g. Darwin) we want to emit two consecutive labels
1085 // before each jump table. The first label is never referenced, but tells
1086 // the assembler and linker the extents of the jump table object. The
1087 // second label is actually referenced by the code.
1088 if (JTInDiffSection
&& MAI
->getLinkerPrivateGlobalPrefix()[0])
1089 // FIXME: This doesn't have to have any specific name, just any randomly
1090 // named and numbered 'l' label would work. Simplify GetJTISymbol.
1091 OutStreamer
.EmitLabel(GetJTISymbol(JTI
, true));
1093 OutStreamer
.EmitLabel(GetJTISymbol(JTI
));
1095 for (unsigned ii
= 0, ee
= JTBBs
.size(); ii
!= ee
; ++ii
)
1096 EmitJumpTableEntry(MJTI
, JTBBs
[ii
], JTI
);
1100 /// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
1102 void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo
*MJTI
,
1103 const MachineBasicBlock
*MBB
,
1104 unsigned UID
) const {
1105 assert(MBB
&& MBB
->getNumber() >= 0 && "Invalid basic block");
1106 const MCExpr
*Value
= 0;
1107 switch (MJTI
->getEntryKind()) {
1108 case MachineJumpTableInfo::EK_Inline
:
1109 llvm_unreachable("Cannot emit EK_Inline jump table entry"); break;
1110 case MachineJumpTableInfo::EK_Custom32
:
1111 Value
= TM
.getTargetLowering()->LowerCustomJumpTableEntry(MJTI
, MBB
, UID
,
1114 case MachineJumpTableInfo::EK_BlockAddress
:
1115 // EK_BlockAddress - Each entry is a plain address of block, e.g.:
1117 Value
= MCSymbolRefExpr::Create(MBB
->getSymbol(), OutContext
);
1119 case MachineJumpTableInfo::EK_GPRel32BlockAddress
: {
1120 // EK_GPRel32BlockAddress - Each entry is an address of block, encoded
1121 // with a relocation as gp-relative, e.g.:
1123 MCSymbol
*MBBSym
= MBB
->getSymbol();
1124 OutStreamer
.EmitGPRel32Value(MCSymbolRefExpr::Create(MBBSym
, OutContext
));
1128 case MachineJumpTableInfo::EK_LabelDifference32
: {
1129 // EK_LabelDifference32 - Each entry is the address of the block minus
1130 // the address of the jump table. This is used for PIC jump tables where
1131 // gprel32 is not supported. e.g.:
1132 // .word LBB123 - LJTI1_2
1133 // If the .set directive is supported, this is emitted as:
1134 // .set L4_5_set_123, LBB123 - LJTI1_2
1135 // .word L4_5_set_123
1137 // If we have emitted set directives for the jump table entries, print
1138 // them rather than the entries themselves. If we're emitting PIC, then
1139 // emit the table entries as differences between two text section labels.
1140 if (MAI
->hasSetDirective()) {
1141 // If we used .set, reference the .set's symbol.
1142 Value
= MCSymbolRefExpr::Create(GetJTSetSymbol(UID
, MBB
->getNumber()),
1146 // Otherwise, use the difference as the jump table entry.
1147 Value
= MCSymbolRefExpr::Create(MBB
->getSymbol(), OutContext
);
1148 const MCExpr
*JTI
= MCSymbolRefExpr::Create(GetJTISymbol(UID
), OutContext
);
1149 Value
= MCBinaryExpr::CreateSub(Value
, JTI
, OutContext
);
1154 assert(Value
&& "Unknown entry kind!");
1156 unsigned EntrySize
= MJTI
->getEntrySize(*TM
.getTargetData());
1157 OutStreamer
.EmitValue(Value
, EntrySize
, /*addrspace*/0);
1161 /// EmitSpecialLLVMGlobal - Check to see if the specified global is a
1162 /// special global used by LLVM. If so, emit it and return true, otherwise
1163 /// do nothing and return false.
1164 bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable
*GV
) {
1165 if (GV
->getName() == "llvm.used") {
1166 if (MAI
->hasNoDeadStrip()) // No need to emit this at all.
1167 EmitLLVMUsedList(GV
->getInitializer());
1171 // Ignore debug and non-emitted data. This handles llvm.compiler.used.
1172 if (GV
->getSection() == "llvm.metadata" ||
1173 GV
->hasAvailableExternallyLinkage())
1176 if (!GV
->hasAppendingLinkage()) return false;
1178 assert(GV
->hasInitializer() && "Not a special LLVM global!");
1180 const TargetData
*TD
= TM
.getTargetData();
1181 unsigned Align
= Log2_32(TD
->getPointerPrefAlignment());
1182 if (GV
->getName() == "llvm.global_ctors") {
1183 OutStreamer
.SwitchSection(getObjFileLowering().getStaticCtorSection());
1184 EmitAlignment(Align
);
1185 EmitXXStructorList(GV
->getInitializer());
1187 if (TM
.getRelocationModel() == Reloc::Static
&&
1188 MAI
->hasStaticCtorDtorReferenceInStaticMode()) {
1189 StringRef
Sym(".constructors_used");
1190 OutStreamer
.EmitSymbolAttribute(OutContext
.GetOrCreateSymbol(Sym
),
1196 if (GV
->getName() == "llvm.global_dtors") {
1197 OutStreamer
.SwitchSection(getObjFileLowering().getStaticDtorSection());
1198 EmitAlignment(Align
);
1199 EmitXXStructorList(GV
->getInitializer());
1201 if (TM
.getRelocationModel() == Reloc::Static
&&
1202 MAI
->hasStaticCtorDtorReferenceInStaticMode()) {
1203 StringRef
Sym(".destructors_used");
1204 OutStreamer
.EmitSymbolAttribute(OutContext
.GetOrCreateSymbol(Sym
),
1213 /// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
1214 /// global in the specified llvm.used list for which emitUsedDirectiveFor
1215 /// is true, as being used with this directive.
1216 void AsmPrinter::EmitLLVMUsedList(const Constant
*List
) {
1217 // Should be an array of 'i8*'.
1218 const ConstantArray
*InitList
= dyn_cast
<ConstantArray
>(List
);
1219 if (InitList
== 0) return;
1221 for (unsigned i
= 0, e
= InitList
->getNumOperands(); i
!= e
; ++i
) {
1222 const GlobalValue
*GV
=
1223 dyn_cast
<GlobalValue
>(InitList
->getOperand(i
)->stripPointerCasts());
1224 if (GV
&& getObjFileLowering().shouldEmitUsedDirectiveFor(GV
, Mang
))
1225 OutStreamer
.EmitSymbolAttribute(Mang
->getSymbol(GV
), MCSA_NoDeadStrip
);
1229 /// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the
1230 /// function pointers, ignoring the init priority.
1231 void AsmPrinter::EmitXXStructorList(const Constant
*List
) {
1232 // Should be an array of '{ int, void ()* }' structs. The first value is the
1233 // init priority, which we ignore.
1234 if (!isa
<ConstantArray
>(List
)) return;
1235 const ConstantArray
*InitList
= cast
<ConstantArray
>(List
);
1236 for (unsigned i
= 0, e
= InitList
->getNumOperands(); i
!= e
; ++i
)
1237 if (ConstantStruct
*CS
= dyn_cast
<ConstantStruct
>(InitList
->getOperand(i
))){
1238 if (CS
->getNumOperands() != 2) return; // Not array of 2-element structs.
1240 if (CS
->getOperand(1)->isNullValue())
1241 return; // Found a null terminator, exit printing.
1242 // Emit the function pointer.
1243 EmitGlobalConstant(CS
->getOperand(1));
1247 //===--------------------------------------------------------------------===//
1248 // Emission and print routines
1251 /// EmitInt8 - Emit a byte directive and value.
1253 void AsmPrinter::EmitInt8(int Value
) const {
1254 OutStreamer
.EmitIntValue(Value
, 1, 0/*addrspace*/);
1257 /// EmitInt16 - Emit a short directive and value.
1259 void AsmPrinter::EmitInt16(int Value
) const {
1260 OutStreamer
.EmitIntValue(Value
, 2, 0/*addrspace*/);
1263 /// EmitInt32 - Emit a long directive and value.
1265 void AsmPrinter::EmitInt32(int Value
) const {
1266 OutStreamer
.EmitIntValue(Value
, 4, 0/*addrspace*/);
1269 /// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size
1270 /// in bytes of the directive is specified by Size and Hi/Lo specify the
1271 /// labels. This implicitly uses .set if it is available.
1272 void AsmPrinter::EmitLabelDifference(const MCSymbol
*Hi
, const MCSymbol
*Lo
,
1273 unsigned Size
) const {
1274 // Get the Hi-Lo expression.
1275 const MCExpr
*Diff
=
1276 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi
, OutContext
),
1277 MCSymbolRefExpr::Create(Lo
, OutContext
),
1280 if (!MAI
->hasSetDirective()) {
1281 OutStreamer
.EmitValue(Diff
, Size
, 0/*AddrSpace*/);
1285 // Otherwise, emit with .set (aka assignment).
1286 MCSymbol
*SetLabel
= GetTempSymbol("set", SetCounter
++);
1287 OutStreamer
.EmitAssignment(SetLabel
, Diff
);
1288 OutStreamer
.EmitSymbolValue(SetLabel
, Size
, 0/*AddrSpace*/);
1291 /// EmitLabelOffsetDifference - Emit something like ".long Hi+Offset-Lo"
1292 /// where the size in bytes of the directive is specified by Size and Hi/Lo
1293 /// specify the labels. This implicitly uses .set if it is available.
1294 void AsmPrinter::EmitLabelOffsetDifference(const MCSymbol
*Hi
, uint64_t Offset
,
1295 const MCSymbol
*Lo
, unsigned Size
)
1298 // Emit Hi+Offset - Lo
1299 // Get the Hi+Offset expression.
1300 const MCExpr
*Plus
=
1301 MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Hi
, OutContext
),
1302 MCConstantExpr::Create(Offset
, OutContext
),
1305 // Get the Hi+Offset-Lo expression.
1306 const MCExpr
*Diff
=
1307 MCBinaryExpr::CreateSub(Plus
,
1308 MCSymbolRefExpr::Create(Lo
, OutContext
),
1311 if (!MAI
->hasSetDirective())
1312 OutStreamer
.EmitValue(Diff
, 4, 0/*AddrSpace*/);
1314 // Otherwise, emit with .set (aka assignment).
1315 MCSymbol
*SetLabel
= GetTempSymbol("set", SetCounter
++);
1316 OutStreamer
.EmitAssignment(SetLabel
, Diff
);
1317 OutStreamer
.EmitSymbolValue(SetLabel
, 4, 0/*AddrSpace*/);
1321 /// EmitLabelPlusOffset - Emit something like ".long Label+Offset"
1322 /// where the size in bytes of the directive is specified by Size and Label
1323 /// specifies the label. This implicitly uses .set if it is available.
1324 void AsmPrinter::EmitLabelPlusOffset(const MCSymbol
*Label
, uint64_t Offset
,
1328 // Emit Label+Offset
1329 const MCExpr
*Plus
=
1330 MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Label
, OutContext
),
1331 MCConstantExpr::Create(Offset
, OutContext
),
1334 OutStreamer
.EmitValue(Plus
, 4, 0/*AddrSpace*/);
1338 //===----------------------------------------------------------------------===//
1340 // EmitAlignment - Emit an alignment directive to the specified power of
1341 // two boundary. For example, if you pass in 3 here, you will get an 8
1342 // byte alignment. If a global value is specified, and if that global has
1343 // an explicit alignment requested, it will override the alignment request
1344 // if required for correctness.
1346 void AsmPrinter::EmitAlignment(unsigned NumBits
, const GlobalValue
*GV
) const {
1347 if (GV
) NumBits
= getGVAlignmentLog2(GV
, *TM
.getTargetData(), NumBits
);
1349 if (NumBits
== 0) return; // 1-byte aligned: no need to emit alignment.
1351 if (getCurrentSection()->getKind().isText())
1352 OutStreamer
.EmitCodeAlignment(1 << NumBits
);
1354 OutStreamer
.EmitValueToAlignment(1 << NumBits
, 0, 1, 0);
1357 //===----------------------------------------------------------------------===//
1358 // Constant emission.
1359 //===----------------------------------------------------------------------===//
1361 /// LowerConstant - Lower the specified LLVM Constant to an MCExpr.
1363 static const MCExpr
*LowerConstant(const Constant
*CV
, AsmPrinter
&AP
) {
1364 MCContext
&Ctx
= AP
.OutContext
;
1366 if (CV
->isNullValue() || isa
<UndefValue
>(CV
))
1367 return MCConstantExpr::Create(0, Ctx
);
1369 if (const ConstantInt
*CI
= dyn_cast
<ConstantInt
>(CV
))
1370 return MCConstantExpr::Create(CI
->getZExtValue(), Ctx
);
1372 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(CV
))
1373 return MCSymbolRefExpr::Create(AP
.Mang
->getSymbol(GV
), Ctx
);
1375 if (const BlockAddress
*BA
= dyn_cast
<BlockAddress
>(CV
))
1376 return MCSymbolRefExpr::Create(AP
.GetBlockAddressSymbol(BA
), Ctx
);
1378 const ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(CV
);
1380 llvm_unreachable("Unknown constant value to lower!");
1381 return MCConstantExpr::Create(0, Ctx
);
1384 switch (CE
->getOpcode()) {
1386 // If the code isn't optimized, there may be outstanding folding
1387 // opportunities. Attempt to fold the expression using TargetData as a
1388 // last resort before giving up.
1390 ConstantFoldConstantExpression(CE
, AP
.TM
.getTargetData()))
1392 return LowerConstant(C
, AP
);
1394 // Otherwise report the problem to the user.
1397 raw_string_ostream
OS(S
);
1398 OS
<< "Unsupported expression in static initializer: ";
1399 WriteAsOperand(OS
, CE
, /*PrintType=*/false,
1400 !AP
.MF
? 0 : AP
.MF
->getFunction()->getParent());
1401 report_fatal_error(OS
.str());
1403 return MCConstantExpr::Create(0, Ctx
);
1404 case Instruction::GetElementPtr
: {
1405 const TargetData
&TD
= *AP
.TM
.getTargetData();
1406 // Generate a symbolic expression for the byte address
1407 const Constant
*PtrVal
= CE
->getOperand(0);
1408 SmallVector
<Value
*, 8> IdxVec(CE
->op_begin()+1, CE
->op_end());
1409 int64_t Offset
= TD
.getIndexedOffset(PtrVal
->getType(), &IdxVec
[0],
1412 const MCExpr
*Base
= LowerConstant(CE
->getOperand(0), AP
);
1416 // Truncate/sext the offset to the pointer size.
1417 if (TD
.getPointerSizeInBits() != 64) {
1418 int SExtAmount
= 64-TD
.getPointerSizeInBits();
1419 Offset
= (Offset
<< SExtAmount
) >> SExtAmount
;
1422 return MCBinaryExpr::CreateAdd(Base
, MCConstantExpr::Create(Offset
, Ctx
),
1426 case Instruction::Trunc
:
1427 // We emit the value and depend on the assembler to truncate the generated
1428 // expression properly. This is important for differences between
1429 // blockaddress labels. Since the two labels are in the same function, it
1430 // is reasonable to treat their delta as a 32-bit value.
1432 case Instruction::BitCast
:
1433 return LowerConstant(CE
->getOperand(0), AP
);
1435 case Instruction::IntToPtr
: {
1436 const TargetData
&TD
= *AP
.TM
.getTargetData();
1437 // Handle casts to pointers by changing them into casts to the appropriate
1438 // integer type. This promotes constant folding and simplifies this code.
1439 Constant
*Op
= CE
->getOperand(0);
1440 Op
= ConstantExpr::getIntegerCast(Op
, TD
.getIntPtrType(CV
->getContext()),
1442 return LowerConstant(Op
, AP
);
1445 case Instruction::PtrToInt
: {
1446 const TargetData
&TD
= *AP
.TM
.getTargetData();
1447 // Support only foldable casts to/from pointers that can be eliminated by
1448 // changing the pointer to the appropriately sized integer type.
1449 Constant
*Op
= CE
->getOperand(0);
1450 const Type
*Ty
= CE
->getType();
1452 const MCExpr
*OpExpr
= LowerConstant(Op
, AP
);
1454 // We can emit the pointer value into this slot if the slot is an
1455 // integer slot equal to the size of the pointer.
1456 if (TD
.getTypeAllocSize(Ty
) == TD
.getTypeAllocSize(Op
->getType()))
1459 // Otherwise the pointer is smaller than the resultant integer, mask off
1460 // the high bits so we are sure to get a proper truncation if the input is
1462 unsigned InBits
= TD
.getTypeAllocSizeInBits(Op
->getType());
1463 const MCExpr
*MaskExpr
= MCConstantExpr::Create(~0ULL >> (64-InBits
), Ctx
);
1464 return MCBinaryExpr::CreateAnd(OpExpr
, MaskExpr
, Ctx
);
1467 // The MC library also has a right-shift operator, but it isn't consistently
1468 // signed or unsigned between different targets.
1469 case Instruction::Add
:
1470 case Instruction::Sub
:
1471 case Instruction::Mul
:
1472 case Instruction::SDiv
:
1473 case Instruction::SRem
:
1474 case Instruction::Shl
:
1475 case Instruction::And
:
1476 case Instruction::Or
:
1477 case Instruction::Xor
: {
1478 const MCExpr
*LHS
= LowerConstant(CE
->getOperand(0), AP
);
1479 const MCExpr
*RHS
= LowerConstant(CE
->getOperand(1), AP
);
1480 switch (CE
->getOpcode()) {
1481 default: llvm_unreachable("Unknown binary operator constant cast expr");
1482 case Instruction::Add
: return MCBinaryExpr::CreateAdd(LHS
, RHS
, Ctx
);
1483 case Instruction::Sub
: return MCBinaryExpr::CreateSub(LHS
, RHS
, Ctx
);
1484 case Instruction::Mul
: return MCBinaryExpr::CreateMul(LHS
, RHS
, Ctx
);
1485 case Instruction::SDiv
: return MCBinaryExpr::CreateDiv(LHS
, RHS
, Ctx
);
1486 case Instruction::SRem
: return MCBinaryExpr::CreateMod(LHS
, RHS
, Ctx
);
1487 case Instruction::Shl
: return MCBinaryExpr::CreateShl(LHS
, RHS
, Ctx
);
1488 case Instruction::And
: return MCBinaryExpr::CreateAnd(LHS
, RHS
, Ctx
);
1489 case Instruction::Or
: return MCBinaryExpr::CreateOr (LHS
, RHS
, Ctx
);
1490 case Instruction::Xor
: return MCBinaryExpr::CreateXor(LHS
, RHS
, Ctx
);
1496 static void EmitGlobalConstantImpl(const Constant
*C
, unsigned AddrSpace
,
1499 static void EmitGlobalConstantArray(const ConstantArray
*CA
, unsigned AddrSpace
,
1501 if (AddrSpace
!= 0 || !CA
->isString()) {
1502 // Not a string. Print the values in successive locations
1503 for (unsigned i
= 0, e
= CA
->getNumOperands(); i
!= e
; ++i
)
1504 EmitGlobalConstantImpl(CA
->getOperand(i
), AddrSpace
, AP
);
1508 // Otherwise, it can be emitted as .ascii.
1509 SmallVector
<char, 128> TmpVec
;
1510 TmpVec
.reserve(CA
->getNumOperands());
1511 for (unsigned i
= 0, e
= CA
->getNumOperands(); i
!= e
; ++i
)
1512 TmpVec
.push_back(cast
<ConstantInt
>(CA
->getOperand(i
))->getZExtValue());
1514 AP
.OutStreamer
.EmitBytes(StringRef(TmpVec
.data(), TmpVec
.size()), AddrSpace
);
1517 static void EmitGlobalConstantVector(const ConstantVector
*CV
,
1518 unsigned AddrSpace
, AsmPrinter
&AP
) {
1519 for (unsigned i
= 0, e
= CV
->getType()->getNumElements(); i
!= e
; ++i
)
1520 EmitGlobalConstantImpl(CV
->getOperand(i
), AddrSpace
, AP
);
1522 const TargetData
&TD
= *AP
.TM
.getTargetData();
1523 unsigned Size
= TD
.getTypeAllocSize(CV
->getType());
1524 unsigned EmittedSize
= TD
.getTypeAllocSize(CV
->getType()->getElementType()) *
1525 CV
->getType()->getNumElements();
1526 if (unsigned Padding
= Size
- EmittedSize
)
1527 AP
.OutStreamer
.EmitZeros(Padding
, AddrSpace
);
1530 static void EmitGlobalConstantStruct(const ConstantStruct
*CS
,
1531 unsigned AddrSpace
, AsmPrinter
&AP
) {
1532 // Print the fields in successive locations. Pad to align if needed!
1533 const TargetData
*TD
= AP
.TM
.getTargetData();
1534 unsigned Size
= TD
->getTypeAllocSize(CS
->getType());
1535 const StructLayout
*Layout
= TD
->getStructLayout(CS
->getType());
1536 uint64_t SizeSoFar
= 0;
1537 for (unsigned i
= 0, e
= CS
->getNumOperands(); i
!= e
; ++i
) {
1538 const Constant
*Field
= CS
->getOperand(i
);
1540 // Check if padding is needed and insert one or more 0s.
1541 uint64_t FieldSize
= TD
->getTypeAllocSize(Field
->getType());
1542 uint64_t PadSize
= ((i
== e
-1 ? Size
: Layout
->getElementOffset(i
+1))
1543 - Layout
->getElementOffset(i
)) - FieldSize
;
1544 SizeSoFar
+= FieldSize
+ PadSize
;
1546 // Now print the actual field value.
1547 EmitGlobalConstantImpl(Field
, AddrSpace
, AP
);
1549 // Insert padding - this may include padding to increase the size of the
1550 // current field up to the ABI size (if the struct is not packed) as well
1551 // as padding to ensure that the next field starts at the right offset.
1552 AP
.OutStreamer
.EmitZeros(PadSize
, AddrSpace
);
1554 assert(SizeSoFar
== Layout
->getSizeInBytes() &&
1555 "Layout of constant struct may be incorrect!");
1558 static void EmitGlobalConstantFP(const ConstantFP
*CFP
, unsigned AddrSpace
,
1560 // FP Constants are printed as integer constants to avoid losing
1562 if (CFP
->getType()->isDoubleTy()) {
1563 if (AP
.isVerbose()) {
1564 double Val
= CFP
->getValueAPF().convertToDouble();
1565 AP
.OutStreamer
.GetCommentOS() << "double " << Val
<< '\n';
1568 uint64_t Val
= CFP
->getValueAPF().bitcastToAPInt().getZExtValue();
1569 AP
.OutStreamer
.EmitIntValue(Val
, 8, AddrSpace
);
1573 if (CFP
->getType()->isFloatTy()) {
1574 if (AP
.isVerbose()) {
1575 float Val
= CFP
->getValueAPF().convertToFloat();
1576 AP
.OutStreamer
.GetCommentOS() << "float " << Val
<< '\n';
1578 uint64_t Val
= CFP
->getValueAPF().bitcastToAPInt().getZExtValue();
1579 AP
.OutStreamer
.EmitIntValue(Val
, 4, AddrSpace
);
1583 if (CFP
->getType()->isX86_FP80Ty()) {
1584 // all long double variants are printed as hex
1585 // API needed to prevent premature destruction
1586 APInt API
= CFP
->getValueAPF().bitcastToAPInt();
1587 const uint64_t *p
= API
.getRawData();
1588 if (AP
.isVerbose()) {
1589 // Convert to double so we can print the approximate val as a comment.
1590 APFloat DoubleVal
= CFP
->getValueAPF();
1592 DoubleVal
.convert(APFloat::IEEEdouble
, APFloat::rmNearestTiesToEven
,
1594 AP
.OutStreamer
.GetCommentOS() << "x86_fp80 ~= "
1595 << DoubleVal
.convertToDouble() << '\n';
1598 if (AP
.TM
.getTargetData()->isBigEndian()) {
1599 AP
.OutStreamer
.EmitIntValue(p
[1], 2, AddrSpace
);
1600 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1602 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1603 AP
.OutStreamer
.EmitIntValue(p
[1], 2, AddrSpace
);
1606 // Emit the tail padding for the long double.
1607 const TargetData
&TD
= *AP
.TM
.getTargetData();
1608 AP
.OutStreamer
.EmitZeros(TD
.getTypeAllocSize(CFP
->getType()) -
1609 TD
.getTypeStoreSize(CFP
->getType()), AddrSpace
);
1613 assert(CFP
->getType()->isPPC_FP128Ty() &&
1614 "Floating point constant type not handled");
1615 // All long double variants are printed as hex
1616 // API needed to prevent premature destruction.
1617 APInt API
= CFP
->getValueAPF().bitcastToAPInt();
1618 const uint64_t *p
= API
.getRawData();
1619 if (AP
.TM
.getTargetData()->isBigEndian()) {
1620 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1621 AP
.OutStreamer
.EmitIntValue(p
[1], 8, AddrSpace
);
1623 AP
.OutStreamer
.EmitIntValue(p
[1], 8, AddrSpace
);
1624 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1628 static void EmitGlobalConstantLargeInt(const ConstantInt
*CI
,
1629 unsigned AddrSpace
, AsmPrinter
&AP
) {
1630 const TargetData
*TD
= AP
.TM
.getTargetData();
1631 unsigned BitWidth
= CI
->getBitWidth();
1632 assert((BitWidth
& 63) == 0 && "only support multiples of 64-bits");
1634 // We don't expect assemblers to support integer data directives
1635 // for more than 64 bits, so we emit the data in at most 64-bit
1636 // quantities at a time.
1637 const uint64_t *RawData
= CI
->getValue().getRawData();
1638 for (unsigned i
= 0, e
= BitWidth
/ 64; i
!= e
; ++i
) {
1639 uint64_t Val
= TD
->isBigEndian() ? RawData
[e
- i
- 1] : RawData
[i
];
1640 AP
.OutStreamer
.EmitIntValue(Val
, 8, AddrSpace
);
1644 static void EmitGlobalConstantImpl(const Constant
*CV
, unsigned AddrSpace
,
1646 if (isa
<ConstantAggregateZero
>(CV
) || isa
<UndefValue
>(CV
)) {
1647 uint64_t Size
= AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1648 return AP
.OutStreamer
.EmitZeros(Size
, AddrSpace
);
1651 if (const ConstantInt
*CI
= dyn_cast
<ConstantInt
>(CV
)) {
1652 unsigned Size
= AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1659 AP
.OutStreamer
.GetCommentOS() << format("0x%llx\n", CI
->getZExtValue());
1660 AP
.OutStreamer
.EmitIntValue(CI
->getZExtValue(), Size
, AddrSpace
);
1663 EmitGlobalConstantLargeInt(CI
, AddrSpace
, AP
);
1668 if (const ConstantArray
*CVA
= dyn_cast
<ConstantArray
>(CV
))
1669 return EmitGlobalConstantArray(CVA
, AddrSpace
, AP
);
1671 if (const ConstantStruct
*CVS
= dyn_cast
<ConstantStruct
>(CV
))
1672 return EmitGlobalConstantStruct(CVS
, AddrSpace
, AP
);
1674 if (const ConstantFP
*CFP
= dyn_cast
<ConstantFP
>(CV
))
1675 return EmitGlobalConstantFP(CFP
, AddrSpace
, AP
);
1677 if (isa
<ConstantPointerNull
>(CV
)) {
1678 unsigned Size
= AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1679 AP
.OutStreamer
.EmitIntValue(0, Size
, AddrSpace
);
1683 if (const ConstantVector
*V
= dyn_cast
<ConstantVector
>(CV
))
1684 return EmitGlobalConstantVector(V
, AddrSpace
, AP
);
1686 // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it
1687 // thread the streamer with EmitValue.
1688 AP
.OutStreamer
.EmitValue(LowerConstant(CV
, AP
),
1689 AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType()),
1693 /// EmitGlobalConstant - Print a general LLVM constant to the .s file.
1694 void AsmPrinter::EmitGlobalConstant(const Constant
*CV
, unsigned AddrSpace
) {
1695 uint64_t Size
= TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1697 EmitGlobalConstantImpl(CV
, AddrSpace
, *this);
1698 else if (MAI
->hasSubsectionsViaSymbols()) {
1699 // If the global has zero size, emit a single byte so that two labels don't
1700 // look like they are at the same location.
1701 OutStreamer
.EmitIntValue(0, 1, AddrSpace
);
1705 void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue
*MCPV
) {
1706 // Target doesn't support this yet!
1707 llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
1710 void AsmPrinter::printOffset(int64_t Offset
, raw_ostream
&OS
) const {
1712 OS
<< '+' << Offset
;
1713 else if (Offset
< 0)
1717 //===----------------------------------------------------------------------===//
1718 // Symbol Lowering Routines.
1719 //===----------------------------------------------------------------------===//
1721 /// GetTempSymbol - Return the MCSymbol corresponding to the assembler
1722 /// temporary label with the specified stem and unique ID.
1723 MCSymbol
*AsmPrinter::GetTempSymbol(StringRef Name
, unsigned ID
) const {
1724 return OutContext
.GetOrCreateSymbol(Twine(MAI
->getPrivateGlobalPrefix()) +
1728 /// GetTempSymbol - Return an assembler temporary label with the specified
1730 MCSymbol
*AsmPrinter::GetTempSymbol(StringRef Name
) const {
1731 return OutContext
.GetOrCreateSymbol(Twine(MAI
->getPrivateGlobalPrefix())+
1736 MCSymbol
*AsmPrinter::GetBlockAddressSymbol(const BlockAddress
*BA
) const {
1737 return MMI
->getAddrLabelSymbol(BA
->getBasicBlock());
1740 MCSymbol
*AsmPrinter::GetBlockAddressSymbol(const BasicBlock
*BB
) const {
1741 return MMI
->getAddrLabelSymbol(BB
);
1744 /// GetCPISymbol - Return the symbol for the specified constant pool entry.
1745 MCSymbol
*AsmPrinter::GetCPISymbol(unsigned CPID
) const {
1746 return OutContext
.GetOrCreateSymbol
1747 (Twine(MAI
->getPrivateGlobalPrefix()) + "CPI" + Twine(getFunctionNumber())
1748 + "_" + Twine(CPID
));
1751 /// GetJTISymbol - Return the symbol for the specified jump table entry.
1752 MCSymbol
*AsmPrinter::GetJTISymbol(unsigned JTID
, bool isLinkerPrivate
) const {
1753 return MF
->getJTISymbol(JTID
, OutContext
, isLinkerPrivate
);
1756 /// GetJTSetSymbol - Return the symbol for the specified jump table .set
1757 /// FIXME: privatize to AsmPrinter.
1758 MCSymbol
*AsmPrinter::GetJTSetSymbol(unsigned UID
, unsigned MBBID
) const {
1759 return OutContext
.GetOrCreateSymbol
1760 (Twine(MAI
->getPrivateGlobalPrefix()) + Twine(getFunctionNumber()) + "_" +
1761 Twine(UID
) + "_set_" + Twine(MBBID
));
1764 /// GetSymbolWithGlobalValueBase - Return the MCSymbol for a symbol with
1765 /// global value name as its base, with the specified suffix, and where the
1766 /// symbol is forced to have private linkage if ForcePrivate is true.
1767 MCSymbol
*AsmPrinter::GetSymbolWithGlobalValueBase(const GlobalValue
*GV
,
1769 bool ForcePrivate
) const {
1770 SmallString
<60> NameStr
;
1771 Mang
->getNameWithPrefix(NameStr
, GV
, ForcePrivate
);
1772 NameStr
.append(Suffix
.begin(), Suffix
.end());
1773 return OutContext
.GetOrCreateSymbol(NameStr
.str());
1776 /// GetExternalSymbolSymbol - Return the MCSymbol for the specified
1778 MCSymbol
*AsmPrinter::GetExternalSymbolSymbol(StringRef Sym
) const {
1779 SmallString
<60> NameStr
;
1780 Mang
->getNameWithPrefix(NameStr
, Sym
);
1781 return OutContext
.GetOrCreateSymbol(NameStr
.str());
1786 /// PrintParentLoopComment - Print comments about parent loops of this one.
1787 static void PrintParentLoopComment(raw_ostream
&OS
, const MachineLoop
*Loop
,
1788 unsigned FunctionNumber
) {
1789 if (Loop
== 0) return;
1790 PrintParentLoopComment(OS
, Loop
->getParentLoop(), FunctionNumber
);
1791 OS
.indent(Loop
->getLoopDepth()*2)
1792 << "Parent Loop BB" << FunctionNumber
<< "_"
1793 << Loop
->getHeader()->getNumber()
1794 << " Depth=" << Loop
->getLoopDepth() << '\n';
1798 /// PrintChildLoopComment - Print comments about child loops within
1799 /// the loop for this basic block, with nesting.
1800 static void PrintChildLoopComment(raw_ostream
&OS
, const MachineLoop
*Loop
,
1801 unsigned FunctionNumber
) {
1802 // Add child loop information
1803 for (MachineLoop::iterator CL
= Loop
->begin(), E
= Loop
->end();CL
!= E
; ++CL
){
1804 OS
.indent((*CL
)->getLoopDepth()*2)
1805 << "Child Loop BB" << FunctionNumber
<< "_"
1806 << (*CL
)->getHeader()->getNumber() << " Depth " << (*CL
)->getLoopDepth()
1808 PrintChildLoopComment(OS
, *CL
, FunctionNumber
);
1812 /// EmitBasicBlockLoopComments - Pretty-print comments for basic blocks.
1813 static void EmitBasicBlockLoopComments(const MachineBasicBlock
&MBB
,
1814 const MachineLoopInfo
*LI
,
1815 const AsmPrinter
&AP
) {
1816 // Add loop depth information
1817 const MachineLoop
*Loop
= LI
->getLoopFor(&MBB
);
1818 if (Loop
== 0) return;
1820 MachineBasicBlock
*Header
= Loop
->getHeader();
1821 assert(Header
&& "No header for loop");
1823 // If this block is not a loop header, just print out what is the loop header
1825 if (Header
!= &MBB
) {
1826 AP
.OutStreamer
.AddComment(" in Loop: Header=BB" +
1827 Twine(AP
.getFunctionNumber())+"_" +
1828 Twine(Loop
->getHeader()->getNumber())+
1829 " Depth="+Twine(Loop
->getLoopDepth()));
1833 // Otherwise, it is a loop header. Print out information about child and
1835 raw_ostream
&OS
= AP
.OutStreamer
.GetCommentOS();
1837 PrintParentLoopComment(OS
, Loop
->getParentLoop(), AP
.getFunctionNumber());
1840 OS
.indent(Loop
->getLoopDepth()*2-2);
1845 OS
<< "Loop Header: Depth=" + Twine(Loop
->getLoopDepth()) << '\n';
1847 PrintChildLoopComment(OS
, Loop
, AP
.getFunctionNumber());
1851 /// EmitBasicBlockStart - This method prints the label for the specified
1852 /// MachineBasicBlock, an alignment (if present) and a comment describing
1853 /// it if appropriate.
1854 void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock
*MBB
) const {
1855 // Emit an alignment directive for this block, if needed.
1856 if (unsigned Align
= MBB
->getAlignment())
1857 EmitAlignment(Log2_32(Align
));
1859 // If the block has its address taken, emit any labels that were used to
1860 // reference the block. It is possible that there is more than one label
1861 // here, because multiple LLVM BB's may have been RAUW'd to this block after
1862 // the references were generated.
1863 if (MBB
->hasAddressTaken()) {
1864 const BasicBlock
*BB
= MBB
->getBasicBlock();
1866 OutStreamer
.AddComment("Block address taken");
1868 std::vector
<MCSymbol
*> Syms
= MMI
->getAddrLabelSymbolToEmit(BB
);
1870 for (unsigned i
= 0, e
= Syms
.size(); i
!= e
; ++i
)
1871 OutStreamer
.EmitLabel(Syms
[i
]);
1874 // Print the main label for the block.
1875 if (MBB
->pred_empty() || isBlockOnlyReachableByFallthrough(MBB
)) {
1876 if (isVerbose() && OutStreamer
.hasRawTextSupport()) {
1877 if (const BasicBlock
*BB
= MBB
->getBasicBlock())
1879 OutStreamer
.AddComment("%" + BB
->getName());
1881 EmitBasicBlockLoopComments(*MBB
, LI
, *this);
1883 // NOTE: Want this comment at start of line, don't emit with AddComment.
1884 OutStreamer
.EmitRawText(Twine(MAI
->getCommentString()) + " BB#" +
1885 Twine(MBB
->getNumber()) + ":");
1889 if (const BasicBlock
*BB
= MBB
->getBasicBlock())
1891 OutStreamer
.AddComment("%" + BB
->getName());
1892 EmitBasicBlockLoopComments(*MBB
, LI
, *this);
1895 OutStreamer
.EmitLabel(MBB
->getSymbol());
1899 void AsmPrinter::EmitVisibility(MCSymbol
*Sym
, unsigned Visibility
,
1900 bool IsDefinition
) const {
1901 MCSymbolAttr Attr
= MCSA_Invalid
;
1903 switch (Visibility
) {
1905 case GlobalValue::HiddenVisibility
:
1907 Attr
= MAI
->getHiddenVisibilityAttr();
1909 Attr
= MAI
->getHiddenDeclarationVisibilityAttr();
1911 case GlobalValue::ProtectedVisibility
:
1912 Attr
= MAI
->getProtectedVisibilityAttr();
1916 if (Attr
!= MCSA_Invalid
)
1917 OutStreamer
.EmitSymbolAttribute(Sym
, Attr
);
1920 /// isBlockOnlyReachableByFallthough - Return true if the basic block has
1921 /// exactly one predecessor and the control transfer mechanism between
1922 /// the predecessor and this block is a fall-through.
1924 isBlockOnlyReachableByFallthrough(const MachineBasicBlock
*MBB
) const {
1925 // If this is a landing pad, it isn't a fall through. If it has no preds,
1926 // then nothing falls through to it.
1927 if (MBB
->isLandingPad() || MBB
->pred_empty())
1930 // If there isn't exactly one predecessor, it can't be a fall through.
1931 MachineBasicBlock::const_pred_iterator PI
= MBB
->pred_begin(), PI2
= PI
;
1933 if (PI2
!= MBB
->pred_end())
1936 // The predecessor has to be immediately before this block.
1937 MachineBasicBlock
*Pred
= *PI
;
1939 if (!Pred
->isLayoutSuccessor(MBB
))
1942 // If the block is completely empty, then it definitely does fall through.
1946 // Check the terminators in the previous blocks
1947 for (MachineBasicBlock::iterator II
= Pred
->getFirstTerminator(),
1948 IE
= Pred
->end(); II
!= IE
; ++II
) {
1949 MachineInstr
&MI
= *II
;
1951 // If it is not a simple branch, we are in a table somewhere.
1952 if (!MI
.getDesc().isBranch() || MI
.getDesc().isIndirectBranch())
1955 // If we are the operands of one of the branches, this is not
1957 for (MachineInstr::mop_iterator OI
= MI
.operands_begin(),
1958 OE
= MI
.operands_end(); OI
!= OE
; ++OI
) {
1959 const MachineOperand
& OP
= *OI
;
1962 if (OP
.isMBB() && OP
.getMBB() == MBB
)
1972 GCMetadataPrinter
*AsmPrinter::GetOrCreateGCPrinter(GCStrategy
*S
) {
1973 if (!S
->usesMetadata())
1976 gcp_map_type
&GCMap
= getGCMap(GCMetadataPrinters
);
1977 gcp_map_type::iterator GCPI
= GCMap
.find(S
);
1978 if (GCPI
!= GCMap
.end())
1979 return GCPI
->second
;
1981 const char *Name
= S
->getName().c_str();
1983 for (GCMetadataPrinterRegistry::iterator
1984 I
= GCMetadataPrinterRegistry::begin(),
1985 E
= GCMetadataPrinterRegistry::end(); I
!= E
; ++I
)
1986 if (strcmp(Name
, I
->getName()) == 0) {
1987 GCMetadataPrinter
*GMP
= I
->instantiate();
1989 GCMap
.insert(std::make_pair(S
, GMP
));
1993 report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name
));