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