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