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();
579 assert(MI
->getOperand(0).isReg() && "Unknown operand type");
580 if (MI
->getOperand(0).getReg() == 0) {
581 // Suppress offset, it is not meaningful here.
583 // NOTE: Want this comment at start of line, don't emit with AddComment.
584 AP
.OutStreamer
.EmitRawText(OS
.str());
587 OS
<< AP
.TM
.getRegisterInfo()->getName(MI
->getOperand(0).getReg());
590 OS
<< '+' << MI
->getOperand(1).getImm();
591 // NOTE: Want this comment at start of line, don't emit with AddComment.
592 AP
.OutStreamer
.EmitRawText(OS
.str());
596 AsmPrinter::CFIMoveType
AsmPrinter::needsCFIMoves() {
597 if (MAI
->getExceptionHandlingType() == ExceptionHandling::DwarfCFI
&&
598 MF
->getFunction()->needsUnwindTableEntry())
601 if (MMI
->hasDebugInfo())
607 bool AsmPrinter::needsSEHMoves() {
608 return MAI
->getExceptionHandlingType() == ExceptionHandling::Win64
&&
609 MF
->getFunction()->needsUnwindTableEntry();
612 void AsmPrinter::emitPrologLabel(const MachineInstr
&MI
) {
613 MCSymbol
*Label
= MI
.getOperand(0).getMCSymbol();
615 if (MAI
->getExceptionHandlingType() != ExceptionHandling::DwarfCFI
)
618 if (needsCFIMoves() == CFI_M_None
)
621 MachineModuleInfo
&MMI
= MF
->getMMI();
622 std::vector
<MachineMove
> &Moves
= MMI
.getFrameMoves();
623 bool FoundOne
= false;
625 for (std::vector
<MachineMove
>::iterator I
= Moves
.begin(),
626 E
= Moves
.end(); I
!= E
; ++I
) {
627 if (I
->getLabel() == Label
) {
628 EmitCFIFrameMove(*I
);
635 /// EmitFunctionBody - This method emits the body and trailer for a
637 void AsmPrinter::EmitFunctionBody() {
638 // Emit target-specific gunk before the function body.
639 EmitFunctionBodyStart();
641 bool ShouldPrintDebugScopes
= DD
&& MMI
->hasDebugInfo();
643 // Print out code for the function.
644 bool HasAnyRealCode
= false;
645 const MachineInstr
*LastMI
= 0;
646 for (MachineFunction::const_iterator I
= MF
->begin(), E
= MF
->end();
648 // Print a label for the basic block.
649 EmitBasicBlockStart(I
);
650 for (MachineBasicBlock::const_iterator II
= I
->begin(), IE
= I
->end();
654 // Print the assembly for the instruction.
655 if (!II
->isLabel() && !II
->isImplicitDef() && !II
->isKill() &&
656 !II
->isDebugValue()) {
657 HasAnyRealCode
= true;
661 if (ShouldPrintDebugScopes
) {
662 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
663 DD
->beginInstruction(II
);
667 EmitComments(*II
, OutStreamer
.GetCommentOS());
669 switch (II
->getOpcode()) {
670 case TargetOpcode::PROLOG_LABEL
:
671 emitPrologLabel(*II
);
674 case TargetOpcode::EH_LABEL
:
675 case TargetOpcode::GC_LABEL
:
676 OutStreamer
.EmitLabel(II
->getOperand(0).getMCSymbol());
678 case TargetOpcode::INLINEASM
:
681 case TargetOpcode::DBG_VALUE
:
683 if (!EmitDebugValueComment(II
, *this))
687 case TargetOpcode::IMPLICIT_DEF
:
688 if (isVerbose()) EmitImplicitDef(II
, *this);
690 case TargetOpcode::KILL
:
691 if (isVerbose()) EmitKill(II
, *this);
694 if (!TM
.hasMCUseLoc())
695 MCLineEntry::Make(&OutStreamer
, getCurrentSection());
701 if (ShouldPrintDebugScopes
) {
702 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
703 DD
->endInstruction(II
);
708 // If the last instruction was a prolog label, then we have a situation where
709 // we emitted a prolog but no function body. This results in the ending prolog
710 // label equaling the end of function label and an invalid "row" in the
711 // FDE. We need to emit a noop in this situation so that the FDE's rows are
713 bool RequiresNoop
= LastMI
&& LastMI
->isPrologLabel();
715 // If the function is empty and the object file uses .subsections_via_symbols,
716 // then we need to emit *something* to the function body to prevent the
717 // labels from collapsing together. Just emit a noop.
718 if ((MAI
->hasSubsectionsViaSymbols() && !HasAnyRealCode
) || RequiresNoop
) {
720 TM
.getInstrInfo()->getNoopForMachoTarget(Noop
);
721 if (Noop
.getOpcode()) {
722 OutStreamer
.AddComment("avoids zero-length function");
723 OutStreamer
.EmitInstruction(Noop
);
724 } else // Target not mc-ized yet.
725 OutStreamer
.EmitRawText(StringRef("\tnop\n"));
728 // Emit target-specific gunk after the function body.
729 EmitFunctionBodyEnd();
731 // If the target wants a .size directive for the size of the function, emit
733 if (MAI
->hasDotTypeDotSizeDirective()) {
734 // Create a symbol for the end of function, so we can get the size as
735 // difference between the function label and the temp label.
736 MCSymbol
*FnEndLabel
= OutContext
.CreateTempSymbol();
737 OutStreamer
.EmitLabel(FnEndLabel
);
739 const MCExpr
*SizeExp
=
740 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel
, OutContext
),
741 MCSymbolRefExpr::Create(CurrentFnSym
, OutContext
),
743 OutStreamer
.EmitELFSize(CurrentFnSym
, SizeExp
);
746 // Emit post-function debug information.
748 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
752 NamedRegionTimer
T(EHTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
757 // Print out jump tables referenced by the function.
760 OutStreamer
.AddBlankLine();
763 /// getDebugValueLocation - Get location information encoded by DBG_VALUE
765 MachineLocation
AsmPrinter::
766 getDebugValueLocation(const MachineInstr
*MI
) const {
767 // Target specific DBG_VALUE instructions are handled by each target.
768 return MachineLocation();
771 /// EmitDwarfRegOp - Emit dwarf register operation.
772 void AsmPrinter::EmitDwarfRegOp(const MachineLocation
&MLoc
) const {
773 const TargetRegisterInfo
*TRI
= TM
.getRegisterInfo();
774 int Reg
= TRI
->getDwarfRegNum(MLoc
.getReg(), false);
776 for (const unsigned *SR
= TRI
->getSuperRegisters(MLoc
.getReg());
777 *SR
&& Reg
< 0; ++SR
) {
778 Reg
= TRI
->getDwarfRegNum(*SR
, false);
779 // FIXME: Get the bit range this register uses of the superregister
780 // so that we can produce a DW_OP_bit_piece
783 // FIXME: Handle cases like a super register being encoded as
784 // DW_OP_reg 32 DW_OP_piece 4 DW_OP_reg 33
786 // FIXME: We have no reasonable way of handling errors in here. The
787 // caller might be in the middle of an dwarf expression. We should
788 // probably assert that Reg >= 0 once debug info generation is more mature.
790 if (int Offset
= MLoc
.getOffset()) {
792 OutStreamer
.AddComment(
793 dwarf::OperationEncodingString(dwarf::DW_OP_breg0
+ Reg
));
794 EmitInt8(dwarf::DW_OP_breg0
+ Reg
);
796 OutStreamer
.AddComment("DW_OP_bregx");
797 EmitInt8(dwarf::DW_OP_bregx
);
798 OutStreamer
.AddComment(Twine(Reg
));
804 OutStreamer
.AddComment(
805 dwarf::OperationEncodingString(dwarf::DW_OP_reg0
+ Reg
));
806 EmitInt8(dwarf::DW_OP_reg0
+ Reg
);
808 OutStreamer
.AddComment("DW_OP_regx");
809 EmitInt8(dwarf::DW_OP_regx
);
810 OutStreamer
.AddComment(Twine(Reg
));
815 // FIXME: Produce a DW_OP_bit_piece if we used a superregister
818 bool AsmPrinter::doFinalization(Module
&M
) {
819 // Emit global variables.
820 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
822 EmitGlobalVariable(I
);
824 // Emit visibility info for declarations
825 for (Module::const_iterator I
= M
.begin(), E
= M
.end(); I
!= E
; ++I
) {
826 const Function
&F
= *I
;
827 if (!F
.isDeclaration())
829 GlobalValue::VisibilityTypes V
= F
.getVisibility();
830 if (V
== GlobalValue::DefaultVisibility
)
833 MCSymbol
*Name
= Mang
->getSymbol(&F
);
834 EmitVisibility(Name
, V
, false);
837 // Finalize debug and EH information.
840 NamedRegionTimer
T(EHTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
847 NamedRegionTimer
T(DbgTimerName
, DWARFGroupName
, TimePassesIsEnabled
);
853 // If the target wants to know about weak references, print them all.
854 if (MAI
->getWeakRefDirective()) {
855 // FIXME: This is not lazy, it would be nice to only print weak references
856 // to stuff that is actually used. Note that doing so would require targets
857 // to notice uses in operands (due to constant exprs etc). This should
858 // happen with the MC stuff eventually.
860 // Print out module-level global variables here.
861 for (Module::const_global_iterator I
= M
.global_begin(), E
= M
.global_end();
863 if (!I
->hasExternalWeakLinkage()) continue;
864 OutStreamer
.EmitSymbolAttribute(Mang
->getSymbol(I
), MCSA_WeakReference
);
867 for (Module::const_iterator I
= M
.begin(), E
= M
.end(); I
!= E
; ++I
) {
868 if (!I
->hasExternalWeakLinkage()) continue;
869 OutStreamer
.EmitSymbolAttribute(Mang
->getSymbol(I
), MCSA_WeakReference
);
873 if (MAI
->hasSetDirective()) {
874 OutStreamer
.AddBlankLine();
875 for (Module::const_alias_iterator I
= M
.alias_begin(), E
= M
.alias_end();
877 MCSymbol
*Name
= Mang
->getSymbol(I
);
879 const GlobalValue
*GV
= cast
<GlobalValue
>(I
->getAliasedGlobal());
880 MCSymbol
*Target
= Mang
->getSymbol(GV
);
882 if (I
->hasExternalLinkage() || !MAI
->getWeakRefDirective())
883 OutStreamer
.EmitSymbolAttribute(Name
, MCSA_Global
);
884 else if (I
->hasWeakLinkage())
885 OutStreamer
.EmitSymbolAttribute(Name
, MCSA_WeakReference
);
887 assert(I
->hasLocalLinkage() && "Invalid alias linkage");
889 EmitVisibility(Name
, I
->getVisibility());
891 // Emit the directives as assignments aka .set:
892 OutStreamer
.EmitAssignment(Name
,
893 MCSymbolRefExpr::Create(Target
, OutContext
));
897 GCModuleInfo
*MI
= getAnalysisIfAvailable
<GCModuleInfo
>();
898 assert(MI
&& "AsmPrinter didn't require GCModuleInfo?");
899 for (GCModuleInfo::iterator I
= MI
->end(), E
= MI
->begin(); I
!= E
; )
900 if (GCMetadataPrinter
*MP
= GetOrCreateGCPrinter(*--I
))
901 MP
->finishAssembly(*this);
903 // If we don't have any trampolines, then we don't require stack memory
904 // to be executable. Some targets have a directive to declare this.
905 Function
*InitTrampolineIntrinsic
= M
.getFunction("llvm.init.trampoline");
906 if (!InitTrampolineIntrinsic
|| InitTrampolineIntrinsic
->use_empty())
907 if (const MCSection
*S
= MAI
->getNonexecutableStackSection(OutContext
))
908 OutStreamer
.SwitchSection(S
);
910 // Allow the target to emit any magic that it wants at the end of the file,
911 // after everything else has gone out.
914 delete Mang
; Mang
= 0;
917 OutStreamer
.Finish();
921 void AsmPrinter::SetupMachineFunction(MachineFunction
&MF
) {
923 // Get the function symbol.
924 CurrentFnSym
= Mang
->getSymbol(MF
.getFunction());
927 LI
= &getAnalysis
<MachineLoopInfo
>();
931 // SectionCPs - Keep track the alignment, constpool entries per Section.
935 SmallVector
<unsigned, 4> CPEs
;
936 SectionCPs(const MCSection
*s
, unsigned a
) : S(s
), Alignment(a
) {}
940 /// EmitConstantPool - Print to the current output stream assembly
941 /// representations of the constants in the constant pool MCP. This is
942 /// used to print out constants which have been "spilled to memory" by
943 /// the code generator.
945 void AsmPrinter::EmitConstantPool() {
946 const MachineConstantPool
*MCP
= MF
->getConstantPool();
947 const std::vector
<MachineConstantPoolEntry
> &CP
= MCP
->getConstants();
948 if (CP
.empty()) return;
950 // Calculate sections for constant pool entries. We collect entries to go into
951 // the same section together to reduce amount of section switch statements.
952 SmallVector
<SectionCPs
, 4> CPSections
;
953 for (unsigned i
= 0, e
= CP
.size(); i
!= e
; ++i
) {
954 const MachineConstantPoolEntry
&CPE
= CP
[i
];
955 unsigned Align
= CPE
.getAlignment();
958 switch (CPE
.getRelocationInfo()) {
959 default: llvm_unreachable("Unknown section kind");
960 case 2: Kind
= SectionKind::getReadOnlyWithRel(); break;
962 Kind
= SectionKind::getReadOnlyWithRelLocal();
965 switch (TM
.getTargetData()->getTypeAllocSize(CPE
.getType())) {
966 case 4: Kind
= SectionKind::getMergeableConst4(); break;
967 case 8: Kind
= SectionKind::getMergeableConst8(); break;
968 case 16: Kind
= SectionKind::getMergeableConst16();break;
969 default: Kind
= SectionKind::getMergeableConst(); break;
973 const MCSection
*S
= getObjFileLowering().getSectionForConstant(Kind
);
975 // The number of sections are small, just do a linear search from the
976 // last section to the first.
978 unsigned SecIdx
= CPSections
.size();
979 while (SecIdx
!= 0) {
980 if (CPSections
[--SecIdx
].S
== S
) {
986 SecIdx
= CPSections
.size();
987 CPSections
.push_back(SectionCPs(S
, Align
));
990 if (Align
> CPSections
[SecIdx
].Alignment
)
991 CPSections
[SecIdx
].Alignment
= Align
;
992 CPSections
[SecIdx
].CPEs
.push_back(i
);
995 // Now print stuff into the calculated sections.
996 for (unsigned i
= 0, e
= CPSections
.size(); i
!= e
; ++i
) {
997 OutStreamer
.SwitchSection(CPSections
[i
].S
);
998 EmitAlignment(Log2_32(CPSections
[i
].Alignment
));
1000 unsigned Offset
= 0;
1001 for (unsigned j
= 0, ee
= CPSections
[i
].CPEs
.size(); j
!= ee
; ++j
) {
1002 unsigned CPI
= CPSections
[i
].CPEs
[j
];
1003 MachineConstantPoolEntry CPE
= CP
[CPI
];
1005 // Emit inter-object padding for alignment.
1006 unsigned AlignMask
= CPE
.getAlignment() - 1;
1007 unsigned NewOffset
= (Offset
+ AlignMask
) & ~AlignMask
;
1008 OutStreamer
.EmitFill(NewOffset
- Offset
, 0/*fillval*/, 0/*addrspace*/);
1010 const Type
*Ty
= CPE
.getType();
1011 Offset
= NewOffset
+ TM
.getTargetData()->getTypeAllocSize(Ty
);
1012 OutStreamer
.EmitLabel(GetCPISymbol(CPI
));
1014 if (CPE
.isMachineConstantPoolEntry())
1015 EmitMachineConstantPoolValue(CPE
.Val
.MachineCPVal
);
1017 EmitGlobalConstant(CPE
.Val
.ConstVal
);
1022 /// EmitJumpTableInfo - Print assembly representations of the jump tables used
1023 /// by the current function to the current output stream.
1025 void AsmPrinter::EmitJumpTableInfo() {
1026 const MachineJumpTableInfo
*MJTI
= MF
->getJumpTableInfo();
1027 if (MJTI
== 0) return;
1028 if (MJTI
->getEntryKind() == MachineJumpTableInfo::EK_Inline
) return;
1029 const std::vector
<MachineJumpTableEntry
> &JT
= MJTI
->getJumpTables();
1030 if (JT
.empty()) return;
1032 // Pick the directive to use to print the jump table entries, and switch to
1033 // the appropriate section.
1034 const Function
*F
= MF
->getFunction();
1035 bool JTInDiffSection
= false;
1036 if (// In PIC mode, we need to emit the jump table to the same section as the
1037 // function body itself, otherwise the label differences won't make sense.
1038 // FIXME: Need a better predicate for this: what about custom entries?
1039 MJTI
->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32
||
1040 // We should also do if the section name is NULL or function is declared
1041 // in discardable section
1042 // FIXME: this isn't the right predicate, should be based on the MCSection
1043 // for the function.
1044 F
->isWeakForLinker()) {
1045 OutStreamer
.SwitchSection(getObjFileLowering().SectionForGlobal(F
,Mang
,TM
));
1047 // Otherwise, drop it in the readonly section.
1048 const MCSection
*ReadOnlySection
=
1049 getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly());
1050 OutStreamer
.SwitchSection(ReadOnlySection
);
1051 JTInDiffSection
= true;
1054 EmitAlignment(Log2_32(MJTI
->getEntryAlignment(*TM
.getTargetData())));
1056 for (unsigned JTI
= 0, e
= JT
.size(); JTI
!= e
; ++JTI
) {
1057 const std::vector
<MachineBasicBlock
*> &JTBBs
= JT
[JTI
].MBBs
;
1059 // If this jump table was deleted, ignore it.
1060 if (JTBBs
.empty()) continue;
1062 // For the EK_LabelDifference32 entry, if the target supports .set, emit a
1063 // .set directive for each unique entry. This reduces the number of
1064 // relocations the assembler will generate for the jump table.
1065 if (MJTI
->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32
&&
1066 MAI
->hasSetDirective()) {
1067 SmallPtrSet
<const MachineBasicBlock
*, 16> EmittedSets
;
1068 const TargetLowering
*TLI
= TM
.getTargetLowering();
1069 const MCExpr
*Base
= TLI
->getPICJumpTableRelocBaseExpr(MF
,JTI
,OutContext
);
1070 for (unsigned ii
= 0, ee
= JTBBs
.size(); ii
!= ee
; ++ii
) {
1071 const MachineBasicBlock
*MBB
= JTBBs
[ii
];
1072 if (!EmittedSets
.insert(MBB
)) continue;
1074 // .set LJTSet, LBB32-base
1076 MCSymbolRefExpr::Create(MBB
->getSymbol(), OutContext
);
1077 OutStreamer
.EmitAssignment(GetJTSetSymbol(JTI
, MBB
->getNumber()),
1078 MCBinaryExpr::CreateSub(LHS
, Base
, OutContext
));
1082 // On some targets (e.g. Darwin) we want to emit two consecutive labels
1083 // before each jump table. The first label is never referenced, but tells
1084 // the assembler and linker the extents of the jump table object. The
1085 // second label is actually referenced by the code.
1086 if (JTInDiffSection
&& MAI
->getLinkerPrivateGlobalPrefix()[0])
1087 // FIXME: This doesn't have to have any specific name, just any randomly
1088 // named and numbered 'l' label would work. Simplify GetJTISymbol.
1089 OutStreamer
.EmitLabel(GetJTISymbol(JTI
, true));
1091 OutStreamer
.EmitLabel(GetJTISymbol(JTI
));
1093 for (unsigned ii
= 0, ee
= JTBBs
.size(); ii
!= ee
; ++ii
)
1094 EmitJumpTableEntry(MJTI
, JTBBs
[ii
], JTI
);
1098 /// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
1100 void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo
*MJTI
,
1101 const MachineBasicBlock
*MBB
,
1102 unsigned UID
) const {
1103 assert(MBB
&& MBB
->getNumber() >= 0 && "Invalid basic block");
1104 const MCExpr
*Value
= 0;
1105 switch (MJTI
->getEntryKind()) {
1106 case MachineJumpTableInfo::EK_Inline
:
1107 llvm_unreachable("Cannot emit EK_Inline jump table entry"); break;
1108 case MachineJumpTableInfo::EK_Custom32
:
1109 Value
= TM
.getTargetLowering()->LowerCustomJumpTableEntry(MJTI
, MBB
, UID
,
1112 case MachineJumpTableInfo::EK_BlockAddress
:
1113 // EK_BlockAddress - Each entry is a plain address of block, e.g.:
1115 Value
= MCSymbolRefExpr::Create(MBB
->getSymbol(), OutContext
);
1117 case MachineJumpTableInfo::EK_GPRel32BlockAddress
: {
1118 // EK_GPRel32BlockAddress - Each entry is an address of block, encoded
1119 // with a relocation as gp-relative, e.g.:
1121 MCSymbol
*MBBSym
= MBB
->getSymbol();
1122 OutStreamer
.EmitGPRel32Value(MCSymbolRefExpr::Create(MBBSym
, OutContext
));
1126 case MachineJumpTableInfo::EK_LabelDifference32
: {
1127 // EK_LabelDifference32 - Each entry is the address of the block minus
1128 // the address of the jump table. This is used for PIC jump tables where
1129 // gprel32 is not supported. e.g.:
1130 // .word LBB123 - LJTI1_2
1131 // If the .set directive is supported, this is emitted as:
1132 // .set L4_5_set_123, LBB123 - LJTI1_2
1133 // .word L4_5_set_123
1135 // If we have emitted set directives for the jump table entries, print
1136 // them rather than the entries themselves. If we're emitting PIC, then
1137 // emit the table entries as differences between two text section labels.
1138 if (MAI
->hasSetDirective()) {
1139 // If we used .set, reference the .set's symbol.
1140 Value
= MCSymbolRefExpr::Create(GetJTSetSymbol(UID
, MBB
->getNumber()),
1144 // Otherwise, use the difference as the jump table entry.
1145 Value
= MCSymbolRefExpr::Create(MBB
->getSymbol(), OutContext
);
1146 const MCExpr
*JTI
= MCSymbolRefExpr::Create(GetJTISymbol(UID
), OutContext
);
1147 Value
= MCBinaryExpr::CreateSub(Value
, JTI
, OutContext
);
1152 assert(Value
&& "Unknown entry kind!");
1154 unsigned EntrySize
= MJTI
->getEntrySize(*TM
.getTargetData());
1155 OutStreamer
.EmitValue(Value
, EntrySize
, /*addrspace*/0);
1159 /// EmitSpecialLLVMGlobal - Check to see if the specified global is a
1160 /// special global used by LLVM. If so, emit it and return true, otherwise
1161 /// do nothing and return false.
1162 bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable
*GV
) {
1163 if (GV
->getName() == "llvm.used") {
1164 if (MAI
->hasNoDeadStrip()) // No need to emit this at all.
1165 EmitLLVMUsedList(GV
->getInitializer());
1169 // Ignore debug and non-emitted data. This handles llvm.compiler.used.
1170 if (GV
->getSection() == "llvm.metadata" ||
1171 GV
->hasAvailableExternallyLinkage())
1174 if (!GV
->hasAppendingLinkage()) return false;
1176 assert(GV
->hasInitializer() && "Not a special LLVM global!");
1178 const TargetData
*TD
= TM
.getTargetData();
1179 unsigned Align
= Log2_32(TD
->getPointerPrefAlignment());
1180 if (GV
->getName() == "llvm.global_ctors") {
1181 OutStreamer
.SwitchSection(getObjFileLowering().getStaticCtorSection());
1182 EmitAlignment(Align
);
1183 EmitXXStructorList(GV
->getInitializer());
1185 if (TM
.getRelocationModel() == Reloc::Static
&&
1186 MAI
->hasStaticCtorDtorReferenceInStaticMode()) {
1187 StringRef
Sym(".constructors_used");
1188 OutStreamer
.EmitSymbolAttribute(OutContext
.GetOrCreateSymbol(Sym
),
1194 if (GV
->getName() == "llvm.global_dtors") {
1195 OutStreamer
.SwitchSection(getObjFileLowering().getStaticDtorSection());
1196 EmitAlignment(Align
);
1197 EmitXXStructorList(GV
->getInitializer());
1199 if (TM
.getRelocationModel() == Reloc::Static
&&
1200 MAI
->hasStaticCtorDtorReferenceInStaticMode()) {
1201 StringRef
Sym(".destructors_used");
1202 OutStreamer
.EmitSymbolAttribute(OutContext
.GetOrCreateSymbol(Sym
),
1211 /// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
1212 /// global in the specified llvm.used list for which emitUsedDirectiveFor
1213 /// is true, as being used with this directive.
1214 void AsmPrinter::EmitLLVMUsedList(Constant
*List
) {
1215 // Should be an array of 'i8*'.
1216 ConstantArray
*InitList
= dyn_cast
<ConstantArray
>(List
);
1217 if (InitList
== 0) return;
1219 for (unsigned i
= 0, e
= InitList
->getNumOperands(); i
!= e
; ++i
) {
1220 const GlobalValue
*GV
=
1221 dyn_cast
<GlobalValue
>(InitList
->getOperand(i
)->stripPointerCasts());
1222 if (GV
&& getObjFileLowering().shouldEmitUsedDirectiveFor(GV
, Mang
))
1223 OutStreamer
.EmitSymbolAttribute(Mang
->getSymbol(GV
), MCSA_NoDeadStrip
);
1227 /// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the
1228 /// function pointers, ignoring the init priority.
1229 void AsmPrinter::EmitXXStructorList(Constant
*List
) {
1230 // Should be an array of '{ int, void ()* }' structs. The first value is the
1231 // init priority, which we ignore.
1232 if (!isa
<ConstantArray
>(List
)) return;
1233 ConstantArray
*InitList
= cast
<ConstantArray
>(List
);
1234 for (unsigned i
= 0, e
= InitList
->getNumOperands(); i
!= e
; ++i
)
1235 if (ConstantStruct
*CS
= dyn_cast
<ConstantStruct
>(InitList
->getOperand(i
))){
1236 if (CS
->getNumOperands() != 2) return; // Not array of 2-element structs.
1238 if (CS
->getOperand(1)->isNullValue())
1239 return; // Found a null terminator, exit printing.
1240 // Emit the function pointer.
1241 EmitGlobalConstant(CS
->getOperand(1));
1245 //===--------------------------------------------------------------------===//
1246 // Emission and print routines
1249 /// EmitInt8 - Emit a byte directive and value.
1251 void AsmPrinter::EmitInt8(int Value
) const {
1252 OutStreamer
.EmitIntValue(Value
, 1, 0/*addrspace*/);
1255 /// EmitInt16 - Emit a short directive and value.
1257 void AsmPrinter::EmitInt16(int Value
) const {
1258 OutStreamer
.EmitIntValue(Value
, 2, 0/*addrspace*/);
1261 /// EmitInt32 - Emit a long directive and value.
1263 void AsmPrinter::EmitInt32(int Value
) const {
1264 OutStreamer
.EmitIntValue(Value
, 4, 0/*addrspace*/);
1267 /// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size
1268 /// in bytes of the directive is specified by Size and Hi/Lo specify the
1269 /// labels. This implicitly uses .set if it is available.
1270 void AsmPrinter::EmitLabelDifference(const MCSymbol
*Hi
, const MCSymbol
*Lo
,
1271 unsigned Size
) const {
1272 // Get the Hi-Lo expression.
1273 const MCExpr
*Diff
=
1274 MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi
, OutContext
),
1275 MCSymbolRefExpr::Create(Lo
, OutContext
),
1278 if (!MAI
->hasSetDirective()) {
1279 OutStreamer
.EmitValue(Diff
, Size
, 0/*AddrSpace*/);
1283 // Otherwise, emit with .set (aka assignment).
1284 MCSymbol
*SetLabel
= GetTempSymbol("set", SetCounter
++);
1285 OutStreamer
.EmitAssignment(SetLabel
, Diff
);
1286 OutStreamer
.EmitSymbolValue(SetLabel
, Size
, 0/*AddrSpace*/);
1289 /// EmitLabelOffsetDifference - Emit something like ".long Hi+Offset-Lo"
1290 /// where the size in bytes of the directive is specified by Size and Hi/Lo
1291 /// specify the labels. This implicitly uses .set if it is available.
1292 void AsmPrinter::EmitLabelOffsetDifference(const MCSymbol
*Hi
, uint64_t Offset
,
1293 const MCSymbol
*Lo
, unsigned Size
)
1296 // Emit Hi+Offset - Lo
1297 // Get the Hi+Offset expression.
1298 const MCExpr
*Plus
=
1299 MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Hi
, OutContext
),
1300 MCConstantExpr::Create(Offset
, OutContext
),
1303 // Get the Hi+Offset-Lo expression.
1304 const MCExpr
*Diff
=
1305 MCBinaryExpr::CreateSub(Plus
,
1306 MCSymbolRefExpr::Create(Lo
, OutContext
),
1309 if (!MAI
->hasSetDirective())
1310 OutStreamer
.EmitValue(Diff
, 4, 0/*AddrSpace*/);
1312 // Otherwise, emit with .set (aka assignment).
1313 MCSymbol
*SetLabel
= GetTempSymbol("set", SetCounter
++);
1314 OutStreamer
.EmitAssignment(SetLabel
, Diff
);
1315 OutStreamer
.EmitSymbolValue(SetLabel
, 4, 0/*AddrSpace*/);
1319 /// EmitLabelPlusOffset - Emit something like ".long Label+Offset"
1320 /// where the size in bytes of the directive is specified by Size and Label
1321 /// specifies the label. This implicitly uses .set if it is available.
1322 void AsmPrinter::EmitLabelPlusOffset(const MCSymbol
*Label
, uint64_t Offset
,
1326 // Emit Label+Offset
1327 const MCExpr
*Plus
=
1328 MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Label
, OutContext
),
1329 MCConstantExpr::Create(Offset
, OutContext
),
1332 OutStreamer
.EmitValue(Plus
, 4, 0/*AddrSpace*/);
1336 //===----------------------------------------------------------------------===//
1338 // EmitAlignment - Emit an alignment directive to the specified power of
1339 // two boundary. For example, if you pass in 3 here, you will get an 8
1340 // byte alignment. If a global value is specified, and if that global has
1341 // an explicit alignment requested, it will override the alignment request
1342 // if required for correctness.
1344 void AsmPrinter::EmitAlignment(unsigned NumBits
, const GlobalValue
*GV
) const {
1345 if (GV
) NumBits
= getGVAlignmentLog2(GV
, *TM
.getTargetData(), NumBits
);
1347 if (NumBits
== 0) return; // 1-byte aligned: no need to emit alignment.
1349 if (getCurrentSection()->getKind().isText())
1350 OutStreamer
.EmitCodeAlignment(1 << NumBits
);
1352 OutStreamer
.EmitValueToAlignment(1 << NumBits
, 0, 1, 0);
1355 //===----------------------------------------------------------------------===//
1356 // Constant emission.
1357 //===----------------------------------------------------------------------===//
1359 /// LowerConstant - Lower the specified LLVM Constant to an MCExpr.
1361 static const MCExpr
*LowerConstant(const Constant
*CV
, AsmPrinter
&AP
) {
1362 MCContext
&Ctx
= AP
.OutContext
;
1364 if (CV
->isNullValue() || isa
<UndefValue
>(CV
))
1365 return MCConstantExpr::Create(0, Ctx
);
1367 if (const ConstantInt
*CI
= dyn_cast
<ConstantInt
>(CV
))
1368 return MCConstantExpr::Create(CI
->getZExtValue(), Ctx
);
1370 if (const GlobalValue
*GV
= dyn_cast
<GlobalValue
>(CV
))
1371 return MCSymbolRefExpr::Create(AP
.Mang
->getSymbol(GV
), Ctx
);
1373 if (const BlockAddress
*BA
= dyn_cast
<BlockAddress
>(CV
))
1374 return MCSymbolRefExpr::Create(AP
.GetBlockAddressSymbol(BA
), Ctx
);
1376 const ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(CV
);
1378 llvm_unreachable("Unknown constant value to lower!");
1379 return MCConstantExpr::Create(0, Ctx
);
1382 switch (CE
->getOpcode()) {
1384 // If the code isn't optimized, there may be outstanding folding
1385 // opportunities. Attempt to fold the expression using TargetData as a
1386 // last resort before giving up.
1388 ConstantFoldConstantExpression(CE
, AP
.TM
.getTargetData()))
1390 return LowerConstant(C
, AP
);
1392 // Otherwise report the problem to the user.
1395 raw_string_ostream
OS(S
);
1396 OS
<< "Unsupported expression in static initializer: ";
1397 WriteAsOperand(OS
, CE
, /*PrintType=*/false,
1398 !AP
.MF
? 0 : AP
.MF
->getFunction()->getParent());
1399 report_fatal_error(OS
.str());
1401 return MCConstantExpr::Create(0, Ctx
);
1402 case Instruction::GetElementPtr
: {
1403 const TargetData
&TD
= *AP
.TM
.getTargetData();
1404 // Generate a symbolic expression for the byte address
1405 const Constant
*PtrVal
= CE
->getOperand(0);
1406 SmallVector
<Value
*, 8> IdxVec(CE
->op_begin()+1, CE
->op_end());
1407 int64_t Offset
= TD
.getIndexedOffset(PtrVal
->getType(), &IdxVec
[0],
1410 const MCExpr
*Base
= LowerConstant(CE
->getOperand(0), AP
);
1414 // Truncate/sext the offset to the pointer size.
1415 if (TD
.getPointerSizeInBits() != 64) {
1416 int SExtAmount
= 64-TD
.getPointerSizeInBits();
1417 Offset
= (Offset
<< SExtAmount
) >> SExtAmount
;
1420 return MCBinaryExpr::CreateAdd(Base
, MCConstantExpr::Create(Offset
, Ctx
),
1424 case Instruction::Trunc
:
1425 // We emit the value and depend on the assembler to truncate the generated
1426 // expression properly. This is important for differences between
1427 // blockaddress labels. Since the two labels are in the same function, it
1428 // is reasonable to treat their delta as a 32-bit value.
1430 case Instruction::BitCast
:
1431 return LowerConstant(CE
->getOperand(0), AP
);
1433 case Instruction::IntToPtr
: {
1434 const TargetData
&TD
= *AP
.TM
.getTargetData();
1435 // Handle casts to pointers by changing them into casts to the appropriate
1436 // integer type. This promotes constant folding and simplifies this code.
1437 Constant
*Op
= CE
->getOperand(0);
1438 Op
= ConstantExpr::getIntegerCast(Op
, TD
.getIntPtrType(CV
->getContext()),
1440 return LowerConstant(Op
, AP
);
1443 case Instruction::PtrToInt
: {
1444 const TargetData
&TD
= *AP
.TM
.getTargetData();
1445 // Support only foldable casts to/from pointers that can be eliminated by
1446 // changing the pointer to the appropriately sized integer type.
1447 Constant
*Op
= CE
->getOperand(0);
1448 const Type
*Ty
= CE
->getType();
1450 const MCExpr
*OpExpr
= LowerConstant(Op
, AP
);
1452 // We can emit the pointer value into this slot if the slot is an
1453 // integer slot equal to the size of the pointer.
1454 if (TD
.getTypeAllocSize(Ty
) == TD
.getTypeAllocSize(Op
->getType()))
1457 // Otherwise the pointer is smaller than the resultant integer, mask off
1458 // the high bits so we are sure to get a proper truncation if the input is
1460 unsigned InBits
= TD
.getTypeAllocSizeInBits(Op
->getType());
1461 const MCExpr
*MaskExpr
= MCConstantExpr::Create(~0ULL >> (64-InBits
), Ctx
);
1462 return MCBinaryExpr::CreateAnd(OpExpr
, MaskExpr
, Ctx
);
1465 // The MC library also has a right-shift operator, but it isn't consistently
1466 // signed or unsigned between different targets.
1467 case Instruction::Add
:
1468 case Instruction::Sub
:
1469 case Instruction::Mul
:
1470 case Instruction::SDiv
:
1471 case Instruction::SRem
:
1472 case Instruction::Shl
:
1473 case Instruction::And
:
1474 case Instruction::Or
:
1475 case Instruction::Xor
: {
1476 const MCExpr
*LHS
= LowerConstant(CE
->getOperand(0), AP
);
1477 const MCExpr
*RHS
= LowerConstant(CE
->getOperand(1), AP
);
1478 switch (CE
->getOpcode()) {
1479 default: llvm_unreachable("Unknown binary operator constant cast expr");
1480 case Instruction::Add
: return MCBinaryExpr::CreateAdd(LHS
, RHS
, Ctx
);
1481 case Instruction::Sub
: return MCBinaryExpr::CreateSub(LHS
, RHS
, Ctx
);
1482 case Instruction::Mul
: return MCBinaryExpr::CreateMul(LHS
, RHS
, Ctx
);
1483 case Instruction::SDiv
: return MCBinaryExpr::CreateDiv(LHS
, RHS
, Ctx
);
1484 case Instruction::SRem
: return MCBinaryExpr::CreateMod(LHS
, RHS
, Ctx
);
1485 case Instruction::Shl
: return MCBinaryExpr::CreateShl(LHS
, RHS
, Ctx
);
1486 case Instruction::And
: return MCBinaryExpr::CreateAnd(LHS
, RHS
, Ctx
);
1487 case Instruction::Or
: return MCBinaryExpr::CreateOr (LHS
, RHS
, Ctx
);
1488 case Instruction::Xor
: return MCBinaryExpr::CreateXor(LHS
, RHS
, Ctx
);
1494 static void EmitGlobalConstantImpl(const Constant
*C
, unsigned AddrSpace
,
1497 static void EmitGlobalConstantArray(const ConstantArray
*CA
, unsigned AddrSpace
,
1499 if (AddrSpace
!= 0 || !CA
->isString()) {
1500 // Not a string. Print the values in successive locations
1501 for (unsigned i
= 0, e
= CA
->getNumOperands(); i
!= e
; ++i
)
1502 EmitGlobalConstantImpl(CA
->getOperand(i
), AddrSpace
, AP
);
1506 // Otherwise, it can be emitted as .ascii.
1507 SmallVector
<char, 128> TmpVec
;
1508 TmpVec
.reserve(CA
->getNumOperands());
1509 for (unsigned i
= 0, e
= CA
->getNumOperands(); i
!= e
; ++i
)
1510 TmpVec
.push_back(cast
<ConstantInt
>(CA
->getOperand(i
))->getZExtValue());
1512 AP
.OutStreamer
.EmitBytes(StringRef(TmpVec
.data(), TmpVec
.size()), AddrSpace
);
1515 static void EmitGlobalConstantVector(const ConstantVector
*CV
,
1516 unsigned AddrSpace
, AsmPrinter
&AP
) {
1517 for (unsigned i
= 0, e
= CV
->getType()->getNumElements(); i
!= e
; ++i
)
1518 EmitGlobalConstantImpl(CV
->getOperand(i
), AddrSpace
, AP
);
1521 static void EmitGlobalConstantStruct(const ConstantStruct
*CS
,
1522 unsigned AddrSpace
, AsmPrinter
&AP
) {
1523 // Print the fields in successive locations. Pad to align if needed!
1524 const TargetData
*TD
= AP
.TM
.getTargetData();
1525 unsigned Size
= TD
->getTypeAllocSize(CS
->getType());
1526 const StructLayout
*Layout
= TD
->getStructLayout(CS
->getType());
1527 uint64_t SizeSoFar
= 0;
1528 for (unsigned i
= 0, e
= CS
->getNumOperands(); i
!= e
; ++i
) {
1529 const Constant
*Field
= CS
->getOperand(i
);
1531 // Check if padding is needed and insert one or more 0s.
1532 uint64_t FieldSize
= TD
->getTypeAllocSize(Field
->getType());
1533 uint64_t PadSize
= ((i
== e
-1 ? Size
: Layout
->getElementOffset(i
+1))
1534 - Layout
->getElementOffset(i
)) - FieldSize
;
1535 SizeSoFar
+= FieldSize
+ PadSize
;
1537 // Now print the actual field value.
1538 EmitGlobalConstantImpl(Field
, AddrSpace
, AP
);
1540 // Insert padding - this may include padding to increase the size of the
1541 // current field up to the ABI size (if the struct is not packed) as well
1542 // as padding to ensure that the next field starts at the right offset.
1543 AP
.OutStreamer
.EmitZeros(PadSize
, AddrSpace
);
1545 assert(SizeSoFar
== Layout
->getSizeInBytes() &&
1546 "Layout of constant struct may be incorrect!");
1549 static void EmitGlobalConstantFP(const ConstantFP
*CFP
, unsigned AddrSpace
,
1551 // FP Constants are printed as integer constants to avoid losing
1553 if (CFP
->getType()->isDoubleTy()) {
1554 if (AP
.isVerbose()) {
1555 double Val
= CFP
->getValueAPF().convertToDouble();
1556 AP
.OutStreamer
.GetCommentOS() << "double " << Val
<< '\n';
1559 uint64_t Val
= CFP
->getValueAPF().bitcastToAPInt().getZExtValue();
1560 AP
.OutStreamer
.EmitIntValue(Val
, 8, AddrSpace
);
1564 if (CFP
->getType()->isFloatTy()) {
1565 if (AP
.isVerbose()) {
1566 float Val
= CFP
->getValueAPF().convertToFloat();
1567 AP
.OutStreamer
.GetCommentOS() << "float " << Val
<< '\n';
1569 uint64_t Val
= CFP
->getValueAPF().bitcastToAPInt().getZExtValue();
1570 AP
.OutStreamer
.EmitIntValue(Val
, 4, AddrSpace
);
1574 if (CFP
->getType()->isX86_FP80Ty()) {
1575 // all long double variants are printed as hex
1576 // API needed to prevent premature destruction
1577 APInt API
= CFP
->getValueAPF().bitcastToAPInt();
1578 const uint64_t *p
= API
.getRawData();
1579 if (AP
.isVerbose()) {
1580 // Convert to double so we can print the approximate val as a comment.
1581 APFloat DoubleVal
= CFP
->getValueAPF();
1583 DoubleVal
.convert(APFloat::IEEEdouble
, APFloat::rmNearestTiesToEven
,
1585 AP
.OutStreamer
.GetCommentOS() << "x86_fp80 ~= "
1586 << DoubleVal
.convertToDouble() << '\n';
1589 if (AP
.TM
.getTargetData()->isBigEndian()) {
1590 AP
.OutStreamer
.EmitIntValue(p
[1], 2, AddrSpace
);
1591 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1593 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1594 AP
.OutStreamer
.EmitIntValue(p
[1], 2, AddrSpace
);
1597 // Emit the tail padding for the long double.
1598 const TargetData
&TD
= *AP
.TM
.getTargetData();
1599 AP
.OutStreamer
.EmitZeros(TD
.getTypeAllocSize(CFP
->getType()) -
1600 TD
.getTypeStoreSize(CFP
->getType()), AddrSpace
);
1604 assert(CFP
->getType()->isPPC_FP128Ty() &&
1605 "Floating point constant type not handled");
1606 // All long double variants are printed as hex
1607 // API needed to prevent premature destruction.
1608 APInt API
= CFP
->getValueAPF().bitcastToAPInt();
1609 const uint64_t *p
= API
.getRawData();
1610 if (AP
.TM
.getTargetData()->isBigEndian()) {
1611 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1612 AP
.OutStreamer
.EmitIntValue(p
[1], 8, AddrSpace
);
1614 AP
.OutStreamer
.EmitIntValue(p
[1], 8, AddrSpace
);
1615 AP
.OutStreamer
.EmitIntValue(p
[0], 8, AddrSpace
);
1619 static void EmitGlobalConstantLargeInt(const ConstantInt
*CI
,
1620 unsigned AddrSpace
, AsmPrinter
&AP
) {
1621 const TargetData
*TD
= AP
.TM
.getTargetData();
1622 unsigned BitWidth
= CI
->getBitWidth();
1623 assert((BitWidth
& 63) == 0 && "only support multiples of 64-bits");
1625 // We don't expect assemblers to support integer data directives
1626 // for more than 64 bits, so we emit the data in at most 64-bit
1627 // quantities at a time.
1628 const uint64_t *RawData
= CI
->getValue().getRawData();
1629 for (unsigned i
= 0, e
= BitWidth
/ 64; i
!= e
; ++i
) {
1630 uint64_t Val
= TD
->isBigEndian() ? RawData
[e
- i
- 1] : RawData
[i
];
1631 AP
.OutStreamer
.EmitIntValue(Val
, 8, AddrSpace
);
1635 static void EmitGlobalConstantImpl(const Constant
*CV
, unsigned AddrSpace
,
1637 if (isa
<ConstantAggregateZero
>(CV
) || isa
<UndefValue
>(CV
)) {
1638 uint64_t Size
= AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1639 return AP
.OutStreamer
.EmitZeros(Size
, AddrSpace
);
1642 if (const ConstantInt
*CI
= dyn_cast
<ConstantInt
>(CV
)) {
1643 unsigned Size
= AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1650 AP
.OutStreamer
.GetCommentOS() << format("0x%llx\n", CI
->getZExtValue());
1651 AP
.OutStreamer
.EmitIntValue(CI
->getZExtValue(), Size
, AddrSpace
);
1654 EmitGlobalConstantLargeInt(CI
, AddrSpace
, AP
);
1659 if (const ConstantArray
*CVA
= dyn_cast
<ConstantArray
>(CV
))
1660 return EmitGlobalConstantArray(CVA
, AddrSpace
, AP
);
1662 if (const ConstantStruct
*CVS
= dyn_cast
<ConstantStruct
>(CV
))
1663 return EmitGlobalConstantStruct(CVS
, AddrSpace
, AP
);
1665 if (const ConstantFP
*CFP
= dyn_cast
<ConstantFP
>(CV
))
1666 return EmitGlobalConstantFP(CFP
, AddrSpace
, AP
);
1668 if (isa
<ConstantPointerNull
>(CV
)) {
1669 unsigned Size
= AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1670 AP
.OutStreamer
.EmitIntValue(0, Size
, AddrSpace
);
1674 if (const ConstantVector
*V
= dyn_cast
<ConstantVector
>(CV
))
1675 return EmitGlobalConstantVector(V
, AddrSpace
, AP
);
1677 // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it
1678 // thread the streamer with EmitValue.
1679 AP
.OutStreamer
.EmitValue(LowerConstant(CV
, AP
),
1680 AP
.TM
.getTargetData()->getTypeAllocSize(CV
->getType()),
1684 /// EmitGlobalConstant - Print a general LLVM constant to the .s file.
1685 void AsmPrinter::EmitGlobalConstant(const Constant
*CV
, unsigned AddrSpace
) {
1686 uint64_t Size
= TM
.getTargetData()->getTypeAllocSize(CV
->getType());
1688 EmitGlobalConstantImpl(CV
, AddrSpace
, *this);
1689 else if (MAI
->hasSubsectionsViaSymbols()) {
1690 // If the global has zero size, emit a single byte so that two labels don't
1691 // look like they are at the same location.
1692 OutStreamer
.EmitIntValue(0, 1, AddrSpace
);
1696 void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue
*MCPV
) {
1697 // Target doesn't support this yet!
1698 llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
1701 void AsmPrinter::printOffset(int64_t Offset
, raw_ostream
&OS
) const {
1703 OS
<< '+' << Offset
;
1704 else if (Offset
< 0)
1708 //===----------------------------------------------------------------------===//
1709 // Symbol Lowering Routines.
1710 //===----------------------------------------------------------------------===//
1712 /// GetTempSymbol - Return the MCSymbol corresponding to the assembler
1713 /// temporary label with the specified stem and unique ID.
1714 MCSymbol
*AsmPrinter::GetTempSymbol(StringRef Name
, unsigned ID
) const {
1715 return OutContext
.GetOrCreateSymbol(Twine(MAI
->getPrivateGlobalPrefix()) +
1719 /// GetTempSymbol - Return an assembler temporary label with the specified
1721 MCSymbol
*AsmPrinter::GetTempSymbol(StringRef Name
) const {
1722 return OutContext
.GetOrCreateSymbol(Twine(MAI
->getPrivateGlobalPrefix())+
1727 MCSymbol
*AsmPrinter::GetBlockAddressSymbol(const BlockAddress
*BA
) const {
1728 return MMI
->getAddrLabelSymbol(BA
->getBasicBlock());
1731 MCSymbol
*AsmPrinter::GetBlockAddressSymbol(const BasicBlock
*BB
) const {
1732 return MMI
->getAddrLabelSymbol(BB
);
1735 /// GetCPISymbol - Return the symbol for the specified constant pool entry.
1736 MCSymbol
*AsmPrinter::GetCPISymbol(unsigned CPID
) const {
1737 return OutContext
.GetOrCreateSymbol
1738 (Twine(MAI
->getPrivateGlobalPrefix()) + "CPI" + Twine(getFunctionNumber())
1739 + "_" + Twine(CPID
));
1742 /// GetJTISymbol - Return the symbol for the specified jump table entry.
1743 MCSymbol
*AsmPrinter::GetJTISymbol(unsigned JTID
, bool isLinkerPrivate
) const {
1744 return MF
->getJTISymbol(JTID
, OutContext
, isLinkerPrivate
);
1747 /// GetJTSetSymbol - Return the symbol for the specified jump table .set
1748 /// FIXME: privatize to AsmPrinter.
1749 MCSymbol
*AsmPrinter::GetJTSetSymbol(unsigned UID
, unsigned MBBID
) const {
1750 return OutContext
.GetOrCreateSymbol
1751 (Twine(MAI
->getPrivateGlobalPrefix()) + Twine(getFunctionNumber()) + "_" +
1752 Twine(UID
) + "_set_" + Twine(MBBID
));
1755 /// GetSymbolWithGlobalValueBase - Return the MCSymbol for a symbol with
1756 /// global value name as its base, with the specified suffix, and where the
1757 /// symbol is forced to have private linkage if ForcePrivate is true.
1758 MCSymbol
*AsmPrinter::GetSymbolWithGlobalValueBase(const GlobalValue
*GV
,
1760 bool ForcePrivate
) const {
1761 SmallString
<60> NameStr
;
1762 Mang
->getNameWithPrefix(NameStr
, GV
, ForcePrivate
);
1763 NameStr
.append(Suffix
.begin(), Suffix
.end());
1764 return OutContext
.GetOrCreateSymbol(NameStr
.str());
1767 /// GetExternalSymbolSymbol - Return the MCSymbol for the specified
1769 MCSymbol
*AsmPrinter::GetExternalSymbolSymbol(StringRef Sym
) const {
1770 SmallString
<60> NameStr
;
1771 Mang
->getNameWithPrefix(NameStr
, Sym
);
1772 return OutContext
.GetOrCreateSymbol(NameStr
.str());
1777 /// PrintParentLoopComment - Print comments about parent loops of this one.
1778 static void PrintParentLoopComment(raw_ostream
&OS
, const MachineLoop
*Loop
,
1779 unsigned FunctionNumber
) {
1780 if (Loop
== 0) return;
1781 PrintParentLoopComment(OS
, Loop
->getParentLoop(), FunctionNumber
);
1782 OS
.indent(Loop
->getLoopDepth()*2)
1783 << "Parent Loop BB" << FunctionNumber
<< "_"
1784 << Loop
->getHeader()->getNumber()
1785 << " Depth=" << Loop
->getLoopDepth() << '\n';
1789 /// PrintChildLoopComment - Print comments about child loops within
1790 /// the loop for this basic block, with nesting.
1791 static void PrintChildLoopComment(raw_ostream
&OS
, const MachineLoop
*Loop
,
1792 unsigned FunctionNumber
) {
1793 // Add child loop information
1794 for (MachineLoop::iterator CL
= Loop
->begin(), E
= Loop
->end();CL
!= E
; ++CL
){
1795 OS
.indent((*CL
)->getLoopDepth()*2)
1796 << "Child Loop BB" << FunctionNumber
<< "_"
1797 << (*CL
)->getHeader()->getNumber() << " Depth " << (*CL
)->getLoopDepth()
1799 PrintChildLoopComment(OS
, *CL
, FunctionNumber
);
1803 /// EmitBasicBlockLoopComments - Pretty-print comments for basic blocks.
1804 static void EmitBasicBlockLoopComments(const MachineBasicBlock
&MBB
,
1805 const MachineLoopInfo
*LI
,
1806 const AsmPrinter
&AP
) {
1807 // Add loop depth information
1808 const MachineLoop
*Loop
= LI
->getLoopFor(&MBB
);
1809 if (Loop
== 0) return;
1811 MachineBasicBlock
*Header
= Loop
->getHeader();
1812 assert(Header
&& "No header for loop");
1814 // If this block is not a loop header, just print out what is the loop header
1816 if (Header
!= &MBB
) {
1817 AP
.OutStreamer
.AddComment(" in Loop: Header=BB" +
1818 Twine(AP
.getFunctionNumber())+"_" +
1819 Twine(Loop
->getHeader()->getNumber())+
1820 " Depth="+Twine(Loop
->getLoopDepth()));
1824 // Otherwise, it is a loop header. Print out information about child and
1826 raw_ostream
&OS
= AP
.OutStreamer
.GetCommentOS();
1828 PrintParentLoopComment(OS
, Loop
->getParentLoop(), AP
.getFunctionNumber());
1831 OS
.indent(Loop
->getLoopDepth()*2-2);
1836 OS
<< "Loop Header: Depth=" + Twine(Loop
->getLoopDepth()) << '\n';
1838 PrintChildLoopComment(OS
, Loop
, AP
.getFunctionNumber());
1842 /// EmitBasicBlockStart - This method prints the label for the specified
1843 /// MachineBasicBlock, an alignment (if present) and a comment describing
1844 /// it if appropriate.
1845 void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock
*MBB
) const {
1846 // Emit an alignment directive for this block, if needed.
1847 if (unsigned Align
= MBB
->getAlignment())
1848 EmitAlignment(Log2_32(Align
));
1850 // If the block has its address taken, emit any labels that were used to
1851 // reference the block. It is possible that there is more than one label
1852 // here, because multiple LLVM BB's may have been RAUW'd to this block after
1853 // the references were generated.
1854 if (MBB
->hasAddressTaken()) {
1855 const BasicBlock
*BB
= MBB
->getBasicBlock();
1857 OutStreamer
.AddComment("Block address taken");
1859 std::vector
<MCSymbol
*> Syms
= MMI
->getAddrLabelSymbolToEmit(BB
);
1861 for (unsigned i
= 0, e
= Syms
.size(); i
!= e
; ++i
)
1862 OutStreamer
.EmitLabel(Syms
[i
]);
1865 // Print the main label for the block.
1866 if (MBB
->pred_empty() || isBlockOnlyReachableByFallthrough(MBB
)) {
1867 if (isVerbose() && OutStreamer
.hasRawTextSupport()) {
1868 if (const BasicBlock
*BB
= MBB
->getBasicBlock())
1870 OutStreamer
.AddComment("%" + BB
->getName());
1872 EmitBasicBlockLoopComments(*MBB
, LI
, *this);
1874 // NOTE: Want this comment at start of line, don't emit with AddComment.
1875 OutStreamer
.EmitRawText(Twine(MAI
->getCommentString()) + " BB#" +
1876 Twine(MBB
->getNumber()) + ":");
1880 if (const BasicBlock
*BB
= MBB
->getBasicBlock())
1882 OutStreamer
.AddComment("%" + BB
->getName());
1883 EmitBasicBlockLoopComments(*MBB
, LI
, *this);
1886 OutStreamer
.EmitLabel(MBB
->getSymbol());
1890 void AsmPrinter::EmitVisibility(MCSymbol
*Sym
, unsigned Visibility
,
1891 bool IsDefinition
) const {
1892 MCSymbolAttr Attr
= MCSA_Invalid
;
1894 switch (Visibility
) {
1896 case GlobalValue::HiddenVisibility
:
1898 Attr
= MAI
->getHiddenVisibilityAttr();
1900 Attr
= MAI
->getHiddenDeclarationVisibilityAttr();
1902 case GlobalValue::ProtectedVisibility
:
1903 Attr
= MAI
->getProtectedVisibilityAttr();
1907 if (Attr
!= MCSA_Invalid
)
1908 OutStreamer
.EmitSymbolAttribute(Sym
, Attr
);
1911 /// isBlockOnlyReachableByFallthough - Return true if the basic block has
1912 /// exactly one predecessor and the control transfer mechanism between
1913 /// the predecessor and this block is a fall-through.
1915 isBlockOnlyReachableByFallthrough(const MachineBasicBlock
*MBB
) const {
1916 // If this is a landing pad, it isn't a fall through. If it has no preds,
1917 // then nothing falls through to it.
1918 if (MBB
->isLandingPad() || MBB
->pred_empty())
1921 // If there isn't exactly one predecessor, it can't be a fall through.
1922 MachineBasicBlock::const_pred_iterator PI
= MBB
->pred_begin(), PI2
= PI
;
1924 if (PI2
!= MBB
->pred_end())
1927 // The predecessor has to be immediately before this block.
1928 MachineBasicBlock
*Pred
= *PI
;
1930 if (!Pred
->isLayoutSuccessor(MBB
))
1933 // If the block is completely empty, then it definitely does fall through.
1937 // Check the terminators in the previous blocks
1938 for (MachineBasicBlock::iterator II
= Pred
->getFirstTerminator(),
1939 IE
= Pred
->end(); II
!= IE
; ++II
) {
1940 MachineInstr
&MI
= *II
;
1942 // If it is not a simple branch, we are in a table somewhere.
1943 if (!MI
.getDesc().isBranch() || MI
.getDesc().isIndirectBranch())
1946 // If we are the operands of one of the branches, this is not
1948 for (MachineInstr::mop_iterator OI
= MI
.operands_begin(),
1949 OE
= MI
.operands_end(); OI
!= OE
; ++OI
) {
1950 const MachineOperand
& OP
= *OI
;
1951 if (OP
.isMBB() && OP
.getMBB() == MBB
)
1961 GCMetadataPrinter
*AsmPrinter::GetOrCreateGCPrinter(GCStrategy
*S
) {
1962 if (!S
->usesMetadata())
1965 gcp_map_type
&GCMap
= getGCMap(GCMetadataPrinters
);
1966 gcp_map_type::iterator GCPI
= GCMap
.find(S
);
1967 if (GCPI
!= GCMap
.end())
1968 return GCPI
->second
;
1970 const char *Name
= S
->getName().c_str();
1972 for (GCMetadataPrinterRegistry::iterator
1973 I
= GCMetadataPrinterRegistry::begin(),
1974 E
= GCMetadataPrinterRegistry::end(); I
!= E
; ++I
)
1975 if (strcmp(Name
, I
->getName()) == 0) {
1976 GCMetadataPrinter
*GMP
= I
->instantiate();
1978 GCMap
.insert(std::make_pair(S
, GMP
));
1982 report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name
));