Refactoring. Update DbgVarible to handle queries itself.
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfDebug.cpp
1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains support for writing dwarf debug info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
16 #include "DIE.h"
17 #include "llvm/Constants.h"
18 #include "llvm/Module.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/CodeGen/MachineModuleInfo.h"
21 #include "llvm/MC/MCAsmInfo.h"
22 #include "llvm/MC/MCSection.h"
23 #include "llvm/MC/MCStreamer.h"
24 #include "llvm/MC/MCSymbol.h"
25 #include "llvm/Target/Mangler.h"
26 #include "llvm/Target/TargetData.h"
27 #include "llvm/Target/TargetFrameInfo.h"
28 #include "llvm/Target/TargetLoweringObjectFile.h"
29 #include "llvm/Target/TargetMachine.h"
30 #include "llvm/Target/TargetRegisterInfo.h"
31 #include "llvm/Target/TargetOptions.h"
32 #include "llvm/Analysis/DebugInfo.h"
33 #include "llvm/ADT/STLExtras.h"
34 #include "llvm/ADT/StringExtras.h"
35 #include "llvm/Support/CommandLine.h"
36 #include "llvm/Support/Debug.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include "llvm/Support/ValueHandle.h"
39 #include "llvm/Support/FormattedStream.h"
40 #include "llvm/Support/Timer.h"
41 #include "llvm/System/Path.h"
42 using namespace llvm;
43
44 static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
45      cl::desc("Print DbgScope information for each machine instruction"));
46
47 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
48                                               cl::Hidden,
49      cl::desc("Disable debug info printing"));
50
51 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
52      cl::desc("Make an absense of debug location information explicit."),
53      cl::init(false));
54
55 namespace {
56   const char *DWARFGroupName = "DWARF Emission";
57   const char *DbgTimerName = "DWARF Debug Writer";
58 } // end anonymous namespace
59
60 //===----------------------------------------------------------------------===//
61
62 /// Configuration values for initial hash set sizes (log2).
63 ///
64 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
65
66 namespace llvm {
67
68 //===----------------------------------------------------------------------===//
69 /// CompileUnit - This dwarf writer support class manages information associate
70 /// with a source file.
71 class CompileUnit {
72   /// ID - File identifier for source.
73   ///
74   unsigned ID;
75
76   /// Die - Compile unit debug information entry.
77   ///
78   const OwningPtr<DIE> CUDie;
79
80   /// IndexTyDie - An anonymous type for index type.  Owned by CUDie.
81   DIE *IndexTyDie;
82
83   /// MDNodeToDieMap - Tracks the mapping of unit level debug informaton
84   /// variables to debug information entries.
85   DenseMap<const MDNode *, DIE *> MDNodeToDieMap;
86
87   /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug informaton
88   /// descriptors to debug information entries using a DIEEntry proxy.
89   DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap;
90
91   /// Globals - A map of globally visible named entities for this unit.
92   ///
93   StringMap<DIE*> Globals;
94
95   /// GlobalTypes - A map of globally visible types for this unit.
96   ///
97   StringMap<DIE*> GlobalTypes;
98
99 public:
100   CompileUnit(unsigned I, DIE *D)
101     : ID(I), CUDie(D), IndexTyDie(0) {}
102
103   // Accessors.
104   unsigned getID()                  const { return ID; }
105   DIE* getCUDie()                   const { return CUDie.get(); }
106   const StringMap<DIE*> &getGlobals()     const { return Globals; }
107   const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
108
109   /// hasContent - Return true if this compile unit has something to write out.
110   ///
111   bool hasContent() const { return !CUDie->getChildren().empty(); }
112
113   /// addGlobal - Add a new global entity to the compile unit.
114   ///
115   void addGlobal(StringRef Name, DIE *Die) { Globals[Name] = Die; }
116
117   /// addGlobalType - Add a new global type to the compile unit.
118   ///
119   void addGlobalType(StringRef Name, DIE *Die) {
120     GlobalTypes[Name] = Die;
121   }
122
123   /// getDIE - Returns the debug information entry map slot for the
124   /// specified debug variable.
125   DIE *getDIE(const MDNode *N) { return MDNodeToDieMap.lookup(N); }
126
127   /// insertDIE - Insert DIE into the map.
128   void insertDIE(const MDNode *N, DIE *D) {
129     MDNodeToDieMap.insert(std::make_pair(N, D));
130   }
131
132   /// getDIEEntry - Returns the debug information entry for the speciefied
133   /// debug variable.
134   DIEEntry *getDIEEntry(const MDNode *N) {
135     DenseMap<const MDNode *, DIEEntry *>::iterator I =
136       MDNodeToDIEEntryMap.find(N);
137     if (I == MDNodeToDIEEntryMap.end())
138       return NULL;
139     return I->second;
140   }
141
142   /// insertDIEEntry - Insert debug information entry into the map.
143   void insertDIEEntry(const MDNode *N, DIEEntry *E) {
144     MDNodeToDIEEntryMap.insert(std::make_pair(N, E));
145   }
146
147   /// addDie - Adds or interns the DIE to the compile unit.
148   ///
149   void addDie(DIE *Buffer) {
150     this->CUDie->addChild(Buffer);
151   }
152
153   // getIndexTyDie - Get an anonymous type for index type.
154   DIE *getIndexTyDie() {
155     return IndexTyDie;
156   }
157
158   // setIndexTyDie - Set D as anonymous type for index which can be reused
159   // later.
160   void setIndexTyDie(DIE *D) {
161     IndexTyDie = D;
162   }
163
164 };
165
166 //===----------------------------------------------------------------------===//
167 /// DbgVariable - This class is used to track local variable information.
168 ///
169 class DbgVariable {
170   DIVariable Var;                    // Variable Descriptor.
171   DIE *TheDIE;                       // Variable DIE.
172   unsigned DotDebugLocOffset;        // Offset in DotDebugLocEntries.
173 public:
174   // AbsVar may be NULL.
175   DbgVariable(DIVariable V) : Var(V), TheDIE(0), DotDebugLocOffset(~0U) {}
176
177   // Accessors.
178   DIVariable getVariable()           const { return Var; }
179   void setDIE(DIE *D)                      { TheDIE = D; }
180   DIE *getDIE()                      const { return TheDIE; }
181   void setDotDebugLocOffset(unsigned O)    { DotDebugLocOffset = O; }
182   unsigned getDotDebugLocOffset()    const { return DotDebugLocOffset; }
183   StringRef getName()                const { return Var.getName(); }
184   unsigned getTag()                  const { return Var.getTag(); }
185   bool variableHasComplexAddress()   const {
186     assert(Var.Verify() && "Invalid complex DbgVariable!");
187     return Var.hasComplexAddress();
188   }
189   bool isBlockByrefVariable()        const {
190     assert(Var.Verify() && "Invalid complex DbgVariable!");
191     return Var.isBlockByrefVariable();
192   }
193   unsigned getNumAddrElements()      const { 
194     assert(Var.Verify() && "Invalid complex DbgVariable!");
195     return Var.getNumAddrElements();
196   }
197   uint64_t getAddrElement(unsigned i) const {
198     return Var.getAddrElement(i);
199   }
200   DIType getType()               const {
201     DIType Ty = Var.getType();
202     // FIXME: isBlockByrefVariable should be reformulated in terms of complex
203     // addresses instead.
204     if (Var.isBlockByrefVariable()) {
205       /* Byref variables, in Blocks, are declared by the programmer as
206          "SomeType VarName;", but the compiler creates a
207          __Block_byref_x_VarName struct, and gives the variable VarName
208          either the struct, or a pointer to the struct, as its type.  This
209          is necessary for various behind-the-scenes things the compiler
210          needs to do with by-reference variables in blocks.
211          
212          However, as far as the original *programmer* is concerned, the
213          variable should still have type 'SomeType', as originally declared.
214          
215          The following function dives into the __Block_byref_x_VarName
216          struct to find the original type of the variable.  This will be
217          passed back to the code generating the type for the Debug
218          Information Entry for the variable 'VarName'.  'VarName' will then
219          have the original type 'SomeType' in its debug information.
220          
221          The original type 'SomeType' will be the type of the field named
222          'VarName' inside the __Block_byref_x_VarName struct.
223          
224          NOTE: In order for this to not completely fail on the debugger
225          side, the Debug Information Entry for the variable VarName needs to
226          have a DW_AT_location that tells the debugger how to unwind through
227          the pointers and __Block_byref_x_VarName struct to find the actual
228          value of the variable.  The function addBlockByrefType does this.  */
229       DIType subType = Ty;
230       unsigned tag = Ty.getTag();
231       
232       if (tag == dwarf::DW_TAG_pointer_type) {
233         DIDerivedType DTy = DIDerivedType(Ty);
234         subType = DTy.getTypeDerivedFrom();
235       }
236       
237       DICompositeType blockStruct = DICompositeType(subType);
238       DIArray Elements = blockStruct.getTypeArray();
239       
240       for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
241         DIDescriptor Element = Elements.getElement(i);
242         DIDerivedType DT = DIDerivedType(Element);
243         if (getName() == DT.getName())
244           return (DT.getTypeDerivedFrom());
245       }
246       return Ty;
247     }
248     return Ty;
249   }
250 };
251
252 //===----------------------------------------------------------------------===//
253 /// DbgRange - This is used to track range of instructions with identical
254 /// debug info scope.
255 ///
256 typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
257
258 //===----------------------------------------------------------------------===//
259 /// DbgScope - This class is used to track scope information.
260 ///
261 class DbgScope {
262   DbgScope *Parent;                   // Parent to this scope.
263   DIDescriptor Desc;                  // Debug info descriptor for scope.
264   // Location at which this scope is inlined.
265   AssertingVH<const MDNode> InlinedAtLocation;
266   bool AbstractScope;                 // Abstract Scope
267   const MachineInstr *LastInsn;       // Last instruction of this scope.
268   const MachineInstr *FirstInsn;      // First instruction of this scope.
269   unsigned DFSIn, DFSOut;
270   // Scopes defined in scope.  Contents not owned.
271   SmallVector<DbgScope *, 4> Scopes;
272   // Variables declared in scope.  Contents owned.
273   SmallVector<DbgVariable *, 8> Variables;
274   SmallVector<DbgRange, 4> Ranges;
275   // Private state for dump()
276   mutable unsigned IndentLevel;
277 public:
278   DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
279     : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
280       LastInsn(0), FirstInsn(0),
281       DFSIn(0), DFSOut(0), IndentLevel(0) {}
282   virtual ~DbgScope();
283
284   // Accessors.
285   DbgScope *getParent()          const { return Parent; }
286   void setParent(DbgScope *P)          { Parent = P; }
287   DIDescriptor getDesc()         const { return Desc; }
288   const MDNode *getInlinedAt()         const { return InlinedAtLocation; }
289   const MDNode *getScopeNode()         const { return Desc; }
290   const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
291   const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
292   const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
293
294   /// openInsnRange - This scope covers instruction range starting from MI.
295   void openInsnRange(const MachineInstr *MI) {
296     if (!FirstInsn)
297       FirstInsn = MI;
298
299     if (Parent)
300       Parent->openInsnRange(MI);
301   }
302
303   /// extendInsnRange - Extend the current instruction range covered by
304   /// this scope.
305   void extendInsnRange(const MachineInstr *MI) {
306     assert (FirstInsn && "MI Range is not open!");
307     LastInsn = MI;
308     if (Parent)
309       Parent->extendInsnRange(MI);
310   }
311
312   /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
313   /// until now. This is used when a new scope is encountered while walking
314   /// machine instructions.
315   void closeInsnRange(DbgScope *NewScope = NULL) {
316     assert (LastInsn && "Last insn missing!");
317     Ranges.push_back(DbgRange(FirstInsn, LastInsn));
318     FirstInsn = NULL;
319     LastInsn = NULL;
320     // If Parent dominates NewScope then do not close Parent's instruction
321     // range.
322     if (Parent && (!NewScope || !Parent->dominates(NewScope)))
323       Parent->closeInsnRange(NewScope);
324   }
325
326   void setAbstractScope() { AbstractScope = true; }
327   bool isAbstractScope() const { return AbstractScope; }
328
329   // Depth First Search support to walk and mainpluate DbgScope hierarchy.
330   unsigned getDFSOut() const { return DFSOut; }
331   void setDFSOut(unsigned O) { DFSOut = O; }
332   unsigned getDFSIn() const  { return DFSIn; }
333   void setDFSIn(unsigned I)  { DFSIn = I; }
334   bool dominates(const DbgScope *S) {
335     if (S == this)
336       return true;
337     if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
338       return true;
339     return false;
340   }
341
342   /// addScope - Add a scope to the scope.
343   ///
344   void addScope(DbgScope *S) { Scopes.push_back(S); }
345
346   /// addVariable - Add a variable to the scope.
347   ///
348   void addVariable(DbgVariable *V) { Variables.push_back(V); }
349
350 #ifndef NDEBUG
351   void dump() const;
352 #endif
353 };
354
355 } // end llvm namespace
356
357 #ifndef NDEBUG
358 void DbgScope::dump() const {
359   raw_ostream &err = dbgs();
360   err.indent(IndentLevel);
361   const MDNode *N = Desc;
362   N->dump();
363   if (AbstractScope)
364     err << "Abstract Scope\n";
365
366   IndentLevel += 2;
367   if (!Scopes.empty())
368     err << "Children ...\n";
369   for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
370     if (Scopes[i] != this)
371       Scopes[i]->dump();
372
373   IndentLevel -= 2;
374 }
375 #endif
376
377 DbgScope::~DbgScope() {
378   for (unsigned j = 0, M = Variables.size(); j < M; ++j)
379     delete Variables[j];
380 }
381
382 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
383   : Asm(A), MMI(Asm->MMI), FirstCU(0),
384     AbbreviationsSet(InitAbbreviationsSetSize),
385     CurrentFnDbgScope(0), PrevLabel(NULL) {
386   NextStringPoolNumber = 0;
387
388   DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
389   DwarfStrSectionSym = TextSectionSym = 0;
390   DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
391   DwarfDebugLineSectionSym = CurrentLineSectionSym = 0;
392   FunctionBeginSym = FunctionEndSym = 0;
393   DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
394   {
395     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
396     beginModule(M);
397   }
398 }
399 DwarfDebug::~DwarfDebug() {
400   for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
401     DIEBlocks[j]->~DIEBlock();
402 }
403
404 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
405   std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
406   if (Entry.first) return Entry.first;
407
408   Entry.second = NextStringPoolNumber++;
409   return Entry.first = Asm->GetTempSymbol("string", Entry.second);
410 }
411
412
413 /// assignAbbrevNumber - Define a unique number for the abbreviation.
414 ///
415 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
416   // Profile the node so that we can make it unique.
417   FoldingSetNodeID ID;
418   Abbrev.Profile(ID);
419
420   // Check the set for priors.
421   DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
422
423   // If it's newly added.
424   if (InSet == &Abbrev) {
425     // Add to abbreviation list.
426     Abbreviations.push_back(&Abbrev);
427
428     // Assign the vector position + 1 as its number.
429     Abbrev.setNumber(Abbreviations.size());
430   } else {
431     // Assign existing abbreviation number.
432     Abbrev.setNumber(InSet->getNumber());
433   }
434 }
435
436 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
437 /// information entry.
438 DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
439   DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
440   return Value;
441 }
442
443 /// addUInt - Add an unsigned integer attribute data and value.
444 ///
445 void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
446                          unsigned Form, uint64_t Integer) {
447   if (!Form) Form = DIEInteger::BestForm(false, Integer);
448   DIEValue *Value = Integer == 1 ?
449     DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer);
450   Die->addValue(Attribute, Form, Value);
451 }
452
453 /// addSInt - Add an signed integer attribute data and value.
454 ///
455 void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
456                          unsigned Form, int64_t Integer) {
457   if (!Form) Form = DIEInteger::BestForm(true, Integer);
458   DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
459   Die->addValue(Attribute, Form, Value);
460 }
461
462 /// addString - Add a string attribute data and value. DIEString only
463 /// keeps string reference.
464 void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
465                            StringRef String) {
466   DIEValue *Value = new (DIEValueAllocator) DIEString(String);
467   Die->addValue(Attribute, Form, Value);
468 }
469
470 /// addLabel - Add a Dwarf label attribute data and value.
471 ///
472 void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
473                           const MCSymbol *Label) {
474   DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
475   Die->addValue(Attribute, Form, Value);
476 }
477
478 /// addDelta - Add a label delta attribute data and value.
479 ///
480 void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
481                           const MCSymbol *Hi, const MCSymbol *Lo) {
482   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
483   Die->addValue(Attribute, Form, Value);
484 }
485
486 /// addDIEEntry - Add a DIE attribute data and value.
487 ///
488 void DwarfDebug::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form,
489                              DIE *Entry) {
490   Die->addValue(Attribute, Form, createDIEEntry(Entry));
491 }
492
493
494 /// addBlock - Add block data.
495 ///
496 void DwarfDebug::addBlock(DIE *Die, unsigned Attribute, unsigned Form,
497                           DIEBlock *Block) {
498   Block->ComputeSize(Asm);
499   DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
500   Die->addValue(Attribute, Block->BestForm(), Block);
501 }
502
503 /// addSourceLine - Add location information to specified debug information
504 /// entry.
505 void DwarfDebug::addSourceLine(DIE *Die, const DIVariable V) {
506   // Verify variable.
507   if (!V.Verify())
508     return;
509
510   unsigned Line = V.getLineNumber();
511   unsigned FileID = GetOrCreateSourceID(V.getContext().getDirectory(),
512                                         V.getContext().getFilename());
513   assert(FileID && "Invalid file id");
514   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
515   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
516 }
517
518 /// addSourceLine - Add location information to specified debug information
519 /// entry.
520 void DwarfDebug::addSourceLine(DIE *Die, const DIGlobalVariable G) {
521   // Verify global variable.
522   if (!G.Verify())
523     return;
524
525   unsigned Line = G.getLineNumber();
526   unsigned FileID = GetOrCreateSourceID(G.getContext().getDirectory(),
527                                         G.getContext().getFilename());
528   assert(FileID && "Invalid file id");
529   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
530   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
531 }
532
533 /// addSourceLine - Add location information to specified debug information
534 /// entry.
535 void DwarfDebug::addSourceLine(DIE *Die, const DISubprogram SP) {
536   // Verify subprogram.
537   if (!SP.Verify())
538     return;
539   // If the line number is 0, don't add it.
540   if (SP.getLineNumber() == 0)
541     return;
542
543   unsigned Line = SP.getLineNumber();
544   if (!SP.getContext().Verify())
545     return;
546   unsigned FileID = GetOrCreateSourceID(SP.getDirectory(),
547                                         SP.getFilename());
548   assert(FileID && "Invalid file id");
549   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
550   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
551 }
552
553 /// addSourceLine - Add location information to specified debug information
554 /// entry.
555 void DwarfDebug::addSourceLine(DIE *Die, const DIType Ty) {
556   // Verify type.
557   if (!Ty.Verify())
558     return;
559
560   unsigned Line = Ty.getLineNumber();
561   if (!Ty.getContext().Verify())
562     return;
563   unsigned FileID = GetOrCreateSourceID(Ty.getContext().getDirectory(),
564                                         Ty.getContext().getFilename());
565   assert(FileID && "Invalid file id");
566   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
567   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
568 }
569
570 /// addSourceLine - Add location information to specified debug information
571 /// entry.
572 void DwarfDebug::addSourceLine(DIE *Die, const DINameSpace NS) {
573   // Verify namespace.
574   if (!NS.Verify())
575     return;
576
577   unsigned Line = NS.getLineNumber();
578   StringRef FN = NS.getFilename();
579   StringRef Dir = NS.getDirectory();
580
581   unsigned FileID = GetOrCreateSourceID(Dir, FN);
582   assert(FileID && "Invalid file id");
583   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
584   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
585 }
586
587 /// addVariableAddress - Add DW_AT_location attribute for a DbgVariable.
588 void DwarfDebug::addVariableAddress(DbgVariable *&DV, DIE *Die,
589                                     unsigned Attribute,
590                                     const MachineLocation &Location) {
591   if (DV->variableHasComplexAddress())
592     addComplexAddress(DV, Die, dwarf::DW_AT_location, Location);
593   else if (DV->isBlockByrefVariable())
594     addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location);
595   else
596     addAddress(Die, dwarf::DW_AT_location, Location);
597 }
598
599 /// addComplexAddress - Start with the address based on the location provided,
600 /// and generate the DWARF information necessary to find the actual variable
601 /// given the extra address information encoded in the DIVariable, starting from
602 /// the starting location.  Add the DWARF information to the die.
603 ///
604 void DwarfDebug::addComplexAddress(DbgVariable *&DV, DIE *Die,
605                                    unsigned Attribute,
606                                    const MachineLocation &Location) {
607   DIType Ty = DV->getType();
608
609   // Decode the original location, and use that as the start of the byref
610   // variable's location.
611   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
612   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
613   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
614
615   if (Location.isReg()) {
616     if (Reg < 32) {
617       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
618     } else {
619       Reg = Reg - dwarf::DW_OP_reg0;
620       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
621       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
622     }
623   } else {
624     if (Reg < 32)
625       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
626     else {
627       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
628       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
629     }
630
631     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
632   }
633
634   for (unsigned i = 0, N = DV->getNumAddrElements(); i < N; ++i) {
635     uint64_t Element = DV->getAddrElement(i);
636
637     if (Element == DIFactory::OpPlus) {
638       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
639       addUInt(Block, 0, dwarf::DW_FORM_udata, DV->getAddrElement(++i));
640     } else if (Element == DIFactory::OpDeref) {
641       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
642     } else llvm_unreachable("unknown DIFactory Opcode");
643   }
644
645   // Now attach the location information to the DIE.
646   addBlock(Die, Attribute, 0, Block);
647 }
648
649 /* Byref variables, in Blocks, are declared by the programmer as "SomeType
650    VarName;", but the compiler creates a __Block_byref_x_VarName struct, and
651    gives the variable VarName either the struct, or a pointer to the struct, as
652    its type.  This is necessary for various behind-the-scenes things the
653    compiler needs to do with by-reference variables in Blocks.
654
655    However, as far as the original *programmer* is concerned, the variable
656    should still have type 'SomeType', as originally declared.
657
658    The function getBlockByrefType dives into the __Block_byref_x_VarName
659    struct to find the original type of the variable, which is then assigned to
660    the variable's Debug Information Entry as its real type.  So far, so good.
661    However now the debugger will expect the variable VarName to have the type
662    SomeType.  So we need the location attribute for the variable to be an
663    expression that explains to the debugger how to navigate through the
664    pointers and struct to find the actual variable of type SomeType.
665
666    The following function does just that.  We start by getting
667    the "normal" location for the variable. This will be the location
668    of either the struct __Block_byref_x_VarName or the pointer to the
669    struct __Block_byref_x_VarName.
670
671    The struct will look something like:
672
673    struct __Block_byref_x_VarName {
674      ... <various fields>
675      struct __Block_byref_x_VarName *forwarding;
676      ... <various other fields>
677      SomeType VarName;
678      ... <maybe more fields>
679    };
680
681    If we are given the struct directly (as our starting point) we
682    need to tell the debugger to:
683
684    1).  Add the offset of the forwarding field.
685
686    2).  Follow that pointer to get the real __Block_byref_x_VarName
687    struct to use (the real one may have been copied onto the heap).
688
689    3).  Add the offset for the field VarName, to find the actual variable.
690
691    If we started with a pointer to the struct, then we need to
692    dereference that pointer first, before the other steps.
693    Translating this into DWARF ops, we will need to append the following
694    to the current location description for the variable:
695
696    DW_OP_deref                    -- optional, if we start with a pointer
697    DW_OP_plus_uconst <forward_fld_offset>
698    DW_OP_deref
699    DW_OP_plus_uconst <varName_fld_offset>
700
701    That is what this function does.  */
702
703 /// addBlockByrefAddress - Start with the address based on the location
704 /// provided, and generate the DWARF information necessary to find the
705 /// actual Block variable (navigating the Block struct) based on the
706 /// starting location.  Add the DWARF information to the die.  For
707 /// more information, read large comment just above here.
708 ///
709 void DwarfDebug::addBlockByrefAddress(DbgVariable *&DV, DIE *Die,
710                                       unsigned Attribute,
711                                       const MachineLocation &Location) {
712   DIType Ty = DV->getType();
713   DIType TmpTy = Ty;
714   unsigned Tag = Ty.getTag();
715   bool isPointer = false;
716
717   StringRef varName = DV->getName();
718
719   if (Tag == dwarf::DW_TAG_pointer_type) {
720     DIDerivedType DTy = DIDerivedType(Ty);
721     TmpTy = DTy.getTypeDerivedFrom();
722     isPointer = true;
723   }
724
725   DICompositeType blockStruct = DICompositeType(TmpTy);
726
727   // Find the __forwarding field and the variable field in the __Block_byref
728   // struct.
729   DIArray Fields = blockStruct.getTypeArray();
730   DIDescriptor varField = DIDescriptor();
731   DIDescriptor forwardingField = DIDescriptor();
732
733   for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) {
734     DIDescriptor Element = Fields.getElement(i);
735     DIDerivedType DT = DIDerivedType(Element);
736     StringRef fieldName = DT.getName();
737     if (fieldName == "__forwarding")
738       forwardingField = Element;
739     else if (fieldName == varName)
740       varField = Element;
741   }
742
743   // Get the offsets for the forwarding field and the variable field.
744   unsigned forwardingFieldOffset =
745     DIDerivedType(forwardingField).getOffsetInBits() >> 3;
746   unsigned varFieldOffset =
747     DIDerivedType(varField).getOffsetInBits() >> 3;
748
749   // Decode the original location, and use that as the start of the byref
750   // variable's location.
751   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
752   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
753   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
754
755   if (Location.isReg()) {
756     if (Reg < 32)
757       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
758     else {
759       Reg = Reg - dwarf::DW_OP_reg0;
760       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
761       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
762     }
763   } else {
764     if (Reg < 32)
765       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
766     else {
767       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
768       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
769     }
770
771     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
772   }
773
774   // If we started with a pointer to the __Block_byref... struct, then
775   // the first thing we need to do is dereference the pointer (DW_OP_deref).
776   if (isPointer)
777     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
778
779   // Next add the offset for the '__forwarding' field:
780   // DW_OP_plus_uconst ForwardingFieldOffset.  Note there's no point in
781   // adding the offset if it's 0.
782   if (forwardingFieldOffset > 0) {
783     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
784     addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset);
785   }
786
787   // Now dereference the __forwarding field to get to the real __Block_byref
788   // struct:  DW_OP_deref.
789   addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
790
791   // Now that we've got the real __Block_byref... struct, add the offset
792   // for the variable's field to get to the location of the actual variable:
793   // DW_OP_plus_uconst varFieldOffset.  Again, don't add if it's 0.
794   if (varFieldOffset > 0) {
795     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
796     addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset);
797   }
798
799   // Now attach the location information to the DIE.
800   addBlock(Die, Attribute, 0, Block);
801 }
802
803 /// addAddress - Add an address attribute to a die based on the location
804 /// provided.
805 void DwarfDebug::addAddress(DIE *Die, unsigned Attribute,
806                             const MachineLocation &Location) {
807   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
808   unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
809   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
810
811   if (Location.isReg()) {
812     if (Reg < 32) {
813       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + Reg);
814     } else {
815       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx);
816       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
817     }
818   } else {
819     if (Reg < 32) {
820       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + Reg);
821     } else {
822       addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx);
823       addUInt(Block, 0, dwarf::DW_FORM_udata, Reg);
824     }
825
826     addUInt(Block, 0, dwarf::DW_FORM_sdata, Location.getOffset());
827   }
828
829   addBlock(Die, Attribute, 0, Block);
830 }
831
832 /// addRegisterAddress - Add register location entry in variable DIE.
833 bool DwarfDebug::addRegisterAddress(DIE *Die, const MCSymbol *VS,
834                                     const MachineOperand &MO) {
835   assert (MO.isReg() && "Invalid machine operand!");
836   if (!MO.getReg())
837     return false;
838   MachineLocation Location;
839   Location.set(MO.getReg());
840   addAddress(Die, dwarf::DW_AT_location, Location);
841   if (VS)
842     addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
843   return true;
844 }
845
846 /// addConstantValue - Add constant value entry in variable DIE.
847 bool DwarfDebug::addConstantValue(DIE *Die, const MCSymbol *VS,
848                                   const MachineOperand &MO) {
849   assert (MO.isImm() && "Invalid machine operand!");
850   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
851   unsigned Imm = MO.getImm();
852   addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
853   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
854   if (VS)
855     addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
856   return true;
857 }
858
859 /// addConstantFPValue - Add constant value entry in variable DIE.
860 bool DwarfDebug::addConstantFPValue(DIE *Die, const MCSymbol *VS,
861                                     const MachineOperand &MO) {
862   assert (MO.isFPImm() && "Invalid machine operand!");
863   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
864   APFloat FPImm = MO.getFPImm()->getValueAPF();
865
866   // Get the raw data form of the floating point.
867   const APInt FltVal = FPImm.bitcastToAPInt();
868   const char *FltPtr = (const char*)FltVal.getRawData();
869
870   int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte.
871   bool LittleEndian = Asm->getTargetData().isLittleEndian();
872   int Incr = (LittleEndian ? 1 : -1);
873   int Start = (LittleEndian ? 0 : NumBytes - 1);
874   int Stop = (LittleEndian ? NumBytes : -1);
875
876   // Output the constant to DWARF one byte at a time.
877   for (; Start != Stop; Start += Incr)
878     addUInt(Block, 0, dwarf::DW_FORM_data1,
879             (unsigned char)0xFF & FltPtr[Start]);
880
881   addBlock(Die, dwarf::DW_AT_const_value, 0, Block);
882   if (VS)
883     addLabel(Die, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr, VS);
884   return true;
885 }
886
887
888 /// addToContextOwner - Add Die into the list of its context owner's children.
889 void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
890   if (Context.isType()) {
891     DIE *ContextDIE = getOrCreateTypeDIE(DIType(Context));
892     ContextDIE->addChild(Die);
893   } else if (Context.isNameSpace()) {
894     DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
895     ContextDIE->addChild(Die);
896   } else if (Context.isSubprogram()) {
897     DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context),
898                                           /*MakeDecl=*/false);
899     ContextDIE->addChild(Die);
900   } else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
901     ContextDIE->addChild(Die);
902   else
903     getCompileUnit(Context)->addDie(Die);
904 }
905
906 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
907 /// given DIType.
908 DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
909   CompileUnit *TypeCU = getCompileUnit(Ty);
910   DIE *TyDIE = TypeCU->getDIE(Ty);
911   if (TyDIE)
912     return TyDIE;
913
914   // Create new type.
915   TyDIE = new DIE(dwarf::DW_TAG_base_type);
916   TypeCU->insertDIE(Ty, TyDIE);
917   if (Ty.isBasicType())
918     constructTypeDIE(*TyDIE, DIBasicType(Ty));
919   else if (Ty.isCompositeType())
920     constructTypeDIE(*TyDIE, DICompositeType(Ty));
921   else {
922     assert(Ty.isDerivedType() && "Unknown kind of DIType");
923     constructTypeDIE(*TyDIE, DIDerivedType(Ty));
924   }
925
926   addToContextOwner(TyDIE, Ty.getContext());
927   return TyDIE;
928 }
929
930 /// addType - Add a new type attribute to the specified entity.
931 void DwarfDebug::addType(DIE *Entity, DIType Ty) {
932   if (!Ty.Verify())
933     return;
934
935   // Check for pre-existence.
936   CompileUnit *TypeCU = getCompileUnit(Ty);
937   DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
938   // If it exists then use the existing value.
939   if (Entry) {
940     Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
941     return;
942   }
943
944   // Construct type.
945   DIE *Buffer = getOrCreateTypeDIE(Ty);
946
947   // Set up proxy.
948   Entry = createDIEEntry(Buffer);
949   TypeCU->insertDIEEntry(Ty, Entry);
950
951   Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
952 }
953
954 /// constructTypeDIE - Construct basic type die from DIBasicType.
955 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
956   // Get core information.
957   StringRef Name = BTy.getName();
958   Buffer.setTag(dwarf::DW_TAG_base_type);
959   addUInt(&Buffer, dwarf::DW_AT_encoding,  dwarf::DW_FORM_data1,
960           BTy.getEncoding());
961
962   // Add name if not anonymous or intermediate type.
963   if (!Name.empty())
964     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
965   uint64_t Size = BTy.getSizeInBits() >> 3;
966   addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
967 }
968
969 /// constructTypeDIE - Construct derived type die from DIDerivedType.
970 void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
971   // Get core information.
972   StringRef Name = DTy.getName();
973   uint64_t Size = DTy.getSizeInBits() >> 3;
974   unsigned Tag = DTy.getTag();
975
976   // FIXME - Workaround for templates.
977   if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
978
979   Buffer.setTag(Tag);
980
981   // Map to main type, void will not have a type.
982   DIType FromTy = DTy.getTypeDerivedFrom();
983   addType(&Buffer, FromTy);
984
985   // Add name if not anonymous or intermediate type.
986   if (!Name.empty())
987     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
988
989   // Add size if non-zero (derived types might be zero-sized.)
990   if (Size)
991     addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
992
993   // Add source line info if available and TyDesc is not a forward declaration.
994   if (!DTy.isForwardDecl())
995     addSourceLine(&Buffer, DTy);
996 }
997
998 /// constructTypeDIE - Construct type DIE from DICompositeType.
999 void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
1000   // Get core information.
1001   StringRef Name = CTy.getName();
1002
1003   uint64_t Size = CTy.getSizeInBits() >> 3;
1004   unsigned Tag = CTy.getTag();
1005   Buffer.setTag(Tag);
1006
1007   switch (Tag) {
1008   case dwarf::DW_TAG_vector_type:
1009   case dwarf::DW_TAG_array_type:
1010     constructArrayTypeDIE(Buffer, &CTy);
1011     break;
1012   case dwarf::DW_TAG_enumeration_type: {
1013     DIArray Elements = CTy.getTypeArray();
1014
1015     // Add enumerators to enumeration type.
1016     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1017       DIE *ElemDie = NULL;
1018       DIDescriptor Enum(Elements.getElement(i));
1019       if (Enum.isEnumerator()) {
1020         ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
1021         Buffer.addChild(ElemDie);
1022       }
1023     }
1024   }
1025     break;
1026   case dwarf::DW_TAG_subroutine_type: {
1027     // Add return type.
1028     DIArray Elements = CTy.getTypeArray();
1029     DIDescriptor RTy = Elements.getElement(0);
1030     addType(&Buffer, DIType(RTy));
1031
1032     // Add prototype flag.
1033     addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1034
1035     // Add arguments.
1036     for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1037       DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1038       DIDescriptor Ty = Elements.getElement(i);
1039       addType(Arg, DIType(Ty));
1040       Buffer.addChild(Arg);
1041     }
1042   }
1043     break;
1044   case dwarf::DW_TAG_structure_type:
1045   case dwarf::DW_TAG_union_type:
1046   case dwarf::DW_TAG_class_type: {
1047     // Add elements to structure type.
1048     DIArray Elements = CTy.getTypeArray();
1049
1050     // A forward struct declared type may not have elements available.
1051     unsigned N = Elements.getNumElements();
1052     if (N == 0)
1053       break;
1054
1055     // Add elements to structure type.
1056     for (unsigned i = 0; i < N; ++i) {
1057       DIDescriptor Element = Elements.getElement(i);
1058       DIE *ElemDie = NULL;
1059       if (Element.isSubprogram())
1060         ElemDie = createSubprogramDIE(DISubprogram(Element));
1061       else if (Element.isVariable()) {
1062         DIVariable DV(Element);
1063         ElemDie = new DIE(dwarf::DW_TAG_variable);
1064         addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1065                   DV.getName());
1066         addType(ElemDie, DV.getType());
1067         addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1068         addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1069         addSourceLine(ElemDie, DV);
1070       } else if (Element.isDerivedType())
1071         ElemDie = createMemberDIE(DIDerivedType(Element));
1072       else
1073         continue;
1074       Buffer.addChild(ElemDie);
1075     }
1076
1077     if (CTy.isAppleBlockExtension())
1078       addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1079
1080     unsigned RLang = CTy.getRunTimeLang();
1081     if (RLang)
1082       addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1083               dwarf::DW_FORM_data1, RLang);
1084
1085     DICompositeType ContainingType = CTy.getContainingType();
1086     if (DIDescriptor(ContainingType).isCompositeType())
1087       addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1088                   getOrCreateTypeDIE(DIType(ContainingType)));
1089     else {
1090       DIDescriptor Context = CTy.getContext();
1091       addToContextOwner(&Buffer, Context);
1092     }
1093     break;
1094   }
1095   default:
1096     break;
1097   }
1098
1099   // Add name if not anonymous or intermediate type.
1100   if (!Name.empty())
1101     addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1102
1103   if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type
1104       || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)
1105     {
1106     // Add size if non-zero (derived types might be zero-sized.)
1107     if (Size)
1108       addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1109     else {
1110       // Add zero size if it is not a forward declaration.
1111       if (CTy.isForwardDecl())
1112         addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1113       else
1114         addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1115     }
1116
1117     // Add source line info if available.
1118     if (!CTy.isForwardDecl())
1119       addSourceLine(&Buffer, CTy);
1120   }
1121 }
1122
1123 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1124 void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1125   int64_t L = SR.getLo();
1126   int64_t H = SR.getHi();
1127   DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1128
1129   addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1130   if (L)
1131     addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1132   addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1133
1134   Buffer.addChild(DW_Subrange);
1135 }
1136
1137 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1138 void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1139                                        DICompositeType *CTy) {
1140   Buffer.setTag(dwarf::DW_TAG_array_type);
1141   if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1142     addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1143
1144   // Emit derived type.
1145   addType(&Buffer, CTy->getTypeDerivedFrom());
1146   DIArray Elements = CTy->getTypeArray();
1147
1148   // Get an anonymous type for index type.
1149   CompileUnit *TheCU = getCompileUnit(*CTy);
1150   DIE *IdxTy = TheCU->getIndexTyDie();
1151   if (!IdxTy) {
1152     // Construct an anonymous type for index type.
1153     IdxTy = new DIE(dwarf::DW_TAG_base_type);
1154     addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1155     addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1156             dwarf::DW_ATE_signed);
1157     TheCU->addDie(IdxTy);
1158     TheCU->setIndexTyDie(IdxTy);
1159   }
1160
1161   // Add subranges to array type.
1162   for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1163     DIDescriptor Element = Elements.getElement(i);
1164     if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1165       constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1166   }
1167 }
1168
1169 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1170 DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1171   DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1172   StringRef Name = ETy.getName();
1173   addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1174   int64_t Value = ETy.getEnumValue();
1175   addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1176   return Enumerator;
1177 }
1178
1179 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1180 /// printer to not emit usual symbol prefix before the symbol name is used then
1181 /// return linkage name after skipping this special LLVM prefix.
1182 static StringRef getRealLinkageName(StringRef LinkageName) {
1183   char One = '\1';
1184   if (LinkageName.startswith(StringRef(&One, 1)))
1185     return LinkageName.substr(1);
1186   return LinkageName;
1187 }
1188
1189 /// createGlobalVariableDIE - Create new DIE using GV.
1190 DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1191   // If the global variable was optmized out then no need to create debug info
1192   // entry.
1193   if (!GV.getGlobal()) return NULL;
1194   if (GV.getDisplayName().empty()) return NULL;
1195
1196   DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1197   addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1198             GV.getDisplayName());
1199
1200   StringRef LinkageName = GV.getLinkageName();
1201   if (!LinkageName.empty())
1202     addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1203               getRealLinkageName(LinkageName));
1204
1205   addType(GVDie, GV.getType());
1206   if (!GV.isLocalToUnit())
1207     addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1208   addSourceLine(GVDie, GV);
1209
1210   return GVDie;
1211 }
1212
1213 /// createMemberDIE - Create new member DIE.
1214 DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1215   DIE *MemberDie = new DIE(DT.getTag());
1216   StringRef Name = DT.getName();
1217   if (!Name.empty())
1218     addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1219
1220   addType(MemberDie, DT.getTypeDerivedFrom());
1221
1222   addSourceLine(MemberDie, DT);
1223
1224   DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1225   addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1226
1227   uint64_t Size = DT.getSizeInBits();
1228   uint64_t FieldSize = DT.getOriginalTypeSize();
1229
1230   if (Size != FieldSize) {
1231     // Handle bitfield.
1232     addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1233     addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1234
1235     uint64_t Offset = DT.getOffsetInBits();
1236     uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1237     uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1238     uint64_t FieldOffset = (HiMark - FieldSize);
1239     Offset -= FieldOffset;
1240
1241     // Maybe we need to work from the other end.
1242     if (Asm->getTargetData().isLittleEndian())
1243       Offset = FieldSize - (Offset + Size);
1244     addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1245
1246     // Here WD_AT_data_member_location points to the anonymous
1247     // field that includes this bit field.
1248     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1249
1250   } else
1251     // This is not a bitfield.
1252     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1253
1254   if (DT.getTag() == dwarf::DW_TAG_inheritance
1255       && DT.isVirtual()) {
1256
1257     // For C++, virtual base classes are not at fixed offset. Use following
1258     // expression to extract appropriate offset from vtable.
1259     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1260
1261     DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1262     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1263     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1264     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1265     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1266     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1267     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1268     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1269
1270     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1271              VBaseLocationDie);
1272   } else
1273     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1274
1275   if (DT.isProtected())
1276     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1277             dwarf::DW_ACCESS_protected);
1278   else if (DT.isPrivate())
1279     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1280             dwarf::DW_ACCESS_private);
1281   else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1282     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1283             dwarf::DW_ACCESS_public);
1284   if (DT.isVirtual())
1285     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1286             dwarf::DW_VIRTUALITY_virtual);
1287   return MemberDie;
1288 }
1289
1290 /// createSubprogramDIE - Create new DIE using SP.
1291 DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1292   CompileUnit *SPCU = getCompileUnit(SP);
1293   DIE *SPDie = SPCU->getDIE(SP);
1294   if (SPDie)
1295     return SPDie;
1296
1297   SPDie = new DIE(dwarf::DW_TAG_subprogram);
1298   // Constructors and operators for anonymous aggregates do not have names.
1299   if (!SP.getName().empty())
1300     addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1301
1302   StringRef LinkageName = SP.getLinkageName();
1303   if (!LinkageName.empty())
1304     addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1305               getRealLinkageName(LinkageName));
1306
1307   addSourceLine(SPDie, SP);
1308
1309   // Add prototyped tag, if C or ObjC.
1310   unsigned Lang = SP.getCompileUnit().getLanguage();
1311   if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1312       Lang == dwarf::DW_LANG_ObjC)
1313     addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1314
1315   // Add Return Type.
1316   DICompositeType SPTy = SP.getType();
1317   DIArray Args = SPTy.getTypeArray();
1318   unsigned SPTag = SPTy.getTag();
1319
1320   if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1321     addType(SPDie, SPTy);
1322   else
1323     addType(SPDie, DIType(Args.getElement(0)));
1324
1325   unsigned VK = SP.getVirtuality();
1326   if (VK) {
1327     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1328     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1329     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1330     addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1331     addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1332     ContainingTypeMap.insert(std::make_pair(SPDie,
1333                                             SP.getContainingType()));
1334   }
1335
1336   if (MakeDecl || !SP.isDefinition()) {
1337     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1338
1339     // Add arguments. Do not add arguments for subprogram definition. They will
1340     // be handled while processing variables.
1341     DICompositeType SPTy = SP.getType();
1342     DIArray Args = SPTy.getTypeArray();
1343     unsigned SPTag = SPTy.getTag();
1344
1345     if (SPTag == dwarf::DW_TAG_subroutine_type)
1346       for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1347         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1348         DIType ATy = DIType(DIType(Args.getElement(i)));
1349         addType(Arg, ATy);
1350         if (ATy.isArtificial())
1351           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1352         SPDie->addChild(Arg);
1353       }
1354   }
1355
1356   if (SP.isArtificial())
1357     addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1358
1359   if (!SP.isLocalToUnit())
1360     addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1361
1362   if (SP.isOptimized())
1363     addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1364
1365   if (unsigned isa = Asm->getISAEncoding()) {
1366     addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1367   }
1368
1369   // DW_TAG_inlined_subroutine may refer to this DIE.
1370   SPCU->insertDIE(SP, SPDie);
1371
1372   // Add to context owner.
1373   addToContextOwner(SPDie, SP.getContext());
1374
1375   return SPDie;
1376 }
1377
1378 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1379   assert(N && "Invalid Scope encoding!");
1380
1381   DbgScope *AScope = AbstractScopes.lookup(N);
1382   if (AScope)
1383     return AScope;
1384
1385   DbgScope *Parent = NULL;
1386
1387   DIDescriptor Scope(N);
1388   if (Scope.isLexicalBlock()) {
1389     DILexicalBlock DB(N);
1390     DIDescriptor ParentDesc = DB.getContext();
1391     Parent = getOrCreateAbstractScope(ParentDesc);
1392   }
1393
1394   AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1395
1396   if (Parent)
1397     Parent->addScope(AScope);
1398   AScope->setAbstractScope();
1399   AbstractScopes[N] = AScope;
1400   if (DIDescriptor(N).isSubprogram())
1401     AbstractScopesList.push_back(AScope);
1402   return AScope;
1403 }
1404
1405 /// isSubprogramContext - Return true if Context is either a subprogram
1406 /// or another context nested inside a subprogram.
1407 static bool isSubprogramContext(const MDNode *Context) {
1408   if (!Context)
1409     return false;
1410   DIDescriptor D(Context);
1411   if (D.isSubprogram())
1412     return true;
1413   if (D.isType())
1414     return isSubprogramContext(DIType(Context).getContext());
1415   return false;
1416 }
1417
1418 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1419 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1420 /// If there are global variables in this scope then create and insert
1421 /// DIEs for these variables.
1422 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1423   CompileUnit *SPCU = getCompileUnit(SPNode);
1424   DIE *SPDie = SPCU->getDIE(SPNode);
1425
1426   assert(SPDie && "Unable to find subprogram DIE!");
1427   DISubprogram SP(SPNode);
1428
1429   // There is not any need to generate specification DIE for a function
1430   // defined at compile unit level. If a function is defined inside another
1431   // function then gdb prefers the definition at top level and but does not
1432   // expect specification DIE in parent function. So avoid creating
1433   // specification DIE for a function defined inside a function.
1434   if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1435       !SP.getContext().isFile() &&
1436       !isSubprogramContext(SP.getContext())) {
1437     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1438
1439     // Add arguments.
1440     DICompositeType SPTy = SP.getType();
1441     DIArray Args = SPTy.getTypeArray();
1442     unsigned SPTag = SPTy.getTag();
1443     if (SPTag == dwarf::DW_TAG_subroutine_type)
1444       for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1445         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1446         DIType ATy = DIType(DIType(Args.getElement(i)));
1447         addType(Arg, ATy);
1448         if (ATy.isArtificial())
1449           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1450         SPDie->addChild(Arg);
1451       }
1452     DIE *SPDeclDie = SPDie;
1453     SPDie = new DIE(dwarf::DW_TAG_subprogram);
1454     addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1455                 SPDeclDie);
1456     SPCU->addDie(SPDie);
1457   }
1458
1459   // Pick up abstract subprogram DIE.
1460   if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
1461     SPDie = new DIE(dwarf::DW_TAG_subprogram);
1462     addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
1463                 dwarf::DW_FORM_ref4, AbsSPDIE);
1464     SPCU->addDie(SPDie);
1465   }
1466
1467   addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1468            Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1469   addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1470            Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1471   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1472   MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1473   addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1474
1475   return SPDie;
1476 }
1477
1478 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1479 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1480 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1481
1482   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1483   if (Scope->isAbstractScope())
1484     return ScopeDIE;
1485
1486   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1487   if (Ranges.empty())
1488     return 0;
1489
1490   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1491   if (Ranges.size() > 1) {
1492     // .debug_range section has not been laid out yet. Emit offset in
1493     // .debug_range as a uint, size 4, for now. emitDIE will handle
1494     // DW_AT_ranges appropriately.
1495     addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1496             DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1497     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1498          RE = Ranges.end(); RI != RE; ++RI) {
1499       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1500       DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1501     }
1502     DebugRangeSymbols.push_back(NULL);
1503     DebugRangeSymbols.push_back(NULL);
1504     return ScopeDIE;
1505   }
1506
1507   const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1508   const MCSymbol *End = getLabelAfterInsn(RI->second);
1509
1510   if (End == 0) return 0;
1511
1512   assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1513   assert(End->isDefined() && "Invalid end label for an inlined scope!");
1514
1515   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1516   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1517
1518   return ScopeDIE;
1519 }
1520
1521 /// constructInlinedScopeDIE - This scope represents inlined body of
1522 /// a function. Construct DIE to represent this concrete inlined copy
1523 /// of the function.
1524 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1525
1526   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1527   assert (Ranges.empty() == false
1528           && "DbgScope does not have instruction markers!");
1529
1530   // FIXME : .debug_inlined section specification does not clearly state how
1531   // to emit inlined scope that is split into multiple instruction ranges.
1532   // For now, use first instruction range and emit low_pc/high_pc pair and
1533   // corresponding .debug_inlined section entry for this pair.
1534   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1535   const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1536   const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1537
1538   if (StartLabel == 0 || EndLabel == 0) {
1539     assert (0 && "Unexpected Start and End  labels for a inlined scope!");
1540     return 0;
1541   }
1542   assert(StartLabel->isDefined() &&
1543          "Invalid starting label for an inlined scope!");
1544   assert(EndLabel->isDefined() &&
1545          "Invalid end label for an inlined scope!");
1546
1547   if (!Scope->getScopeNode())
1548     return NULL;
1549   DIScope DS(Scope->getScopeNode());
1550   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1551
1552   DISubprogram InlinedSP = getDISubprogram(DS);
1553   CompileUnit *TheCU = getCompileUnit(InlinedSP);
1554   DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1555   assert(OriginDIE && "Unable to find Origin DIE!");
1556   addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1557               dwarf::DW_FORM_ref4, OriginDIE);
1558
1559   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1560   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1561
1562   InlinedSubprogramDIEs.insert(OriginDIE);
1563
1564   // Track the start label for this inlined function.
1565   DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1566     I = InlineInfo.find(InlinedSP);
1567
1568   if (I == InlineInfo.end()) {
1569     InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1570                                                              ScopeDIE));
1571     InlinedSPNodes.push_back(InlinedSP);
1572   } else
1573     I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1574
1575   DILocation DL(Scope->getInlinedAt());
1576   addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1577   addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1578
1579   return ScopeDIE;
1580 }
1581
1582
1583 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1584 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1585   StringRef Name = DV->getName();
1586   if (Name.empty())
1587     return NULL;
1588
1589   // Translate tag to proper Dwarf tag.  The result variable is dropped for
1590   // now.
1591   unsigned Tag;
1592   switch (DV->getTag()) {
1593   case dwarf::DW_TAG_return_variable:
1594     return NULL;
1595   case dwarf::DW_TAG_arg_variable:
1596     Tag = dwarf::DW_TAG_formal_parameter;
1597     break;
1598   case dwarf::DW_TAG_auto_variable:    // fall thru
1599   default:
1600     Tag = dwarf::DW_TAG_variable;
1601     break;
1602   }
1603
1604   // Define variable debug information entry.
1605   DIE *VariableDie = new DIE(Tag);
1606
1607   DIE *AbsDIE = NULL;
1608   DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1609     V2AVI = VarToAbstractVarMap.find(DV);
1610   if (V2AVI != VarToAbstractVarMap.end())
1611     AbsDIE = V2AVI->second->getDIE();
1612
1613   if (AbsDIE)
1614     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1615                 dwarf::DW_FORM_ref4, AbsDIE);
1616   else {
1617     addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1618     addSourceLine(VariableDie, DV->getVariable());
1619
1620     // Add variable type.
1621     addType(VariableDie, DV->getType());
1622   }
1623
1624   if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
1625     addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1626
1627   if (Scope->isAbstractScope()) {
1628     DV->setDIE(VariableDie);
1629     return VariableDie;
1630   }
1631
1632   // Add variable address.
1633
1634   unsigned Offset = DV->getDotDebugLocOffset();
1635   if (Offset != ~0U) {
1636     addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1637              Asm->GetTempSymbol("debug_loc", Offset));
1638     DV->setDIE(VariableDie);
1639     UseDotDebugLocEntry.insert(VariableDie);
1640     return VariableDie;
1641   }
1642
1643   // Check if variable is described by a  DBG_VALUE instruction.
1644   DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1645     DbgVariableToDbgInstMap.find(DV);
1646   if (DVI != DbgVariableToDbgInstMap.end()) {
1647     const MachineInstr *DVInsn = DVI->second;
1648     const MCSymbol *DVLabel = findVariableLabel(DV);
1649     bool updated = false;
1650     // FIXME : Handle getNumOperands != 3
1651     if (DVInsn->getNumOperands() == 3) {
1652       if (DVInsn->getOperand(0).isReg())
1653         updated =
1654           addRegisterAddress(VariableDie, DVLabel, DVInsn->getOperand(0));
1655       else if (DVInsn->getOperand(0).isImm())
1656         updated = addConstantValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1657       else if (DVInsn->getOperand(0).isFPImm())
1658         updated =
1659           addConstantFPValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1660     } else {
1661       MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1662       if (Location.getReg()) {
1663         addAddress(VariableDie, dwarf::DW_AT_location, Location);
1664         if (DVLabel)
1665           addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1666                    DVLabel);
1667         updated = true;
1668       }
1669     }
1670     if (!updated) {
1671       // If variableDie is not updated then DBG_VALUE instruction does not
1672       // have valid variable info.
1673       delete VariableDie;
1674       return NULL;
1675     }
1676     DV->setDIE(VariableDie);
1677     return VariableDie;
1678   }
1679
1680   // .. else use frame index, if available.
1681   MachineLocation Location;
1682   unsigned FrameReg;
1683   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1684   int FI = 0;
1685   if (findVariableFrameIndex(DV, &FI)) {
1686     int Offset = RI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1687     Location.set(FrameReg, Offset);
1688     addVariableAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1689   }
1690   DV->setDIE(VariableDie);
1691   return VariableDie;
1692
1693 }
1694
1695 void DwarfDebug::addPubTypes(DISubprogram SP) {
1696   DICompositeType SPTy = SP.getType();
1697   unsigned SPTag = SPTy.getTag();
1698   if (SPTag != dwarf::DW_TAG_subroutine_type)
1699     return;
1700
1701   DIArray Args = SPTy.getTypeArray();
1702   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1703     DIType ATy(Args.getElement(i));
1704     if (!ATy.Verify())
1705       continue;
1706     DICompositeType CATy = getDICompositeType(ATy);
1707     if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1708         && !CATy.isForwardDecl()) {
1709       CompileUnit *TheCU = getCompileUnit(CATy);
1710       if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1711         TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1712     }
1713   }
1714 }
1715
1716 /// constructScopeDIE - Construct a DIE for this scope.
1717 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1718   if (!Scope || !Scope->getScopeNode())
1719     return NULL;
1720
1721   DIScope DS(Scope->getScopeNode());
1722   DIE *ScopeDIE = NULL;
1723   if (Scope->getInlinedAt())
1724     ScopeDIE = constructInlinedScopeDIE(Scope);
1725   else if (DS.isSubprogram()) {
1726     ProcessedSPNodes.insert(DS);
1727     if (Scope->isAbstractScope()) {
1728       ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1729       // Note down abstract DIE.
1730       if (ScopeDIE)
1731         AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1732     }
1733     else
1734       ScopeDIE = updateSubprogramScopeDIE(DS);
1735   }
1736   else
1737     ScopeDIE = constructLexicalScopeDIE(Scope);
1738   if (!ScopeDIE) return NULL;
1739
1740   // Add variables to scope.
1741   const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1742   for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1743     DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1744     if (VariableDIE)
1745       ScopeDIE->addChild(VariableDIE);
1746   }
1747
1748   // Add nested scopes.
1749   const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1750   for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1751     // Define the Scope debug information entry.
1752     DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1753     if (NestedDIE)
1754       ScopeDIE->addChild(NestedDIE);
1755   }
1756
1757   if (DS.isSubprogram())
1758     addPubTypes(DISubprogram(DS));
1759
1760  return ScopeDIE;
1761 }
1762
1763 /// GetOrCreateSourceID - Look up the source id with the given directory and
1764 /// source file names. If none currently exists, create a new id and insert it
1765 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1766 /// maps as well.
1767 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1768   unsigned DId;
1769   assert (DirName.empty() == false && "Invalid directory name!");
1770
1771   StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1772   if (DI != DirectoryIdMap.end()) {
1773     DId = DI->getValue();
1774   } else {
1775     DId = DirectoryNames.size() + 1;
1776     DirectoryIdMap[DirName] = DId;
1777     DirectoryNames.push_back(DirName);
1778   }
1779
1780   unsigned FId;
1781   StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1782   if (FI != SourceFileIdMap.end()) {
1783     FId = FI->getValue();
1784   } else {
1785     FId = SourceFileNames.size() + 1;
1786     SourceFileIdMap[FileName] = FId;
1787     SourceFileNames.push_back(FileName);
1788   }
1789
1790   DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1791     SourceIdMap.find(std::make_pair(DId, FId));
1792   if (SI != SourceIdMap.end())
1793     return SI->second;
1794
1795   unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1796   SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1797   SourceIds.push_back(std::make_pair(DId, FId));
1798
1799   return SrcId;
1800 }
1801
1802 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1803 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1804   CompileUnit *TheCU = getCompileUnit(NS);
1805   DIE *NDie = TheCU->getDIE(NS);
1806   if (NDie)
1807     return NDie;
1808   NDie = new DIE(dwarf::DW_TAG_namespace);
1809   TheCU->insertDIE(NS, NDie);
1810   if (!NS.getName().empty())
1811     addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1812   addSourceLine(NDie, NS);
1813   addToContextOwner(NDie, NS.getContext());
1814   return NDie;
1815 }
1816
1817 /// constructCompileUnit - Create new CompileUnit for the given
1818 /// metadata node with tag DW_TAG_compile_unit.
1819 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1820   DICompileUnit DIUnit(N);
1821   StringRef FN = DIUnit.getFilename();
1822   StringRef Dir = DIUnit.getDirectory();
1823   unsigned ID = GetOrCreateSourceID(Dir, FN);
1824
1825   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1826   addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1827             DIUnit.getProducer());
1828   addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1829           DIUnit.getLanguage());
1830   addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1831   // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1832   // simplifies debug range entries.
1833   addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
1834   // DW_AT_stmt_list is a offset of line number information for this
1835   // compile unit in debug_line section. This offset is calculated
1836   // during endMoudle().
1837   addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1838
1839   if (!Dir.empty())
1840     addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1841   if (DIUnit.isOptimized())
1842     addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1843
1844   StringRef Flags = DIUnit.getFlags();
1845   if (!Flags.empty())
1846     addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1847
1848   unsigned RVer = DIUnit.getRunTimeVersion();
1849   if (RVer)
1850     addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1851             dwarf::DW_FORM_data1, RVer);
1852
1853   CompileUnit *NewCU = new CompileUnit(ID, Die);
1854   if (!FirstCU)
1855     FirstCU = NewCU;
1856   CUMap.insert(std::make_pair(N, NewCU));
1857 }
1858
1859 /// getCompielUnit - Get CompileUnit DIE.
1860 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1861   assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1862   DIDescriptor D(N);
1863   const MDNode *CUNode = NULL;
1864   if (D.isCompileUnit())
1865     CUNode = N;
1866   else if (D.isSubprogram())
1867     CUNode = DISubprogram(N).getCompileUnit();
1868   else if (D.isType())
1869     CUNode = DIType(N).getCompileUnit();
1870   else if (D.isGlobalVariable())
1871     CUNode = DIGlobalVariable(N).getCompileUnit();
1872   else if (D.isVariable())
1873     CUNode = DIVariable(N).getCompileUnit();
1874   else if (D.isNameSpace())
1875     CUNode = DINameSpace(N).getCompileUnit();
1876   else if (D.isFile())
1877     CUNode = DIFile(N).getCompileUnit();
1878   else
1879     return FirstCU;
1880
1881   DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1882     = CUMap.find(CUNode);
1883   if (I == CUMap.end())
1884     return FirstCU;
1885   return I->second;
1886 }
1887
1888
1889 /// constructGlobalVariableDIE - Construct global variable DIE.
1890 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1891   DIGlobalVariable DI_GV(N);
1892
1893   // If debug information is malformed then ignore it.
1894   if (DI_GV.Verify() == false)
1895     return;
1896
1897   // Check for pre-existence.
1898   CompileUnit *TheCU = getCompileUnit(N);
1899   if (TheCU->getDIE(DI_GV))
1900     return;
1901
1902   DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1903   if (!VariableDie)
1904     return;
1905
1906   // Add to map.
1907   TheCU->insertDIE(N, VariableDie);
1908
1909   // Add to context owner.
1910   DIDescriptor GVContext = DI_GV.getContext();
1911   // Do not create specification DIE if context is either compile unit
1912   // or a subprogram.
1913   if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1914       !GVContext.isFile() &&
1915       !isSubprogramContext(GVContext)) {
1916     // Create specification DIE.
1917     DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1918     addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1919                 dwarf::DW_FORM_ref4, VariableDie);
1920     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1921     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1922     addLabel(Block, 0, dwarf::DW_FORM_udata,
1923              Asm->Mang->getSymbol(DI_GV.getGlobal()));
1924     addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1925     addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1926     TheCU->addDie(VariableSpecDIE);
1927   } else {
1928     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1929     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1930     addLabel(Block, 0, dwarf::DW_FORM_udata,
1931              Asm->Mang->getSymbol(DI_GV.getGlobal()));
1932     addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1933   }
1934   addToContextOwner(VariableDie, GVContext);
1935
1936   // Expose as global. FIXME - need to check external flag.
1937   TheCU->addGlobal(DI_GV.getName(), VariableDie);
1938
1939   DIType GTy = DI_GV.getType();
1940   if (GTy.isCompositeType() && !GTy.getName().empty()
1941       && !GTy.isForwardDecl()) {
1942     DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1943     assert(Entry && "Missing global type!");
1944     TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1945   }
1946   return;
1947 }
1948
1949 /// construct SubprogramDIE - Construct subprogram DIE.
1950 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1951   DISubprogram SP(N);
1952
1953   // Check for pre-existence.
1954   CompileUnit *TheCU = getCompileUnit(N);
1955   if (TheCU->getDIE(N))
1956     return;
1957
1958   if (!SP.isDefinition())
1959     // This is a method declaration which will be handled while constructing
1960     // class type.
1961     return;
1962
1963   DIE *SubprogramDie = createSubprogramDIE(SP);
1964
1965   // Add to map.
1966   TheCU->insertDIE(N, SubprogramDie);
1967
1968   // Add to context owner.
1969   addToContextOwner(SubprogramDie, SP.getContext());
1970
1971   // Expose as global.
1972   TheCU->addGlobal(SP.getName(), SubprogramDie);
1973
1974   return;
1975 }
1976
1977 /// beginModule - Emit all Dwarf sections that should come prior to the
1978 /// content. Create global DIEs and emit initial debug info sections.
1979 /// This is inovked by the target AsmPrinter.
1980 void DwarfDebug::beginModule(Module *M) {
1981   if (DisableDebugInfoPrinting)
1982     return;
1983
1984   DebugInfoFinder DbgFinder;
1985   DbgFinder.processModule(*M);
1986
1987   bool HasDebugInfo = false;
1988
1989   // Scan all the compile-units to see if there are any marked as the main unit.
1990   // if not, we do not generate debug info.
1991   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1992        E = DbgFinder.compile_unit_end(); I != E; ++I) {
1993     if (DICompileUnit(*I).isMain()) {
1994       HasDebugInfo = true;
1995       break;
1996     }
1997   }
1998
1999   if (!HasDebugInfo) return;
2000
2001   // Tell MMI that we have debug info.
2002   MMI->setDebugInfoAvailability(true);
2003
2004   // Emit initial sections.
2005   EmitSectionLabels();
2006
2007   // Create all the compile unit DIEs.
2008   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2009          E = DbgFinder.compile_unit_end(); I != E; ++I)
2010     constructCompileUnit(*I);
2011
2012   // Create DIEs for each subprogram.
2013   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2014          E = DbgFinder.subprogram_end(); I != E; ++I)
2015     constructSubprogramDIE(*I);
2016
2017   // Create DIEs for each global variable.
2018   for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2019          E = DbgFinder.global_variable_end(); I != E; ++I)
2020     constructGlobalVariableDIE(*I);
2021
2022   // Prime section data.
2023   SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2024
2025   // Print out .file directives to specify files for .loc directives. These are
2026   // printed out early so that they precede any .loc directives.
2027   if (Asm->MAI->hasDotLocAndDotFile()) {
2028     for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
2029       // Remember source id starts at 1.
2030       std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
2031       // FIXME: don't use sys::path for this!  This should not depend on the
2032       // host.
2033       sys::Path FullPath(getSourceDirectoryName(Id.first));
2034       bool AppendOk =
2035         FullPath.appendComponent(getSourceFileName(Id.second));
2036       assert(AppendOk && "Could not append filename to directory!");
2037       AppendOk = false;
2038       Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
2039     }
2040   }
2041 }
2042
2043 /// endModule - Emit all Dwarf sections that should come after the content.
2044 ///
2045 void DwarfDebug::endModule() {
2046   if (!FirstCU) return;
2047   const Module *M = MMI->getModule();
2048   DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
2049   if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2050     for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2051       if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2052       DISubprogram SP(AllSPs->getOperand(SI));
2053       if (!SP.Verify()) continue;
2054
2055       // Collect info for variables that were optimized out.
2056       if (!SP.isDefinition()) continue;
2057       StringRef FName = SP.getLinkageName();
2058       if (FName.empty())
2059         FName = SP.getName();
2060       NamedMDNode *NMD =
2061         M->getNamedMetadata(Twine("llvm.dbg.lv.", getRealLinkageName(FName)));
2062       if (!NMD) continue;
2063       unsigned E = NMD->getNumOperands();
2064       if (!E) continue;
2065       DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
2066       DeadFnScopeMap[SP] = Scope;
2067       for (unsigned I = 0; I != E; ++I) {
2068         DIVariable DV(NMD->getOperand(I));
2069         if (!DV.Verify()) continue;
2070         Scope->addVariable(new DbgVariable(DV));
2071       }
2072
2073       // Construct subprogram DIE and add variables DIEs.
2074       constructSubprogramDIE(SP);
2075       DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
2076       const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
2077       for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2078         DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2079         if (VariableDIE)
2080           ScopeDIE->addChild(VariableDIE);
2081       }
2082     }
2083   }
2084
2085   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2086   for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2087          AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2088     DIE *ISP = *AI;
2089     addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2090   }
2091
2092   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2093          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2094     DIE *SPDie = CI->first;
2095     const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2096     if (!N) continue;
2097     DIE *NDie = getCompileUnit(N)->getDIE(N);
2098     if (!NDie) continue;
2099     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2100   }
2101
2102   // Standard sections final addresses.
2103   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2104   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2105   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2106   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2107
2108   // End text sections.
2109   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2110     Asm->OutStreamer.SwitchSection(SectionMap[i]);
2111     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2112   }
2113
2114   // Emit common frame information.
2115   emitCommonDebugFrame();
2116
2117   // Emit function debug frame information
2118   for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2119          E = DebugFrames.end(); I != E; ++I)
2120     emitFunctionDebugFrame(*I);
2121
2122   // Compute DIE offsets and sizes.
2123   computeSizeAndOffsets();
2124
2125   // Emit source line correspondence into a debug line section.
2126   emitDebugLines();
2127
2128   // Emit all the DIEs into a debug info section
2129   emitDebugInfo();
2130
2131   // Corresponding abbreviations into a abbrev section.
2132   emitAbbreviations();
2133
2134   // Emit info into a debug pubnames section.
2135   emitDebugPubNames();
2136
2137   // Emit info into a debug pubtypes section.
2138   emitDebugPubTypes();
2139
2140   // Emit info into a debug loc section.
2141   emitDebugLoc();
2142
2143   // Emit info into a debug aranges section.
2144   EmitDebugARanges();
2145
2146   // Emit info into a debug ranges section.
2147   emitDebugRanges();
2148
2149   // Emit info into a debug macinfo section.
2150   emitDebugMacInfo();
2151
2152   // Emit inline info.
2153   emitDebugInlineInfo();
2154
2155   // Emit info into a debug str section.
2156   emitDebugStr();
2157
2158   // clean up.
2159   DeleteContainerSeconds(DeadFnScopeMap);
2160   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2161          E = CUMap.end(); I != E; ++I)
2162     delete I->second;
2163   FirstCU = NULL;  // Reset for the next Module, if any.
2164 }
2165
2166 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2167 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2168                                               DebugLoc ScopeLoc) {
2169
2170   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2171   if (AbsDbgVariable)
2172     return AbsDbgVariable;
2173
2174   LLVMContext &Ctx = Var->getContext();
2175   DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2176   if (!Scope)
2177     return NULL;
2178
2179   AbsDbgVariable = new DbgVariable(Var);
2180   Scope->addVariable(AbsDbgVariable);
2181   AbstractVariables[Var] = AbsDbgVariable;
2182   return AbsDbgVariable;
2183 }
2184
2185 /// collectVariableInfoFromMMITable - Collect variable information from
2186 /// side table maintained by MMI.
2187 void
2188 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2189                                    SmallPtrSet<const MDNode *, 16> &Processed) {
2190   const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2191   MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2192   for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2193          VE = VMap.end(); VI != VE; ++VI) {
2194     const MDNode *Var = VI->first;
2195     if (!Var) continue;
2196     Processed.insert(Var);
2197     DIVariable DV(Var);
2198     const std::pair<unsigned, DebugLoc> &VP = VI->second;
2199
2200     DbgScope *Scope = 0;
2201     if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2202       Scope = ConcreteScopes.lookup(IA);
2203     if (Scope == 0)
2204       Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2205
2206     // If variable scope is not found then skip this variable.
2207     if (Scope == 0)
2208       continue;
2209
2210     DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2211     DbgVariable *RegVar = new DbgVariable(DV);
2212     recordVariableFrameIndex(RegVar, VP.first);
2213     Scope->addVariable(RegVar);
2214     if (AbsDbgVariable) {
2215       recordVariableFrameIndex(AbsDbgVariable, VP.first);
2216       VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2217     }
2218   }
2219 }
2220
2221 /// isDbgValueInUndefinedReg - Return true if debug value, encoded by
2222 /// DBG_VALUE instruction, is in undefined reg.
2223 static bool isDbgValueInUndefinedReg(const MachineInstr *MI) {
2224   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2225   if (MI->getOperand(0).isReg() && !MI->getOperand(0).getReg())
2226     return true;
2227   return false;
2228 }
2229
2230 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
2231 /// DBG_VALUE instruction, is in a defined reg.
2232 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2233   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2234   if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2235     return true;
2236   return false;
2237 }
2238
2239 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2240 void
2241 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2242                                 SmallPtrSet<const MDNode *, 16> &Processed) {
2243
2244   /// collection info from MMI table.
2245   collectVariableInfoFromMMITable(MF, Processed);
2246
2247   SmallVector<const MachineInstr *, 8> DbgValues;
2248   // Collect variable information from DBG_VALUE machine instructions;
2249   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2250        I != E; ++I)
2251     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2252          II != IE; ++II) {
2253       const MachineInstr *MInsn = II;
2254       if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn))
2255         continue;
2256       DbgValues.push_back(MInsn);
2257     }
2258
2259   // This is a collection of DBV_VALUE instructions describing same variable.
2260   SmallVector<const MachineInstr *, 4> MultipleValues;
2261   for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2262         E = DbgValues.end(); I != E; ++I) {
2263     const MachineInstr *MInsn = *I;
2264     MultipleValues.clear();
2265     if (isDbgValueInDefinedReg(MInsn))
2266       MultipleValues.push_back(MInsn);
2267     DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2268     if (Processed.count(DV) != 0)
2269       continue;
2270
2271     const MachineInstr *PrevMI = MInsn;
2272     for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2273            ME = DbgValues.end(); MI != ME; ++MI) {
2274       const MDNode *Var =
2275         (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2276       if (Var == DV && isDbgValueInDefinedReg(*MI) &&
2277           !PrevMI->isIdenticalTo(*MI))
2278         MultipleValues.push_back(*MI);
2279       PrevMI = *MI;
2280     }
2281
2282     DbgScope *Scope = findDbgScope(MInsn);
2283     bool CurFnArg = false;
2284     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2285         DISubprogram(DV.getContext()).describes(MF->getFunction()))
2286       CurFnArg = true;
2287     if (!Scope && CurFnArg)
2288       Scope = CurrentFnDbgScope;
2289     // If variable scope is not found then skip this variable.
2290     if (!Scope)
2291       continue;
2292
2293     Processed.insert(DV);
2294     DbgVariable *RegVar = new DbgVariable(DV);
2295     Scope->addVariable(RegVar);
2296     if (!CurFnArg)
2297       DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn);
2298     if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2299       DbgVariableToDbgInstMap[AbsVar] = MInsn;
2300       VarToAbstractVarMap[RegVar] = AbsVar;
2301     }
2302     if (MultipleValues.size() <= 1) {
2303       DbgVariableToDbgInstMap[RegVar] = MInsn;
2304       continue;
2305     }
2306
2307     // handle multiple DBG_VALUE instructions describing one variable.
2308     if (DotDebugLocEntries.empty())
2309       RegVar->setDotDebugLocOffset(0);
2310     else
2311       RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2312     const MachineInstr *Begin = NULL;
2313     const MachineInstr *End = NULL;
2314     for (SmallVector<const MachineInstr *, 4>::iterator
2315            MVI = MultipleValues.begin(), MVE = MultipleValues.end();
2316          MVI != MVE; ++MVI) {
2317       if (!Begin) {
2318         Begin = *MVI;
2319         continue;
2320       }
2321       End = *MVI;
2322       MachineLocation MLoc;
2323       if (Begin->getNumOperands() == 3) {
2324         if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2325           MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2326       } else
2327         MLoc = Asm->getDebugValueLocation(Begin);
2328
2329       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2330       const MCSymbol *SLabel = getLabelBeforeInsn(End);
2331       if (MLoc.getReg())
2332         DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2333
2334       Begin = End;
2335       if (MVI + 1 == MVE) {
2336         // If End is the last instruction then its value is valid
2337         // until the end of the funtion.
2338         MachineLocation EMLoc;
2339         if (End->getNumOperands() == 3) {
2340           if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2341           EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2342         } else
2343           EMLoc = Asm->getDebugValueLocation(End);
2344         if (EMLoc.getReg()) 
2345           DotDebugLocEntries.
2346             push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc));
2347       }
2348     }
2349     DotDebugLocEntries.push_back(DotDebugLocEntry());
2350   }
2351
2352   // Collect info for variables that were optimized out.
2353   const Function *F = MF->getFunction();
2354   const Module *M = F->getParent();
2355   if (NamedMDNode *NMD =
2356       M->getNamedMetadata(Twine("llvm.dbg.lv.",
2357                                 getRealLinkageName(F->getName())))) {
2358     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2359       DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2360       if (!DV || !Processed.insert(DV))
2361         continue;
2362       DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2363       if (Scope)
2364         Scope->addVariable(new DbgVariable(DV));
2365     }
2366   }
2367 }
2368
2369 /// getLabelBeforeInsn - Return Label preceding the instruction.
2370 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2371   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2372     LabelsBeforeInsn.find(MI);
2373   if (I == LabelsBeforeInsn.end())
2374     // FunctionBeginSym always preceeds all the instruction in current function.
2375     return FunctionBeginSym;
2376   return I->second;
2377 }
2378
2379 /// getLabelAfterInsn - Return Label immediately following the instruction.
2380 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2381   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2382     LabelsAfterInsn.find(MI);
2383   if (I == LabelsAfterInsn.end())
2384     return NULL;
2385   return I->second;
2386 }
2387
2388 /// beginScope - Process beginning of a scope.
2389 void DwarfDebug::beginScope(const MachineInstr *MI) {
2390   if (InsnNeedsLabel.count(MI) == 0) {
2391     LabelsBeforeInsn[MI] = PrevLabel;
2392     return;
2393   }
2394
2395   // Check location.
2396   DebugLoc DL = MI->getDebugLoc();
2397   if (!DL.isUnknown()) {
2398     const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2399     PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2400     PrevInstLoc = DL;
2401     LabelsBeforeInsn[MI] = PrevLabel;
2402     return;
2403   }
2404
2405   // If location is unknown then use temp label for this DBG_VALUE
2406   // instruction.
2407   if (MI->isDebugValue()) {
2408     PrevLabel = MMI->getContext().CreateTempSymbol();
2409     Asm->OutStreamer.EmitLabel(PrevLabel);
2410     LabelsBeforeInsn[MI] = PrevLabel;
2411     return;
2412   }
2413
2414   if (UnknownLocations) {
2415     PrevLabel = recordSourceLine(0, 0, 0);
2416     LabelsBeforeInsn[MI] = PrevLabel;
2417     return;
2418   }
2419
2420   assert (0 && "Instruction is not processed!");
2421 }
2422
2423 /// endScope - Process end of a scope.
2424 void DwarfDebug::endScope(const MachineInstr *MI) {
2425   if (InsnsEndScopeSet.count(MI) != 0) {
2426     // Emit a label if this instruction ends a scope.
2427     MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2428     Asm->OutStreamer.EmitLabel(Label);
2429     LabelsAfterInsn[MI] = Label;
2430   }
2431 }
2432
2433 /// getOrCreateDbgScope - Create DbgScope for the scope.
2434 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
2435                                           const MDNode *InlinedAt) {
2436   if (!InlinedAt) {
2437     DbgScope *WScope = DbgScopeMap.lookup(Scope);
2438     if (WScope)
2439       return WScope;
2440     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2441     DbgScopeMap.insert(std::make_pair(Scope, WScope));
2442     if (DIDescriptor(Scope).isLexicalBlock()) {
2443       DbgScope *Parent =
2444         getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2445       WScope->setParent(Parent);
2446       Parent->addScope(WScope);
2447     }
2448
2449     if (!WScope->getParent()) {
2450       StringRef SPName = DISubprogram(Scope).getLinkageName();
2451       // We used to check only for a linkage name, but that fails
2452       // since we began omitting the linkage name for private
2453       // functions.  The new way is to check for the name in metadata,
2454       // but that's not supported in old .ll test cases.  Ergo, we
2455       // check both.
2456       if (SPName == Asm->MF->getFunction()->getName() ||
2457           DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2458         CurrentFnDbgScope = WScope;
2459     }
2460
2461     return WScope;
2462   }
2463
2464   getOrCreateAbstractScope(Scope);
2465   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2466   if (WScope)
2467     return WScope;
2468
2469   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2470   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2471   DILocation DL(InlinedAt);
2472   DbgScope *Parent =
2473     getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2474   WScope->setParent(Parent);
2475   Parent->addScope(WScope);
2476
2477   ConcreteScopes[InlinedAt] = WScope;
2478
2479   return WScope;
2480 }
2481
2482 /// hasValidLocation - Return true if debug location entry attached with
2483 /// machine instruction encodes valid location info.
2484 static bool hasValidLocation(LLVMContext &Ctx,
2485                              const MachineInstr *MInsn,
2486                              const MDNode *&Scope, const MDNode *&InlinedAt) {
2487   DebugLoc DL = MInsn->getDebugLoc();
2488   if (DL.isUnknown()) return false;
2489
2490   const MDNode *S = DL.getScope(Ctx);
2491
2492   // There is no need to create another DIE for compile unit. For all
2493   // other scopes, create one DbgScope now. This will be translated
2494   // into a scope DIE at the end.
2495   if (DIScope(S).isCompileUnit()) return false;
2496
2497   Scope = S;
2498   InlinedAt = DL.getInlinedAt(Ctx);
2499   return true;
2500 }
2501
2502 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2503 /// hierarchy.
2504 static void calculateDominanceGraph(DbgScope *Scope) {
2505   assert (Scope && "Unable to calculate scop edominance graph!");
2506   SmallVector<DbgScope *, 4> WorkStack;
2507   WorkStack.push_back(Scope);
2508   unsigned Counter = 0;
2509   while (!WorkStack.empty()) {
2510     DbgScope *WS = WorkStack.back();
2511     const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2512     bool visitedChildren = false;
2513     for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2514            SE = Children.end(); SI != SE; ++SI) {
2515       DbgScope *ChildScope = *SI;
2516       if (!ChildScope->getDFSOut()) {
2517         WorkStack.push_back(ChildScope);
2518         visitedChildren = true;
2519         ChildScope->setDFSIn(++Counter);
2520         break;
2521       }
2522     }
2523     if (!visitedChildren) {
2524       WorkStack.pop_back();
2525       WS->setDFSOut(++Counter);
2526     }
2527   }
2528 }
2529
2530 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2531 static
2532 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2533                        DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2534 {
2535 #ifndef NDEBUG
2536   unsigned PrevDFSIn = 0;
2537   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2538        I != E; ++I) {
2539     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2540          II != IE; ++II) {
2541       const MachineInstr *MInsn = II;
2542       const MDNode *Scope = NULL;
2543       const MDNode *InlinedAt = NULL;
2544
2545       // Check if instruction has valid location information.
2546       if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2547         dbgs() << " [ ";
2548         if (InlinedAt)
2549           dbgs() << "*";
2550         DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2551           MI2ScopeMap.find(MInsn);
2552         if (DI != MI2ScopeMap.end()) {
2553           DbgScope *S = DI->second;
2554           dbgs() << S->getDFSIn();
2555           PrevDFSIn = S->getDFSIn();
2556         } else
2557           dbgs() << PrevDFSIn;
2558       } else
2559         dbgs() << " [ x" << PrevDFSIn;
2560       dbgs() << " ]";
2561       MInsn->dump();
2562     }
2563     dbgs() << "\n";
2564   }
2565 #endif
2566 }
2567 /// extractScopeInformation - Scan machine instructions in this function
2568 /// and collect DbgScopes. Return true, if at least one scope was found.
2569 bool DwarfDebug::extractScopeInformation() {
2570   // If scope information was extracted using .dbg intrinsics then there is not
2571   // any need to extract these information by scanning each instruction.
2572   if (!DbgScopeMap.empty())
2573     return false;
2574
2575   // Scan each instruction and create scopes. First build working set of scopes.
2576   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2577   SmallVector<DbgRange, 4> MIRanges;
2578   DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2579   const MDNode *PrevScope = NULL;
2580   const MDNode *PrevInlinedAt = NULL;
2581   const MachineInstr *RangeBeginMI = NULL;
2582   const MachineInstr *PrevMI = NULL;
2583   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2584        I != E; ++I) {
2585     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2586          II != IE; ++II) {
2587       const MachineInstr *MInsn = II;
2588       const MDNode *Scope = NULL;
2589       const MDNode *InlinedAt = NULL;
2590
2591       // Check if instruction has valid location information.
2592       if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2593         PrevMI = MInsn;
2594         continue;
2595       }
2596
2597       // If scope has not changed then skip this instruction.
2598       if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2599         PrevMI = MInsn;
2600         continue;
2601       }
2602
2603       if (RangeBeginMI) {
2604         // If we have alread seen a beginning of a instruction range and
2605         // current instruction scope does not match scope of first instruction
2606         // in this range then create a new instruction range.
2607         DbgRange R(RangeBeginMI, PrevMI);
2608         MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
2609                                                         PrevInlinedAt);
2610         MIRanges.push_back(R);
2611       }
2612
2613       // This is a beginning of a new instruction range.
2614       RangeBeginMI = MInsn;
2615
2616       // Reset previous markers.
2617       PrevMI = MInsn;
2618       PrevScope = Scope;
2619       PrevInlinedAt = InlinedAt;
2620     }
2621   }
2622
2623   // Create last instruction range.
2624   if (RangeBeginMI && PrevMI && PrevScope) {
2625     DbgRange R(RangeBeginMI, PrevMI);
2626     MIRanges.push_back(R);
2627     MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2628   }
2629
2630   if (!CurrentFnDbgScope)
2631     return false;
2632
2633   calculateDominanceGraph(CurrentFnDbgScope);
2634   if (PrintDbgScope)
2635     printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2636
2637   // Find ranges of instructions covered by each DbgScope;
2638   DbgScope *PrevDbgScope = NULL;
2639   for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2640          RE = MIRanges.end(); RI != RE; ++RI) {
2641     const DbgRange &R = *RI;
2642     DbgScope *S = MI2ScopeMap.lookup(R.first);
2643     assert (S && "Lost DbgScope for a machine instruction!");
2644     if (PrevDbgScope && !PrevDbgScope->dominates(S))
2645       PrevDbgScope->closeInsnRange(S);
2646     S->openInsnRange(R.first);
2647     S->extendInsnRange(R.second);
2648     PrevDbgScope = S;
2649   }
2650
2651   if (PrevDbgScope)
2652     PrevDbgScope->closeInsnRange();
2653
2654   identifyScopeMarkers();
2655
2656   return !DbgScopeMap.empty();
2657 }
2658
2659 /// identifyScopeMarkers() -
2660 /// Each DbgScope has first instruction and last instruction to mark beginning
2661 /// and end of a scope respectively. Create an inverse map that list scopes
2662 /// starts (and ends) with an instruction. One instruction may start (or end)
2663 /// multiple scopes. Ignore scopes that are not reachable.
2664 void DwarfDebug::identifyScopeMarkers() {
2665   SmallVector<DbgScope *, 4> WorkList;
2666   WorkList.push_back(CurrentFnDbgScope);
2667   while (!WorkList.empty()) {
2668     DbgScope *S = WorkList.pop_back_val();
2669
2670     const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2671     if (!Children.empty())
2672       for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2673              SE = Children.end(); SI != SE; ++SI)
2674         WorkList.push_back(*SI);
2675
2676     if (S->isAbstractScope())
2677       continue;
2678
2679     const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2680     if (Ranges.empty())
2681       continue;
2682     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2683            RE = Ranges.end(); RI != RE; ++RI) {
2684       assert(RI->first && "DbgRange does not have first instruction!");
2685       assert(RI->second && "DbgRange does not have second instruction!");
2686       InsnsEndScopeSet.insert(RI->second);
2687     }
2688   }
2689 }
2690
2691 /// FindFirstDebugLoc - Find the first debug location in the function. This
2692 /// is intended to be an approximation for the source position of the
2693 /// beginning of the function.
2694 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2695   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2696        I != E; ++I)
2697     for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2698          MBBI != MBBE; ++MBBI) {
2699       DebugLoc DL = MBBI->getDebugLoc();
2700       if (!DL.isUnknown())
2701         return DL;
2702     }
2703   return DebugLoc();
2704 }
2705
2706 /// beginFunction - Gather pre-function debug information.  Assumes being
2707 /// emitted immediately after the function entry point.
2708 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2709   if (!MMI->hasDebugInfo()) return;
2710   if (!extractScopeInformation()) return;
2711
2712   FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2713                                         Asm->getFunctionNumber());
2714   // Assumes in correct section after the entry point.
2715   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2716
2717   // Emit label for the implicitly defined dbg.stoppoint at the start of the
2718   // function.
2719   DebugLoc FDL = FindFirstDebugLoc(MF);
2720   if (FDL.isUnknown()) return;
2721
2722   const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2723   const MDNode *TheScope = 0;
2724
2725   DISubprogram SP = getDISubprogram(Scope);
2726   unsigned Line, Col;
2727   if (SP.Verify()) {
2728     Line = SP.getLineNumber();
2729     Col = 0;
2730     TheScope = SP;
2731   } else {
2732     Line = FDL.getLine();
2733     Col = FDL.getCol();
2734     TheScope = Scope;
2735   }
2736
2737   recordSourceLine(Line, Col, TheScope);
2738
2739   /// ProcessedArgs - Collection of arguments already processed.
2740   SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2741
2742   DebugLoc PrevLoc;
2743   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2744        I != E; ++I)
2745     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2746          II != IE; ++II) {
2747       const MachineInstr *MI = II;
2748       DebugLoc DL = MI->getDebugLoc();
2749       if (MI->isDebugValue()) {
2750         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2751         DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2752         if (!DV.Verify()) continue;
2753         // If DBG_VALUE is for a local variable then it needs a label.
2754         if (DV.getTag() != dwarf::DW_TAG_arg_variable
2755             && isDbgValueInUndefinedReg(MI) == false)
2756           InsnNeedsLabel.insert(MI);
2757         // DBG_VALUE for inlined functions argument needs a label.
2758         else if (!DISubprogram(getDISubprogram(DV.getContext())).
2759                  describes(MF->getFunction()))
2760           InsnNeedsLabel.insert(MI);
2761         // DBG_VALUE indicating argument location change needs a label.
2762         else if (isDbgValueInUndefinedReg(MI) == false
2763                  && !ProcessedArgs.insert(DV))
2764           InsnNeedsLabel.insert(MI);
2765       } else {
2766         // If location is unknown then instruction needs a location only if
2767         // UnknownLocations flag is set.
2768         if (DL.isUnknown()) {
2769           if (UnknownLocations && !PrevLoc.isUnknown())
2770             InsnNeedsLabel.insert(MI);
2771         } else if (DL != PrevLoc)
2772           // Otherwise, instruction needs a location only if it is new location.
2773           InsnNeedsLabel.insert(MI);
2774       }
2775
2776       if (!DL.isUnknown() || UnknownLocations)
2777         PrevLoc = DL;
2778     }
2779
2780   PrevLabel = FunctionBeginSym;
2781 }
2782
2783 /// endFunction - Gather and emit post-function debug information.
2784 ///
2785 void DwarfDebug::endFunction(const MachineFunction *MF) {
2786   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2787
2788   if (CurrentFnDbgScope) {
2789
2790     // Define end label for subprogram.
2791     FunctionEndSym = Asm->GetTempSymbol("func_end",
2792                                         Asm->getFunctionNumber());
2793     // Assumes in correct section after the entry point.
2794     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2795
2796     SmallPtrSet<const MDNode *, 16> ProcessedVars;
2797     collectVariableInfo(MF, ProcessedVars);
2798
2799     // Get function line info.
2800     if (!Lines.empty()) {
2801       // Get section line info.
2802       unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2803       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2804       std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2805       // Append the function info to section info.
2806       SectionLineInfos.insert(SectionLineInfos.end(),
2807                               Lines.begin(), Lines.end());
2808     }
2809
2810     // Construct abstract scopes.
2811     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2812            AE = AbstractScopesList.end(); AI != AE; ++AI) {
2813       DISubprogram SP((*AI)->getScopeNode());
2814       if (SP.Verify()) {
2815         // Collect info for variables that were optimized out.
2816         StringRef FName = SP.getLinkageName();
2817         if (FName.empty())
2818           FName = SP.getName();
2819         const Module *M = MF->getFunction()->getParent();
2820         if (NamedMDNode *NMD =
2821             M->getNamedMetadata(Twine("llvm.dbg.lv.",
2822                                       getRealLinkageName(FName)))) {
2823           for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2824           DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2825           if (!DV || !ProcessedVars.insert(DV))
2826             continue;
2827           DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2828           if (Scope)
2829             Scope->addVariable(new DbgVariable(DV));
2830           }
2831         }
2832       }
2833       if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2834         constructScopeDIE(*AI);
2835     }
2836
2837     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2838
2839     if (!DisableFramePointerElim(*MF))
2840       addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2841               dwarf::DW_FORM_flag, 1);
2842
2843
2844     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2845                                                  MMI->getFrameMoves()));
2846   }
2847
2848   // Clear debug info
2849   CurrentFnDbgScope = NULL;
2850   InsnNeedsLabel.clear();
2851   DbgVariableToFrameIndexMap.clear();
2852   VarToAbstractVarMap.clear();
2853   DbgVariableToDbgInstMap.clear();
2854   DbgVariableLabelsMap.clear();
2855   DeleteContainerSeconds(DbgScopeMap);
2856   InsnsEndScopeSet.clear();
2857   ConcreteScopes.clear();
2858   DeleteContainerSeconds(AbstractScopes);
2859   AbstractScopesList.clear();
2860   AbstractVariables.clear();
2861   LabelsBeforeInsn.clear();
2862   LabelsAfterInsn.clear();
2863   Lines.clear();
2864   PrevLabel = NULL;
2865 }
2866
2867 /// recordVariableFrameIndex - Record a variable's index.
2868 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2869   assert (V && "Invalid DbgVariable!");
2870   DbgVariableToFrameIndexMap[V] = Index;
2871 }
2872
2873 /// findVariableFrameIndex - Return true if frame index for the variable
2874 /// is found. Update FI to hold value of the index.
2875 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2876   assert (V && "Invalid DbgVariable!");
2877   DenseMap<const DbgVariable *, int>::iterator I =
2878     DbgVariableToFrameIndexMap.find(V);
2879   if (I == DbgVariableToFrameIndexMap.end())
2880     return false;
2881   *FI = I->second;
2882   return true;
2883 }
2884
2885 /// findVariableLabel - Find MCSymbol for the variable.
2886 const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2887   DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2888     = DbgVariableLabelsMap.find(V);
2889   if (I == DbgVariableLabelsMap.end())
2890     return NULL;
2891   else return I->second;
2892 }
2893
2894 /// findDbgScope - Find DbgScope for the debug loc attached with an
2895 /// instruction.
2896 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2897   DbgScope *Scope = NULL;
2898   LLVMContext &Ctx =
2899     MInsn->getParent()->getParent()->getFunction()->getContext();
2900   DebugLoc DL = MInsn->getDebugLoc();
2901
2902   if (DL.isUnknown())
2903     return Scope;
2904
2905   if (const MDNode *IA = DL.getInlinedAt(Ctx))
2906     Scope = ConcreteScopes.lookup(IA);
2907   if (Scope == 0)
2908     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2909
2910   return Scope;
2911 }
2912
2913
2914 /// recordSourceLine - Register a source line with debug info. Returns the
2915 /// unique label that was emitted and which provides correspondence to
2916 /// the source line list.
2917 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2918                                        const MDNode *S) {
2919   StringRef Dir;
2920   StringRef Fn;
2921
2922   unsigned Src = 1;
2923   if (S) {
2924     DIDescriptor Scope(S);
2925
2926     if (Scope.isCompileUnit()) {
2927       DICompileUnit CU(S);
2928       Dir = CU.getDirectory();
2929       Fn = CU.getFilename();
2930     } else if (Scope.isSubprogram()) {
2931       DISubprogram SP(S);
2932       Dir = SP.getDirectory();
2933       Fn = SP.getFilename();
2934     } else if (Scope.isLexicalBlock()) {
2935       DILexicalBlock DB(S);
2936       Dir = DB.getDirectory();
2937       Fn = DB.getFilename();
2938     } else
2939       assert(0 && "Unexpected scope info");
2940
2941     Src = GetOrCreateSourceID(Dir, Fn);
2942   }
2943
2944   MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2945   Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2946
2947   Asm->OutStreamer.EmitLabel(Label);
2948   return Label;
2949 }
2950
2951 //===----------------------------------------------------------------------===//
2952 // Emit Methods
2953 //===----------------------------------------------------------------------===//
2954
2955 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2956 ///
2957 unsigned
2958 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2959   // Get the children.
2960   const std::vector<DIE *> &Children = Die->getChildren();
2961
2962   // If not last sibling and has children then add sibling offset attribute.
2963   if (!Last && !Children.empty())
2964     Die->addSiblingOffset(DIEValueAllocator);
2965
2966   // Record the abbreviation.
2967   assignAbbrevNumber(Die->getAbbrev());
2968
2969   // Get the abbreviation for this DIE.
2970   unsigned AbbrevNumber = Die->getAbbrevNumber();
2971   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2972
2973   // Set DIE offset
2974   Die->setOffset(Offset);
2975
2976   // Start the size with the size of abbreviation code.
2977   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2978
2979   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2980   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2981
2982   // Size the DIE attribute values.
2983   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2984     // Size attribute value.
2985     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2986
2987   // Size the DIE children if any.
2988   if (!Children.empty()) {
2989     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2990            "Children flag not set");
2991
2992     for (unsigned j = 0, M = Children.size(); j < M; ++j)
2993       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2994
2995     // End of children marker.
2996     Offset += sizeof(int8_t);
2997   }
2998
2999   Die->setSize(Offset - Die->getOffset());
3000   return Offset;
3001 }
3002
3003 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
3004 ///
3005 void DwarfDebug::computeSizeAndOffsets() {
3006   unsigned PrevOffset = 0;
3007   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3008          E = CUMap.end(); I != E; ++I) {
3009     // Compute size of compile unit header.
3010     static unsigned Offset = PrevOffset +
3011       sizeof(int32_t) + // Length of Compilation Unit Info
3012       sizeof(int16_t) + // DWARF version number
3013       sizeof(int32_t) + // Offset Into Abbrev. Section
3014       sizeof(int8_t);   // Pointer Size (in bytes)
3015     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3016     PrevOffset = Offset;
3017   }
3018 }
3019
3020 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3021 /// temporary label to it if SymbolStem is specified.
3022 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
3023                                 const char *SymbolStem = 0) {
3024   Asm->OutStreamer.SwitchSection(Section);
3025   if (!SymbolStem) return 0;
3026
3027   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3028   Asm->OutStreamer.EmitLabel(TmpSym);
3029   return TmpSym;
3030 }
3031
3032 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
3033 /// the start of each one.
3034 void DwarfDebug::EmitSectionLabels() {
3035   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
3036
3037   // Dwarf sections base addresses.
3038   if (Asm->MAI->doesDwarfRequireFrameSection()) {
3039     DwarfFrameSectionSym =
3040       EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3041    }
3042
3043   DwarfInfoSectionSym =
3044     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3045   DwarfAbbrevSectionSym =
3046     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3047   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3048
3049   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3050     EmitSectionSym(Asm, MacroInfo);
3051
3052   DwarfDebugLineSectionSym =
3053     EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3054   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3055   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3056   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3057   DwarfStrSectionSym =
3058     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3059   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3060                                              "debug_range");
3061
3062   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3063                                            "section_debug_loc");
3064
3065   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3066   EmitSectionSym(Asm, TLOF.getDataSection());
3067 }
3068
3069 /// emitDIE - Recusively Emits a debug information entry.
3070 ///
3071 void DwarfDebug::emitDIE(DIE *Die) {
3072   // Get the abbreviation for this DIE.
3073   unsigned AbbrevNumber = Die->getAbbrevNumber();
3074   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3075
3076   // Emit the code (index) for the abbreviation.
3077   if (Asm->isVerbose())
3078     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3079                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
3080                                 Twine::utohexstr(Die->getSize()) + " " +
3081                                 dwarf::TagString(Abbrev->getTag()));
3082   Asm->EmitULEB128(AbbrevNumber);
3083
3084   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3085   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3086
3087   // Emit the DIE attribute values.
3088   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3089     unsigned Attr = AbbrevData[i].getAttribute();
3090     unsigned Form = AbbrevData[i].getForm();
3091     assert(Form && "Too many attributes for DIE (check abbreviation)");
3092
3093     if (Asm->isVerbose())
3094       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3095
3096     switch (Attr) {
3097     case dwarf::DW_AT_sibling:
3098       Asm->EmitInt32(Die->getSiblingOffset());
3099       break;
3100     case dwarf::DW_AT_abstract_origin: {
3101       DIEEntry *E = cast<DIEEntry>(Values[i]);
3102       DIE *Origin = E->getEntry();
3103       unsigned Addr = Origin->getOffset();
3104       Asm->EmitInt32(Addr);
3105       break;
3106     }
3107     case dwarf::DW_AT_ranges: {
3108       // DW_AT_range Value encodes offset in debug_range section.
3109       DIEInteger *V = cast<DIEInteger>(Values[i]);
3110       Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3111                                      V->getValue(),
3112                                      DwarfDebugRangeSectionSym,
3113                                      4);
3114       break;
3115     }
3116     case dwarf::DW_AT_stmt_list: {
3117       Asm->EmitLabelDifference(CurrentLineSectionSym,
3118                                DwarfDebugLineSectionSym, 4);
3119       break;
3120     }
3121     case dwarf::DW_AT_location: {
3122       if (UseDotDebugLocEntry.count(Die) != 0) {
3123         DIELabel *L = cast<DIELabel>(Values[i]);
3124         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3125       } else
3126         Values[i]->EmitValue(Asm, Form);
3127       break;
3128     }
3129     default:
3130       // Emit an attribute using the defined form.
3131       Values[i]->EmitValue(Asm, Form);
3132       break;
3133     }
3134   }
3135
3136   // Emit the DIE children if any.
3137   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3138     const std::vector<DIE *> &Children = Die->getChildren();
3139
3140     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3141       emitDIE(Children[j]);
3142
3143     if (Asm->isVerbose())
3144       Asm->OutStreamer.AddComment("End Of Children Mark");
3145     Asm->EmitInt8(0);
3146   }
3147 }
3148
3149 /// emitDebugInfo - Emit the debug info section.
3150 ///
3151 void DwarfDebug::emitDebugInfo() {
3152   // Start debug info section.
3153   Asm->OutStreamer.SwitchSection(
3154                             Asm->getObjFileLowering().getDwarfInfoSection());
3155   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3156          E = CUMap.end(); I != E; ++I) {
3157     CompileUnit *TheCU = I->second;
3158     DIE *Die = TheCU->getCUDie();
3159
3160     // Emit the compile units header.
3161     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3162                                                   TheCU->getID()));
3163
3164     // Emit size of content not including length itself
3165     unsigned ContentSize = Die->getSize() +
3166       sizeof(int16_t) + // DWARF version number
3167       sizeof(int32_t) + // Offset Into Abbrev. Section
3168       sizeof(int8_t) +  // Pointer Size (in bytes)
3169       sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3170
3171     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3172     Asm->EmitInt32(ContentSize);
3173     Asm->OutStreamer.AddComment("DWARF version number");
3174     Asm->EmitInt16(dwarf::DWARF_VERSION);
3175     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3176     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3177                            DwarfAbbrevSectionSym);
3178     Asm->OutStreamer.AddComment("Address Size (in bytes)");
3179     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3180
3181     emitDIE(Die);
3182     // FIXME - extra padding for gdb bug.
3183     Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3184     Asm->EmitInt8(0);
3185     Asm->EmitInt8(0);
3186     Asm->EmitInt8(0);
3187     Asm->EmitInt8(0);
3188     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3189   }
3190 }
3191
3192 /// emitAbbreviations - Emit the abbreviation section.
3193 ///
3194 void DwarfDebug::emitAbbreviations() const {
3195   // Check to see if it is worth the effort.
3196   if (!Abbreviations.empty()) {
3197     // Start the debug abbrev section.
3198     Asm->OutStreamer.SwitchSection(
3199                             Asm->getObjFileLowering().getDwarfAbbrevSection());
3200
3201     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3202
3203     // For each abbrevation.
3204     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3205       // Get abbreviation data
3206       const DIEAbbrev *Abbrev = Abbreviations[i];
3207
3208       // Emit the abbrevations code (base 1 index.)
3209       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3210
3211       // Emit the abbreviations data.
3212       Abbrev->Emit(Asm);
3213     }
3214
3215     // Mark end of abbreviations.
3216     Asm->EmitULEB128(0, "EOM(3)");
3217
3218     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3219   }
3220 }
3221
3222 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3223 /// the line matrix.
3224 ///
3225 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3226   // Define last address of section.
3227   Asm->OutStreamer.AddComment("Extended Op");
3228   Asm->EmitInt8(0);
3229
3230   Asm->OutStreamer.AddComment("Op size");
3231   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3232   Asm->OutStreamer.AddComment("DW_LNE_set_address");
3233   Asm->EmitInt8(dwarf::DW_LNE_set_address);
3234
3235   Asm->OutStreamer.AddComment("Section end label");
3236
3237   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3238                                    Asm->getTargetData().getPointerSize(),
3239                                    0/*AddrSpace*/);
3240
3241   // Mark end of matrix.
3242   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3243   Asm->EmitInt8(0);
3244   Asm->EmitInt8(1);
3245   Asm->EmitInt8(1);
3246 }
3247
3248 /// emitDebugLines - Emit source line information.
3249 ///
3250 void DwarfDebug::emitDebugLines() {
3251   // If the target is using .loc/.file, the assembler will be emitting the
3252   // .debug_line table automatically.
3253   if (Asm->MAI->hasDotLocAndDotFile())
3254     return;
3255
3256   // Minimum line delta, thus ranging from -10..(255-10).
3257   const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3258   // Maximum line delta, thus ranging from -10..(255-10).
3259   const int MaxLineDelta = 255 + MinLineDelta;
3260
3261   // Start the dwarf line section.
3262   Asm->OutStreamer.SwitchSection(
3263                             Asm->getObjFileLowering().getDwarfLineSection());
3264
3265   // Construct the section header.
3266   CurrentLineSectionSym = Asm->GetTempSymbol("section_line_begin");
3267   Asm->OutStreamer.EmitLabel(CurrentLineSectionSym);
3268   Asm->OutStreamer.AddComment("Length of Source Line Info");
3269   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3270                            Asm->GetTempSymbol("line_begin"), 4);
3271   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3272
3273   Asm->OutStreamer.AddComment("DWARF version number");
3274   Asm->EmitInt16(dwarf::DWARF_VERSION);
3275
3276   Asm->OutStreamer.AddComment("Prolog Length");
3277   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3278                            Asm->GetTempSymbol("line_prolog_begin"), 4);
3279   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3280
3281   Asm->OutStreamer.AddComment("Minimum Instruction Length");
3282   Asm->EmitInt8(1);
3283   Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3284   Asm->EmitInt8(1);
3285   Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3286   Asm->EmitInt8(MinLineDelta);
3287   Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3288   Asm->EmitInt8(MaxLineDelta);
3289   Asm->OutStreamer.AddComment("Special Opcode Base");
3290   Asm->EmitInt8(-MinLineDelta);
3291
3292   // Line number standard opcode encodings argument count
3293   Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3294   Asm->EmitInt8(0);
3295   Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3296   Asm->EmitInt8(1);
3297   Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3298   Asm->EmitInt8(1);
3299   Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3300   Asm->EmitInt8(1);
3301   Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3302   Asm->EmitInt8(1);
3303   Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3304   Asm->EmitInt8(0);
3305   Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3306   Asm->EmitInt8(0);
3307   Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3308   Asm->EmitInt8(0);
3309   Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3310   Asm->EmitInt8(1);
3311
3312   // Emit directories.
3313   for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3314     const std::string &Dir = getSourceDirectoryName(DI);
3315     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3316     Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3317   }
3318
3319   Asm->OutStreamer.AddComment("End of directories");
3320   Asm->EmitInt8(0);
3321
3322   // Emit files.
3323   for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3324     // Remember source id starts at 1.
3325     std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3326     const std::string &FN = getSourceFileName(Id.second);
3327     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3328     Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3329
3330     Asm->EmitULEB128(Id.first, "Directory #");
3331     Asm->EmitULEB128(0, "Mod date");
3332     Asm->EmitULEB128(0, "File size");
3333   }
3334
3335   Asm->OutStreamer.AddComment("End of files");
3336   Asm->EmitInt8(0);
3337
3338   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3339
3340   // A sequence for each text section.
3341   unsigned SecSrcLinesSize = SectionSourceLines.size();
3342
3343   for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3344     // Isolate current sections line info.
3345     const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3346
3347     // Dwarf assumes we start with first line of first source file.
3348     unsigned Source = 1;
3349     unsigned Line = 1;
3350
3351     // Construct rows of the address, source, line, column matrix.
3352     for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3353       const SrcLineInfo &LineInfo = LineInfos[i];
3354       MCSymbol *Label = LineInfo.getLabel();
3355       if (!Label->isDefined()) continue; // Not emitted, in dead code.
3356
3357       if (Asm->isVerbose()) {
3358         std::pair<unsigned, unsigned> SrcID =
3359           getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3360         Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3361                                     "/" +
3362                                     Twine(getSourceFileName(SrcID.second)) +
3363                                     ":" + Twine(LineInfo.getLine()));
3364       }
3365
3366       // Define the line address.
3367       Asm->OutStreamer.AddComment("Extended Op");
3368       Asm->EmitInt8(0);
3369       Asm->OutStreamer.AddComment("Op size");
3370       Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3371
3372       Asm->OutStreamer.AddComment("DW_LNE_set_address");
3373       Asm->EmitInt8(dwarf::DW_LNE_set_address);
3374
3375       Asm->OutStreamer.AddComment("Location label");
3376       Asm->OutStreamer.EmitSymbolValue(Label,
3377                                        Asm->getTargetData().getPointerSize(),
3378                                        0/*AddrSpace*/);
3379
3380       // If change of source, then switch to the new source.
3381       if (Source != LineInfo.getSourceID()) {
3382         Source = LineInfo.getSourceID();
3383         Asm->OutStreamer.AddComment("DW_LNS_set_file");
3384         Asm->EmitInt8(dwarf::DW_LNS_set_file);
3385         Asm->EmitULEB128(Source, "New Source");
3386       }
3387
3388       // If change of line.
3389       if (Line != LineInfo.getLine()) {
3390         // Determine offset.
3391         int Offset = LineInfo.getLine() - Line;
3392         int Delta = Offset - MinLineDelta;
3393
3394         // Update line.
3395         Line = LineInfo.getLine();
3396
3397         // If delta is small enough and in range...
3398         if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3399           // ... then use fast opcode.
3400           Asm->OutStreamer.AddComment("Line Delta");
3401           Asm->EmitInt8(Delta - MinLineDelta);
3402         } else {
3403           // ... otherwise use long hand.
3404           Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3405           Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3406           Asm->EmitSLEB128(Offset, "Line Offset");
3407           Asm->OutStreamer.AddComment("DW_LNS_copy");
3408           Asm->EmitInt8(dwarf::DW_LNS_copy);
3409         }
3410       } else {
3411         // Copy the previous row (different address or source)
3412         Asm->OutStreamer.AddComment("DW_LNS_copy");
3413         Asm->EmitInt8(dwarf::DW_LNS_copy);
3414       }
3415     }
3416
3417     emitEndOfLineMatrix(j + 1);
3418   }
3419
3420   if (SecSrcLinesSize == 0)
3421     // Because we're emitting a debug_line section, we still need a line
3422     // table. The linker and friends expect it to exist. If there's nothing to
3423     // put into it, emit an empty table.
3424     emitEndOfLineMatrix(1);
3425
3426   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3427 }
3428
3429 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3430 ///
3431 void DwarfDebug::emitCommonDebugFrame() {
3432   if (!Asm->MAI->doesDwarfRequireFrameSection())
3433     return;
3434
3435   int stackGrowth = Asm->getTargetData().getPointerSize();
3436   if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3437       TargetFrameInfo::StackGrowsDown)
3438     stackGrowth *= -1;
3439
3440   // Start the dwarf frame section.
3441   Asm->OutStreamer.SwitchSection(
3442                               Asm->getObjFileLowering().getDwarfFrameSection());
3443
3444   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3445   Asm->OutStreamer.AddComment("Length of Common Information Entry");
3446   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3447                            Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3448
3449   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3450   Asm->OutStreamer.AddComment("CIE Identifier Tag");
3451   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3452   Asm->OutStreamer.AddComment("CIE Version");
3453   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3454   Asm->OutStreamer.AddComment("CIE Augmentation");
3455   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3456   Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3457   Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3458   Asm->OutStreamer.AddComment("CIE RA Column");
3459   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3460   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3461
3462   std::vector<MachineMove> Moves;
3463   RI->getInitialFrameState(Moves);
3464
3465   Asm->EmitFrameMoves(Moves, 0, false);
3466
3467   Asm->EmitAlignment(2);
3468   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3469 }
3470
3471 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3472 /// section.
3473 void DwarfDebug::
3474 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3475   if (!Asm->MAI->doesDwarfRequireFrameSection())
3476     return;
3477
3478   // Start the dwarf frame section.
3479   Asm->OutStreamer.SwitchSection(
3480                               Asm->getObjFileLowering().getDwarfFrameSection());
3481
3482   Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3483   MCSymbol *DebugFrameBegin =
3484     Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3485   MCSymbol *DebugFrameEnd =
3486     Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3487   Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3488
3489   Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3490
3491   Asm->OutStreamer.AddComment("FDE CIE offset");
3492   Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3493                          DwarfFrameSectionSym);
3494
3495   Asm->OutStreamer.AddComment("FDE initial location");
3496   MCSymbol *FuncBeginSym =
3497     Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3498   Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3499                                    Asm->getTargetData().getPointerSize(),
3500                                    0/*AddrSpace*/);
3501
3502
3503   Asm->OutStreamer.AddComment("FDE address range");
3504   Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3505                            FuncBeginSym, Asm->getTargetData().getPointerSize());
3506
3507   Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3508
3509   Asm->EmitAlignment(2);
3510   Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3511 }
3512
3513 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3514 ///
3515 void DwarfDebug::emitDebugPubNames() {
3516   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3517          E = CUMap.end(); I != E; ++I) {
3518     CompileUnit *TheCU = I->second;
3519     // Start the dwarf pubnames section.
3520     Asm->OutStreamer.SwitchSection(
3521       Asm->getObjFileLowering().getDwarfPubNamesSection());
3522
3523     Asm->OutStreamer.AddComment("Length of Public Names Info");
3524     Asm->EmitLabelDifference(
3525       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3526       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3527
3528     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3529                                                   TheCU->getID()));
3530
3531     Asm->OutStreamer.AddComment("DWARF Version");
3532     Asm->EmitInt16(dwarf::DWARF_VERSION);
3533
3534     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3535     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3536                            DwarfInfoSectionSym);
3537
3538     Asm->OutStreamer.AddComment("Compilation Unit Length");
3539     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3540                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3541                              4);
3542
3543     const StringMap<DIE*> &Globals = TheCU->getGlobals();
3544     for (StringMap<DIE*>::const_iterator
3545            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3546       const char *Name = GI->getKeyData();
3547       DIE *Entity = GI->second;
3548
3549       Asm->OutStreamer.AddComment("DIE offset");
3550       Asm->EmitInt32(Entity->getOffset());
3551
3552       if (Asm->isVerbose())
3553         Asm->OutStreamer.AddComment("External Name");
3554       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3555     }
3556
3557     Asm->OutStreamer.AddComment("End Mark");
3558     Asm->EmitInt32(0);
3559     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3560                                                 TheCU->getID()));
3561   }
3562 }
3563
3564 void DwarfDebug::emitDebugPubTypes() {
3565   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3566          E = CUMap.end(); I != E; ++I) {
3567     CompileUnit *TheCU = I->second;
3568     // Start the dwarf pubnames section.
3569     Asm->OutStreamer.SwitchSection(
3570       Asm->getObjFileLowering().getDwarfPubTypesSection());
3571     Asm->OutStreamer.AddComment("Length of Public Types Info");
3572     Asm->EmitLabelDifference(
3573       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3574       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3575
3576     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3577                                                   TheCU->getID()));
3578
3579     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3580     Asm->EmitInt16(dwarf::DWARF_VERSION);
3581
3582     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3583     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3584                            DwarfInfoSectionSym);
3585
3586     Asm->OutStreamer.AddComment("Compilation Unit Length");
3587     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3588                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3589                              4);
3590
3591     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3592     for (StringMap<DIE*>::const_iterator
3593            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3594       const char *Name = GI->getKeyData();
3595       DIE * Entity = GI->second;
3596
3597       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3598       Asm->EmitInt32(Entity->getOffset());
3599
3600       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3601       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3602     }
3603
3604     Asm->OutStreamer.AddComment("End Mark");
3605     Asm->EmitInt32(0);
3606     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3607                                                   TheCU->getID()));
3608   }
3609 }
3610
3611 /// emitDebugStr - Emit visible names into a debug str section.
3612 ///
3613 void DwarfDebug::emitDebugStr() {
3614   // Check to see if it is worth the effort.
3615   if (StringPool.empty()) return;
3616
3617   // Start the dwarf str section.
3618   Asm->OutStreamer.SwitchSection(
3619                                 Asm->getObjFileLowering().getDwarfStrSection());
3620
3621   // Get all of the string pool entries and put them in an array by their ID so
3622   // we can sort them.
3623   SmallVector<std::pair<unsigned,
3624       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3625
3626   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3627        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3628     Entries.push_back(std::make_pair(I->second.second, &*I));
3629
3630   array_pod_sort(Entries.begin(), Entries.end());
3631
3632   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3633     // Emit a label for reference from debug information entries.
3634     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3635
3636     // Emit the string itself.
3637     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3638   }
3639 }
3640
3641 /// emitDebugLoc - Emit visible names into a debug loc section.
3642 ///
3643 void DwarfDebug::emitDebugLoc() {
3644   if (DotDebugLocEntries.empty())
3645     return;
3646
3647   // Start the dwarf loc section.
3648   Asm->OutStreamer.SwitchSection(
3649     Asm->getObjFileLowering().getDwarfLocSection());
3650   unsigned char Size = Asm->getTargetData().getPointerSize();
3651   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3652   unsigned index = 1;
3653   for (SmallVector<DotDebugLocEntry, 4>::iterator
3654          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3655        I != E; ++I, ++index) {
3656     DotDebugLocEntry Entry = *I;
3657     if (Entry.isEmpty()) {
3658       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3659       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3660       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3661     } else {
3662       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3663       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3664       const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3665       unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3666       if (int Offset =  Entry.Loc.getOffset()) {
3667         // If the value is at a certain offset from frame register then
3668         // use DW_OP_fbreg.
3669         unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
3670         Asm->OutStreamer.AddComment("Loc expr size");
3671         Asm->EmitInt16(1 + OffsetSize);
3672         Asm->OutStreamer.AddComment(
3673           dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3674         Asm->EmitInt8(dwarf::DW_OP_fbreg);
3675         Asm->OutStreamer.AddComment("Offset");
3676         Asm->EmitSLEB128(Offset);
3677       } else {
3678         if (Reg < 32) {
3679           Asm->OutStreamer.AddComment("Loc expr size");
3680           Asm->EmitInt16(1);
3681           Asm->OutStreamer.AddComment(
3682             dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
3683           Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3684         } else {
3685           Asm->OutStreamer.AddComment("Loc expr size");
3686           Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3687           Asm->EmitInt8(dwarf::DW_OP_regx);
3688           Asm->EmitULEB128(Reg);
3689         }
3690       }
3691     }
3692   }
3693 }
3694
3695 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3696 ///
3697 void DwarfDebug::EmitDebugARanges() {
3698   // Start the dwarf aranges section.
3699   Asm->OutStreamer.SwitchSection(
3700                           Asm->getObjFileLowering().getDwarfARangesSection());
3701 }
3702
3703 /// emitDebugRanges - Emit visible names into a debug ranges section.
3704 ///
3705 void DwarfDebug::emitDebugRanges() {
3706   // Start the dwarf ranges section.
3707   Asm->OutStreamer.SwitchSection(
3708     Asm->getObjFileLowering().getDwarfRangesSection());
3709   unsigned char Size = Asm->getTargetData().getPointerSize();
3710   for (SmallVector<const MCSymbol *, 8>::iterator
3711          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3712        I != E; ++I) {
3713     if (*I)
3714       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3715     else
3716       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3717   }
3718 }
3719
3720 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3721 ///
3722 void DwarfDebug::emitDebugMacInfo() {
3723   if (const MCSection *LineInfo =
3724       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3725     // Start the dwarf macinfo section.
3726     Asm->OutStreamer.SwitchSection(LineInfo);
3727   }
3728 }
3729
3730 /// emitDebugInlineInfo - Emit inline info using following format.
3731 /// Section Header:
3732 /// 1. length of section
3733 /// 2. Dwarf version number
3734 /// 3. address size.
3735 ///
3736 /// Entries (one "entry" for each function that was inlined):
3737 ///
3738 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3739 ///   otherwise offset into __debug_str for regular function name.
3740 /// 2. offset into __debug_str section for regular function name.
3741 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3742 /// instances for the function.
3743 ///
3744 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3745 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3746 /// __debug_info section, and the low_pc is the starting address for the
3747 /// inlining instance.
3748 void DwarfDebug::emitDebugInlineInfo() {
3749   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3750     return;
3751
3752   if (!FirstCU)
3753     return;
3754
3755   Asm->OutStreamer.SwitchSection(
3756                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
3757
3758   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3759   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3760                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3761
3762   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3763
3764   Asm->OutStreamer.AddComment("Dwarf Version");
3765   Asm->EmitInt16(dwarf::DWARF_VERSION);
3766   Asm->OutStreamer.AddComment("Address Size (in bytes)");
3767   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3768
3769   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3770          E = InlinedSPNodes.end(); I != E; ++I) {
3771
3772     const MDNode *Node = *I;
3773     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3774       = InlineInfo.find(Node);
3775     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3776     DISubprogram SP(Node);
3777     StringRef LName = SP.getLinkageName();
3778     StringRef Name = SP.getName();
3779
3780     Asm->OutStreamer.AddComment("MIPS linkage name");
3781     if (LName.empty()) {
3782       Asm->OutStreamer.EmitBytes(Name, 0);
3783       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3784     } else
3785       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3786                              DwarfStrSectionSym);
3787
3788     Asm->OutStreamer.AddComment("Function name");
3789     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3790     Asm->EmitULEB128(Labels.size(), "Inline count");
3791
3792     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3793            LE = Labels.end(); LI != LE; ++LI) {
3794       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3795       Asm->EmitInt32(LI->second->getOffset());
3796
3797       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3798       Asm->OutStreamer.EmitSymbolValue(LI->first,
3799                                        Asm->getTargetData().getPointerSize(),0);
3800     }
3801   }
3802
3803   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3804 }