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