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