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