Handle TAG_constant for integers.
[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, 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, 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, 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, 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, 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 /// createMemberDIE - Create new member DIE.
1190 DIE *DwarfDebug::createMemberDIE(DIDerivedType DT) {
1191   DIE *MemberDie = new DIE(DT.getTag());
1192   StringRef Name = DT.getName();
1193   if (!Name.empty())
1194     addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1195
1196   addType(MemberDie, DT.getTypeDerivedFrom());
1197
1198   addSourceLine(MemberDie, DT);
1199
1200   DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1201   addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1202
1203   uint64_t Size = DT.getSizeInBits();
1204   uint64_t FieldSize = DT.getOriginalTypeSize();
1205
1206   if (Size != FieldSize) {
1207     // Handle bitfield.
1208     addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1209     addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1210
1211     uint64_t Offset = DT.getOffsetInBits();
1212     uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1213     uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1214     uint64_t FieldOffset = (HiMark - FieldSize);
1215     Offset -= FieldOffset;
1216
1217     // Maybe we need to work from the other end.
1218     if (Asm->getTargetData().isLittleEndian())
1219       Offset = FieldSize - (Offset + Size);
1220     addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1221
1222     // Here WD_AT_data_member_location points to the anonymous
1223     // field that includes this bit field.
1224     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1225
1226   } else
1227     // This is not a bitfield.
1228     addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1229
1230   if (DT.getTag() == dwarf::DW_TAG_inheritance
1231       && DT.isVirtual()) {
1232
1233     // For C++, virtual base classes are not at fixed offset. Use following
1234     // expression to extract appropriate offset from vtable.
1235     // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1236
1237     DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1238     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1239     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1240     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1241     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1242     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1243     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1244     addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1245
1246     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1247              VBaseLocationDie);
1248   } else
1249     addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1250
1251   if (DT.isProtected())
1252     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1253             dwarf::DW_ACCESS_protected);
1254   else if (DT.isPrivate())
1255     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1256             dwarf::DW_ACCESS_private);
1257   else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1258     addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1259             dwarf::DW_ACCESS_public);
1260   if (DT.isVirtual())
1261     addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1262             dwarf::DW_VIRTUALITY_virtual);
1263   return MemberDie;
1264 }
1265
1266 /// createSubprogramDIE - Create new DIE using SP.
1267 DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP, bool MakeDecl) {
1268   CompileUnit *SPCU = getCompileUnit(SP);
1269   DIE *SPDie = SPCU->getDIE(SP);
1270   if (SPDie)
1271     return SPDie;
1272
1273   SPDie = new DIE(dwarf::DW_TAG_subprogram);
1274   // Constructors and operators for anonymous aggregates do not have names.
1275   if (!SP.getName().empty())
1276     addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1277
1278   StringRef LinkageName = SP.getLinkageName();
1279   if (!LinkageName.empty())
1280     addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1281               getRealLinkageName(LinkageName));
1282
1283   addSourceLine(SPDie, SP);
1284
1285   // Add prototyped tag, if C or ObjC.
1286   unsigned Lang = SP.getCompileUnit().getLanguage();
1287   if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1288       Lang == dwarf::DW_LANG_ObjC)
1289     addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1290
1291   // Add Return Type.
1292   DICompositeType SPTy = SP.getType();
1293   DIArray Args = SPTy.getTypeArray();
1294   unsigned SPTag = SPTy.getTag();
1295
1296   if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1297     addType(SPDie, SPTy);
1298   else
1299     addType(SPDie, DIType(Args.getElement(0)));
1300
1301   unsigned VK = SP.getVirtuality();
1302   if (VK) {
1303     addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1304     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1305     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1306     addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1307     addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1308     ContainingTypeMap.insert(std::make_pair(SPDie,
1309                                             SP.getContainingType()));
1310   }
1311
1312   if (MakeDecl || !SP.isDefinition()) {
1313     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1314
1315     // Add arguments. Do not add arguments for subprogram definition. They will
1316     // be handled while processing variables.
1317     DICompositeType SPTy = SP.getType();
1318     DIArray Args = SPTy.getTypeArray();
1319     unsigned SPTag = SPTy.getTag();
1320
1321     if (SPTag == dwarf::DW_TAG_subroutine_type)
1322       for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1323         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1324         DIType ATy = DIType(DIType(Args.getElement(i)));
1325         addType(Arg, ATy);
1326         if (ATy.isArtificial())
1327           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1328         SPDie->addChild(Arg);
1329       }
1330   }
1331
1332   if (SP.isArtificial())
1333     addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1334
1335   if (!SP.isLocalToUnit())
1336     addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1337
1338   if (SP.isOptimized())
1339     addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1340
1341   if (unsigned isa = Asm->getISAEncoding()) {
1342     addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
1343   }
1344
1345   // DW_TAG_inlined_subroutine may refer to this DIE.
1346   SPCU->insertDIE(SP, SPDie);
1347
1348   // Add to context owner.
1349   addToContextOwner(SPDie, SP.getContext());
1350
1351   return SPDie;
1352 }
1353
1354 DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1355   assert(N && "Invalid Scope encoding!");
1356
1357   DbgScope *AScope = AbstractScopes.lookup(N);
1358   if (AScope)
1359     return AScope;
1360
1361   DbgScope *Parent = NULL;
1362
1363   DIDescriptor Scope(N);
1364   if (Scope.isLexicalBlock()) {
1365     DILexicalBlock DB(N);
1366     DIDescriptor ParentDesc = DB.getContext();
1367     Parent = getOrCreateAbstractScope(ParentDesc);
1368   }
1369
1370   AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1371
1372   if (Parent)
1373     Parent->addScope(AScope);
1374   AScope->setAbstractScope();
1375   AbstractScopes[N] = AScope;
1376   if (DIDescriptor(N).isSubprogram())
1377     AbstractScopesList.push_back(AScope);
1378   return AScope;
1379 }
1380
1381 /// isSubprogramContext - Return true if Context is either a subprogram
1382 /// or another context nested inside a subprogram.
1383 static bool isSubprogramContext(const MDNode *Context) {
1384   if (!Context)
1385     return false;
1386   DIDescriptor D(Context);
1387   if (D.isSubprogram())
1388     return true;
1389   if (D.isType())
1390     return isSubprogramContext(DIType(Context).getContext());
1391   return false;
1392 }
1393
1394 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1395 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1396 /// If there are global variables in this scope then create and insert
1397 /// DIEs for these variables.
1398 DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1399   CompileUnit *SPCU = getCompileUnit(SPNode);
1400   DIE *SPDie = SPCU->getDIE(SPNode);
1401
1402   assert(SPDie && "Unable to find subprogram DIE!");
1403   DISubprogram SP(SPNode);
1404
1405   // There is not any need to generate specification DIE for a function
1406   // defined at compile unit level. If a function is defined inside another
1407   // function then gdb prefers the definition at top level and but does not
1408   // expect specification DIE in parent function. So avoid creating
1409   // specification DIE for a function defined inside a function.
1410   if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1411       !SP.getContext().isFile() &&
1412       !isSubprogramContext(SP.getContext())) {
1413     addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1414
1415     // Add arguments.
1416     DICompositeType SPTy = SP.getType();
1417     DIArray Args = SPTy.getTypeArray();
1418     unsigned SPTag = SPTy.getTag();
1419     if (SPTag == dwarf::DW_TAG_subroutine_type)
1420       for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1421         DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1422         DIType ATy = DIType(DIType(Args.getElement(i)));
1423         addType(Arg, ATy);
1424         if (ATy.isArtificial())
1425           addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1426         SPDie->addChild(Arg);
1427       }
1428     DIE *SPDeclDie = SPDie;
1429     SPDie = new DIE(dwarf::DW_TAG_subprogram);
1430     addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1431                 SPDeclDie);
1432     SPCU->addDie(SPDie);
1433   }
1434
1435   // Pick up abstract subprogram DIE.
1436   if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
1437     SPDie = new DIE(dwarf::DW_TAG_subprogram);
1438     addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
1439                 dwarf::DW_FORM_ref4, AbsSPDIE);
1440     SPCU->addDie(SPDie);
1441   }
1442
1443   addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1444            Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1445   addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1446            Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1447   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1448   MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1449   addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1450
1451   return SPDie;
1452 }
1453
1454 /// constructLexicalScope - Construct new DW_TAG_lexical_block
1455 /// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1456 DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1457
1458   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1459   if (Scope->isAbstractScope())
1460     return ScopeDIE;
1461
1462   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1463   if (Ranges.empty())
1464     return 0;
1465
1466   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1467   if (Ranges.size() > 1) {
1468     // .debug_range section has not been laid out yet. Emit offset in
1469     // .debug_range as a uint, size 4, for now. emitDIE will handle
1470     // DW_AT_ranges appropriately.
1471     addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1472             DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1473     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1474          RE = Ranges.end(); RI != RE; ++RI) {
1475       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1476       DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1477     }
1478     DebugRangeSymbols.push_back(NULL);
1479     DebugRangeSymbols.push_back(NULL);
1480     return ScopeDIE;
1481   }
1482
1483   const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1484   const MCSymbol *End = getLabelAfterInsn(RI->second);
1485
1486   if (End == 0) return 0;
1487
1488   assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1489   assert(End->isDefined() && "Invalid end label for an inlined scope!");
1490
1491   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1492   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1493
1494   return ScopeDIE;
1495 }
1496
1497 /// constructInlinedScopeDIE - This scope represents inlined body of
1498 /// a function. Construct DIE to represent this concrete inlined copy
1499 /// of the function.
1500 DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1501
1502   const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1503   assert (Ranges.empty() == false
1504           && "DbgScope does not have instruction markers!");
1505
1506   // FIXME : .debug_inlined section specification does not clearly state how
1507   // to emit inlined scope that is split into multiple instruction ranges.
1508   // For now, use first instruction range and emit low_pc/high_pc pair and
1509   // corresponding .debug_inlined section entry for this pair.
1510   SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1511   const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1512   const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1513
1514   if (StartLabel == 0 || EndLabel == 0) {
1515     assert (0 && "Unexpected Start and End  labels for a inlined scope!");
1516     return 0;
1517   }
1518   assert(StartLabel->isDefined() &&
1519          "Invalid starting label for an inlined scope!");
1520   assert(EndLabel->isDefined() &&
1521          "Invalid end label for an inlined scope!");
1522
1523   if (!Scope->getScopeNode())
1524     return NULL;
1525   DIScope DS(Scope->getScopeNode());
1526   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1527
1528   DISubprogram InlinedSP = getDISubprogram(DS);
1529   CompileUnit *TheCU = getCompileUnit(InlinedSP);
1530   DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1531   assert(OriginDIE && "Unable to find Origin DIE!");
1532   addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1533               dwarf::DW_FORM_ref4, OriginDIE);
1534
1535   addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1536   addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1537
1538   InlinedSubprogramDIEs.insert(OriginDIE);
1539
1540   // Track the start label for this inlined function.
1541   DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1542     I = InlineInfo.find(InlinedSP);
1543
1544   if (I == InlineInfo.end()) {
1545     InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1546                                                              ScopeDIE));
1547     InlinedSPNodes.push_back(InlinedSP);
1548   } else
1549     I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1550
1551   DILocation DL(Scope->getInlinedAt());
1552   addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1553   addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1554
1555   return ScopeDIE;
1556 }
1557
1558
1559 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
1560 DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1561   StringRef Name = DV->getName();
1562   if (Name.empty())
1563     return NULL;
1564
1565   // Translate tag to proper Dwarf tag.  The result variable is dropped for
1566   // now.
1567   unsigned Tag;
1568   switch (DV->getTag()) {
1569   case dwarf::DW_TAG_return_variable:
1570     return NULL;
1571   case dwarf::DW_TAG_arg_variable:
1572     Tag = dwarf::DW_TAG_formal_parameter;
1573     break;
1574   case dwarf::DW_TAG_auto_variable:    // fall thru
1575   default:
1576     Tag = dwarf::DW_TAG_variable;
1577     break;
1578   }
1579
1580   // Define variable debug information entry.
1581   DIE *VariableDie = new DIE(Tag);
1582
1583   DIE *AbsDIE = NULL;
1584   DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1585     V2AVI = VarToAbstractVarMap.find(DV);
1586   if (V2AVI != VarToAbstractVarMap.end())
1587     AbsDIE = V2AVI->second->getDIE();
1588
1589   if (AbsDIE)
1590     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1591                 dwarf::DW_FORM_ref4, AbsDIE);
1592   else {
1593     addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1594     addSourceLine(VariableDie, DV->getVariable());
1595
1596     // Add variable type.
1597     addType(VariableDie, DV->getType());
1598   }
1599
1600   if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
1601     addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1602
1603   if (Scope->isAbstractScope()) {
1604     DV->setDIE(VariableDie);
1605     return VariableDie;
1606   }
1607
1608   // Add variable address.
1609
1610   unsigned Offset = DV->getDotDebugLocOffset();
1611   if (Offset != ~0U) {
1612     addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1613              Asm->GetTempSymbol("debug_loc", Offset));
1614     DV->setDIE(VariableDie);
1615     UseDotDebugLocEntry.insert(VariableDie);
1616     return VariableDie;
1617   }
1618
1619   // Check if variable is described by a  DBG_VALUE instruction.
1620   DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1621     DbgVariableToDbgInstMap.find(DV);
1622   if (DVI != DbgVariableToDbgInstMap.end()) {
1623     const MachineInstr *DVInsn = DVI->second;
1624     const MCSymbol *DVLabel = findVariableLabel(DV);
1625     bool updated = false;
1626     // FIXME : Handle getNumOperands != 3
1627     if (DVInsn->getNumOperands() == 3) {
1628       if (DVInsn->getOperand(0).isReg())
1629         updated =
1630           addRegisterAddress(VariableDie, DVLabel, DVInsn->getOperand(0));
1631       else if (DVInsn->getOperand(0).isImm())
1632         updated = addConstantValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1633       else if (DVInsn->getOperand(0).isFPImm())
1634         updated =
1635           addConstantFPValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1636     } else {
1637       MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1638       if (Location.getReg()) {
1639         addAddress(VariableDie, dwarf::DW_AT_location, Location);
1640         if (DVLabel)
1641           addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1642                    DVLabel);
1643         updated = true;
1644       }
1645     }
1646     if (!updated) {
1647       // If variableDie is not updated then DBG_VALUE instruction does not
1648       // have valid variable info.
1649       delete VariableDie;
1650       return NULL;
1651     }
1652     DV->setDIE(VariableDie);
1653     return VariableDie;
1654   }
1655
1656   // .. else use frame index, if available.
1657   MachineLocation Location;
1658   unsigned FrameReg;
1659   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1660   int FI = 0;
1661   if (findVariableFrameIndex(DV, &FI)) {
1662     int Offset = RI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1663     Location.set(FrameReg, Offset);
1664     addVariableAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1665   }
1666   DV->setDIE(VariableDie);
1667   return VariableDie;
1668
1669 }
1670
1671 void DwarfDebug::addPubTypes(DISubprogram SP) {
1672   DICompositeType SPTy = SP.getType();
1673   unsigned SPTag = SPTy.getTag();
1674   if (SPTag != dwarf::DW_TAG_subroutine_type)
1675     return;
1676
1677   DIArray Args = SPTy.getTypeArray();
1678   for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1679     DIType ATy(Args.getElement(i));
1680     if (!ATy.Verify())
1681       continue;
1682     DICompositeType CATy = getDICompositeType(ATy);
1683     if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1684         && !CATy.isForwardDecl()) {
1685       CompileUnit *TheCU = getCompileUnit(CATy);
1686       if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1687         TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1688     }
1689   }
1690 }
1691
1692 /// constructScopeDIE - Construct a DIE for this scope.
1693 DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1694   if (!Scope || !Scope->getScopeNode())
1695     return NULL;
1696
1697   DIScope DS(Scope->getScopeNode());
1698   DIE *ScopeDIE = NULL;
1699   if (Scope->getInlinedAt())
1700     ScopeDIE = constructInlinedScopeDIE(Scope);
1701   else if (DS.isSubprogram()) {
1702     ProcessedSPNodes.insert(DS);
1703     if (Scope->isAbstractScope()) {
1704       ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1705       // Note down abstract DIE.
1706       if (ScopeDIE)
1707         AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
1708     }
1709     else
1710       ScopeDIE = updateSubprogramScopeDIE(DS);
1711   }
1712   else
1713     ScopeDIE = constructLexicalScopeDIE(Scope);
1714   if (!ScopeDIE) return NULL;
1715
1716   // Add variables to scope.
1717   const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1718   for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1719     DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1720     if (VariableDIE)
1721       ScopeDIE->addChild(VariableDIE);
1722   }
1723
1724   // Add nested scopes.
1725   const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1726   for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1727     // Define the Scope debug information entry.
1728     DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1729     if (NestedDIE)
1730       ScopeDIE->addChild(NestedDIE);
1731   }
1732
1733   if (DS.isSubprogram())
1734     addPubTypes(DISubprogram(DS));
1735
1736  return ScopeDIE;
1737 }
1738
1739 /// GetOrCreateSourceID - Look up the source id with the given directory and
1740 /// source file names. If none currently exists, create a new id and insert it
1741 /// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1742 /// maps as well.
1743 unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1744   unsigned DId;
1745   assert (DirName.empty() == false && "Invalid directory name!");
1746
1747   StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1748   if (DI != DirectoryIdMap.end()) {
1749     DId = DI->getValue();
1750   } else {
1751     DId = DirectoryNames.size() + 1;
1752     DirectoryIdMap[DirName] = DId;
1753     DirectoryNames.push_back(DirName);
1754   }
1755
1756   unsigned FId;
1757   StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1758   if (FI != SourceFileIdMap.end()) {
1759     FId = FI->getValue();
1760   } else {
1761     FId = SourceFileNames.size() + 1;
1762     SourceFileIdMap[FileName] = FId;
1763     SourceFileNames.push_back(FileName);
1764   }
1765
1766   DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1767     SourceIdMap.find(std::make_pair(DId, FId));
1768   if (SI != SourceIdMap.end())
1769     return SI->second;
1770
1771   unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1772   SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1773   SourceIds.push_back(std::make_pair(DId, FId));
1774
1775   return SrcId;
1776 }
1777
1778 /// getOrCreateNameSpace - Create a DIE for DINameSpace.
1779 DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1780   CompileUnit *TheCU = getCompileUnit(NS);
1781   DIE *NDie = TheCU->getDIE(NS);
1782   if (NDie)
1783     return NDie;
1784   NDie = new DIE(dwarf::DW_TAG_namespace);
1785   TheCU->insertDIE(NS, NDie);
1786   if (!NS.getName().empty())
1787     addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1788   addSourceLine(NDie, NS);
1789   addToContextOwner(NDie, NS.getContext());
1790   return NDie;
1791 }
1792
1793 /// constructCompileUnit - Create new CompileUnit for the given
1794 /// metadata node with tag DW_TAG_compile_unit.
1795 void DwarfDebug::constructCompileUnit(const MDNode *N) {
1796   DICompileUnit DIUnit(N);
1797   StringRef FN = DIUnit.getFilename();
1798   StringRef Dir = DIUnit.getDirectory();
1799   unsigned ID = GetOrCreateSourceID(Dir, FN);
1800
1801   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1802   addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1803             DIUnit.getProducer());
1804   addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1805           DIUnit.getLanguage());
1806   addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1807   // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1808   // simplifies debug range entries.
1809   addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
1810   // DW_AT_stmt_list is a offset of line number information for this
1811   // compile unit in debug_line section. This offset is calculated
1812   // during endMoudle().
1813   addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1814
1815   if (!Dir.empty())
1816     addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1817   if (DIUnit.isOptimized())
1818     addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1819
1820   StringRef Flags = DIUnit.getFlags();
1821   if (!Flags.empty())
1822     addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1823
1824   unsigned RVer = DIUnit.getRunTimeVersion();
1825   if (RVer)
1826     addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1827             dwarf::DW_FORM_data1, RVer);
1828
1829   CompileUnit *NewCU = new CompileUnit(ID, Die);
1830   if (!FirstCU)
1831     FirstCU = NewCU;
1832   CUMap.insert(std::make_pair(N, NewCU));
1833 }
1834
1835 /// getCompielUnit - Get CompileUnit DIE.
1836 CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1837   assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1838   DIDescriptor D(N);
1839   const MDNode *CUNode = NULL;
1840   if (D.isCompileUnit())
1841     CUNode = N;
1842   else if (D.isSubprogram())
1843     CUNode = DISubprogram(N).getCompileUnit();
1844   else if (D.isType())
1845     CUNode = DIType(N).getCompileUnit();
1846   else if (D.isGlobalVariable())
1847     CUNode = DIGlobalVariable(N).getCompileUnit();
1848   else if (D.isVariable())
1849     CUNode = DIVariable(N).getCompileUnit();
1850   else if (D.isNameSpace())
1851     CUNode = DINameSpace(N).getCompileUnit();
1852   else if (D.isFile())
1853     CUNode = DIFile(N).getCompileUnit();
1854   else
1855     return FirstCU;
1856
1857   DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1858     = CUMap.find(CUNode);
1859   if (I == CUMap.end())
1860     return FirstCU;
1861   return I->second;
1862 }
1863
1864
1865 /// constructGlobalVariableDIE - Construct global variable DIE.
1866 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1867   DIGlobalVariable GV(N);
1868
1869   // If debug information is malformed then ignore it.
1870   if (GV.Verify() == false)
1871     return;
1872
1873   // Check for pre-existence.
1874   CompileUnit *TheCU = getCompileUnit(N);
1875   if (TheCU->getDIE(GV))
1876     return;
1877
1878   DIType GTy = GV.getType();
1879   DIE *VariableDIE = new DIE(GV.getTag());
1880
1881   bool isGlobalVariable = GV.getGlobal() != NULL;
1882
1883   // Add name.
1884   addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1885             GV.getDisplayName());
1886   StringRef LinkageName = GV.getLinkageName();
1887   if (!LinkageName.empty() && isGlobalVariable)
1888     addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1889               getRealLinkageName(LinkageName));
1890   // Add type.
1891   addType(VariableDIE, GTy);
1892   if (GTy.isCompositeType() && !GTy.getName().empty()
1893       && !GTy.isForwardDecl()) {
1894     DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1895     assert(Entry && "Missing global type!");
1896     TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1897   }
1898   // Add scoping info.
1899   if (!GV.isLocalToUnit()) {
1900     addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1901     // Expose as global. 
1902     TheCU->addGlobal(GV.getName(), VariableDIE);
1903   }
1904   // Add line number info.
1905   addSourceLine(VariableDIE, GV);
1906   // Add to map.
1907   TheCU->insertDIE(N, VariableDIE);
1908   // Add to context owner.
1909   DIDescriptor GVContext = GV.getContext();
1910   addToContextOwner(VariableDIE, GVContext);
1911   // Add location.
1912   if (isGlobalVariable) {
1913     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1914     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1915     addLabel(Block, 0, dwarf::DW_FORM_udata,
1916              Asm->Mang->getSymbol(GV.getGlobal()));
1917     // Do not create specification DIE if context is either compile unit
1918     // or a subprogram.
1919     if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1920         !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1921       // Create specification DIE.
1922       DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1923       addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1924                   dwarf::DW_FORM_ref4, VariableDIE);
1925       addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1926       addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1927       TheCU->addDie(VariableSpecDIE);
1928     } else {
1929       addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1930     } 
1931   } else if (Constant *C = GV.getConstant()) {
1932     if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1933       DIBasicType BTy(GTy);
1934       if (BTy.Verify()) {
1935         unsigned Encoding = BTy.getEncoding();
1936         if (Encoding == dwarf::DW_ATE_unsigned ||
1937             Encoding == dwarf::DW_ATE_unsigned_char)
1938           addUInt(VariableDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1939                   CI->getZExtValue());
1940         else
1941           addSInt(VariableDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1942                  CI->getSExtValue());
1943       }
1944     }
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 }