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