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