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