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