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