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