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