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