70053264c364cb1bf09d38275c1b82ad2c3826a1
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfDebug.cpp
1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
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 contains support for writing dwarf debug info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
16 #include "DIE.h"
17 #include "DwarfCompileUnit.h"
18 #include "llvm/Constants.h"
19 #include "llvm/Module.h"
20 #include "llvm/Instructions.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineModuleInfo.h"
23 #include "llvm/MC/MCAsmInfo.h"
24 #include "llvm/MC/MCSection.h"
25 #include "llvm/MC/MCStreamer.h"
26 #include "llvm/MC/MCSymbol.h"
27 #include "llvm/Target/Mangler.h"
28 #include "llvm/Target/TargetData.h"
29 #include "llvm/Target/TargetFrameLowering.h"
30 #include "llvm/Target/TargetLoweringObjectFile.h"
31 #include "llvm/Target/TargetMachine.h"
32 #include "llvm/Target/TargetRegisterInfo.h"
33 #include "llvm/Target/TargetOptions.h"
34 #include "llvm/Analysis/DebugInfo.h"
35 #include "llvm/Analysis/DIBuilder.h"
36 #include "llvm/ADT/Statistic.h"
37 #include "llvm/ADT/STLExtras.h"
38 #include "llvm/ADT/StringExtras.h"
39 #include "llvm/Support/CommandLine.h"
40 #include "llvm/Support/Debug.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/ValueHandle.h"
43 #include "llvm/Support/FormattedStream.h"
44 #include "llvm/Support/Timer.h"
45 #include "llvm/Support/Path.h"
46 using namespace llvm;
47
48 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
49      cl::desc("Print DbgScope information for each machine instruction"));
50
51 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
52                                               cl::Hidden,
53      cl::desc("Disable debug info printing"));
54
55 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
56      cl::desc("Make an absense of debug location information explicit."),
57      cl::init(false));
58
59 #ifndef NDEBUG
60 STATISTIC(BlocksWithoutLineNo, "Number of blocks without any line number");
61 #endif
62
63 namespace {
64   const char *DWARFGroupName = "DWARF Emission";
65   const char *DbgTimerName = "DWARF Debug Writer";
66 } // end anonymous namespace
67
68 //===----------------------------------------------------------------------===//
69
70 /// Configuration values for initial hash set sizes (log2).
71 ///
72 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
73
74 namespace llvm {
75
76 DIType DbgVariable::getType()               const {
77   DIType Ty = Var.getType();
78   // FIXME: isBlockByrefVariable should be reformulated in terms of complex
79   // addresses instead.
80   if (Var.isBlockByrefVariable()) {
81     /* Byref variables, in Blocks, are declared by the programmer as
82        "SomeType VarName;", but the compiler creates a
83        __Block_byref_x_VarName struct, and gives the variable VarName
84        either the struct, or a pointer to the struct, as its type.  This
85        is necessary for various behind-the-scenes things the compiler
86        needs to do with by-reference variables in blocks.
87        
88        However, as far as the original *programmer* is concerned, the
89        variable should still have type 'SomeType', as originally declared.
90        
91        The following function dives into the __Block_byref_x_VarName
92        struct to find the original type of the variable.  This will be
93        passed back to the code generating the type for the Debug
94        Information Entry for the variable 'VarName'.  'VarName' will then
95        have the original type 'SomeType' in its debug information.
96        
97        The original type 'SomeType' will be the type of the field named
98        'VarName' inside the __Block_byref_x_VarName struct.
99        
100        NOTE: In order for this to not completely fail on the debugger
101        side, the Debug Information Entry for the variable VarName needs to
102        have a DW_AT_location that tells the debugger how to unwind through
103        the pointers and __Block_byref_x_VarName struct to find the actual
104        value of the variable.  The function addBlockByrefType does this.  */
105     DIType subType = Ty;
106     unsigned tag = Ty.getTag();
107     
108     if (tag == dwarf::DW_TAG_pointer_type) {
109       DIDerivedType DTy = DIDerivedType(Ty);
110       subType = DTy.getTypeDerivedFrom();
111     }
112     
113     DICompositeType blockStruct = DICompositeType(subType);
114     DIArray Elements = blockStruct.getTypeArray();
115     
116     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
117       DIDescriptor Element = Elements.getElement(i);
118       DIDerivedType DT = DIDerivedType(Element);
119       if (getName() == DT.getName())
120         return (DT.getTypeDerivedFrom());
121     }
122     return Ty;
123   }
124   return Ty;
125 }
126
127 //===----------------------------------------------------------------------===//
128 /// DbgRange - This is used to track range of instructions with identical
129 /// debug info scope.
130 ///
131 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
132
133 //===----------------------------------------------------------------------===//
134 /// DbgScope - This class is used to track scope information.
135 ///
136 class DbgScope {
137   DbgScope *Parent;                   // Parent to this scope.
138   DIDescriptor Desc;                  // Debug info descriptor for scope.
139   // Location at which this scope is inlined.
140   AssertingVH<const MDNode> InlinedAtLocation;
141   bool AbstractScope;                 // Abstract Scope
142   const MachineInstr *LastInsn;       // Last instruction of this scope.
143   const MachineInstr *FirstInsn;      // First instruction of this scope.
144   unsigned DFSIn, DFSOut;
145   // Scopes defined in scope.  Contents not owned.
146   SmallVector<DbgScope *, 4> Scopes;
147   // Variables declared in scope.  Contents owned.
148   SmallVector<DbgVariable *, 8> Variables;
149   SmallVector<DbgRange, 4> Ranges;
150   // Private state for dump()
151   mutable unsigned IndentLevel;
152 public:
153   DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
154     : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
155       LastInsn(0), FirstInsn(0),
156       DFSIn(0), DFSOut(0), IndentLevel(0) {}
157   virtual ~DbgScope();
158
159   // Accessors.
160   DbgScope *getParent()          const { return Parent; }
161   void setParent(DbgScope *P)          { Parent = P; }
162   DIDescriptor getDesc()         const { return Desc; }
163   const MDNode *getInlinedAt()         const { return InlinedAtLocation; }
164   const MDNode *getScopeNode()         const { return Desc; }
165   const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
166   const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
167   const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
168
169   /// openInsnRange - This scope covers instruction range starting from MI.
170   void openInsnRange(const MachineInstr *MI) {
171     if (!FirstInsn)
172       FirstInsn = MI;
173
174     if (Parent)
175       Parent->openInsnRange(MI);
176   }
177
178   /// extendInsnRange - Extend the current instruction range covered by
179   /// this scope.
180   void extendInsnRange(const MachineInstr *MI) {
181     assert (FirstInsn && "MI Range is not open!");
182     LastInsn = MI;
183     if (Parent)
184       Parent->extendInsnRange(MI);
185   }
186
187   /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
188   /// until now. This is used when a new scope is encountered while walking
189   /// machine instructions.
190   void closeInsnRange(DbgScope *NewScope = NULL) {
191     assert (LastInsn && "Last insn missing!");
192     Ranges.push_back(DbgRange(FirstInsn, LastInsn));
193     FirstInsn = NULL;
194     LastInsn = NULL;
195     // If Parent dominates NewScope then do not close Parent's instruction
196     // range.
197     if (Parent && (!NewScope || !Parent->dominates(NewScope)))
198       Parent->closeInsnRange(NewScope);
199   }
200
201   void setAbstractScope() { AbstractScope = true; }
202   bool isAbstractScope() const { return AbstractScope; }
203
204   // Depth First Search support to walk and mainpluate DbgScope hierarchy.
205   unsigned getDFSOut() const { return DFSOut; }
206   void setDFSOut(unsigned O) { DFSOut = O; }
207   unsigned getDFSIn() const  { return DFSIn; }
208   void setDFSIn(unsigned I)  { DFSIn = I; }
209   bool dominates(const DbgScope *S) {
210     if (S == this)
211       return true;
212     if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
213       return true;
214     return false;
215   }
216
217   /// addScope - Add a scope to the scope.
218   ///
219   void addScope(DbgScope *S) { Scopes.push_back(S); }
220
221   /// addVariable - Add a variable to the scope.
222   ///
223   void addVariable(DbgVariable *V) { Variables.push_back(V); }
224
225 #ifndef NDEBUG
226   void dump() const;
227 #endif
228 };
229
230 } // end llvm namespace
231
232 #ifndef NDEBUG
233 void DbgScope::dump() const {
234   raw_ostream &err = dbgs();
235   err.indent(IndentLevel);
236   const MDNode *N = Desc;
237   N->dump();
238   if (AbstractScope)
239     err << "Abstract Scope\n";
240
241   IndentLevel += 2;
242   if (!Scopes.empty())
243     err << "Children ...\n";
244   for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
245     if (Scopes[i] != this)
246       Scopes[i]->dump();
247
248   IndentLevel -= 2;
249 }
250 #endif
251
252 DbgScope::~DbgScope() {
253   for (unsigned j = 0, M = Variables.size(); j < M; ++j)
254     delete Variables[j];
255 }
256
257 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
258   : Asm(A), MMI(Asm->MMI), FirstCU(0),
259     AbbreviationsSet(InitAbbreviationsSetSize),
260     CurrentFnDbgScope(0), PrevLabel(NULL) {
261   NextStringPoolNumber = 0;
262
263   DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
264   DwarfStrSectionSym = TextSectionSym = 0;
265   DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
266   FunctionBeginSym = FunctionEndSym = 0;
267   {
268     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
269     beginModule(M);
270   }
271 }
272 DwarfDebug::~DwarfDebug() {
273 }
274
275 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
276   std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
277   if (Entry.first) return Entry.first;
278
279   Entry.second = NextStringPoolNumber++;
280   return Entry.first = Asm->GetTempSymbol("string", Entry.second);
281 }
282
283
284 /// assignAbbrevNumber - Define a unique number for the abbreviation.
285 ///
286 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
287   // Profile the node so that we can make it unique.
288   FoldingSetNodeID ID;
289   Abbrev.Profile(ID);
290
291   // Check the set for priors.
292   DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
293
294   // If it's newly added.
295   if (InSet == &Abbrev) {
296     // Add to abbreviation list.
297     Abbreviations.push_back(&Abbrev);
298
299     // Assign the vector position + 1 as its number.
300     Abbrev.setNumber(Abbreviations.size());
301   } else {
302     // Assign existing abbreviation number.
303     Abbrev.setNumber(InSet->getNumber());
304   }
305 }
306
307 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
308 /// printer to not emit usual symbol prefix before the symbol name is used then
309 /// return linkage name after skipping this special LLVM prefix.
310 static StringRef getRealLinkageName(StringRef LinkageName) {
311   char One = '\1';
312   if (LinkageName.startswith(StringRef(&One, 1)))
313     return LinkageName.substr(1);
314   return LinkageName;
315 }
316
317 /// createSubprogramDIE - Create new DIE using SP.
318 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
319   CompileUnit *SPCU = getCompileUnit(SP);
320   DIE *SPDie = SPCU->getDIE(SP);
321   if (SPDie)
322     return SPDie;
323
324   SPDie = new DIE(dwarf::DW_TAG_subprogram);
325   // Constructors and operators for anonymous aggregates do not have names.
326   if (!SP.getName().empty())
327     SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, 
328                     SP.getName());
329
330   StringRef LinkageName = SP.getLinkageName();
331   if (!LinkageName.empty())
332     SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
333                     getRealLinkageName(LinkageName));
334
335   SPCU->addSourceLine(SPDie, SP);
336
337   if (SP.isPrototyped()) 
338     SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
339   
340   // Add Return Type.
341   DICompositeType SPTy = SP.getType();
342   DIArray Args = SPTy.getTypeArray();
343   unsigned SPTag = SPTy.getTag();
344
345   if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
346     SPCU->addType(SPDie, SPTy);
347   else
348     SPCU->addType(SPDie, DIType(Args.getElement(0)));
349
350   unsigned VK = SP.getVirtuality();
351   if (VK) {
352     SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
353     DIEBlock *Block = SPCU->getDIEBlock();
354     SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
355     SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
356     SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
357     ContainingTypeMap.insert(std::make_pair(SPDie,
358                                             SP.getContainingType()));
359   }
360
361   if (!SP.isDefinition()) {
362     SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
363     
364     // Add arguments. Do not add arguments for subprogram definition. They will
365     // be handled while processing variables.
366     DICompositeType SPTy = SP.getType();
367     DIArray Args = SPTy.getTypeArray();
368     unsigned SPTag = SPTy.getTag();
369
370     if (SPTag == dwarf::DW_TAG_subroutine_type)
371       for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
372         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
373         DIType ATy = DIType(DIType(Args.getElement(i)));
374         SPCU->addType(Arg, ATy);
375         if (ATy.isArtificial())
376           SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
377         SPDie->addChild(Arg);
378       }
379   }
380
381   if (SP.isArtificial())
382     SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
383
384   if (!SP.isLocalToUnit())
385     SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
386
387   if (SP.isOptimized())
388     SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
389
390   if (unsigned isa = Asm->getISAEncoding()) {
391     SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
392   }
393
394   // Add function template parameters.
395   SPCU->addTemplateParams(*SPDie, SP.getTemplateParams());
396
397   // DW_TAG_inlined_subroutine may refer to this DIE.
398   SPCU->insertDIE(SP, SPDie);
399
400   // Add to context owner.
401   SPCU->addToContextOwner(SPDie, SP.getContext());
402
403   return SPDie;
404 }
405
406 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
407   assert(N && "Invalid Scope encoding!");
408
409   DbgScope *AScope = AbstractScopes.lookup(N);
410   if (AScope)
411     return AScope;
412
413   DbgScope *Parent = NULL;
414
415   DIDescriptor Scope(N);
416   if (Scope.isLexicalBlock()) {
417     DILexicalBlock DB(N);
418     DIDescriptor ParentDesc = DB.getContext();
419     Parent = getOrCreateAbstractScope(ParentDesc);
420   }
421
422   AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
423
424   if (Parent)
425     Parent->addScope(AScope);
426   AScope->setAbstractScope();
427   AbstractScopes[N] = AScope;
428   if (DIDescriptor(N).isSubprogram())
429     AbstractScopesList.push_back(AScope);
430   return AScope;
431 }
432
433 /// isSubprogramContext - Return true if Context is either a subprogram
434 /// or another context nested inside a subprogram.
435 static bool isSubprogramContext(const MDNode *Context) {
436   if (!Context)
437     return false;
438   DIDescriptor D(Context);
439   if (D.isSubprogram())
440     return true;
441   if (D.isType())
442     return isSubprogramContext(DIType(Context).getContext());
443   return false;
444 }
445
446 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
447 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
448 /// If there are global variables in this scope then create and insert
449 /// DIEs for these variables.
450 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
451   CompileUnit *SPCU = getCompileUnit(SPNode);
452   DIE *SPDie = SPCU->getDIE(SPNode);
453
454   assert(SPDie && "Unable to find subprogram DIE!");
455   DISubprogram SP(SPNode);
456
457   // There is not any need to generate specification DIE for a function
458   // defined at compile unit level. If a function is defined inside another
459   // function then gdb prefers the definition at top level and but does not
460   // expect specification DIE in parent function. So avoid creating
461   // specification DIE for a function defined inside a function.
462   if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
463       !SP.getContext().isFile() &&
464       !isSubprogramContext(SP.getContext())) {
465    SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
466
467     // Add arguments.
468     DICompositeType SPTy = SP.getType();
469     DIArray Args = SPTy.getTypeArray();
470     unsigned SPTag = SPTy.getTag();
471     if (SPTag == dwarf::DW_TAG_subroutine_type)
472       for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
473         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
474         DIType ATy = DIType(DIType(Args.getElement(i)));
475         SPCU->addType(Arg, ATy);
476         if (ATy.isArtificial())
477           SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
478         SPDie->addChild(Arg);
479       }
480     DIE *SPDeclDie = SPDie;
481     SPDie = new DIE(dwarf::DW_TAG_subprogram);
482     SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
483                       SPDeclDie);
484     SPCU->addDie(SPDie);
485   }
486
487   // Pick up abstract subprogram DIE.
488   if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
489     SPDie = new DIE(dwarf::DW_TAG_subprogram);
490     SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
491                       dwarf::DW_FORM_ref4, AbsSPDIE);
492     SPCU->addDie(SPDie);
493   }
494
495   SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
496                  Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
497   SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
498                  Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
499   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
500   MachineLocation Location(RI->getFrameRegister(*Asm->MF));
501   SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
502
503   return SPDie;
504 }
505
506 /// constructLexicalScope - Construct new DW_TAG_lexical_block
507 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
508 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
509
510   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
511   if (Scope->isAbstractScope())
512     return ScopeDIE;
513
514   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
515   if (Ranges.empty())
516     return 0;
517
518   CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode());
519   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
520   if (Ranges.size() > 1) {
521     // .debug_range section has not been laid out yet. Emit offset in
522     // .debug_range as a uint, size 4, for now. emitDIE will handle
523     // DW_AT_ranges appropriately.
524     TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
525                    DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
526     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
527          RE = Ranges.end(); RI != RE; ++RI) {
528       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
529       DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
530     }
531     DebugRangeSymbols.push_back(NULL);
532     DebugRangeSymbols.push_back(NULL);
533     return ScopeDIE;
534   }
535
536   const MCSymbol *Start = getLabelBeforeInsn(RI->first);
537   const MCSymbol *End = getLabelAfterInsn(RI->second);
538
539   if (End == 0) return 0;
540
541   assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
542   assert(End->isDefined() && "Invalid end label for an inlined scope!");
543
544   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
545   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
546
547   return ScopeDIE;
548 }
549
550 /// constructInlinedScopeDIE - This scope represents inlined body of
551 /// a function. Construct DIE to represent this concrete inlined copy
552 /// of the function.
553 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
554
555   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
556   assert (Ranges.empty() == false
557           && "DbgScope does not have instruction markers!");
558
559   // FIXME : .debug_inlined section specification does not clearly state how
560   // to emit inlined scope that is split into multiple instruction ranges.
561   // For now, use first instruction range and emit low_pc/high_pc pair and
562   // corresponding .debug_inlined section entry for this pair.
563   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
564   const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
565   const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
566
567   if (StartLabel == 0 || EndLabel == 0) {
568     assert (0 && "Unexpected Start and End  labels for a inlined scope!");
569     return 0;
570   }
571   assert(StartLabel->isDefined() &&
572          "Invalid starting label for an inlined scope!");
573   assert(EndLabel->isDefined() &&
574          "Invalid end label for an inlined scope!");
575
576   if (!Scope->getScopeNode())
577     return NULL;
578   DIScope DS(Scope->getScopeNode());
579   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
580
581   DISubprogram InlinedSP = getDISubprogram(DS);
582   CompileUnit *TheCU = getCompileUnit(InlinedSP);
583   DIE *OriginDIE = TheCU->getDIE(InlinedSP);
584   assert(OriginDIE && "Unable to find Origin DIE!");
585   TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
586                      dwarf::DW_FORM_ref4, OriginDIE);
587
588   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
589   TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
590
591   InlinedSubprogramDIEs.insert(OriginDIE);
592
593   // Track the start label for this inlined function.
594   DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
595     I = InlineInfo.find(InlinedSP);
596
597   if (I == InlineInfo.end()) {
598     InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
599                                                              ScopeDIE));
600     InlinedSPNodes.push_back(InlinedSP);
601   } else
602     I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
603
604   DILocation DL(Scope->getInlinedAt());
605   TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
606   TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
607
608   return ScopeDIE;
609 }
610
611
612 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
613 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
614   StringRef Name = DV->getName();
615   if (Name.empty())
616     return NULL;
617
618   // Translate tag to proper Dwarf tag.  The result variable is dropped for
619   // now.
620   unsigned Tag;
621   switch (DV->getTag()) {
622   case dwarf::DW_TAG_return_variable:
623     return NULL;
624   case dwarf::DW_TAG_arg_variable:
625     Tag = dwarf::DW_TAG_formal_parameter;
626     break;
627   case dwarf::DW_TAG_auto_variable:    // fall thru
628   default:
629     Tag = dwarf::DW_TAG_variable;
630     break;
631   }
632
633   // Define variable debug information entry.
634   DIE *VariableDie = new DIE(Tag);
635   CompileUnit *TheCU = getCompileUnit(DV->getVariable());
636   DIE *AbsDIE = NULL;
637   DenseMap<const DbgVariable *, const DbgVariable *>::iterator
638     V2AVI = VarToAbstractVarMap.find(DV);
639   if (V2AVI != VarToAbstractVarMap.end())
640     AbsDIE = V2AVI->second->getDIE();
641
642   if (AbsDIE)
643     TheCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
644                        dwarf::DW_FORM_ref4, AbsDIE);
645   else {
646     TheCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
647     TheCU->addSourceLine(VariableDie, DV->getVariable());
648
649     // Add variable type.
650     TheCU->addType(VariableDie, DV->getType());
651   }
652
653   if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
654     TheCU->addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
655   else if (DIVariable(DV->getVariable()).isArtificial())
656     TheCU->addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
657
658   if (Scope->isAbstractScope()) {
659     DV->setDIE(VariableDie);
660     return VariableDie;
661   }
662
663   // Add variable address.
664
665   unsigned Offset = DV->getDotDebugLocOffset();
666   if (Offset != ~0U) {
667     TheCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
668              Asm->GetTempSymbol("debug_loc", Offset));
669     DV->setDIE(VariableDie);
670     UseDotDebugLocEntry.insert(VariableDie);
671     return VariableDie;
672   }
673
674   // Check if variable is described by a  DBG_VALUE instruction.
675   DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
676     DbgVariableToDbgInstMap.find(DV);
677   if (DVI != DbgVariableToDbgInstMap.end()) {
678     const MachineInstr *DVInsn = DVI->second;
679     bool updated = false;
680     // FIXME : Handle getNumOperands != 3
681     if (DVInsn->getNumOperands() == 3) {
682       if (DVInsn->getOperand(0).isReg()) {
683         const MachineOperand RegOp = DVInsn->getOperand(0);
684         const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
685         if (DVInsn->getOperand(1).isImm() &&
686             TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
687           TheCU->addVariableAddress(DV, VariableDie, DVInsn->getOperand(1).getImm());
688           updated = true;
689         } else
690           updated = TheCU->addRegisterAddress(VariableDie, RegOp);
691       }
692       else if (DVInsn->getOperand(0).isImm())
693         updated = TheCU->addConstantValue(VariableDie, DVInsn->getOperand(0));
694       else if (DVInsn->getOperand(0).isFPImm())
695         updated =
696           TheCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
697     } else {
698       MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
699       if (Location.getReg()) {
700         TheCU->addAddress(VariableDie, dwarf::DW_AT_location, Location);
701         updated = true;
702       }
703     }
704     if (!updated) {
705       // If variableDie is not updated then DBG_VALUE instruction does not
706       // have valid variable info.
707       delete VariableDie;
708       return NULL;
709     }
710     DV->setDIE(VariableDie);
711     return VariableDie;
712   }
713
714   // .. else use frame index, if available.
715   int FI = 0;
716   if (findVariableFrameIndex(DV, &FI))
717     TheCU->addVariableAddress(DV, VariableDie, FI);
718   
719   DV->setDIE(VariableDie);
720   return VariableDie;
721
722 }
723
724 void CompileUnit::addPubTypes(DISubprogram SP) {
725   DICompositeType SPTy = SP.getType();
726   unsigned SPTag = SPTy.getTag();
727   if (SPTag != dwarf::DW_TAG_subroutine_type)
728     return;
729
730   DIArray Args = SPTy.getTypeArray();
731   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
732     DIType ATy(Args.getElement(i));
733     if (!ATy.Verify())
734       continue;
735     DICompositeType CATy = getDICompositeType(ATy);
736     if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
737         && !CATy.isForwardDecl()) {
738       if (DIEEntry *Entry = getDIEEntry(CATy))
739         addGlobalType(CATy.getName(), Entry->getEntry());
740     }
741   }
742 }
743
744 /// constructScopeDIE - Construct a DIE for this scope.
745 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
746   if (!Scope || !Scope->getScopeNode())
747     return NULL;
748
749   SmallVector <DIE *, 8> Children;
750
751   // Collect arguments for current function.
752   if (Scope == CurrentFnDbgScope)
753     for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
754       if (DbgVariable *ArgDV = CurrentFnArguments[i])
755         if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
756           Children.push_back(Arg);
757
758   // Collect lexical scope childrens first.
759   const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
760   for (unsigned i = 0, N = Variables.size(); i < N; ++i)
761     if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
762       Children.push_back(Variable);
763   const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
764   for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
765     if (DIE *Nested = constructScopeDIE(Scopes[j]))
766       Children.push_back(Nested);
767   DIScope DS(Scope->getScopeNode());
768   DIE *ScopeDIE = NULL;
769   if (Scope->getInlinedAt())
770     ScopeDIE = constructInlinedScopeDIE(Scope);
771   else if (DS.isSubprogram()) {
772     ProcessedSPNodes.insert(DS);
773     if (Scope->isAbstractScope()) {
774       ScopeDIE = getCompileUnit(DS)->getDIE(DS);
775       // Note down abstract DIE.
776       if (ScopeDIE)
777         AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
778     }
779     else
780       ScopeDIE = updateSubprogramScopeDIE(DS);
781   }
782   else {
783     // There is no need to emit empty lexical block DIE.
784     if (Children.empty())
785       return NULL;
786     ScopeDIE = constructLexicalScopeDIE(Scope);
787   }
788   
789   if (!ScopeDIE) return NULL;
790
791   // Add children
792   for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
793          E = Children.end(); I != E; ++I)
794     ScopeDIE->addChild(*I);
795
796   if (DS.isSubprogram())
797     getCompileUnit(DS)->addPubTypes(DISubprogram(DS));
798
799  return ScopeDIE;
800 }
801
802 /// GetOrCreateSourceID - Look up the source id with the given directory and
803 /// source file names. If none currently exists, create a new id and insert it
804 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
805 /// maps as well.
806
807 unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName, 
808                                          StringRef DirName) {
809   // If FE did not provide a file name, then assume stdin.
810   if (FileName.empty())
811     return GetOrCreateSourceID("<stdin>", StringRef());
812
813   // MCStream expects full path name as filename.
814   if (!DirName.empty() && !FileName.startswith("/")) {
815     std::string FullPathName(DirName.data());
816     if (!DirName.endswith("/"))
817       FullPathName += "/";
818     FullPathName += FileName.data();
819     // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
820     return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
821   }
822
823   StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
824   if (Entry.getValue())
825     return Entry.getValue();
826
827   unsigned SrcId = SourceIdMap.size();
828   Entry.setValue(SrcId);
829
830   // Print out a .file directive to specify files for .loc directives.
831   Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
832
833   return SrcId;
834 }
835
836 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
837 DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
838   DIE *NDie = getDIE(NS);
839   if (NDie)
840     return NDie;
841   NDie = new DIE(dwarf::DW_TAG_namespace);
842   insertDIE(NS, NDie);
843   if (!NS.getName().empty())
844     addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
845   addSourceLine(NDie, NS);
846   addToContextOwner(NDie, NS.getContext());
847   return NDie;
848 }
849
850 /// constructCompileUnit - Create new CompileUnit for the given
851 /// metadata node with tag DW_TAG_compile_unit.
852 void DwarfDebug::constructCompileUnit(const MDNode *N) {
853   DICompileUnit DIUnit(N);
854   StringRef FN = DIUnit.getFilename();
855   StringRef Dir = DIUnit.getDirectory();
856   unsigned ID = GetOrCreateSourceID(FN, Dir);
857
858   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
859   CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
860   NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
861                    DIUnit.getProducer());
862   NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
863                  DIUnit.getLanguage());
864   NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
865   // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
866   // simplifies debug range entries.
867   NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
868   // DW_AT_stmt_list is a offset of line number information for this
869   // compile unit in debug_line section.
870   if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
871     NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
872                     Asm->GetTempSymbol("section_line"));
873   else
874     NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
875
876   if (!Dir.empty())
877     NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
878   if (DIUnit.isOptimized())
879     NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
880
881   StringRef Flags = DIUnit.getFlags();
882   if (!Flags.empty())
883     NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
884   
885   unsigned RVer = DIUnit.getRunTimeVersion();
886   if (RVer)
887     NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
888             dwarf::DW_FORM_data1, RVer);
889
890   if (!FirstCU)
891     FirstCU = NewCU;
892   CUMap.insert(std::make_pair(N, NewCU));
893 }
894
895 /// getCompielUnit - Get CompileUnit DIE.
896 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
897   assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
898   DIDescriptor D(N);
899   const MDNode *CUNode = NULL;
900   if (D.isCompileUnit())
901     CUNode = N;
902   else if (D.isSubprogram())
903     CUNode = DISubprogram(N).getCompileUnit();
904   else if (D.isType())
905     CUNode = DIType(N).getCompileUnit();
906   else if (D.isGlobalVariable())
907     CUNode = DIGlobalVariable(N).getCompileUnit();
908   else if (D.isVariable())
909     CUNode = DIVariable(N).getCompileUnit();
910   else if (D.isNameSpace())
911     CUNode = DINameSpace(N).getCompileUnit();
912   else if (D.isFile())
913     CUNode = DIFile(N).getCompileUnit();
914   else
915     return FirstCU;
916
917   DenseMap<const MDNode *, CompileUnit *>::const_iterator I
918     = CUMap.find(CUNode);
919   if (I == CUMap.end())
920     return FirstCU;
921   return I->second;
922 }
923
924 /// isUnsignedDIType - Return true if type encoding is unsigned.
925 static bool isUnsignedDIType(DIType Ty) {
926   DIDerivedType DTy(Ty);
927   if (DTy.Verify())
928     return isUnsignedDIType(DTy.getTypeDerivedFrom());
929
930   DIBasicType BTy(Ty);
931   if (BTy.Verify()) {
932     unsigned Encoding = BTy.getEncoding();
933     if (Encoding == dwarf::DW_ATE_unsigned ||
934         Encoding == dwarf::DW_ATE_unsigned_char)
935       return true;
936   }
937   return false;
938 }
939
940 // Return const exprssion if value is a GEP to access merged global
941 // constant. e.g.
942 // i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
943 static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
944   const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
945   if (!CE || CE->getNumOperands() != 3 ||
946       CE->getOpcode() != Instruction::GetElementPtr)
947     return NULL;
948
949   // First operand points to a global value.
950   if (!isa<GlobalValue>(CE->getOperand(0)))
951     return NULL;
952
953   // Second operand is zero.
954   const ConstantInt *CI = 
955     dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
956   if (!CI || !CI->isZero())
957     return NULL;
958
959   // Third operand is offset.
960   if (!isa<ConstantInt>(CE->getOperand(2)))
961     return NULL;
962
963   return CE;
964 }
965
966 /// constructGlobalVariableDIE - Construct global variable DIE.
967 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
968   DIGlobalVariable GV(N);
969
970   // If debug information is malformed then ignore it.
971   if (GV.Verify() == false)
972     return;
973
974   // Check for pre-existence.
975   CompileUnit *TheCU = getCompileUnit(N);
976   if (TheCU->getDIE(GV))
977     return;
978
979   DIType GTy = GV.getType();
980   DIE *VariableDIE = new DIE(GV.getTag());
981
982   bool isGlobalVariable = GV.getGlobal() != NULL;
983
984   // Add name.
985   TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
986                    GV.getDisplayName());
987   StringRef LinkageName = GV.getLinkageName();
988   if (!LinkageName.empty() && isGlobalVariable)
989     TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, 
990                      dwarf::DW_FORM_string,
991                      getRealLinkageName(LinkageName));
992   // Add type.
993   TheCU->addType(VariableDIE, GTy);
994   if (GTy.isCompositeType() && !GTy.getName().empty()
995       && !GTy.isForwardDecl()) {
996     DIEEntry *Entry = TheCU->getDIEEntry(GTy);
997     assert(Entry && "Missing global type!");
998     TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
999   }
1000   // Add scoping info.
1001   if (!GV.isLocalToUnit()) {
1002     TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1003     // Expose as global. 
1004     TheCU->addGlobal(GV.getName(), VariableDIE);
1005   }
1006   // Add line number info.
1007   TheCU->addSourceLine(VariableDIE, GV);
1008   // Add to map.
1009   TheCU->insertDIE(N, VariableDIE);
1010   // Add to context owner.
1011   DIDescriptor GVContext = GV.getContext();
1012   TheCU->addToContextOwner(VariableDIE, GVContext);
1013   // Add location.
1014   if (isGlobalVariable) {
1015     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1016     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1017     TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1018              Asm->Mang->getSymbol(GV.getGlobal()));
1019     // Do not create specification DIE if context is either compile unit
1020     // or a subprogram.
1021     if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1022         !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1023       // Create specification DIE.
1024       DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1025       TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1026                   dwarf::DW_FORM_ref4, VariableDIE);
1027       TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1028       TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1029       TheCU->addDie(VariableSpecDIE);
1030     } else {
1031       TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1032     } 
1033   } else if (ConstantInt *CI = 
1034              dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1035     TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
1036   else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1037     // GV is a merged global.
1038     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1039     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1040     TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1041                     Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
1042     ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
1043     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1044     TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
1045     TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1046     TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1047   }
1048
1049   return;
1050 }
1051
1052 /// construct SubprogramDIE - Construct subprogram DIE.
1053 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1054   DISubprogram SP(N);
1055
1056   // Check for pre-existence.
1057   CompileUnit *TheCU = getCompileUnit(N);
1058   if (TheCU->getDIE(N))
1059     return;
1060
1061   if (!SP.isDefinition())
1062     // This is a method declaration which will be handled while constructing
1063     // class type.
1064     return;
1065
1066   DIE *SubprogramDie = createSubprogramDIE(SP);
1067
1068   // Add to map.
1069   TheCU->insertDIE(N, SubprogramDie);
1070
1071   // Add to context owner.
1072   TheCU->addToContextOwner(SubprogramDie, SP.getContext());
1073
1074   // Expose as global.
1075   TheCU->addGlobal(SP.getName(), SubprogramDie);
1076
1077   return;
1078 }
1079
1080 /// beginModule - Emit all Dwarf sections that should come prior to the
1081 /// content. Create global DIEs and emit initial debug info sections.
1082 /// This is inovked by the target AsmPrinter.
1083 void DwarfDebug::beginModule(Module *M) {
1084   if (DisableDebugInfoPrinting)
1085     return;
1086
1087   DebugInfoFinder DbgFinder;
1088   DbgFinder.processModule(*M);
1089
1090   bool HasDebugInfo = false;
1091
1092   // Scan all the compile-units to see if there are any marked as the main unit.
1093   // if not, we do not generate debug info.
1094   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1095        E = DbgFinder.compile_unit_end(); I != E; ++I) {
1096     if (DICompileUnit(*I).isMain()) {
1097       HasDebugInfo = true;
1098       break;
1099     }
1100   }
1101
1102   if (!HasDebugInfo) return;
1103
1104   // Tell MMI that we have debug info.
1105   MMI->setDebugInfoAvailability(true);
1106
1107   // Emit initial sections.
1108   EmitSectionLabels();
1109
1110   // Create all the compile unit DIEs.
1111   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1112          E = DbgFinder.compile_unit_end(); I != E; ++I)
1113     constructCompileUnit(*I);
1114
1115   // Create DIEs for each subprogram.
1116   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1117          E = DbgFinder.subprogram_end(); I != E; ++I)
1118     constructSubprogramDIE(*I);
1119
1120   // Create DIEs for each global variable.
1121   for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1122          E = DbgFinder.global_variable_end(); I != E; ++I)
1123     constructGlobalVariableDIE(*I);
1124
1125   //getOrCreateTypeDIE
1126   if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
1127     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1128       DIType Ty(NMD->getOperand(i));
1129       getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1130     }
1131
1132   if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
1133     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1134       DIType Ty(NMD->getOperand(i));
1135       getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1136     }
1137
1138   // Prime section data.
1139   SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1140 }
1141
1142 /// endModule - Emit all Dwarf sections that should come after the content.
1143 ///
1144 void DwarfDebug::endModule() {
1145   if (!FirstCU) return;
1146   const Module *M = MMI->getModule();
1147   DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
1148   if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1149     for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1150       if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1151       DISubprogram SP(AllSPs->getOperand(SI));
1152       if (!SP.Verify()) continue;
1153
1154       // Collect info for variables that were optimized out.
1155       if (!SP.isDefinition()) continue;
1156       StringRef FName = SP.getLinkageName();
1157       if (FName.empty())
1158         FName = SP.getName();
1159       NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
1160       if (!NMD) continue;
1161       unsigned E = NMD->getNumOperands();
1162       if (!E) continue;
1163       DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
1164       DeadFnScopeMap[SP] = Scope;
1165       for (unsigned I = 0; I != E; ++I) {
1166         DIVariable DV(NMD->getOperand(I));
1167         if (!DV.Verify()) continue;
1168         Scope->addVariable(new DbgVariable(DV));
1169       }
1170
1171       // Construct subprogram DIE and add variables DIEs.
1172       constructSubprogramDIE(SP);
1173       DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
1174       const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1175       for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1176         DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1177         if (VariableDIE)
1178           ScopeDIE->addChild(VariableDIE);
1179       }
1180     }
1181   }
1182
1183   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1184   for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1185          AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1186     DIE *ISP = *AI;
1187     FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1188   }
1189
1190   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1191          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1192     DIE *SPDie = CI->first;
1193     const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1194     if (!N) continue;
1195     DIE *NDie = getCompileUnit(N)->getDIE(N);
1196     if (!NDie) continue;
1197     getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type, 
1198                                    dwarf::DW_FORM_ref4, NDie);
1199   }
1200
1201   // Standard sections final addresses.
1202   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1203   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1204   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1205   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1206
1207   // End text sections.
1208   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1209     Asm->OutStreamer.SwitchSection(SectionMap[i]);
1210     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
1211   }
1212
1213   // Emit common frame information.
1214   emitCommonDebugFrame();
1215
1216   // Emit function debug frame information
1217   for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1218          E = DebugFrames.end(); I != E; ++I)
1219     emitFunctionDebugFrame(*I);
1220
1221   // Compute DIE offsets and sizes.
1222   computeSizeAndOffsets();
1223
1224   // Emit all the DIEs into a debug info section
1225   emitDebugInfo();
1226
1227   // Corresponding abbreviations into a abbrev section.
1228   emitAbbreviations();
1229
1230   // Emit info into a debug pubnames section.
1231   emitDebugPubNames();
1232
1233   // Emit info into a debug pubtypes section.
1234   emitDebugPubTypes();
1235
1236   // Emit info into a debug loc section.
1237   emitDebugLoc();
1238
1239   // Emit info into a debug aranges section.
1240   EmitDebugARanges();
1241
1242   // Emit info into a debug ranges section.
1243   emitDebugRanges();
1244
1245   // Emit info into a debug macinfo section.
1246   emitDebugMacInfo();
1247
1248   // Emit inline info.
1249   emitDebugInlineInfo();
1250
1251   // Emit info into a debug str section.
1252   emitDebugStr();
1253
1254   // clean up.
1255   DeleteContainerSeconds(DeadFnScopeMap);
1256   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1257          E = CUMap.end(); I != E; ++I)
1258     delete I->second;
1259   FirstCU = NULL;  // Reset for the next Module, if any.
1260 }
1261
1262 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
1263 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1264                                               DebugLoc ScopeLoc) {
1265
1266   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
1267   if (AbsDbgVariable)
1268     return AbsDbgVariable;
1269
1270   LLVMContext &Ctx = Var->getContext();
1271   DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1272   if (!Scope)
1273     return NULL;
1274
1275   AbsDbgVariable = new DbgVariable(Var);
1276   Scope->addVariable(AbsDbgVariable);
1277   AbstractVariables[Var] = AbsDbgVariable;
1278   return AbsDbgVariable;
1279 }
1280
1281 /// addCurrentFnArgument - If Var is an current function argument that add
1282 /// it in CurrentFnArguments list.
1283 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1284                                       DbgVariable *Var, DbgScope *Scope) {
1285   if (Scope != CurrentFnDbgScope) 
1286     return false;
1287   DIVariable DV = Var->getVariable();
1288   if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1289     return false;
1290   unsigned ArgNo = DV.getArgNumber();
1291   if (ArgNo == 0) 
1292     return false;
1293
1294   size_t Size = CurrentFnArguments.size();
1295   if (Size == 0)
1296     CurrentFnArguments.resize(MF->getFunction()->arg_size());
1297   // llvm::Function argument size is not good indicator of how many
1298   // arguments does the function have at source level.
1299   if (ArgNo > Size)
1300     CurrentFnArguments.resize(ArgNo * 2);
1301   CurrentFnArguments[ArgNo - 1] = Var;
1302   return true;
1303 }
1304
1305 /// collectVariableInfoFromMMITable - Collect variable information from
1306 /// side table maintained by MMI.
1307 void
1308 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
1309                                    SmallPtrSet<const MDNode *, 16> &Processed) {
1310   const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
1311   MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1312   for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1313          VE = VMap.end(); VI != VE; ++VI) {
1314     const MDNode *Var = VI->first;
1315     if (!Var) continue;
1316     Processed.insert(Var);
1317     DIVariable DV(Var);
1318     const std::pair<unsigned, DebugLoc> &VP = VI->second;
1319
1320     DbgScope *Scope = 0;
1321     if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
1322       Scope = ConcreteScopes.lookup(IA);
1323     if (Scope == 0)
1324       Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
1325
1326     // If variable scope is not found then skip this variable.
1327     if (Scope == 0)
1328       continue;
1329
1330     DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1331     DbgVariable *RegVar = new DbgVariable(DV);
1332     recordVariableFrameIndex(RegVar, VP.first);
1333     if (!addCurrentFnArgument(MF, RegVar, Scope))
1334       Scope->addVariable(RegVar);
1335     if (AbsDbgVariable) {
1336       recordVariableFrameIndex(AbsDbgVariable, VP.first);
1337       VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1338     }
1339   }
1340 }
1341
1342 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
1343 /// DBG_VALUE instruction, is in a defined reg.
1344 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1345   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
1346   return MI->getNumOperands() == 3 &&
1347          MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1348          MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
1349 }
1350
1351 /// collectVariableInfo - Populate DbgScope entries with variables' info.
1352 void
1353 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1354                                 SmallPtrSet<const MDNode *, 16> &Processed) {
1355
1356   /// collection info from MMI table.
1357   collectVariableInfoFromMMITable(MF, Processed);
1358
1359   for (SmallVectorImpl<const MDNode*>::const_iterator
1360          UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1361          ++UVI) {
1362     const MDNode *Var = *UVI;
1363     if (Processed.count(Var))
1364       continue;
1365
1366     // History contains relevant DBG_VALUE instructions for Var and instructions
1367     // clobbering it.
1368     SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1369     if (History.empty())
1370       continue;
1371     const MachineInstr *MInsn = History.front();
1372
1373     DIVariable DV(Var);
1374     DbgScope *Scope = NULL;
1375     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1376         DISubprogram(DV.getContext()).describes(MF->getFunction()))
1377       Scope = CurrentFnDbgScope;
1378     else
1379       Scope = findDbgScope(MInsn);
1380     // If variable scope is not found then skip this variable.
1381     if (!Scope)
1382       continue;
1383
1384     Processed.insert(DV);
1385     assert(MInsn->isDebugValue() && "History must begin with debug value");
1386     DbgVariable *RegVar = new DbgVariable(DV);
1387     if (!addCurrentFnArgument(MF, RegVar, Scope))
1388       Scope->addVariable(RegVar);
1389     if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1390       DbgVariableToDbgInstMap[AbsVar] = MInsn;
1391       VarToAbstractVarMap[RegVar] = AbsVar;
1392     }
1393
1394     // Simple ranges that are fully coalesced.
1395     if (History.size() <= 1 || (History.size() == 2 &&
1396                                 MInsn->isIdenticalTo(History.back()))) {
1397       DbgVariableToDbgInstMap[RegVar] = MInsn;
1398       continue;
1399     }
1400
1401     // handle multiple DBG_VALUE instructions describing one variable.
1402     RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1403
1404     for (SmallVectorImpl<const MachineInstr*>::const_iterator
1405            HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1406       const MachineInstr *Begin = *HI;
1407       assert(Begin->isDebugValue() && "Invalid History entry");
1408       MachineLocation MLoc;
1409       if (Begin->getNumOperands() == 3) {
1410         if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
1411           MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
1412       } else
1413         MLoc = Asm->getDebugValueLocation(Begin);
1414
1415       // FIXME: emitDebugLoc only understands registers.
1416       if (!MLoc.getReg())
1417         continue;
1418
1419       // Compute the range for a register location.
1420       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1421       const MCSymbol *SLabel = 0;
1422
1423       if (HI + 1 == HE)
1424         // If Begin is the last instruction in History then its value is valid
1425         // until the end of the funtion.
1426         SLabel = FunctionEndSym;
1427       else {
1428         const MachineInstr *End = HI[1];
1429         if (End->isDebugValue())
1430           SLabel = getLabelBeforeInsn(End);
1431         else {
1432           // End is a normal instruction clobbering the range.
1433           SLabel = getLabelAfterInsn(End);
1434           assert(SLabel && "Forgot label after clobber instruction");
1435           ++HI;
1436         }
1437       }
1438
1439       // The value is valid until the next DBG_VALUE or clobber.
1440       DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
1441     }
1442     DotDebugLocEntries.push_back(DotDebugLocEntry());
1443   }
1444
1445   // Collect info for variables that were optimized out.
1446   const Function *F = MF->getFunction();
1447   if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
1448     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1449       DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
1450       if (!DV || !Processed.insert(DV))
1451         continue;
1452       DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1453       if (Scope)
1454         Scope->addVariable(new DbgVariable(DV));
1455     }
1456   }
1457 }
1458
1459 /// getLabelBeforeInsn - Return Label preceding the instruction.
1460 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1461   MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1462   assert(Label && "Didn't insert label before instruction");
1463   return Label;
1464 }
1465
1466 /// getLabelAfterInsn - Return Label immediately following the instruction.
1467 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1468   return LabelsAfterInsn.lookup(MI);
1469 }
1470
1471 /// beginInstruction - Process beginning of an instruction.
1472 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1473   // Check if source location changes, but ignore DBG_VALUE locations.
1474   if (!MI->isDebugValue()) {
1475     DebugLoc DL = MI->getDebugLoc();
1476     if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1477       PrevInstLoc = DL;
1478       if (!DL.isUnknown()) {
1479         const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1480         recordSourceLine(DL.getLine(), DL.getCol(), Scope);
1481       } else
1482         recordSourceLine(0, 0, 0);
1483     }
1484   }
1485
1486   // Insert labels where requested.
1487   DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1488     LabelsBeforeInsn.find(MI);
1489
1490   // No label needed.
1491   if (I == LabelsBeforeInsn.end())
1492     return;
1493
1494   // Label already assigned.
1495   if (I->second)
1496     return;
1497
1498   if (!PrevLabel) {
1499     PrevLabel = MMI->getContext().CreateTempSymbol();
1500     Asm->OutStreamer.EmitLabel(PrevLabel);
1501   }
1502   I->second = PrevLabel;
1503 }
1504
1505 /// endInstruction - Process end of an instruction.
1506 void DwarfDebug::endInstruction(const MachineInstr *MI) {
1507   // Don't create a new label after DBG_VALUE instructions.
1508   // They don't generate code.
1509   if (!MI->isDebugValue())
1510     PrevLabel = 0;
1511
1512   DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1513     LabelsAfterInsn.find(MI);
1514
1515   // No label needed.
1516   if (I == LabelsAfterInsn.end())
1517     return;
1518
1519   // Label already assigned.
1520   if (I->second)
1521     return;
1522
1523   // We need a label after this instruction.
1524   if (!PrevLabel) {
1525     PrevLabel = MMI->getContext().CreateTempSymbol();
1526     Asm->OutStreamer.EmitLabel(PrevLabel);
1527   }
1528   I->second = PrevLabel;
1529 }
1530
1531 /// getOrCreateDbgScope - Create DbgScope for the scope.
1532 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
1533                                           const MDNode *InlinedAt) {
1534   if (!InlinedAt) {
1535     DbgScope *WScope = DbgScopeMap.lookup(Scope);
1536     if (WScope)
1537       return WScope;
1538     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1539     DbgScopeMap.insert(std::make_pair(Scope, WScope));
1540     if (DIDescriptor(Scope).isLexicalBlock()) {
1541       DbgScope *Parent =
1542         getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
1543       WScope->setParent(Parent);
1544       Parent->addScope(WScope);
1545     }
1546
1547     if (!WScope->getParent()) {
1548       StringRef SPName = DISubprogram(Scope).getLinkageName();
1549       // We used to check only for a linkage name, but that fails
1550       // since we began omitting the linkage name for private
1551       // functions.  The new way is to check for the name in metadata,
1552       // but that's not supported in old .ll test cases.  Ergo, we
1553       // check both.
1554       if (SPName == Asm->MF->getFunction()->getName() ||
1555           DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
1556         CurrentFnDbgScope = WScope;
1557     }
1558
1559     return WScope;
1560   }
1561
1562   getOrCreateAbstractScope(Scope);
1563   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1564   if (WScope)
1565     return WScope;
1566
1567   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1568   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
1569   DILocation DL(InlinedAt);
1570   DbgScope *Parent =
1571     getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
1572   WScope->setParent(Parent);
1573   Parent->addScope(WScope);
1574
1575   ConcreteScopes[InlinedAt] = WScope;
1576
1577   return WScope;
1578 }
1579
1580 /// hasValidLocation - Return true if debug location entry attached with
1581 /// machine instruction encodes valid location info.
1582 static bool hasValidLocation(LLVMContext &Ctx,
1583                              const MachineInstr *MInsn,
1584                              const MDNode *&Scope, const MDNode *&InlinedAt) {
1585   DebugLoc DL = MInsn->getDebugLoc();
1586   if (DL.isUnknown()) return false;
1587
1588   const MDNode *S = DL.getScope(Ctx);
1589
1590   // There is no need to create another DIE for compile unit. For all
1591   // other scopes, create one DbgScope now. This will be translated
1592   // into a scope DIE at the end.
1593   if (DIScope(S).isCompileUnit()) return false;
1594
1595   Scope = S;
1596   InlinedAt = DL.getInlinedAt(Ctx);
1597   return true;
1598 }
1599
1600 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
1601 /// hierarchy.
1602 static void calculateDominanceGraph(DbgScope *Scope) {
1603   assert (Scope && "Unable to calculate scop edominance graph!");
1604   SmallVector<DbgScope *, 4> WorkStack;
1605   WorkStack.push_back(Scope);
1606   unsigned Counter = 0;
1607   while (!WorkStack.empty()) {
1608     DbgScope *WS = WorkStack.back();
1609     const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1610     bool visitedChildren = false;
1611     for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1612            SE = Children.end(); SI != SE; ++SI) {
1613       DbgScope *ChildScope = *SI;
1614       if (!ChildScope->getDFSOut()) {
1615         WorkStack.push_back(ChildScope);
1616         visitedChildren = true;
1617         ChildScope->setDFSIn(++Counter);
1618         break;
1619       }
1620     }
1621     if (!visitedChildren) {
1622       WorkStack.pop_back();
1623       WS->setDFSOut(++Counter);
1624     }
1625   }
1626 }
1627
1628 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
1629 static
1630 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
1631                        DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1632 {
1633 #ifndef NDEBUG
1634   unsigned PrevDFSIn = 0;
1635   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1636        I != E; ++I) {
1637     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1638          II != IE; ++II) {
1639       const MachineInstr *MInsn = II;
1640       const MDNode *Scope = NULL;
1641       const MDNode *InlinedAt = NULL;
1642
1643       // Check if instruction has valid location information.
1644       if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
1645         dbgs() << " [ ";
1646         if (InlinedAt)
1647           dbgs() << "*";
1648         DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
1649           MI2ScopeMap.find(MInsn);
1650         if (DI != MI2ScopeMap.end()) {
1651           DbgScope *S = DI->second;
1652           dbgs() << S->getDFSIn();
1653           PrevDFSIn = S->getDFSIn();
1654         } else
1655           dbgs() << PrevDFSIn;
1656       } else
1657         dbgs() << " [ x" << PrevDFSIn;
1658       dbgs() << " ]";
1659       MInsn->dump();
1660     }
1661     dbgs() << "\n";
1662   }
1663 #endif
1664 }
1665 /// extractScopeInformation - Scan machine instructions in this function
1666 /// and collect DbgScopes. Return true, if at least one scope was found.
1667 bool DwarfDebug::extractScopeInformation() {
1668   // If scope information was extracted using .dbg intrinsics then there is not
1669   // any need to extract these information by scanning each instruction.
1670   if (!DbgScopeMap.empty())
1671     return false;
1672
1673   // Scan each instruction and create scopes. First build working set of scopes.
1674   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
1675   SmallVector<DbgRange, 4> MIRanges;
1676   DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
1677   const MDNode *PrevScope = NULL;
1678   const MDNode *PrevInlinedAt = NULL;
1679   const MachineInstr *RangeBeginMI = NULL;
1680   const MachineInstr *PrevMI = NULL;
1681   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
1682        I != E; ++I) {
1683     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1684          II != IE; ++II) {
1685       const MachineInstr *MInsn = II;
1686       const MDNode *Scope = NULL;
1687       const MDNode *InlinedAt = NULL;
1688
1689       // Check if instruction has valid location information.
1690       if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
1691         PrevMI = MInsn;
1692         continue;
1693       }
1694
1695       // If scope has not changed then skip this instruction.
1696       if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
1697         PrevMI = MInsn;
1698         continue;
1699       }
1700
1701       // Ignore DBG_VALUE. It does not contribute any instruction in output.
1702       if (MInsn->isDebugValue())
1703         continue;
1704
1705       if (RangeBeginMI) {
1706         // If we have alread seen a beginning of a instruction range and
1707         // current instruction scope does not match scope of first instruction
1708         // in this range then create a new instruction range.
1709         DbgRange R(RangeBeginMI, PrevMI);
1710         MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
1711                                                         PrevInlinedAt);
1712         MIRanges.push_back(R);
1713       }
1714
1715       // This is a beginning of a new instruction range.
1716       RangeBeginMI = MInsn;
1717
1718       // Reset previous markers.
1719       PrevMI = MInsn;
1720       PrevScope = Scope;
1721       PrevInlinedAt = InlinedAt;
1722     }
1723   }
1724
1725   // Create last instruction range.
1726   if (RangeBeginMI && PrevMI && PrevScope) {
1727     DbgRange R(RangeBeginMI, PrevMI);
1728     MIRanges.push_back(R);
1729     MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
1730   }
1731
1732   if (!CurrentFnDbgScope)
1733     return false;
1734
1735   calculateDominanceGraph(CurrentFnDbgScope);
1736   if (PrintDbgScope)
1737     printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
1738
1739   // Find ranges of instructions covered by each DbgScope;
1740   DbgScope *PrevDbgScope = NULL;
1741   for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1742          RE = MIRanges.end(); RI != RE; ++RI) {
1743     const DbgRange &R = *RI;
1744     DbgScope *S = MI2ScopeMap.lookup(R.first);
1745     assert (S && "Lost DbgScope for a machine instruction!");
1746     if (PrevDbgScope && !PrevDbgScope->dominates(S))
1747       PrevDbgScope->closeInsnRange(S);
1748     S->openInsnRange(R.first);
1749     S->extendInsnRange(R.second);
1750     PrevDbgScope = S;
1751   }
1752
1753   if (PrevDbgScope)
1754     PrevDbgScope->closeInsnRange();
1755
1756   identifyScopeMarkers();
1757
1758   return !DbgScopeMap.empty();
1759 }
1760
1761 /// identifyScopeMarkers() -
1762 /// Each DbgScope has first instruction and last instruction to mark beginning
1763 /// and end of a scope respectively. Create an inverse map that list scopes
1764 /// starts (and ends) with an instruction. One instruction may start (or end)
1765 /// multiple scopes. Ignore scopes that are not reachable.
1766 void DwarfDebug::identifyScopeMarkers() {
1767   SmallVector<DbgScope *, 4> WorkList;
1768   WorkList.push_back(CurrentFnDbgScope);
1769   while (!WorkList.empty()) {
1770     DbgScope *S = WorkList.pop_back_val();
1771
1772     const SmallVector<DbgScope *, 4> &Children = S->getScopes();
1773     if (!Children.empty())
1774       for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1775              SE = Children.end(); SI != SE; ++SI)
1776         WorkList.push_back(*SI);
1777
1778     if (S->isAbstractScope())
1779       continue;
1780
1781     const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1782     if (Ranges.empty())
1783       continue;
1784     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1785            RE = Ranges.end(); RI != RE; ++RI) {
1786       assert(RI->first && "DbgRange does not have first instruction!");
1787       assert(RI->second && "DbgRange does not have second instruction!");
1788       requestLabelBeforeInsn(RI->first);
1789       requestLabelAfterInsn(RI->second);
1790     }
1791   }
1792 }
1793
1794 /// FindFirstDebugLoc - Find the first debug location in the function. This
1795 /// is intended to be an approximation for the source position of the
1796 /// beginning of the function.
1797 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
1798   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1799        I != E; ++I)
1800     for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
1801          MBBI != MBBE; ++MBBI) {
1802       DebugLoc DL = MBBI->getDebugLoc();
1803       if (!DL.isUnknown())
1804         return DL;
1805     }
1806   return DebugLoc();
1807 }
1808
1809 #ifndef NDEBUG
1810 /// CheckLineNumbers - Count basicblocks whose instructions do not have any
1811 /// line number information.
1812 static void CheckLineNumbers(const MachineFunction *MF) {
1813   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1814        I != E; ++I) {
1815     bool FoundLineNo = false;
1816     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1817          II != IE; ++II) {
1818       const MachineInstr *MI = II;
1819       if (!MI->getDebugLoc().isUnknown()) {
1820         FoundLineNo = true;
1821         break;
1822       }
1823     }
1824     if (!FoundLineNo && I->size())
1825       ++BlocksWithoutLineNo;      
1826   }
1827 }
1828 #endif
1829
1830 /// beginFunction - Gather pre-function debug information.  Assumes being
1831 /// emitted immediately after the function entry point.
1832 void DwarfDebug::beginFunction(const MachineFunction *MF) {
1833   if (!MMI->hasDebugInfo()) return;
1834   if (!extractScopeInformation()) return;
1835
1836 #ifndef NDEBUG
1837   CheckLineNumbers(MF);
1838 #endif
1839
1840   FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1841                                         Asm->getFunctionNumber());
1842   // Assumes in correct section after the entry point.
1843   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1844
1845   // Emit label for the implicitly defined dbg.stoppoint at the start of the
1846   // function.
1847   DebugLoc FDL = FindFirstDebugLoc(MF);
1848   if (FDL.isUnknown()) return;
1849
1850   const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
1851   const MDNode *TheScope = 0;
1852
1853   DISubprogram SP = getDISubprogram(Scope);
1854   unsigned Line, Col;
1855   if (SP.Verify()) {
1856     Line = SP.getLineNumber();
1857     Col = 0;
1858     TheScope = SP;
1859   } else {
1860     Line = FDL.getLine();
1861     Col = FDL.getCol();
1862     TheScope = Scope;
1863   }
1864
1865   recordSourceLine(Line, Col, TheScope);
1866
1867   assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1868
1869   /// ProcessedArgs - Collection of arguments already processed.
1870   SmallPtrSet<const MDNode *, 8> ProcessedArgs;
1871
1872   const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1873
1874   /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1875   std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1876
1877   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1878        I != E; ++I) {
1879     bool AtBlockEntry = true;
1880     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1881          II != IE; ++II) {
1882       const MachineInstr *MI = II;
1883
1884       if (MI->isDebugValue()) {
1885         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
1886
1887         // Keep track of user variables.
1888         const MDNode *Var =
1889           MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1890
1891         // Variable is in a register, we need to check for clobbers.
1892         if (isDbgValueInDefinedReg(MI))
1893           LiveUserVar[MI->getOperand(0).getReg()] = Var;
1894
1895         // Check the history of this variable.
1896         SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1897         if (History.empty()) {
1898           UserVariables.push_back(Var);
1899           // The first mention of a function argument gets the FunctionBeginSym
1900           // label, so arguments are visible when breaking at function entry.
1901           DIVariable DV(Var);
1902           if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1903               DISubprogram(getDISubprogram(DV.getContext()))
1904                 .describes(MF->getFunction()))
1905             LabelsBeforeInsn[MI] = FunctionBeginSym;
1906         } else {
1907           // We have seen this variable before. Try to coalesce DBG_VALUEs.
1908           const MachineInstr *Prev = History.back();
1909           if (Prev->isDebugValue()) {
1910             // Coalesce identical entries at the end of History.
1911             if (History.size() >= 2 &&
1912                 Prev->isIdenticalTo(History[History.size() - 2]))
1913               History.pop_back();
1914
1915             // Terminate old register assignments that don't reach MI;
1916             MachineFunction::const_iterator PrevMBB = Prev->getParent();
1917             if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1918                 isDbgValueInDefinedReg(Prev)) {
1919               // Previous register assignment needs to terminate at the end of
1920               // its basic block.
1921               MachineBasicBlock::const_iterator LastMI =
1922                 PrevMBB->getLastNonDebugInstr();
1923               if (LastMI == PrevMBB->end())
1924                 // Drop DBG_VALUE for empty range.
1925                 History.pop_back();
1926               else {
1927                 // Terminate after LastMI.
1928                 History.push_back(LastMI);
1929               }
1930             }
1931           }
1932         }
1933         History.push_back(MI);
1934       } else {
1935         // Not a DBG_VALUE instruction.
1936         if (!MI->isLabel())
1937           AtBlockEntry = false;
1938
1939         // Check if the instruction clobbers any registers with debug vars.
1940         for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1941                MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1942           if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1943             continue;
1944           for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1945                unsigned Reg = *AI; ++AI) {
1946             const MDNode *Var = LiveUserVar[Reg];
1947             if (!Var)
1948               continue;
1949             // Reg is now clobbered.
1950             LiveUserVar[Reg] = 0;
1951
1952             // Was MD last defined by a DBG_VALUE referring to Reg?
1953             DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1954             if (HistI == DbgValues.end())
1955               continue;
1956             SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1957             if (History.empty())
1958               continue;
1959             const MachineInstr *Prev = History.back();
1960             // Sanity-check: Register assignments are terminated at the end of
1961             // their block.
1962             if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1963               continue;
1964             // Is the variable still in Reg?
1965             if (!isDbgValueInDefinedReg(Prev) ||
1966                 Prev->getOperand(0).getReg() != Reg)
1967               continue;
1968             // Var is clobbered. Make sure the next instruction gets a label.
1969             History.push_back(MI);
1970           }
1971         }
1972       }
1973     }
1974   }
1975
1976   for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1977        I != E; ++I) {
1978     SmallVectorImpl<const MachineInstr*> &History = I->second;
1979     if (History.empty())
1980       continue;
1981
1982     // Make sure the final register assignments are terminated.
1983     const MachineInstr *Prev = History.back();
1984     if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1985       const MachineBasicBlock *PrevMBB = Prev->getParent();
1986       MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
1987       if (LastMI == PrevMBB->end())
1988         // Drop DBG_VALUE for empty range.
1989         History.pop_back();
1990       else {
1991         // Terminate after LastMI.
1992         History.push_back(LastMI);
1993       }
1994     }
1995     // Request labels for the full history.
1996     for (unsigned i = 0, e = History.size(); i != e; ++i) {
1997       const MachineInstr *MI = History[i];
1998       if (MI->isDebugValue())
1999         requestLabelBeforeInsn(MI);
2000       else
2001         requestLabelAfterInsn(MI);
2002     }
2003   }
2004
2005   PrevInstLoc = DebugLoc();
2006   PrevLabel = FunctionBeginSym;
2007 }
2008
2009 /// endFunction - Gather and emit post-function debug information.
2010 ///
2011 void DwarfDebug::endFunction(const MachineFunction *MF) {
2012   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2013
2014   if (CurrentFnDbgScope) {
2015
2016     // Define end label for subprogram.
2017     FunctionEndSym = Asm->GetTempSymbol("func_end",
2018                                         Asm->getFunctionNumber());
2019     // Assumes in correct section after the entry point.
2020     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2021
2022     SmallPtrSet<const MDNode *, 16> ProcessedVars;
2023     collectVariableInfo(MF, ProcessedVars);
2024
2025     // Construct abstract scopes.
2026     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2027            AE = AbstractScopesList.end(); AI != AE; ++AI) {
2028       DISubprogram SP((*AI)->getScopeNode());
2029       if (SP.Verify()) {
2030         // Collect info for variables that were optimized out.
2031         StringRef FName = SP.getLinkageName();
2032         if (FName.empty())
2033           FName = SP.getName();
2034         if (NamedMDNode *NMD = 
2035             getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
2036           for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2037           DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2038           if (!DV || !ProcessedVars.insert(DV))
2039             continue;
2040           DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2041           if (Scope)
2042             Scope->addVariable(new DbgVariable(DV));
2043           }
2044         }
2045       }
2046       if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2047         constructScopeDIE(*AI);
2048     }
2049
2050     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2051
2052     if (!DisableFramePointerElim(*MF))
2053       getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE, 
2054                                                                  dwarf::DW_AT_APPLE_omit_frame_ptr,
2055                                                                  dwarf::DW_FORM_flag, 1);
2056
2057
2058     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2059                                                  MMI->getFrameMoves()));
2060   }
2061
2062   // Clear debug info
2063   CurrentFnDbgScope = NULL;
2064   CurrentFnArguments.clear();
2065   DbgVariableToFrameIndexMap.clear();
2066   VarToAbstractVarMap.clear();
2067   DbgVariableToDbgInstMap.clear();
2068   DeleteContainerSeconds(DbgScopeMap);
2069   UserVariables.clear();
2070   DbgValues.clear();
2071   ConcreteScopes.clear();
2072   DeleteContainerSeconds(AbstractScopes);
2073   AbstractScopesList.clear();
2074   AbstractVariables.clear();
2075   LabelsBeforeInsn.clear();
2076   LabelsAfterInsn.clear();
2077   PrevLabel = NULL;
2078 }
2079
2080 /// recordVariableFrameIndex - Record a variable's index.
2081 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2082   assert (V && "Invalid DbgVariable!");
2083   DbgVariableToFrameIndexMap[V] = Index;
2084 }
2085
2086 /// findVariableFrameIndex - Return true if frame index for the variable
2087 /// is found. Update FI to hold value of the index.
2088 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2089   assert (V && "Invalid DbgVariable!");
2090   DenseMap<const DbgVariable *, int>::iterator I =
2091     DbgVariableToFrameIndexMap.find(V);
2092   if (I == DbgVariableToFrameIndexMap.end())
2093     return false;
2094   *FI = I->second;
2095   return true;
2096 }
2097
2098 /// findDbgScope - Find DbgScope for the debug loc attached with an
2099 /// instruction.
2100 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2101   DbgScope *Scope = NULL;
2102   LLVMContext &Ctx =
2103     MInsn->getParent()->getParent()->getFunction()->getContext();
2104   DebugLoc DL = MInsn->getDebugLoc();
2105
2106   if (DL.isUnknown())
2107     return Scope;
2108
2109   if (const MDNode *IA = DL.getInlinedAt(Ctx))
2110     Scope = ConcreteScopes.lookup(IA);
2111   if (Scope == 0)
2112     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2113
2114   return Scope;
2115 }
2116
2117
2118 /// recordSourceLine - Register a source line with debug info. Returns the
2119 /// unique label that was emitted and which provides correspondence to
2120 /// the source line list.
2121 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S){
2122   StringRef Fn;
2123   StringRef Dir;
2124   unsigned Src = 1;
2125   if (S) {
2126     DIDescriptor Scope(S);
2127
2128     if (Scope.isCompileUnit()) {
2129       DICompileUnit CU(S);
2130       Fn = CU.getFilename();
2131       Dir = CU.getDirectory();
2132     } else if (Scope.isFile()) {
2133       DIFile F(S);
2134       Fn = F.getFilename();
2135       Dir = F.getDirectory();
2136     } else if (Scope.isSubprogram()) {
2137       DISubprogram SP(S);
2138       Fn = SP.getFilename();
2139       Dir = SP.getDirectory();
2140     } else if (Scope.isLexicalBlock()) {
2141       DILexicalBlock DB(S);
2142       Fn = DB.getFilename();
2143       Dir = DB.getDirectory();
2144     } else
2145       assert(0 && "Unexpected scope info");
2146
2147     Src = GetOrCreateSourceID(Fn, Dir);
2148   }
2149
2150   Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
2151                                          0, 0);
2152 }
2153
2154 //===----------------------------------------------------------------------===//
2155 // Emit Methods
2156 //===----------------------------------------------------------------------===//
2157
2158 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2159 ///
2160 unsigned
2161 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2162   // Get the children.
2163   const std::vector<DIE *> &Children = Die->getChildren();
2164
2165   // If not last sibling and has children then add sibling offset attribute.
2166   if (!Last && !Children.empty())
2167     Die->addSiblingOffset(DIEValueAllocator);
2168
2169   // Record the abbreviation.
2170   assignAbbrevNumber(Die->getAbbrev());
2171
2172   // Get the abbreviation for this DIE.
2173   unsigned AbbrevNumber = Die->getAbbrevNumber();
2174   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2175
2176   // Set DIE offset
2177   Die->setOffset(Offset);
2178
2179   // Start the size with the size of abbreviation code.
2180   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2181
2182   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2183   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2184
2185   // Size the DIE attribute values.
2186   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2187     // Size attribute value.
2188     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2189
2190   // Size the DIE children if any.
2191   if (!Children.empty()) {
2192     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2193            "Children flag not set");
2194
2195     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2196       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2197
2198     // End of children marker.
2199     Offset += sizeof(int8_t);
2200   }
2201
2202   Die->setSize(Offset - Die->getOffset());
2203   return Offset;
2204 }
2205
2206 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2207 ///
2208 void DwarfDebug::computeSizeAndOffsets() {
2209   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2210          E = CUMap.end(); I != E; ++I) {
2211     // Compute size of compile unit header.
2212     unsigned Offset = 
2213       sizeof(int32_t) + // Length of Compilation Unit Info
2214       sizeof(int16_t) + // DWARF version number
2215       sizeof(int32_t) + // Offset Into Abbrev. Section
2216       sizeof(int8_t);   // Pointer Size (in bytes)
2217     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2218   }
2219 }
2220
2221 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2222 /// temporary label to it if SymbolStem is specified.
2223 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2224                                 const char *SymbolStem = 0) {
2225   Asm->OutStreamer.SwitchSection(Section);
2226   if (!SymbolStem) return 0;
2227
2228   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2229   Asm->OutStreamer.EmitLabel(TmpSym);
2230   return TmpSym;
2231 }
2232
2233 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
2234 /// the start of each one.
2235 void DwarfDebug::EmitSectionLabels() {
2236   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2237
2238   // Dwarf sections base addresses.
2239   if (Asm->MAI->doesDwarfRequireFrameSection()) {
2240     DwarfFrameSectionSym =
2241       EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2242    }
2243
2244   DwarfInfoSectionSym =
2245     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2246   DwarfAbbrevSectionSym =
2247     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2248   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2249
2250   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2251     EmitSectionSym(Asm, MacroInfo);
2252
2253   EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
2254   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2255   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2256   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2257   DwarfStrSectionSym =
2258     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2259   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2260                                              "debug_range");
2261
2262   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2263                                            "section_debug_loc");
2264
2265   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2266   EmitSectionSym(Asm, TLOF.getDataSection());
2267 }
2268
2269 /// emitDIE - Recusively Emits a debug information entry.
2270 ///
2271 void DwarfDebug::emitDIE(DIE *Die) {
2272   // Get the abbreviation for this DIE.
2273   unsigned AbbrevNumber = Die->getAbbrevNumber();
2274   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2275
2276   // Emit the code (index) for the abbreviation.
2277   if (Asm->isVerbose())
2278     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2279                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
2280                                 Twine::utohexstr(Die->getSize()) + " " +
2281                                 dwarf::TagString(Abbrev->getTag()));
2282   Asm->EmitULEB128(AbbrevNumber);
2283
2284   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2285   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2286
2287   // Emit the DIE attribute values.
2288   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2289     unsigned Attr = AbbrevData[i].getAttribute();
2290     unsigned Form = AbbrevData[i].getForm();
2291     assert(Form && "Too many attributes for DIE (check abbreviation)");
2292
2293     if (Asm->isVerbose())
2294       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2295
2296     switch (Attr) {
2297     case dwarf::DW_AT_sibling:
2298       Asm->EmitInt32(Die->getSiblingOffset());
2299       break;
2300     case dwarf::DW_AT_abstract_origin: {
2301       DIEEntry *E = cast<DIEEntry>(Values[i]);
2302       DIE *Origin = E->getEntry();
2303       unsigned Addr = Origin->getOffset();
2304       Asm->EmitInt32(Addr);
2305       break;
2306     }
2307     case dwarf::DW_AT_ranges: {
2308       // DW_AT_range Value encodes offset in debug_range section.
2309       DIEInteger *V = cast<DIEInteger>(Values[i]);
2310
2311       if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2312         Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2313                                  V->getValue(),
2314                                  4);
2315       } else {
2316         Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2317                                        V->getValue(),
2318                                        DwarfDebugRangeSectionSym,
2319                                        4);
2320       }
2321       break;
2322     }
2323     case dwarf::DW_AT_location: {
2324       if (UseDotDebugLocEntry.count(Die) != 0) {
2325         DIELabel *L = cast<DIELabel>(Values[i]);
2326         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
2327       } else
2328         Values[i]->EmitValue(Asm, Form);
2329       break;
2330     }
2331     case dwarf::DW_AT_accessibility: {
2332       if (Asm->isVerbose()) {
2333         DIEInteger *V = cast<DIEInteger>(Values[i]);
2334         Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2335       }
2336       Values[i]->EmitValue(Asm, Form);
2337       break;
2338     }
2339     default:
2340       // Emit an attribute using the defined form.
2341       Values[i]->EmitValue(Asm, Form);
2342       break;
2343     }
2344   }
2345
2346   // Emit the DIE children if any.
2347   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2348     const std::vector<DIE *> &Children = Die->getChildren();
2349
2350     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2351       emitDIE(Children[j]);
2352
2353     if (Asm->isVerbose())
2354       Asm->OutStreamer.AddComment("End Of Children Mark");
2355     Asm->EmitInt8(0);
2356   }
2357 }
2358
2359 /// emitDebugInfo - Emit the debug info section.
2360 ///
2361 void DwarfDebug::emitDebugInfo() {
2362   // Start debug info section.
2363   Asm->OutStreamer.SwitchSection(
2364                             Asm->getObjFileLowering().getDwarfInfoSection());
2365   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2366          E = CUMap.end(); I != E; ++I) {
2367     CompileUnit *TheCU = I->second;
2368     DIE *Die = TheCU->getCUDie();
2369
2370     // Emit the compile units header.
2371     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2372                                                   TheCU->getID()));
2373
2374     // Emit size of content not including length itself
2375     unsigned ContentSize = Die->getSize() +
2376       sizeof(int16_t) + // DWARF version number
2377       sizeof(int32_t) + // Offset Into Abbrev. Section
2378       sizeof(int8_t);   // Pointer Size (in bytes)
2379
2380     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2381     Asm->EmitInt32(ContentSize);
2382     Asm->OutStreamer.AddComment("DWARF version number");
2383     Asm->EmitInt16(dwarf::DWARF_VERSION);
2384     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2385     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2386                            DwarfAbbrevSectionSym);
2387     Asm->OutStreamer.AddComment("Address Size (in bytes)");
2388     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2389
2390     emitDIE(Die);
2391     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2392   }
2393 }
2394
2395 /// emitAbbreviations - Emit the abbreviation section.
2396 ///
2397 void DwarfDebug::emitAbbreviations() const {
2398   // Check to see if it is worth the effort.
2399   if (!Abbreviations.empty()) {
2400     // Start the debug abbrev section.
2401     Asm->OutStreamer.SwitchSection(
2402                             Asm->getObjFileLowering().getDwarfAbbrevSection());
2403
2404     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
2405
2406     // For each abbrevation.
2407     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2408       // Get abbreviation data
2409       const DIEAbbrev *Abbrev = Abbreviations[i];
2410
2411       // Emit the abbrevations code (base 1 index.)
2412       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2413
2414       // Emit the abbreviations data.
2415       Abbrev->Emit(Asm);
2416     }
2417
2418     // Mark end of abbreviations.
2419     Asm->EmitULEB128(0, "EOM(3)");
2420
2421     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
2422   }
2423 }
2424
2425 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
2426 /// the line matrix.
2427 ///
2428 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2429   // Define last address of section.
2430   Asm->OutStreamer.AddComment("Extended Op");
2431   Asm->EmitInt8(0);
2432
2433   Asm->OutStreamer.AddComment("Op size");
2434   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
2435   Asm->OutStreamer.AddComment("DW_LNE_set_address");
2436   Asm->EmitInt8(dwarf::DW_LNE_set_address);
2437
2438   Asm->OutStreamer.AddComment("Section end label");
2439
2440   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2441                                    Asm->getTargetData().getPointerSize(),
2442                                    0/*AddrSpace*/);
2443
2444   // Mark end of matrix.
2445   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2446   Asm->EmitInt8(0);
2447   Asm->EmitInt8(1);
2448   Asm->EmitInt8(1);
2449 }
2450
2451 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2452 ///
2453 void DwarfDebug::emitCommonDebugFrame() {
2454   if (!Asm->MAI->doesDwarfRequireFrameSection())
2455     return;
2456
2457   int stackGrowth = Asm->getTargetData().getPointerSize();
2458   if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
2459       TargetFrameLowering::StackGrowsDown)
2460     stackGrowth *= -1;
2461
2462   // Start the dwarf frame section.
2463   Asm->OutStreamer.SwitchSection(
2464                               Asm->getObjFileLowering().getDwarfFrameSection());
2465
2466   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
2467   Asm->OutStreamer.AddComment("Length of Common Information Entry");
2468   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
2469                            Asm->GetTempSymbol("debug_frame_common_begin"), 4);
2470
2471   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
2472   Asm->OutStreamer.AddComment("CIE Identifier Tag");
2473   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2474   Asm->OutStreamer.AddComment("CIE Version");
2475   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2476   Asm->OutStreamer.AddComment("CIE Augmentation");
2477   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2478   Asm->EmitULEB128(1, "CIE Code Alignment Factor");
2479   Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2480   Asm->OutStreamer.AddComment("CIE RA Column");
2481   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
2482   const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
2483   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2484
2485   std::vector<MachineMove> Moves;
2486   TFI->getInitialFrameState(Moves);
2487
2488   Asm->EmitFrameMoves(Moves, 0, false);
2489
2490   Asm->EmitAlignment(2);
2491   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
2492 }
2493
2494 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2495 /// section.
2496 void DwarfDebug::
2497 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2498   if (!Asm->MAI->doesDwarfRequireFrameSection())
2499     return;
2500
2501   // Start the dwarf frame section.
2502   Asm->OutStreamer.SwitchSection(
2503                               Asm->getObjFileLowering().getDwarfFrameSection());
2504
2505   Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2506   MCSymbol *DebugFrameBegin =
2507     Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
2508   MCSymbol *DebugFrameEnd =
2509     Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
2510   Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
2511
2512   Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2513
2514   Asm->OutStreamer.AddComment("FDE CIE offset");
2515   Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
2516                          DwarfFrameSectionSym);
2517
2518   Asm->OutStreamer.AddComment("FDE initial location");
2519   MCSymbol *FuncBeginSym =
2520     Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
2521   Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2522                                    Asm->getTargetData().getPointerSize(),
2523                                    0/*AddrSpace*/);
2524
2525
2526   Asm->OutStreamer.AddComment("FDE address range");
2527   Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
2528                            FuncBeginSym, Asm->getTargetData().getPointerSize());
2529
2530   Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
2531
2532   Asm->EmitAlignment(2);
2533   Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2534 }
2535
2536 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2537 ///
2538 void DwarfDebug::emitDebugPubNames() {
2539   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2540          E = CUMap.end(); I != E; ++I) {
2541     CompileUnit *TheCU = I->second;
2542     // Start the dwarf pubnames section.
2543     Asm->OutStreamer.SwitchSection(
2544       Asm->getObjFileLowering().getDwarfPubNamesSection());
2545
2546     Asm->OutStreamer.AddComment("Length of Public Names Info");
2547     Asm->EmitLabelDifference(
2548       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2549       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
2550
2551     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2552                                                   TheCU->getID()));
2553
2554     Asm->OutStreamer.AddComment("DWARF Version");
2555     Asm->EmitInt16(dwarf::DWARF_VERSION);
2556
2557     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2558     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2559                            DwarfInfoSectionSym);
2560
2561     Asm->OutStreamer.AddComment("Compilation Unit Length");
2562     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2563                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
2564                              4);
2565
2566     const StringMap<DIE*> &Globals = TheCU->getGlobals();
2567     for (StringMap<DIE*>::const_iterator
2568            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2569       const char *Name = GI->getKeyData();
2570       DIE *Entity = GI->second;
2571
2572       Asm->OutStreamer.AddComment("DIE offset");
2573       Asm->EmitInt32(Entity->getOffset());
2574
2575       if (Asm->isVerbose())
2576         Asm->OutStreamer.AddComment("External Name");
2577       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2578     }
2579
2580     Asm->OutStreamer.AddComment("End Mark");
2581     Asm->EmitInt32(0);
2582     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2583                                                 TheCU->getID()));
2584   }
2585 }
2586
2587 void DwarfDebug::emitDebugPubTypes() {
2588   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2589          E = CUMap.end(); I != E; ++I) {
2590     CompileUnit *TheCU = I->second;
2591     // Start the dwarf pubnames section.
2592     Asm->OutStreamer.SwitchSection(
2593       Asm->getObjFileLowering().getDwarfPubTypesSection());
2594     Asm->OutStreamer.AddComment("Length of Public Types Info");
2595     Asm->EmitLabelDifference(
2596       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2597       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
2598
2599     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2600                                                   TheCU->getID()));
2601
2602     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2603     Asm->EmitInt16(dwarf::DWARF_VERSION);
2604
2605     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2606     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2607                            DwarfInfoSectionSym);
2608
2609     Asm->OutStreamer.AddComment("Compilation Unit Length");
2610     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2611                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
2612                              4);
2613
2614     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2615     for (StringMap<DIE*>::const_iterator
2616            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2617       const char *Name = GI->getKeyData();
2618       DIE * Entity = GI->second;
2619
2620       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2621       Asm->EmitInt32(Entity->getOffset());
2622
2623       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2624       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2625     }
2626
2627     Asm->OutStreamer.AddComment("End Mark");
2628     Asm->EmitInt32(0);
2629     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2630                                                   TheCU->getID()));
2631   }
2632 }
2633
2634 /// emitDebugStr - Emit visible names into a debug str section.
2635 ///
2636 void DwarfDebug::emitDebugStr() {
2637   // Check to see if it is worth the effort.
2638   if (StringPool.empty()) return;
2639
2640   // Start the dwarf str section.
2641   Asm->OutStreamer.SwitchSection(
2642                                 Asm->getObjFileLowering().getDwarfStrSection());
2643
2644   // Get all of the string pool entries and put them in an array by their ID so
2645   // we can sort them.
2646   SmallVector<std::pair<unsigned,
2647       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2648
2649   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2650        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2651     Entries.push_back(std::make_pair(I->second.second, &*I));
2652
2653   array_pod_sort(Entries.begin(), Entries.end());
2654
2655   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2656     // Emit a label for reference from debug information entries.
2657     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2658
2659     // Emit the string itself.
2660     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
2661   }
2662 }
2663
2664 /// emitDebugLoc - Emit visible names into a debug loc section.
2665 ///
2666 void DwarfDebug::emitDebugLoc() {
2667   if (DotDebugLocEntries.empty())
2668     return;
2669
2670   for (SmallVector<DotDebugLocEntry, 4>::iterator
2671          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2672        I != E; ++I) {
2673     DotDebugLocEntry &Entry = *I;
2674     if (I + 1 != DotDebugLocEntries.end())
2675       Entry.Merge(I+1);
2676   }
2677
2678   // Start the dwarf loc section.
2679   Asm->OutStreamer.SwitchSection(
2680     Asm->getObjFileLowering().getDwarfLocSection());
2681   unsigned char Size = Asm->getTargetData().getPointerSize();
2682   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2683   unsigned index = 1;
2684   for (SmallVector<DotDebugLocEntry, 4>::iterator
2685          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2686        I != E; ++I, ++index) {
2687     DotDebugLocEntry &Entry = *I;
2688     if (Entry.isMerged()) continue;
2689     if (Entry.isEmpty()) {
2690       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2691       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2692       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2693     } else {
2694       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2695       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
2696       const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
2697       unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
2698       if (int Offset =  Entry.Loc.getOffset()) {
2699         // If the value is at a certain offset from frame register then
2700         // use DW_OP_fbreg.
2701         unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
2702         Asm->OutStreamer.AddComment("Loc expr size");
2703         Asm->EmitInt16(1 + OffsetSize);
2704         Asm->OutStreamer.AddComment(
2705           dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
2706         Asm->EmitInt8(dwarf::DW_OP_fbreg);
2707         Asm->OutStreamer.AddComment("Offset");
2708         Asm->EmitSLEB128(Offset);
2709       } else {
2710         if (Reg < 32) {
2711           Asm->OutStreamer.AddComment("Loc expr size");
2712           Asm->EmitInt16(1);
2713           Asm->OutStreamer.AddComment(
2714             dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
2715           Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
2716         } else {
2717           Asm->OutStreamer.AddComment("Loc expr size");
2718           Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
2719           Asm->EmitInt8(dwarf::DW_OP_regx);
2720           Asm->EmitULEB128(Reg);
2721         }
2722       }
2723     }
2724   }
2725 }
2726
2727 /// EmitDebugARanges - Emit visible names into a debug aranges section.
2728 ///
2729 void DwarfDebug::EmitDebugARanges() {
2730   // Start the dwarf aranges section.
2731   Asm->OutStreamer.SwitchSection(
2732                           Asm->getObjFileLowering().getDwarfARangesSection());
2733 }
2734
2735 /// emitDebugRanges - Emit visible names into a debug ranges section.
2736 ///
2737 void DwarfDebug::emitDebugRanges() {
2738   // Start the dwarf ranges section.
2739   Asm->OutStreamer.SwitchSection(
2740     Asm->getObjFileLowering().getDwarfRangesSection());
2741   unsigned char Size = Asm->getTargetData().getPointerSize();
2742   for (SmallVector<const MCSymbol *, 8>::iterator
2743          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2744        I != E; ++I) {
2745     if (*I)
2746       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
2747     else
2748       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2749   }
2750 }
2751
2752 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2753 ///
2754 void DwarfDebug::emitDebugMacInfo() {
2755   if (const MCSection *LineInfo =
2756       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2757     // Start the dwarf macinfo section.
2758     Asm->OutStreamer.SwitchSection(LineInfo);
2759   }
2760 }
2761
2762 /// emitDebugInlineInfo - Emit inline info using following format.
2763 /// Section Header:
2764 /// 1. length of section
2765 /// 2. Dwarf version number
2766 /// 3. address size.
2767 ///
2768 /// Entries (one "entry" for each function that was inlined):
2769 ///
2770 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
2771 ///   otherwise offset into __debug_str for regular function name.
2772 /// 2. offset into __debug_str section for regular function name.
2773 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
2774 /// instances for the function.
2775 ///
2776 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
2777 /// inlined instance; the die_offset points to the inlined_subroutine die in the
2778 /// __debug_info section, and the low_pc is the starting address for the
2779 /// inlining instance.
2780 void DwarfDebug::emitDebugInlineInfo() {
2781   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
2782     return;
2783
2784   if (!FirstCU)
2785     return;
2786
2787   Asm->OutStreamer.SwitchSection(
2788                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
2789
2790   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2791   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2792                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2793
2794   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2795
2796   Asm->OutStreamer.AddComment("Dwarf Version");
2797   Asm->EmitInt16(dwarf::DWARF_VERSION);
2798   Asm->OutStreamer.AddComment("Address Size (in bytes)");
2799   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2800
2801   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2802          E = InlinedSPNodes.end(); I != E; ++I) {
2803
2804     const MDNode *Node = *I;
2805     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2806       = InlineInfo.find(Node);
2807     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2808     DISubprogram SP(Node);
2809     StringRef LName = SP.getLinkageName();
2810     StringRef Name = SP.getName();
2811
2812     Asm->OutStreamer.AddComment("MIPS linkage name");
2813     if (LName.empty()) {
2814       Asm->OutStreamer.EmitBytes(Name, 0);
2815       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2816     } else
2817       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2818                              DwarfStrSectionSym);
2819
2820     Asm->OutStreamer.AddComment("Function name");
2821     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2822     Asm->EmitULEB128(Labels.size(), "Inline count");
2823
2824     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2825            LE = Labels.end(); LI != LE; ++LI) {
2826       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2827       Asm->EmitInt32(LI->second->getOffset());
2828
2829       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2830       Asm->OutStreamer.EmitSymbolValue(LI->first,
2831                                        Asm->getTargetData().getPointerSize(),0);
2832     }
2833   }
2834
2835   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
2836 }