Handle qualified constants that are directly folded by FE.
[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 /// isUnsignedDIType - Return true if type encoding is unsigned.
1865 static bool isUnsignedDIType(DIType Ty) {
1866   DIDerivedType DTy(Ty);
1867   if (DTy.Verify())
1868     return isUnsignedDIType(DTy.getTypeDerivedFrom());
1869
1870   DIBasicType BTy(Ty);
1871   if (BTy.Verify()) {
1872     unsigned Encoding = BTy.getEncoding();
1873     if (Encoding == dwarf::DW_ATE_unsigned ||
1874         Encoding == dwarf::DW_ATE_unsigned_char)
1875       return true;
1876   }
1877   return false;
1878 }
1879
1880 /// constructGlobalVariableDIE - Construct global variable DIE.
1881 void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1882   DIGlobalVariable GV(N);
1883
1884   // If debug information is malformed then ignore it.
1885   if (GV.Verify() == false)
1886     return;
1887
1888   // Check for pre-existence.
1889   CompileUnit *TheCU = getCompileUnit(N);
1890   if (TheCU->getDIE(GV))
1891     return;
1892
1893   DIType GTy = GV.getType();
1894   DIE *VariableDIE = new DIE(GV.getTag());
1895
1896   bool isGlobalVariable = GV.getGlobal() != NULL;
1897
1898   // Add name.
1899   addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1900             GV.getDisplayName());
1901   StringRef LinkageName = GV.getLinkageName();
1902   if (!LinkageName.empty() && isGlobalVariable)
1903     addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1904               getRealLinkageName(LinkageName));
1905   // Add type.
1906   addType(VariableDIE, GTy);
1907   if (GTy.isCompositeType() && !GTy.getName().empty()
1908       && !GTy.isForwardDecl()) {
1909     DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1910     assert(Entry && "Missing global type!");
1911     TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1912   }
1913   // Add scoping info.
1914   if (!GV.isLocalToUnit()) {
1915     addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1916     // Expose as global. 
1917     TheCU->addGlobal(GV.getName(), VariableDIE);
1918   }
1919   // Add line number info.
1920   addSourceLine(VariableDIE, GV);
1921   // Add to map.
1922   TheCU->insertDIE(N, VariableDIE);
1923   // Add to context owner.
1924   DIDescriptor GVContext = GV.getContext();
1925   addToContextOwner(VariableDIE, GVContext);
1926   // Add location.
1927   if (isGlobalVariable) {
1928     DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1929     addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1930     addLabel(Block, 0, dwarf::DW_FORM_udata,
1931              Asm->Mang->getSymbol(GV.getGlobal()));
1932     // Do not create specification DIE if context is either compile unit
1933     // or a subprogram.
1934     if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1935         !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1936       // Create specification DIE.
1937       DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1938       addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1939                   dwarf::DW_FORM_ref4, VariableDIE);
1940       addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1941       addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1942       TheCU->addDie(VariableSpecDIE);
1943     } else {
1944       addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1945     } 
1946   } else if (Constant *C = GV.getConstant()) {
1947     if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1948       if (isUnsignedDIType(GTy))
1949           addUInt(VariableDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata,
1950                   CI->getZExtValue());
1951         else
1952           addSInt(VariableDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata,
1953                  CI->getSExtValue());
1954     }
1955   }
1956   return;
1957 }
1958
1959 /// construct SubprogramDIE - Construct subprogram DIE.
1960 void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1961   DISubprogram SP(N);
1962
1963   // Check for pre-existence.
1964   CompileUnit *TheCU = getCompileUnit(N);
1965   if (TheCU->getDIE(N))
1966     return;
1967
1968   if (!SP.isDefinition())
1969     // This is a method declaration which will be handled while constructing
1970     // class type.
1971     return;
1972
1973   DIE *SubprogramDie = createSubprogramDIE(SP);
1974
1975   // Add to map.
1976   TheCU->insertDIE(N, SubprogramDie);
1977
1978   // Add to context owner.
1979   addToContextOwner(SubprogramDie, SP.getContext());
1980
1981   // Expose as global.
1982   TheCU->addGlobal(SP.getName(), SubprogramDie);
1983
1984   return;
1985 }
1986
1987 /// beginModule - Emit all Dwarf sections that should come prior to the
1988 /// content. Create global DIEs and emit initial debug info sections.
1989 /// This is inovked by the target AsmPrinter.
1990 void DwarfDebug::beginModule(Module *M) {
1991   if (DisableDebugInfoPrinting)
1992     return;
1993
1994   DebugInfoFinder DbgFinder;
1995   DbgFinder.processModule(*M);
1996
1997   bool HasDebugInfo = false;
1998
1999   // Scan all the compile-units to see if there are any marked as the main unit.
2000   // if not, we do not generate debug info.
2001   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2002        E = DbgFinder.compile_unit_end(); I != E; ++I) {
2003     if (DICompileUnit(*I).isMain()) {
2004       HasDebugInfo = true;
2005       break;
2006     }
2007   }
2008
2009   if (!HasDebugInfo) return;
2010
2011   // Tell MMI that we have debug info.
2012   MMI->setDebugInfoAvailability(true);
2013
2014   // Emit initial sections.
2015   EmitSectionLabels();
2016
2017   // Create all the compile unit DIEs.
2018   for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
2019          E = DbgFinder.compile_unit_end(); I != E; ++I)
2020     constructCompileUnit(*I);
2021
2022   // Create DIEs for each subprogram.
2023   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2024          E = DbgFinder.subprogram_end(); I != E; ++I)
2025     constructSubprogramDIE(*I);
2026
2027   // Create DIEs for each global variable.
2028   for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2029          E = DbgFinder.global_variable_end(); I != E; ++I)
2030     constructGlobalVariableDIE(*I);
2031
2032   //getOrCreateTypeDIE
2033   if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
2034     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i)
2035       getOrCreateTypeDIE(DIType(NMD->getOperand(i)));
2036
2037   // Prime section data.
2038   SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2039
2040   // Print out .file directives to specify files for .loc directives. These are
2041   // printed out early so that they precede any .loc directives.
2042   if (Asm->MAI->hasDotLocAndDotFile()) {
2043     for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
2044       // Remember source id starts at 1.
2045       std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
2046       // FIXME: don't use sys::path for this!  This should not depend on the
2047       // host.
2048       sys::Path FullPath(getSourceDirectoryName(Id.first));
2049       bool AppendOk =
2050         FullPath.appendComponent(getSourceFileName(Id.second));
2051       assert(AppendOk && "Could not append filename to directory!");
2052       AppendOk = false;
2053       Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
2054     }
2055   }
2056 }
2057
2058 /// endModule - Emit all Dwarf sections that should come after the content.
2059 ///
2060 void DwarfDebug::endModule() {
2061   if (!FirstCU) return;
2062   const Module *M = MMI->getModule();
2063   DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
2064   if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2065     for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2066       if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2067       DISubprogram SP(AllSPs->getOperand(SI));
2068       if (!SP.Verify()) continue;
2069
2070       // Collect info for variables that were optimized out.
2071       if (!SP.isDefinition()) continue;
2072       StringRef FName = SP.getLinkageName();
2073       if (FName.empty())
2074         FName = SP.getName();
2075       NamedMDNode *NMD =
2076         M->getNamedMetadata(Twine("llvm.dbg.lv.", getRealLinkageName(FName)));
2077       if (!NMD) continue;
2078       unsigned E = NMD->getNumOperands();
2079       if (!E) continue;
2080       DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
2081       DeadFnScopeMap[SP] = Scope;
2082       for (unsigned I = 0; I != E; ++I) {
2083         DIVariable DV(NMD->getOperand(I));
2084         if (!DV.Verify()) continue;
2085         Scope->addVariable(new DbgVariable(DV));
2086       }
2087
2088       // Construct subprogram DIE and add variables DIEs.
2089       constructSubprogramDIE(SP);
2090       DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
2091       const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
2092       for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2093         DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2094         if (VariableDIE)
2095           ScopeDIE->addChild(VariableDIE);
2096       }
2097     }
2098   }
2099
2100   // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2101   for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2102          AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2103     DIE *ISP = *AI;
2104     addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2105   }
2106
2107   for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2108          CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2109     DIE *SPDie = CI->first;
2110     const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2111     if (!N) continue;
2112     DIE *NDie = getCompileUnit(N)->getDIE(N);
2113     if (!NDie) continue;
2114     addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2115   }
2116
2117   // Standard sections final addresses.
2118   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2119   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2120   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2121   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2122
2123   // End text sections.
2124   for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2125     Asm->OutStreamer.SwitchSection(SectionMap[i]);
2126     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2127   }
2128
2129   // Emit common frame information.
2130   emitCommonDebugFrame();
2131
2132   // Emit function debug frame information
2133   for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2134          E = DebugFrames.end(); I != E; ++I)
2135     emitFunctionDebugFrame(*I);
2136
2137   // Compute DIE offsets and sizes.
2138   computeSizeAndOffsets();
2139
2140   // Emit source line correspondence into a debug line section.
2141   emitDebugLines();
2142
2143   // Emit all the DIEs into a debug info section
2144   emitDebugInfo();
2145
2146   // Corresponding abbreviations into a abbrev section.
2147   emitAbbreviations();
2148
2149   // Emit info into a debug pubnames section.
2150   emitDebugPubNames();
2151
2152   // Emit info into a debug pubtypes section.
2153   emitDebugPubTypes();
2154
2155   // Emit info into a debug loc section.
2156   emitDebugLoc();
2157
2158   // Emit info into a debug aranges section.
2159   EmitDebugARanges();
2160
2161   // Emit info into a debug ranges section.
2162   emitDebugRanges();
2163
2164   // Emit info into a debug macinfo section.
2165   emitDebugMacInfo();
2166
2167   // Emit inline info.
2168   emitDebugInlineInfo();
2169
2170   // Emit info into a debug str section.
2171   emitDebugStr();
2172
2173   // clean up.
2174   DeleteContainerSeconds(DeadFnScopeMap);
2175   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2176          E = CUMap.end(); I != E; ++I)
2177     delete I->second;
2178   FirstCU = NULL;  // Reset for the next Module, if any.
2179 }
2180
2181 /// findAbstractVariable - Find abstract variable, if any, associated with Var.
2182 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2183                                               DebugLoc ScopeLoc) {
2184
2185   DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2186   if (AbsDbgVariable)
2187     return AbsDbgVariable;
2188
2189   LLVMContext &Ctx = Var->getContext();
2190   DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2191   if (!Scope)
2192     return NULL;
2193
2194   AbsDbgVariable = new DbgVariable(Var);
2195   Scope->addVariable(AbsDbgVariable);
2196   AbstractVariables[Var] = AbsDbgVariable;
2197   return AbsDbgVariable;
2198 }
2199
2200 /// collectVariableInfoFromMMITable - Collect variable information from
2201 /// side table maintained by MMI.
2202 void
2203 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2204                                    SmallPtrSet<const MDNode *, 16> &Processed) {
2205   const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2206   MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2207   for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2208          VE = VMap.end(); VI != VE; ++VI) {
2209     const MDNode *Var = VI->first;
2210     if (!Var) continue;
2211     Processed.insert(Var);
2212     DIVariable DV(Var);
2213     const std::pair<unsigned, DebugLoc> &VP = VI->second;
2214
2215     DbgScope *Scope = 0;
2216     if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2217       Scope = ConcreteScopes.lookup(IA);
2218     if (Scope == 0)
2219       Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2220
2221     // If variable scope is not found then skip this variable.
2222     if (Scope == 0)
2223       continue;
2224
2225     DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2226     DbgVariable *RegVar = new DbgVariable(DV);
2227     recordVariableFrameIndex(RegVar, VP.first);
2228     Scope->addVariable(RegVar);
2229     if (AbsDbgVariable) {
2230       recordVariableFrameIndex(AbsDbgVariable, VP.first);
2231       VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2232     }
2233   }
2234 }
2235
2236 /// isDbgValueInUndefinedReg - Return true if debug value, encoded by
2237 /// DBG_VALUE instruction, is in undefined reg.
2238 static bool isDbgValueInUndefinedReg(const MachineInstr *MI) {
2239   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2240   if (MI->getOperand(0).isReg() && !MI->getOperand(0).getReg())
2241     return true;
2242   return false;
2243 }
2244
2245 /// isDbgValueInDefinedReg - Return true if debug value, encoded by
2246 /// DBG_VALUE instruction, is in a defined reg.
2247 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2248   assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2249   if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2250     return true;
2251   return false;
2252 }
2253
2254 /// collectVariableInfo - Populate DbgScope entries with variables' info.
2255 void
2256 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2257                                 SmallPtrSet<const MDNode *, 16> &Processed) {
2258
2259   /// collection info from MMI table.
2260   collectVariableInfoFromMMITable(MF, Processed);
2261
2262   SmallVector<const MachineInstr *, 8> DbgValues;
2263   // Collect variable information from DBG_VALUE machine instructions;
2264   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2265        I != E; ++I)
2266     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2267          II != IE; ++II) {
2268       const MachineInstr *MInsn = II;
2269       if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn))
2270         continue;
2271       DbgValues.push_back(MInsn);
2272     }
2273
2274   // This is a collection of DBV_VALUE instructions describing same variable.
2275   SmallVector<const MachineInstr *, 4> MultipleValues;
2276   for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2277         E = DbgValues.end(); I != E; ++I) {
2278     const MachineInstr *MInsn = *I;
2279     MultipleValues.clear();
2280     if (isDbgValueInDefinedReg(MInsn))
2281       MultipleValues.push_back(MInsn);
2282     DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2283     if (Processed.count(DV) != 0)
2284       continue;
2285
2286     const MachineInstr *PrevMI = MInsn;
2287     for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2288            ME = DbgValues.end(); MI != ME; ++MI) {
2289       const MDNode *Var =
2290         (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2291       if (Var == DV && isDbgValueInDefinedReg(*MI) &&
2292           !PrevMI->isIdenticalTo(*MI))
2293         MultipleValues.push_back(*MI);
2294       PrevMI = *MI;
2295     }
2296
2297     DbgScope *Scope = findDbgScope(MInsn);
2298     bool CurFnArg = false;
2299     if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2300         DISubprogram(DV.getContext()).describes(MF->getFunction()))
2301       CurFnArg = true;
2302     if (!Scope && CurFnArg)
2303       Scope = CurrentFnDbgScope;
2304     // If variable scope is not found then skip this variable.
2305     if (!Scope)
2306       continue;
2307
2308     Processed.insert(DV);
2309     DbgVariable *RegVar = new DbgVariable(DV);
2310     Scope->addVariable(RegVar);
2311     if (!CurFnArg)
2312       DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn);
2313     if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2314       DbgVariableToDbgInstMap[AbsVar] = MInsn;
2315       VarToAbstractVarMap[RegVar] = AbsVar;
2316     }
2317     if (MultipleValues.size() <= 1) {
2318       DbgVariableToDbgInstMap[RegVar] = MInsn;
2319       continue;
2320     }
2321
2322     // handle multiple DBG_VALUE instructions describing one variable.
2323     if (DotDebugLocEntries.empty())
2324       RegVar->setDotDebugLocOffset(0);
2325     else
2326       RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2327     const MachineInstr *Begin = NULL;
2328     const MachineInstr *End = NULL;
2329     for (SmallVector<const MachineInstr *, 4>::iterator
2330            MVI = MultipleValues.begin(), MVE = MultipleValues.end();
2331          MVI != MVE; ++MVI) {
2332       if (!Begin) {
2333         Begin = *MVI;
2334         continue;
2335       }
2336       End = *MVI;
2337       MachineLocation MLoc;
2338       if (Begin->getNumOperands() == 3) {
2339         if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2340           MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2341       } else
2342         MLoc = Asm->getDebugValueLocation(Begin);
2343
2344       const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2345       const MCSymbol *SLabel = getLabelBeforeInsn(End);
2346       if (MLoc.getReg())
2347         DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2348
2349       Begin = End;
2350       if (MVI + 1 == MVE) {
2351         // If End is the last instruction then its value is valid
2352         // until the end of the funtion.
2353         MachineLocation EMLoc;
2354         if (End->getNumOperands() == 3) {
2355           if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2356           EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2357         } else
2358           EMLoc = Asm->getDebugValueLocation(End);
2359         if (EMLoc.getReg()) 
2360           DotDebugLocEntries.
2361             push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc));
2362       }
2363     }
2364     DotDebugLocEntries.push_back(DotDebugLocEntry());
2365   }
2366
2367   // Collect info for variables that were optimized out.
2368   const Function *F = MF->getFunction();
2369   const Module *M = F->getParent();
2370   if (NamedMDNode *NMD =
2371       M->getNamedMetadata(Twine("llvm.dbg.lv.",
2372                                 getRealLinkageName(F->getName())))) {
2373     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2374       DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2375       if (!DV || !Processed.insert(DV))
2376         continue;
2377       DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2378       if (Scope)
2379         Scope->addVariable(new DbgVariable(DV));
2380     }
2381   }
2382 }
2383
2384 /// getLabelBeforeInsn - Return Label preceding the instruction.
2385 const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2386   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2387     LabelsBeforeInsn.find(MI);
2388   if (I == LabelsBeforeInsn.end())
2389     // FunctionBeginSym always preceeds all the instruction in current function.
2390     return FunctionBeginSym;
2391   return I->second;
2392 }
2393
2394 /// getLabelAfterInsn - Return Label immediately following the instruction.
2395 const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2396   DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2397     LabelsAfterInsn.find(MI);
2398   if (I == LabelsAfterInsn.end())
2399     return NULL;
2400   return I->second;
2401 }
2402
2403 /// beginScope - Process beginning of a scope.
2404 void DwarfDebug::beginScope(const MachineInstr *MI) {
2405   if (InsnNeedsLabel.count(MI) == 0) {
2406     LabelsBeforeInsn[MI] = PrevLabel;
2407     return;
2408   }
2409
2410   // Check location.
2411   DebugLoc DL = MI->getDebugLoc();
2412   if (!DL.isUnknown()) {
2413     const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2414     PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2415     PrevInstLoc = DL;
2416     LabelsBeforeInsn[MI] = PrevLabel;
2417     return;
2418   }
2419
2420   // If location is unknown then use temp label for this DBG_VALUE
2421   // instruction.
2422   if (MI->isDebugValue()) {
2423     PrevLabel = MMI->getContext().CreateTempSymbol();
2424     Asm->OutStreamer.EmitLabel(PrevLabel);
2425     LabelsBeforeInsn[MI] = PrevLabel;
2426     return;
2427   }
2428
2429   if (UnknownLocations) {
2430     PrevLabel = recordSourceLine(0, 0, 0);
2431     LabelsBeforeInsn[MI] = PrevLabel;
2432     return;
2433   }
2434
2435   assert (0 && "Instruction is not processed!");
2436 }
2437
2438 /// endScope - Process end of a scope.
2439 void DwarfDebug::endScope(const MachineInstr *MI) {
2440   if (InsnsEndScopeSet.count(MI) != 0) {
2441     // Emit a label if this instruction ends a scope.
2442     MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2443     Asm->OutStreamer.EmitLabel(Label);
2444     LabelsAfterInsn[MI] = Label;
2445   }
2446 }
2447
2448 /// getOrCreateDbgScope - Create DbgScope for the scope.
2449 DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
2450                                           const MDNode *InlinedAt) {
2451   if (!InlinedAt) {
2452     DbgScope *WScope = DbgScopeMap.lookup(Scope);
2453     if (WScope)
2454       return WScope;
2455     WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2456     DbgScopeMap.insert(std::make_pair(Scope, WScope));
2457     if (DIDescriptor(Scope).isLexicalBlock()) {
2458       DbgScope *Parent =
2459         getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2460       WScope->setParent(Parent);
2461       Parent->addScope(WScope);
2462     }
2463
2464     if (!WScope->getParent()) {
2465       StringRef SPName = DISubprogram(Scope).getLinkageName();
2466       // We used to check only for a linkage name, but that fails
2467       // since we began omitting the linkage name for private
2468       // functions.  The new way is to check for the name in metadata,
2469       // but that's not supported in old .ll test cases.  Ergo, we
2470       // check both.
2471       if (SPName == Asm->MF->getFunction()->getName() ||
2472           DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2473         CurrentFnDbgScope = WScope;
2474     }
2475
2476     return WScope;
2477   }
2478
2479   getOrCreateAbstractScope(Scope);
2480   DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2481   if (WScope)
2482     return WScope;
2483
2484   WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2485   DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2486   DILocation DL(InlinedAt);
2487   DbgScope *Parent =
2488     getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2489   WScope->setParent(Parent);
2490   Parent->addScope(WScope);
2491
2492   ConcreteScopes[InlinedAt] = WScope;
2493
2494   return WScope;
2495 }
2496
2497 /// hasValidLocation - Return true if debug location entry attached with
2498 /// machine instruction encodes valid location info.
2499 static bool hasValidLocation(LLVMContext &Ctx,
2500                              const MachineInstr *MInsn,
2501                              const MDNode *&Scope, const MDNode *&InlinedAt) {
2502   DebugLoc DL = MInsn->getDebugLoc();
2503   if (DL.isUnknown()) return false;
2504
2505   const MDNode *S = DL.getScope(Ctx);
2506
2507   // There is no need to create another DIE for compile unit. For all
2508   // other scopes, create one DbgScope now. This will be translated
2509   // into a scope DIE at the end.
2510   if (DIScope(S).isCompileUnit()) return false;
2511
2512   Scope = S;
2513   InlinedAt = DL.getInlinedAt(Ctx);
2514   return true;
2515 }
2516
2517 /// calculateDominanceGraph - Calculate dominance graph for DbgScope
2518 /// hierarchy.
2519 static void calculateDominanceGraph(DbgScope *Scope) {
2520   assert (Scope && "Unable to calculate scop edominance graph!");
2521   SmallVector<DbgScope *, 4> WorkStack;
2522   WorkStack.push_back(Scope);
2523   unsigned Counter = 0;
2524   while (!WorkStack.empty()) {
2525     DbgScope *WS = WorkStack.back();
2526     const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2527     bool visitedChildren = false;
2528     for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2529            SE = Children.end(); SI != SE; ++SI) {
2530       DbgScope *ChildScope = *SI;
2531       if (!ChildScope->getDFSOut()) {
2532         WorkStack.push_back(ChildScope);
2533         visitedChildren = true;
2534         ChildScope->setDFSIn(++Counter);
2535         break;
2536       }
2537     }
2538     if (!visitedChildren) {
2539       WorkStack.pop_back();
2540       WS->setDFSOut(++Counter);
2541     }
2542   }
2543 }
2544
2545 /// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2546 static
2547 void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2548                        DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2549 {
2550 #ifndef NDEBUG
2551   unsigned PrevDFSIn = 0;
2552   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2553        I != E; ++I) {
2554     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2555          II != IE; ++II) {
2556       const MachineInstr *MInsn = II;
2557       const MDNode *Scope = NULL;
2558       const MDNode *InlinedAt = NULL;
2559
2560       // Check if instruction has valid location information.
2561       if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2562         dbgs() << " [ ";
2563         if (InlinedAt)
2564           dbgs() << "*";
2565         DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2566           MI2ScopeMap.find(MInsn);
2567         if (DI != MI2ScopeMap.end()) {
2568           DbgScope *S = DI->second;
2569           dbgs() << S->getDFSIn();
2570           PrevDFSIn = S->getDFSIn();
2571         } else
2572           dbgs() << PrevDFSIn;
2573       } else
2574         dbgs() << " [ x" << PrevDFSIn;
2575       dbgs() << " ]";
2576       MInsn->dump();
2577     }
2578     dbgs() << "\n";
2579   }
2580 #endif
2581 }
2582 /// extractScopeInformation - Scan machine instructions in this function
2583 /// and collect DbgScopes. Return true, if at least one scope was found.
2584 bool DwarfDebug::extractScopeInformation() {
2585   // If scope information was extracted using .dbg intrinsics then there is not
2586   // any need to extract these information by scanning each instruction.
2587   if (!DbgScopeMap.empty())
2588     return false;
2589
2590   // Scan each instruction and create scopes. First build working set of scopes.
2591   LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2592   SmallVector<DbgRange, 4> MIRanges;
2593   DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2594   const MDNode *PrevScope = NULL;
2595   const MDNode *PrevInlinedAt = NULL;
2596   const MachineInstr *RangeBeginMI = NULL;
2597   const MachineInstr *PrevMI = NULL;
2598   for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2599        I != E; ++I) {
2600     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2601          II != IE; ++II) {
2602       const MachineInstr *MInsn = II;
2603       const MDNode *Scope = NULL;
2604       const MDNode *InlinedAt = NULL;
2605
2606       // Check if instruction has valid location information.
2607       if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2608         PrevMI = MInsn;
2609         continue;
2610       }
2611
2612       // If scope has not changed then skip this instruction.
2613       if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2614         PrevMI = MInsn;
2615         continue;
2616       }
2617
2618       if (RangeBeginMI) {
2619         // If we have alread seen a beginning of a instruction range and
2620         // current instruction scope does not match scope of first instruction
2621         // in this range then create a new instruction range.
2622         DbgRange R(RangeBeginMI, PrevMI);
2623         MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
2624                                                         PrevInlinedAt);
2625         MIRanges.push_back(R);
2626       }
2627
2628       // This is a beginning of a new instruction range.
2629       RangeBeginMI = MInsn;
2630
2631       // Reset previous markers.
2632       PrevMI = MInsn;
2633       PrevScope = Scope;
2634       PrevInlinedAt = InlinedAt;
2635     }
2636   }
2637
2638   // Create last instruction range.
2639   if (RangeBeginMI && PrevMI && PrevScope) {
2640     DbgRange R(RangeBeginMI, PrevMI);
2641     MIRanges.push_back(R);
2642     MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2643   }
2644
2645   if (!CurrentFnDbgScope)
2646     return false;
2647
2648   calculateDominanceGraph(CurrentFnDbgScope);
2649   if (PrintDbgScope)
2650     printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2651
2652   // Find ranges of instructions covered by each DbgScope;
2653   DbgScope *PrevDbgScope = NULL;
2654   for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2655          RE = MIRanges.end(); RI != RE; ++RI) {
2656     const DbgRange &R = *RI;
2657     DbgScope *S = MI2ScopeMap.lookup(R.first);
2658     assert (S && "Lost DbgScope for a machine instruction!");
2659     if (PrevDbgScope && !PrevDbgScope->dominates(S))
2660       PrevDbgScope->closeInsnRange(S);
2661     S->openInsnRange(R.first);
2662     S->extendInsnRange(R.second);
2663     PrevDbgScope = S;
2664   }
2665
2666   if (PrevDbgScope)
2667     PrevDbgScope->closeInsnRange();
2668
2669   identifyScopeMarkers();
2670
2671   return !DbgScopeMap.empty();
2672 }
2673
2674 /// identifyScopeMarkers() -
2675 /// Each DbgScope has first instruction and last instruction to mark beginning
2676 /// and end of a scope respectively. Create an inverse map that list scopes
2677 /// starts (and ends) with an instruction. One instruction may start (or end)
2678 /// multiple scopes. Ignore scopes that are not reachable.
2679 void DwarfDebug::identifyScopeMarkers() {
2680   SmallVector<DbgScope *, 4> WorkList;
2681   WorkList.push_back(CurrentFnDbgScope);
2682   while (!WorkList.empty()) {
2683     DbgScope *S = WorkList.pop_back_val();
2684
2685     const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2686     if (!Children.empty())
2687       for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2688              SE = Children.end(); SI != SE; ++SI)
2689         WorkList.push_back(*SI);
2690
2691     if (S->isAbstractScope())
2692       continue;
2693
2694     const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2695     if (Ranges.empty())
2696       continue;
2697     for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2698            RE = Ranges.end(); RI != RE; ++RI) {
2699       assert(RI->first && "DbgRange does not have first instruction!");
2700       assert(RI->second && "DbgRange does not have second instruction!");
2701       InsnsEndScopeSet.insert(RI->second);
2702     }
2703   }
2704 }
2705
2706 /// FindFirstDebugLoc - Find the first debug location in the function. This
2707 /// is intended to be an approximation for the source position of the
2708 /// beginning of the function.
2709 static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2710   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2711        I != E; ++I)
2712     for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2713          MBBI != MBBE; ++MBBI) {
2714       DebugLoc DL = MBBI->getDebugLoc();
2715       if (!DL.isUnknown())
2716         return DL;
2717     }
2718   return DebugLoc();
2719 }
2720
2721 /// beginFunction - Gather pre-function debug information.  Assumes being
2722 /// emitted immediately after the function entry point.
2723 void DwarfDebug::beginFunction(const MachineFunction *MF) {
2724   if (!MMI->hasDebugInfo()) return;
2725   if (!extractScopeInformation()) return;
2726
2727   FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2728                                         Asm->getFunctionNumber());
2729   // Assumes in correct section after the entry point.
2730   Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2731
2732   // Emit label for the implicitly defined dbg.stoppoint at the start of the
2733   // function.
2734   DebugLoc FDL = FindFirstDebugLoc(MF);
2735   if (FDL.isUnknown()) return;
2736
2737   const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2738   const MDNode *TheScope = 0;
2739
2740   DISubprogram SP = getDISubprogram(Scope);
2741   unsigned Line, Col;
2742   if (SP.Verify()) {
2743     Line = SP.getLineNumber();
2744     Col = 0;
2745     TheScope = SP;
2746   } else {
2747     Line = FDL.getLine();
2748     Col = FDL.getCol();
2749     TheScope = Scope;
2750   }
2751
2752   recordSourceLine(Line, Col, TheScope);
2753
2754   /// ProcessedArgs - Collection of arguments already processed.
2755   SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2756
2757   DebugLoc PrevLoc;
2758   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2759        I != E; ++I)
2760     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2761          II != IE; ++II) {
2762       const MachineInstr *MI = II;
2763       DebugLoc DL = MI->getDebugLoc();
2764       if (MI->isDebugValue()) {
2765         assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2766         DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2767         if (!DV.Verify()) continue;
2768         // If DBG_VALUE is for a local variable then it needs a label.
2769         if (DV.getTag() != dwarf::DW_TAG_arg_variable
2770             && isDbgValueInUndefinedReg(MI) == false)
2771           InsnNeedsLabel.insert(MI);
2772         // DBG_VALUE for inlined functions argument needs a label.
2773         else if (!DISubprogram(getDISubprogram(DV.getContext())).
2774                  describes(MF->getFunction()))
2775           InsnNeedsLabel.insert(MI);
2776         // DBG_VALUE indicating argument location change needs a label.
2777         else if (isDbgValueInUndefinedReg(MI) == false
2778                  && !ProcessedArgs.insert(DV))
2779           InsnNeedsLabel.insert(MI);
2780       } else {
2781         // If location is unknown then instruction needs a location only if
2782         // UnknownLocations flag is set.
2783         if (DL.isUnknown()) {
2784           if (UnknownLocations && !PrevLoc.isUnknown())
2785             InsnNeedsLabel.insert(MI);
2786         } else if (DL != PrevLoc)
2787           // Otherwise, instruction needs a location only if it is new location.
2788           InsnNeedsLabel.insert(MI);
2789       }
2790
2791       if (!DL.isUnknown() || UnknownLocations)
2792         PrevLoc = DL;
2793     }
2794
2795   PrevLabel = FunctionBeginSym;
2796 }
2797
2798 /// endFunction - Gather and emit post-function debug information.
2799 ///
2800 void DwarfDebug::endFunction(const MachineFunction *MF) {
2801   if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2802
2803   if (CurrentFnDbgScope) {
2804
2805     // Define end label for subprogram.
2806     FunctionEndSym = Asm->GetTempSymbol("func_end",
2807                                         Asm->getFunctionNumber());
2808     // Assumes in correct section after the entry point.
2809     Asm->OutStreamer.EmitLabel(FunctionEndSym);
2810
2811     SmallPtrSet<const MDNode *, 16> ProcessedVars;
2812     collectVariableInfo(MF, ProcessedVars);
2813
2814     // Get function line info.
2815     if (!Lines.empty()) {
2816       // Get section line info.
2817       unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2818       if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2819       std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2820       // Append the function info to section info.
2821       SectionLineInfos.insert(SectionLineInfos.end(),
2822                               Lines.begin(), Lines.end());
2823     }
2824
2825     // Construct abstract scopes.
2826     for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2827            AE = AbstractScopesList.end(); AI != AE; ++AI) {
2828       DISubprogram SP((*AI)->getScopeNode());
2829       if (SP.Verify()) {
2830         // Collect info for variables that were optimized out.
2831         StringRef FName = SP.getLinkageName();
2832         if (FName.empty())
2833           FName = SP.getName();
2834         const Module *M = MF->getFunction()->getParent();
2835         if (NamedMDNode *NMD =
2836             M->getNamedMetadata(Twine("llvm.dbg.lv.",
2837                                       getRealLinkageName(FName)))) {
2838           for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2839           DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2840           if (!DV || !ProcessedVars.insert(DV))
2841             continue;
2842           DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2843           if (Scope)
2844             Scope->addVariable(new DbgVariable(DV));
2845           }
2846         }
2847       }
2848       if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2849         constructScopeDIE(*AI);
2850     }
2851
2852     DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2853
2854     if (!DisableFramePointerElim(*MF))
2855       addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2856               dwarf::DW_FORM_flag, 1);
2857
2858
2859     DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2860                                                  MMI->getFrameMoves()));
2861   }
2862
2863   // Clear debug info
2864   CurrentFnDbgScope = NULL;
2865   InsnNeedsLabel.clear();
2866   DbgVariableToFrameIndexMap.clear();
2867   VarToAbstractVarMap.clear();
2868   DbgVariableToDbgInstMap.clear();
2869   DbgVariableLabelsMap.clear();
2870   DeleteContainerSeconds(DbgScopeMap);
2871   InsnsEndScopeSet.clear();
2872   ConcreteScopes.clear();
2873   DeleteContainerSeconds(AbstractScopes);
2874   AbstractScopesList.clear();
2875   AbstractVariables.clear();
2876   LabelsBeforeInsn.clear();
2877   LabelsAfterInsn.clear();
2878   Lines.clear();
2879   PrevLabel = NULL;
2880 }
2881
2882 /// recordVariableFrameIndex - Record a variable's index.
2883 void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2884   assert (V && "Invalid DbgVariable!");
2885   DbgVariableToFrameIndexMap[V] = Index;
2886 }
2887
2888 /// findVariableFrameIndex - Return true if frame index for the variable
2889 /// is found. Update FI to hold value of the index.
2890 bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2891   assert (V && "Invalid DbgVariable!");
2892   DenseMap<const DbgVariable *, int>::iterator I =
2893     DbgVariableToFrameIndexMap.find(V);
2894   if (I == DbgVariableToFrameIndexMap.end())
2895     return false;
2896   *FI = I->second;
2897   return true;
2898 }
2899
2900 /// findVariableLabel - Find MCSymbol for the variable.
2901 const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2902   DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2903     = DbgVariableLabelsMap.find(V);
2904   if (I == DbgVariableLabelsMap.end())
2905     return NULL;
2906   else return I->second;
2907 }
2908
2909 /// findDbgScope - Find DbgScope for the debug loc attached with an
2910 /// instruction.
2911 DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2912   DbgScope *Scope = NULL;
2913   LLVMContext &Ctx =
2914     MInsn->getParent()->getParent()->getFunction()->getContext();
2915   DebugLoc DL = MInsn->getDebugLoc();
2916
2917   if (DL.isUnknown())
2918     return Scope;
2919
2920   if (const MDNode *IA = DL.getInlinedAt(Ctx))
2921     Scope = ConcreteScopes.lookup(IA);
2922   if (Scope == 0)
2923     Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2924
2925   return Scope;
2926 }
2927
2928
2929 /// recordSourceLine - Register a source line with debug info. Returns the
2930 /// unique label that was emitted and which provides correspondence to
2931 /// the source line list.
2932 MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2933                                        const MDNode *S) {
2934   StringRef Dir;
2935   StringRef Fn;
2936
2937   unsigned Src = 1;
2938   if (S) {
2939     DIDescriptor Scope(S);
2940
2941     if (Scope.isCompileUnit()) {
2942       DICompileUnit CU(S);
2943       Dir = CU.getDirectory();
2944       Fn = CU.getFilename();
2945     } else if (Scope.isSubprogram()) {
2946       DISubprogram SP(S);
2947       Dir = SP.getDirectory();
2948       Fn = SP.getFilename();
2949     } else if (Scope.isLexicalBlock()) {
2950       DILexicalBlock DB(S);
2951       Dir = DB.getDirectory();
2952       Fn = DB.getFilename();
2953     } else
2954       assert(0 && "Unexpected scope info");
2955
2956     Src = GetOrCreateSourceID(Dir, Fn);
2957   }
2958
2959   MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2960   Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2961
2962   Asm->OutStreamer.EmitLabel(Label);
2963   return Label;
2964 }
2965
2966 //===----------------------------------------------------------------------===//
2967 // Emit Methods
2968 //===----------------------------------------------------------------------===//
2969
2970 /// computeSizeAndOffset - Compute the size and offset of a DIE.
2971 ///
2972 unsigned
2973 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2974   // Get the children.
2975   const std::vector<DIE *> &Children = Die->getChildren();
2976
2977   // If not last sibling and has children then add sibling offset attribute.
2978   if (!Last && !Children.empty())
2979     Die->addSiblingOffset(DIEValueAllocator);
2980
2981   // Record the abbreviation.
2982   assignAbbrevNumber(Die->getAbbrev());
2983
2984   // Get the abbreviation for this DIE.
2985   unsigned AbbrevNumber = Die->getAbbrevNumber();
2986   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2987
2988   // Set DIE offset
2989   Die->setOffset(Offset);
2990
2991   // Start the size with the size of abbreviation code.
2992   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2993
2994   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2995   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2996
2997   // Size the DIE attribute values.
2998   for (unsigned i = 0, N = Values.size(); i < N; ++i)
2999     // Size attribute value.
3000     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
3001
3002   // Size the DIE children if any.
3003   if (!Children.empty()) {
3004     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
3005            "Children flag not set");
3006
3007     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3008       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
3009
3010     // End of children marker.
3011     Offset += sizeof(int8_t);
3012   }
3013
3014   Die->setSize(Offset - Die->getOffset());
3015   return Offset;
3016 }
3017
3018 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
3019 ///
3020 void DwarfDebug::computeSizeAndOffsets() {
3021   unsigned PrevOffset = 0;
3022   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3023          E = CUMap.end(); I != E; ++I) {
3024     // Compute size of compile unit header.
3025     static unsigned Offset = PrevOffset +
3026       sizeof(int32_t) + // Length of Compilation Unit Info
3027       sizeof(int16_t) + // DWARF version number
3028       sizeof(int32_t) + // Offset Into Abbrev. Section
3029       sizeof(int8_t);   // Pointer Size (in bytes)
3030     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3031     PrevOffset = Offset;
3032   }
3033 }
3034
3035 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3036 /// temporary label to it if SymbolStem is specified.
3037 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
3038                                 const char *SymbolStem = 0) {
3039   Asm->OutStreamer.SwitchSection(Section);
3040   if (!SymbolStem) return 0;
3041
3042   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3043   Asm->OutStreamer.EmitLabel(TmpSym);
3044   return TmpSym;
3045 }
3046
3047 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
3048 /// the start of each one.
3049 void DwarfDebug::EmitSectionLabels() {
3050   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
3051
3052   // Dwarf sections base addresses.
3053   if (Asm->MAI->doesDwarfRequireFrameSection()) {
3054     DwarfFrameSectionSym =
3055       EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3056    }
3057
3058   DwarfInfoSectionSym =
3059     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3060   DwarfAbbrevSectionSym =
3061     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3062   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3063
3064   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3065     EmitSectionSym(Asm, MacroInfo);
3066
3067   DwarfDebugLineSectionSym =
3068     EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3069   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3070   EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3071   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3072   DwarfStrSectionSym =
3073     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3074   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3075                                              "debug_range");
3076
3077   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3078                                            "section_debug_loc");
3079
3080   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3081   EmitSectionSym(Asm, TLOF.getDataSection());
3082 }
3083
3084 /// emitDIE - Recusively Emits a debug information entry.
3085 ///
3086 void DwarfDebug::emitDIE(DIE *Die) {
3087   // Get the abbreviation for this DIE.
3088   unsigned AbbrevNumber = Die->getAbbrevNumber();
3089   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3090
3091   // Emit the code (index) for the abbreviation.
3092   if (Asm->isVerbose())
3093     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3094                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
3095                                 Twine::utohexstr(Die->getSize()) + " " +
3096                                 dwarf::TagString(Abbrev->getTag()));
3097   Asm->EmitULEB128(AbbrevNumber);
3098
3099   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3100   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3101
3102   // Emit the DIE attribute values.
3103   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3104     unsigned Attr = AbbrevData[i].getAttribute();
3105     unsigned Form = AbbrevData[i].getForm();
3106     assert(Form && "Too many attributes for DIE (check abbreviation)");
3107
3108     if (Asm->isVerbose())
3109       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3110
3111     switch (Attr) {
3112     case dwarf::DW_AT_sibling:
3113       Asm->EmitInt32(Die->getSiblingOffset());
3114       break;
3115     case dwarf::DW_AT_abstract_origin: {
3116       DIEEntry *E = cast<DIEEntry>(Values[i]);
3117       DIE *Origin = E->getEntry();
3118       unsigned Addr = Origin->getOffset();
3119       Asm->EmitInt32(Addr);
3120       break;
3121     }
3122     case dwarf::DW_AT_ranges: {
3123       // DW_AT_range Value encodes offset in debug_range section.
3124       DIEInteger *V = cast<DIEInteger>(Values[i]);
3125       Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3126                                      V->getValue(),
3127                                      DwarfDebugRangeSectionSym,
3128                                      4);
3129       break;
3130     }
3131     case dwarf::DW_AT_stmt_list: {
3132       Asm->EmitLabelDifference(CurrentLineSectionSym,
3133                                DwarfDebugLineSectionSym, 4);
3134       break;
3135     }
3136     case dwarf::DW_AT_location: {
3137       if (UseDotDebugLocEntry.count(Die) != 0) {
3138         DIELabel *L = cast<DIELabel>(Values[i]);
3139         Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3140       } else
3141         Values[i]->EmitValue(Asm, Form);
3142       break;
3143     }
3144     default:
3145       // Emit an attribute using the defined form.
3146       Values[i]->EmitValue(Asm, Form);
3147       break;
3148     }
3149   }
3150
3151   // Emit the DIE children if any.
3152   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3153     const std::vector<DIE *> &Children = Die->getChildren();
3154
3155     for (unsigned j = 0, M = Children.size(); j < M; ++j)
3156       emitDIE(Children[j]);
3157
3158     if (Asm->isVerbose())
3159       Asm->OutStreamer.AddComment("End Of Children Mark");
3160     Asm->EmitInt8(0);
3161   }
3162 }
3163
3164 /// emitDebugInfo - Emit the debug info section.
3165 ///
3166 void DwarfDebug::emitDebugInfo() {
3167   // Start debug info section.
3168   Asm->OutStreamer.SwitchSection(
3169                             Asm->getObjFileLowering().getDwarfInfoSection());
3170   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3171          E = CUMap.end(); I != E; ++I) {
3172     CompileUnit *TheCU = I->second;
3173     DIE *Die = TheCU->getCUDie();
3174
3175     // Emit the compile units header.
3176     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3177                                                   TheCU->getID()));
3178
3179     // Emit size of content not including length itself
3180     unsigned ContentSize = Die->getSize() +
3181       sizeof(int16_t) + // DWARF version number
3182       sizeof(int32_t) + // Offset Into Abbrev. Section
3183       sizeof(int8_t) +  // Pointer Size (in bytes)
3184       sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3185
3186     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3187     Asm->EmitInt32(ContentSize);
3188     Asm->OutStreamer.AddComment("DWARF version number");
3189     Asm->EmitInt16(dwarf::DWARF_VERSION);
3190     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3191     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3192                            DwarfAbbrevSectionSym);
3193     Asm->OutStreamer.AddComment("Address Size (in bytes)");
3194     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3195
3196     emitDIE(Die);
3197     // FIXME - extra padding for gdb bug.
3198     Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3199     Asm->EmitInt8(0);
3200     Asm->EmitInt8(0);
3201     Asm->EmitInt8(0);
3202     Asm->EmitInt8(0);
3203     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3204   }
3205 }
3206
3207 /// emitAbbreviations - Emit the abbreviation section.
3208 ///
3209 void DwarfDebug::emitAbbreviations() const {
3210   // Check to see if it is worth the effort.
3211   if (!Abbreviations.empty()) {
3212     // Start the debug abbrev section.
3213     Asm->OutStreamer.SwitchSection(
3214                             Asm->getObjFileLowering().getDwarfAbbrevSection());
3215
3216     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3217
3218     // For each abbrevation.
3219     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3220       // Get abbreviation data
3221       const DIEAbbrev *Abbrev = Abbreviations[i];
3222
3223       // Emit the abbrevations code (base 1 index.)
3224       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3225
3226       // Emit the abbreviations data.
3227       Abbrev->Emit(Asm);
3228     }
3229
3230     // Mark end of abbreviations.
3231     Asm->EmitULEB128(0, "EOM(3)");
3232
3233     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3234   }
3235 }
3236
3237 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
3238 /// the line matrix.
3239 ///
3240 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3241   // Define last address of section.
3242   Asm->OutStreamer.AddComment("Extended Op");
3243   Asm->EmitInt8(0);
3244
3245   Asm->OutStreamer.AddComment("Op size");
3246   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3247   Asm->OutStreamer.AddComment("DW_LNE_set_address");
3248   Asm->EmitInt8(dwarf::DW_LNE_set_address);
3249
3250   Asm->OutStreamer.AddComment("Section end label");
3251
3252   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3253                                    Asm->getTargetData().getPointerSize(),
3254                                    0/*AddrSpace*/);
3255
3256   // Mark end of matrix.
3257   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3258   Asm->EmitInt8(0);
3259   Asm->EmitInt8(1);
3260   Asm->EmitInt8(1);
3261 }
3262
3263 /// emitDebugLines - Emit source line information.
3264 ///
3265 void DwarfDebug::emitDebugLines() {
3266   // If the target is using .loc/.file, the assembler will be emitting the
3267   // .debug_line table automatically.
3268   if (Asm->MAI->hasDotLocAndDotFile())
3269     return;
3270
3271   // Minimum line delta, thus ranging from -10..(255-10).
3272   const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3273   // Maximum line delta, thus ranging from -10..(255-10).
3274   const int MaxLineDelta = 255 + MinLineDelta;
3275
3276   // Start the dwarf line section.
3277   Asm->OutStreamer.SwitchSection(
3278                             Asm->getObjFileLowering().getDwarfLineSection());
3279
3280   // Construct the section header.
3281   CurrentLineSectionSym = Asm->GetTempSymbol("section_line_begin");
3282   Asm->OutStreamer.EmitLabel(CurrentLineSectionSym);
3283   Asm->OutStreamer.AddComment("Length of Source Line Info");
3284   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3285                            Asm->GetTempSymbol("line_begin"), 4);
3286   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3287
3288   Asm->OutStreamer.AddComment("DWARF version number");
3289   Asm->EmitInt16(dwarf::DWARF_VERSION);
3290
3291   Asm->OutStreamer.AddComment("Prolog Length");
3292   Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3293                            Asm->GetTempSymbol("line_prolog_begin"), 4);
3294   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3295
3296   Asm->OutStreamer.AddComment("Minimum Instruction Length");
3297   Asm->EmitInt8(1);
3298   Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3299   Asm->EmitInt8(1);
3300   Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3301   Asm->EmitInt8(MinLineDelta);
3302   Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3303   Asm->EmitInt8(MaxLineDelta);
3304   Asm->OutStreamer.AddComment("Special Opcode Base");
3305   Asm->EmitInt8(-MinLineDelta);
3306
3307   // Line number standard opcode encodings argument count
3308   Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3309   Asm->EmitInt8(0);
3310   Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3311   Asm->EmitInt8(1);
3312   Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3313   Asm->EmitInt8(1);
3314   Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3315   Asm->EmitInt8(1);
3316   Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3317   Asm->EmitInt8(1);
3318   Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3319   Asm->EmitInt8(0);
3320   Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3321   Asm->EmitInt8(0);
3322   Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3323   Asm->EmitInt8(0);
3324   Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3325   Asm->EmitInt8(1);
3326
3327   // Emit directories.
3328   for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3329     const std::string &Dir = getSourceDirectoryName(DI);
3330     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3331     Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3332   }
3333
3334   Asm->OutStreamer.AddComment("End of directories");
3335   Asm->EmitInt8(0);
3336
3337   // Emit files.
3338   for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3339     // Remember source id starts at 1.
3340     std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3341     const std::string &FN = getSourceFileName(Id.second);
3342     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3343     Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3344
3345     Asm->EmitULEB128(Id.first, "Directory #");
3346     Asm->EmitULEB128(0, "Mod date");
3347     Asm->EmitULEB128(0, "File size");
3348   }
3349
3350   Asm->OutStreamer.AddComment("End of files");
3351   Asm->EmitInt8(0);
3352
3353   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3354
3355   // A sequence for each text section.
3356   unsigned SecSrcLinesSize = SectionSourceLines.size();
3357
3358   for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3359     // Isolate current sections line info.
3360     const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3361
3362     // Dwarf assumes we start with first line of first source file.
3363     unsigned Source = 1;
3364     unsigned Line = 1;
3365
3366     // Construct rows of the address, source, line, column matrix.
3367     for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3368       const SrcLineInfo &LineInfo = LineInfos[i];
3369       MCSymbol *Label = LineInfo.getLabel();
3370       if (!Label->isDefined()) continue; // Not emitted, in dead code.
3371
3372       if (Asm->isVerbose()) {
3373         std::pair<unsigned, unsigned> SrcID =
3374           getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3375         Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3376                                     "/" +
3377                                     Twine(getSourceFileName(SrcID.second)) +
3378                                     ":" + Twine(LineInfo.getLine()));
3379       }
3380
3381       // Define the line address.
3382       Asm->OutStreamer.AddComment("Extended Op");
3383       Asm->EmitInt8(0);
3384       Asm->OutStreamer.AddComment("Op size");
3385       Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3386
3387       Asm->OutStreamer.AddComment("DW_LNE_set_address");
3388       Asm->EmitInt8(dwarf::DW_LNE_set_address);
3389
3390       Asm->OutStreamer.AddComment("Location label");
3391       Asm->OutStreamer.EmitSymbolValue(Label,
3392                                        Asm->getTargetData().getPointerSize(),
3393                                        0/*AddrSpace*/);
3394
3395       // If change of source, then switch to the new source.
3396       if (Source != LineInfo.getSourceID()) {
3397         Source = LineInfo.getSourceID();
3398         Asm->OutStreamer.AddComment("DW_LNS_set_file");
3399         Asm->EmitInt8(dwarf::DW_LNS_set_file);
3400         Asm->EmitULEB128(Source, "New Source");
3401       }
3402
3403       // If change of line.
3404       if (Line != LineInfo.getLine()) {
3405         // Determine offset.
3406         int Offset = LineInfo.getLine() - Line;
3407         int Delta = Offset - MinLineDelta;
3408
3409         // Update line.
3410         Line = LineInfo.getLine();
3411
3412         // If delta is small enough and in range...
3413         if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3414           // ... then use fast opcode.
3415           Asm->OutStreamer.AddComment("Line Delta");
3416           Asm->EmitInt8(Delta - MinLineDelta);
3417         } else {
3418           // ... otherwise use long hand.
3419           Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3420           Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3421           Asm->EmitSLEB128(Offset, "Line Offset");
3422           Asm->OutStreamer.AddComment("DW_LNS_copy");
3423           Asm->EmitInt8(dwarf::DW_LNS_copy);
3424         }
3425       } else {
3426         // Copy the previous row (different address or source)
3427         Asm->OutStreamer.AddComment("DW_LNS_copy");
3428         Asm->EmitInt8(dwarf::DW_LNS_copy);
3429       }
3430     }
3431
3432     emitEndOfLineMatrix(j + 1);
3433   }
3434
3435   if (SecSrcLinesSize == 0)
3436     // Because we're emitting a debug_line section, we still need a line
3437     // table. The linker and friends expect it to exist. If there's nothing to
3438     // put into it, emit an empty table.
3439     emitEndOfLineMatrix(1);
3440
3441   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3442 }
3443
3444 /// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3445 ///
3446 void DwarfDebug::emitCommonDebugFrame() {
3447   if (!Asm->MAI->doesDwarfRequireFrameSection())
3448     return;
3449
3450   int stackGrowth = Asm->getTargetData().getPointerSize();
3451   if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3452       TargetFrameInfo::StackGrowsDown)
3453     stackGrowth *= -1;
3454
3455   // Start the dwarf frame section.
3456   Asm->OutStreamer.SwitchSection(
3457                               Asm->getObjFileLowering().getDwarfFrameSection());
3458
3459   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3460   Asm->OutStreamer.AddComment("Length of Common Information Entry");
3461   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3462                            Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3463
3464   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3465   Asm->OutStreamer.AddComment("CIE Identifier Tag");
3466   Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3467   Asm->OutStreamer.AddComment("CIE Version");
3468   Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3469   Asm->OutStreamer.AddComment("CIE Augmentation");
3470   Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3471   Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3472   Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3473   Asm->OutStreamer.AddComment("CIE RA Column");
3474   const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3475   Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3476
3477   std::vector<MachineMove> Moves;
3478   RI->getInitialFrameState(Moves);
3479
3480   Asm->EmitFrameMoves(Moves, 0, false);
3481
3482   Asm->EmitAlignment(2);
3483   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3484 }
3485
3486 /// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3487 /// section.
3488 void DwarfDebug::
3489 emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3490   if (!Asm->MAI->doesDwarfRequireFrameSection())
3491     return;
3492
3493   // Start the dwarf frame section.
3494   Asm->OutStreamer.SwitchSection(
3495                               Asm->getObjFileLowering().getDwarfFrameSection());
3496
3497   Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3498   MCSymbol *DebugFrameBegin =
3499     Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3500   MCSymbol *DebugFrameEnd =
3501     Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3502   Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3503
3504   Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3505
3506   Asm->OutStreamer.AddComment("FDE CIE offset");
3507   Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3508                          DwarfFrameSectionSym);
3509
3510   Asm->OutStreamer.AddComment("FDE initial location");
3511   MCSymbol *FuncBeginSym =
3512     Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3513   Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3514                                    Asm->getTargetData().getPointerSize(),
3515                                    0/*AddrSpace*/);
3516
3517
3518   Asm->OutStreamer.AddComment("FDE address range");
3519   Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3520                            FuncBeginSym, Asm->getTargetData().getPointerSize());
3521
3522   Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3523
3524   Asm->EmitAlignment(2);
3525   Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3526 }
3527
3528 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
3529 ///
3530 void DwarfDebug::emitDebugPubNames() {
3531   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3532          E = CUMap.end(); I != E; ++I) {
3533     CompileUnit *TheCU = I->second;
3534     // Start the dwarf pubnames section.
3535     Asm->OutStreamer.SwitchSection(
3536       Asm->getObjFileLowering().getDwarfPubNamesSection());
3537
3538     Asm->OutStreamer.AddComment("Length of Public Names Info");
3539     Asm->EmitLabelDifference(
3540       Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3541       Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3542
3543     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3544                                                   TheCU->getID()));
3545
3546     Asm->OutStreamer.AddComment("DWARF Version");
3547     Asm->EmitInt16(dwarf::DWARF_VERSION);
3548
3549     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3550     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3551                            DwarfInfoSectionSym);
3552
3553     Asm->OutStreamer.AddComment("Compilation Unit Length");
3554     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3555                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3556                              4);
3557
3558     const StringMap<DIE*> &Globals = TheCU->getGlobals();
3559     for (StringMap<DIE*>::const_iterator
3560            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3561       const char *Name = GI->getKeyData();
3562       DIE *Entity = GI->second;
3563
3564       Asm->OutStreamer.AddComment("DIE offset");
3565       Asm->EmitInt32(Entity->getOffset());
3566
3567       if (Asm->isVerbose())
3568         Asm->OutStreamer.AddComment("External Name");
3569       Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3570     }
3571
3572     Asm->OutStreamer.AddComment("End Mark");
3573     Asm->EmitInt32(0);
3574     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3575                                                 TheCU->getID()));
3576   }
3577 }
3578
3579 void DwarfDebug::emitDebugPubTypes() {
3580   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3581          E = CUMap.end(); I != E; ++I) {
3582     CompileUnit *TheCU = I->second;
3583     // Start the dwarf pubnames section.
3584     Asm->OutStreamer.SwitchSection(
3585       Asm->getObjFileLowering().getDwarfPubTypesSection());
3586     Asm->OutStreamer.AddComment("Length of Public Types Info");
3587     Asm->EmitLabelDifference(
3588       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3589       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3590
3591     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3592                                                   TheCU->getID()));
3593
3594     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3595     Asm->EmitInt16(dwarf::DWARF_VERSION);
3596
3597     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3598     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3599                            DwarfInfoSectionSym);
3600
3601     Asm->OutStreamer.AddComment("Compilation Unit Length");
3602     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3603                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
3604                              4);
3605
3606     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3607     for (StringMap<DIE*>::const_iterator
3608            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3609       const char *Name = GI->getKeyData();
3610       DIE * Entity = GI->second;
3611
3612       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3613       Asm->EmitInt32(Entity->getOffset());
3614
3615       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3616       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3617     }
3618
3619     Asm->OutStreamer.AddComment("End Mark");
3620     Asm->EmitInt32(0);
3621     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3622                                                   TheCU->getID()));
3623   }
3624 }
3625
3626 /// emitDebugStr - Emit visible names into a debug str section.
3627 ///
3628 void DwarfDebug::emitDebugStr() {
3629   // Check to see if it is worth the effort.
3630   if (StringPool.empty()) return;
3631
3632   // Start the dwarf str section.
3633   Asm->OutStreamer.SwitchSection(
3634                                 Asm->getObjFileLowering().getDwarfStrSection());
3635
3636   // Get all of the string pool entries and put them in an array by their ID so
3637   // we can sort them.
3638   SmallVector<std::pair<unsigned,
3639       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3640
3641   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3642        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3643     Entries.push_back(std::make_pair(I->second.second, &*I));
3644
3645   array_pod_sort(Entries.begin(), Entries.end());
3646
3647   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3648     // Emit a label for reference from debug information entries.
3649     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3650
3651     // Emit the string itself.
3652     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3653   }
3654 }
3655
3656 /// emitDebugLoc - Emit visible names into a debug loc section.
3657 ///
3658 void DwarfDebug::emitDebugLoc() {
3659   if (DotDebugLocEntries.empty())
3660     return;
3661
3662   // Start the dwarf loc section.
3663   Asm->OutStreamer.SwitchSection(
3664     Asm->getObjFileLowering().getDwarfLocSection());
3665   unsigned char Size = Asm->getTargetData().getPointerSize();
3666   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3667   unsigned index = 1;
3668   for (SmallVector<DotDebugLocEntry, 4>::iterator
3669          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3670        I != E; ++I, ++index) {
3671     DotDebugLocEntry Entry = *I;
3672     if (Entry.isEmpty()) {
3673       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3674       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3675       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3676     } else {
3677       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3678       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3679       const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3680       unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3681       if (int Offset =  Entry.Loc.getOffset()) {
3682         // If the value is at a certain offset from frame register then
3683         // use DW_OP_fbreg.
3684         unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
3685         Asm->OutStreamer.AddComment("Loc expr size");
3686         Asm->EmitInt16(1 + OffsetSize);
3687         Asm->OutStreamer.AddComment(
3688           dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3689         Asm->EmitInt8(dwarf::DW_OP_fbreg);
3690         Asm->OutStreamer.AddComment("Offset");
3691         Asm->EmitSLEB128(Offset);
3692       } else {
3693         if (Reg < 32) {
3694           Asm->OutStreamer.AddComment("Loc expr size");
3695           Asm->EmitInt16(1);
3696           Asm->OutStreamer.AddComment(
3697             dwarf::OperationEncodingString(dwarf::DW_OP_reg0 + Reg));
3698           Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3699         } else {
3700           Asm->OutStreamer.AddComment("Loc expr size");
3701           Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3702           Asm->EmitInt8(dwarf::DW_OP_regx);
3703           Asm->EmitULEB128(Reg);
3704         }
3705       }
3706     }
3707   }
3708 }
3709
3710 /// EmitDebugARanges - Emit visible names into a debug aranges section.
3711 ///
3712 void DwarfDebug::EmitDebugARanges() {
3713   // Start the dwarf aranges section.
3714   Asm->OutStreamer.SwitchSection(
3715                           Asm->getObjFileLowering().getDwarfARangesSection());
3716 }
3717
3718 /// emitDebugRanges - Emit visible names into a debug ranges section.
3719 ///
3720 void DwarfDebug::emitDebugRanges() {
3721   // Start the dwarf ranges section.
3722   Asm->OutStreamer.SwitchSection(
3723     Asm->getObjFileLowering().getDwarfRangesSection());
3724   unsigned char Size = Asm->getTargetData().getPointerSize();
3725   for (SmallVector<const MCSymbol *, 8>::iterator
3726          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3727        I != E; ++I) {
3728     if (*I)
3729       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3730     else
3731       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3732   }
3733 }
3734
3735 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3736 ///
3737 void DwarfDebug::emitDebugMacInfo() {
3738   if (const MCSection *LineInfo =
3739       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3740     // Start the dwarf macinfo section.
3741     Asm->OutStreamer.SwitchSection(LineInfo);
3742   }
3743 }
3744
3745 /// emitDebugInlineInfo - Emit inline info using following format.
3746 /// Section Header:
3747 /// 1. length of section
3748 /// 2. Dwarf version number
3749 /// 3. address size.
3750 ///
3751 /// Entries (one "entry" for each function that was inlined):
3752 ///
3753 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
3754 ///   otherwise offset into __debug_str for regular function name.
3755 /// 2. offset into __debug_str section for regular function name.
3756 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
3757 /// instances for the function.
3758 ///
3759 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
3760 /// inlined instance; the die_offset points to the inlined_subroutine die in the
3761 /// __debug_info section, and the low_pc is the starting address for the
3762 /// inlining instance.
3763 void DwarfDebug::emitDebugInlineInfo() {
3764   if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3765     return;
3766
3767   if (!FirstCU)
3768     return;
3769
3770   Asm->OutStreamer.SwitchSection(
3771                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
3772
3773   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3774   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3775                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3776
3777   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3778
3779   Asm->OutStreamer.AddComment("Dwarf Version");
3780   Asm->EmitInt16(dwarf::DWARF_VERSION);
3781   Asm->OutStreamer.AddComment("Address Size (in bytes)");
3782   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3783
3784   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3785          E = InlinedSPNodes.end(); I != E; ++I) {
3786
3787     const MDNode *Node = *I;
3788     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3789       = InlineInfo.find(Node);
3790     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3791     DISubprogram SP(Node);
3792     StringRef LName = SP.getLinkageName();
3793     StringRef Name = SP.getName();
3794
3795     Asm->OutStreamer.AddComment("MIPS linkage name");
3796     if (LName.empty()) {
3797       Asm->OutStreamer.EmitBytes(Name, 0);
3798       Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3799     } else
3800       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3801                              DwarfStrSectionSym);
3802
3803     Asm->OutStreamer.AddComment("Function name");
3804     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3805     Asm->EmitULEB128(Labels.size(), "Inline count");
3806
3807     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3808            LE = Labels.end(); LI != LE; ++LI) {
3809       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3810       Asm->EmitInt32(LI->second->getOffset());
3811
3812       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3813       Asm->OutStreamer.EmitSymbolValue(LI->first,
3814                                        Asm->getTargetData().getPointerSize(),0);
3815     }
3816   }
3817
3818   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3819 }