DwarfDebug.cpp revision b4645643de240e5b3461b03a9c6950fefe1538ac
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    ModuleCU->addDie(VariableSpecDIE);
1724  } else {
1725    DIEBlock *Block = new DIEBlock();
1726    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1727    addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1728                   Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1729    addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1730  }
1731  addToContextOwner(VariableDie, GVContext);
1732
1733  // Expose as global. FIXME - need to check external flag.
1734  ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1735
1736  DIType GTy = DI_GV.getType();
1737  if (GTy.isCompositeType() && !GTy.getName().empty()) {
1738    DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1739    assert (Entry && "Missing global type!");
1740    ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1741  }
1742  return;
1743}
1744
1745void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1746  DISubprogram SP(N);
1747
1748  // Check for pre-existence.
1749  if (ModuleCU->getDIE(N))
1750    return;
1751
1752  if (!SP.isDefinition())
1753    // This is a method declaration which will be handled while constructing
1754    // class type.
1755    return;
1756
1757  DIE *SubprogramDie = createSubprogramDIE(SP);
1758
1759  // Add to map.
1760  ModuleCU->insertDIE(N, SubprogramDie);
1761
1762  // Add to context owner.
1763  addToContextOwner(SubprogramDie, SP.getContext());
1764
1765  // Expose as global.
1766  ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1767
1768  return;
1769}
1770
1771/// beginModule - Emit all Dwarf sections that should come prior to the
1772/// content. Create global DIEs and emit initial debug info sections.
1773/// This is inovked by the target AsmPrinter.
1774void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
1775  this->M = M;
1776
1777  if (TimePassesIsEnabled)
1778    DebugTimer->startTimer();
1779
1780  if (!MAI->doesSupportDebugInformation())
1781    return;
1782
1783  DebugInfoFinder DbgFinder;
1784  DbgFinder.processModule(*M);
1785
1786  // Create all the compile unit DIEs.
1787  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1788         E = DbgFinder.compile_unit_end(); I != E; ++I)
1789    constructCompileUnit(*I);
1790
1791  if (CompileUnits.empty()) {
1792    if (TimePassesIsEnabled)
1793      DebugTimer->stopTimer();
1794
1795    return;
1796  }
1797
1798  // If main compile unit for this module is not seen than randomly
1799  // select first compile unit.
1800  if (!ModuleCU)
1801    ModuleCU = CompileUnits[0];
1802
1803  // Create DIEs for each subprogram.
1804  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1805         E = DbgFinder.subprogram_end(); I != E; ++I)
1806    constructSubprogramDIE(*I);
1807
1808  // Create DIEs for each global variable.
1809  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1810         E = DbgFinder.global_variable_end(); I != E; ++I)
1811    constructGlobalVariableDIE(*I);
1812
1813  MMI = mmi;
1814  shouldEmit = true;
1815  MMI->setDebugInfoAvailability(true);
1816
1817  // Prime section data.
1818  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1819
1820  // Print out .file directives to specify files for .loc directives. These are
1821  // printed out early so that they precede any .loc directives.
1822  if (MAI->hasDotLocAndDotFile()) {
1823    for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1824      // Remember source id starts at 1.
1825      std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1826      // FIXME: don't use sys::path for this!  This should not depend on the
1827      // host.
1828      sys::Path FullPath(getSourceDirectoryName(Id.first));
1829      bool AppendOk =
1830        FullPath.appendComponent(getSourceFileName(Id.second));
1831      assert(AppendOk && "Could not append filename to directory!");
1832      AppendOk = false;
1833      Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1834    }
1835  }
1836
1837  // Emit initial sections
1838  emitInitial();
1839
1840  if (TimePassesIsEnabled)
1841    DebugTimer->stopTimer();
1842}
1843
1844/// endModule - Emit all Dwarf sections that should come after the content.
1845///
1846void DwarfDebug::endModule() {
1847  if (!ModuleCU)
1848    return;
1849
1850  if (TimePassesIsEnabled)
1851    DebugTimer->startTimer();
1852
1853  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1854  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1855         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1856    DIE *ISP = *AI;
1857    addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1858  }
1859
1860  // Insert top level DIEs.
1861  for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1862         TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1863    ModuleCU->getCUDie()->addChild(*TI);
1864
1865  for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1866         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1867    DIE *SPDie = CI->first;
1868    MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1869    if (!N) continue;
1870    DIE *NDie = ModuleCU->getDIE(N);
1871    if (!NDie) continue;
1872    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1873    // FIXME - This is not the correct approach.
1874    // addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1875  }
1876
1877  // Standard sections final addresses.
1878  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1879  EmitLabel("text_end", 0);
1880  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1881  EmitLabel("data_end", 0);
1882
1883  // End text sections.
1884  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1885    Asm->OutStreamer.SwitchSection(SectionMap[i]);
1886    EmitLabel("section_end", i);
1887  }
1888
1889  // Emit common frame information.
1890  emitCommonDebugFrame();
1891
1892  // Emit function debug frame information
1893  for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1894         E = DebugFrames.end(); I != E; ++I)
1895    emitFunctionDebugFrame(*I);
1896
1897  // Compute DIE offsets and sizes.
1898  computeSizeAndOffsets();
1899
1900  // Emit all the DIEs into a debug info section
1901  emitDebugInfo();
1902
1903  // Corresponding abbreviations into a abbrev section.
1904  emitAbbreviations();
1905
1906  // Emit source line correspondence into a debug line section.
1907  emitDebugLines();
1908
1909  // Emit info into a debug pubnames section.
1910  emitDebugPubNames();
1911
1912  // Emit info into a debug pubtypes section.
1913  emitDebugPubTypes();
1914
1915  // Emit info into a debug str section.
1916  emitDebugStr();
1917
1918  // Emit info into a debug loc section.
1919  emitDebugLoc();
1920
1921  // Emit info into a debug aranges section.
1922  EmitDebugARanges();
1923
1924  // Emit info into a debug ranges section.
1925  emitDebugRanges();
1926
1927  // Emit info into a debug macinfo section.
1928  emitDebugMacInfo();
1929
1930  // Emit inline info.
1931  emitDebugInlineInfo();
1932
1933  if (TimePassesIsEnabled)
1934    DebugTimer->stopTimer();
1935}
1936
1937/// findAbstractVariable - Find abstract variable, if any, associated with Var.
1938DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1939                                              unsigned FrameIdx,
1940                                              DILocation &ScopeLoc) {
1941
1942  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1943  if (AbsDbgVariable)
1944    return AbsDbgVariable;
1945
1946  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1947  if (!Scope)
1948    return NULL;
1949
1950  AbsDbgVariable = new DbgVariable(Var, FrameIdx);
1951  Scope->addVariable(AbsDbgVariable);
1952  AbstractVariables[Var.getNode()] = AbsDbgVariable;
1953  return AbsDbgVariable;
1954}
1955
1956/// collectVariableInfo - Populate DbgScope entries with variables' info.
1957void DwarfDebug::collectVariableInfo() {
1958  if (!MMI) return;
1959
1960  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1961  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1962         VE = VMap.end(); VI != VE; ++VI) {
1963    MDNode *Var = VI->first;
1964    if (!Var) continue;
1965    DIVariable DV (Var);
1966    std::pair< unsigned, MDNode *> VP = VI->second;
1967    DILocation ScopeLoc(VP.second);
1968
1969    DbgScope *Scope =
1970      ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1971    if (!Scope)
1972      Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
1973    // If variable scope is not found then skip this variable.
1974    if (!Scope)
1975      continue;
1976
1977    DbgVariable *RegVar = new DbgVariable(DV, VP.first);
1978    Scope->addVariable(RegVar);
1979    if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1980                                                           ScopeLoc))
1981      RegVar->setAbstractVariable(AbsDbgVariable);
1982  }
1983}
1984
1985/// beginScope - Process beginning of a scope starting at Label.
1986void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
1987  InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1988  if (I == DbgScopeBeginMap.end())
1989    return;
1990  ScopeVector &SD = I->second;
1991  for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
1992       SDI != SDE; ++SDI)
1993    (*SDI)->setStartLabelID(Label);
1994}
1995
1996/// endScope - Process end of a scope.
1997void DwarfDebug::endScope(const MachineInstr *MI) {
1998  InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
1999  if (I == DbgScopeEndMap.end())
2000    return;
2001
2002  unsigned Label = MMI->NextLabelID();
2003  Asm->printLabel(Label);
2004  O << '\n';
2005
2006  SmallVector<DbgScope *, 2> &SD = I->second;
2007  for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2008       SDI != SDE; ++SDI)
2009    (*SDI)->setEndLabelID(Label);
2010  return;
2011}
2012
2013/// createDbgScope - Create DbgScope for the scope.
2014void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2015
2016  if (!InlinedAt) {
2017    DbgScope *WScope = DbgScopeMap.lookup(Scope);
2018    if (WScope)
2019      return;
2020    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2021    DbgScopeMap.insert(std::make_pair(Scope, WScope));
2022    if (DIDescriptor(Scope).isLexicalBlock())
2023      createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2024    return;
2025  }
2026
2027  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2028  if (WScope)
2029    return;
2030
2031  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2032  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2033  DILocation DL(InlinedAt);
2034  createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2035}
2036
2037/// extractScopeInformation - Scan machine instructions in this function
2038/// and collect DbgScopes. Return true, if atleast one scope was found.
2039bool DwarfDebug::extractScopeInformation() {
2040  // If scope information was extracted using .dbg intrinsics then there is not
2041  // any need to extract these information by scanning each instruction.
2042  if (!DbgScopeMap.empty())
2043    return false;
2044
2045  DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2046  unsigned MIIndex = 0;
2047  // Scan each instruction and create scopes. First build working set of scopes.
2048  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2049       I != E; ++I) {
2050    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2051         II != IE; ++II) {
2052      const MachineInstr *MInsn = II;
2053      MIIndexMap[MInsn] = MIIndex++;
2054      DebugLoc DL = MInsn->getDebugLoc();
2055      if (DL.isUnknown()) continue;
2056      DILocation DLT = MF->getDILocation(DL);
2057      DIScope DLTScope = DLT.getScope();
2058      if (DLTScope.isNull()) continue;
2059      // There is no need to create another DIE for compile unit. For all
2060      // other scopes, create one DbgScope now. This will be translated
2061      // into a scope DIE at the end.
2062      if (DLTScope.isCompileUnit()) continue;
2063      createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2064    }
2065  }
2066
2067
2068  // Build scope hierarchy using working set of scopes.
2069  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2070       I != E; ++I) {
2071    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2072         II != IE; ++II) {
2073      const MachineInstr *MInsn = II;
2074      DebugLoc DL = MInsn->getDebugLoc();
2075      if (DL.isUnknown())  continue;
2076      DILocation DLT = MF->getDILocation(DL);
2077      DIScope DLTScope = DLT.getScope();
2078      if (DLTScope.isNull())  continue;
2079      // There is no need to create another DIE for compile unit. For all
2080      // other scopes, create one DbgScope now. This will be translated
2081      // into a scope DIE at the end.
2082      if (DLTScope.isCompileUnit()) continue;
2083      DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2084                                           DLT.getOrigLocation().getNode());
2085      Scope->setLastInsn(MInsn);
2086    }
2087  }
2088
2089  if (!CurrentFnDbgScope)
2090    return false;
2091
2092  CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2093
2094  // Each scope has first instruction and last instruction to mark beginning
2095  // and end of a scope respectively. Create an inverse map that list scopes
2096  // starts (and ends) with an instruction. One instruction may start (or end)
2097  // multiple scopes. Ignore scopes that are not reachable.
2098  SmallVector<DbgScope *, 4> WorkList;
2099  WorkList.push_back(CurrentFnDbgScope);
2100  while (!WorkList.empty()) {
2101    DbgScope *S = WorkList.back(); WorkList.pop_back();
2102
2103    SmallVector<DbgScope *, 4> &Children = S->getScopes();
2104    if (!Children.empty())
2105      for (SmallVector<DbgScope *, 4>::iterator SI = Children.begin(),
2106             SE = Children.end(); SI != SE; ++SI)
2107        WorkList.push_back(*SI);
2108
2109    if (S->isAbstractScope())
2110      continue;
2111    const MachineInstr *MI = S->getFirstInsn();
2112    assert (MI && "DbgScope does not have first instruction!");
2113
2114    InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2115    if (IDI != DbgScopeBeginMap.end())
2116      IDI->second.push_back(S);
2117    else
2118      DbgScopeBeginMap[MI].push_back(S);
2119
2120    MI = S->getLastInsn();
2121    assert (MI && "DbgScope does not have last instruction!");
2122    IDI = DbgScopeEndMap.find(MI);
2123    if (IDI != DbgScopeEndMap.end())
2124      IDI->second.push_back(S);
2125    else
2126      DbgScopeEndMap[MI].push_back(S);
2127  }
2128
2129  return !DbgScopeMap.empty();
2130}
2131
2132/// beginFunction - Gather pre-function debug information.  Assumes being
2133/// emitted immediately after the function entry point.
2134void DwarfDebug::beginFunction(const MachineFunction *MF) {
2135  this->MF = MF;
2136
2137  if (!ShouldEmitDwarfDebug()) return;
2138
2139  if (TimePassesIsEnabled)
2140    DebugTimer->startTimer();
2141
2142  if (!extractScopeInformation())
2143    return;
2144
2145  collectVariableInfo();
2146
2147  // Assumes in correct section after the entry point.
2148  EmitLabel("func_begin", ++SubprogramCount);
2149
2150  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2151  // function.
2152  DebugLoc FDL = MF->getDefaultDebugLoc();
2153  if (!FDL.isUnknown()) {
2154    DILocation DLT = MF->getDILocation(FDL);
2155    unsigned LabelID = 0;
2156    DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2157    if (!SP.isNull())
2158      LabelID = recordSourceLine(SP.getLineNumber(), 0,
2159                                 DLT.getScope().getNode());
2160    else
2161      LabelID = recordSourceLine(DLT.getLineNumber(),
2162                                 DLT.getColumnNumber(),
2163                                 DLT.getScope().getNode());
2164    Asm->printLabel(LabelID);
2165    O << '\n';
2166  }
2167  if (TimePassesIsEnabled)
2168    DebugTimer->stopTimer();
2169}
2170
2171/// endFunction - Gather and emit post-function debug information.
2172///
2173void DwarfDebug::endFunction(const MachineFunction *MF) {
2174  if (!ShouldEmitDwarfDebug()) return;
2175
2176  if (TimePassesIsEnabled)
2177    DebugTimer->startTimer();
2178
2179  if (DbgScopeMap.empty())
2180    return;
2181
2182  if (CurrentFnDbgScope) {
2183    // Define end label for subprogram.
2184    EmitLabel("func_end", SubprogramCount);
2185
2186    // Get function line info.
2187    if (!Lines.empty()) {
2188      // Get section line info.
2189      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2190      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2191      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2192      // Append the function info to section info.
2193      SectionLineInfos.insert(SectionLineInfos.end(),
2194                              Lines.begin(), Lines.end());
2195    }
2196
2197    // Construct abstract scopes.
2198    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2199           AE = AbstractScopesList.end(); AI != AE; ++AI)
2200      constructScopeDIE(*AI);
2201
2202    constructScopeDIE(CurrentFnDbgScope);
2203
2204    DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2205                                                 MMI->getFrameMoves()));
2206  }
2207
2208  // Clear debug info
2209  CurrentFnDbgScope = NULL;
2210  DbgScopeMap.clear();
2211  DbgScopeBeginMap.clear();
2212  DbgScopeEndMap.clear();
2213  ConcreteScopes.clear();
2214  AbstractScopesList.clear();
2215  Lines.clear();
2216
2217  if (TimePassesIsEnabled)
2218    DebugTimer->stopTimer();
2219}
2220
2221/// recordSourceLine - Records location information and associates it with a
2222/// label. Returns a unique label ID used to generate a label and provide
2223/// correspondence to the source line list.
2224unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2225                                      MDNode *S) {
2226  if (!MMI)
2227    return 0;
2228
2229  if (TimePassesIsEnabled)
2230    DebugTimer->startTimer();
2231
2232  StringRef Dir;
2233  StringRef Fn;
2234
2235  DIDescriptor Scope(S);
2236  if (Scope.isCompileUnit()) {
2237    DICompileUnit CU(S);
2238    Dir = CU.getDirectory();
2239    Fn = CU.getFilename();
2240  } else if (Scope.isSubprogram()) {
2241    DISubprogram SP(S);
2242    Dir = SP.getDirectory();
2243    Fn = SP.getFilename();
2244  } else if (Scope.isLexicalBlock()) {
2245    DILexicalBlock DB(S);
2246    Dir = DB.getDirectory();
2247    Fn = DB.getFilename();
2248  } else
2249    assert (0 && "Unexpected scope info");
2250
2251  unsigned Src = GetOrCreateSourceID(Dir, Fn);
2252  unsigned ID = MMI->NextLabelID();
2253  Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2254
2255  if (TimePassesIsEnabled)
2256    DebugTimer->stopTimer();
2257
2258  return ID;
2259}
2260
2261/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2262/// timed. Look up the source id with the given directory and source file
2263/// names. If none currently exists, create a new id and insert it in the
2264/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2265/// well.
2266unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2267                                         const std::string &FileName) {
2268  if (TimePassesIsEnabled)
2269    DebugTimer->startTimer();
2270
2271  unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2272
2273  if (TimePassesIsEnabled)
2274    DebugTimer->stopTimer();
2275
2276  return SrcId;
2277}
2278
2279//===----------------------------------------------------------------------===//
2280// Emit Methods
2281//===----------------------------------------------------------------------===//
2282
2283/// computeSizeAndOffset - Compute the size and offset of a DIE.
2284///
2285unsigned
2286DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2287  // Get the children.
2288  const std::vector<DIE *> &Children = Die->getChildren();
2289
2290  // If not last sibling and has children then add sibling offset attribute.
2291  if (!Last && !Children.empty()) Die->addSiblingOffset();
2292
2293  // Record the abbreviation.
2294  assignAbbrevNumber(Die->getAbbrev());
2295
2296  // Get the abbreviation for this DIE.
2297  unsigned AbbrevNumber = Die->getAbbrevNumber();
2298  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2299
2300  // Set DIE offset
2301  Die->setOffset(Offset);
2302
2303  // Start the size with the size of abbreviation code.
2304  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2305
2306  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2307  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2308
2309  // Size the DIE attribute values.
2310  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2311    // Size attribute value.
2312    Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2313
2314  // Size the DIE children if any.
2315  if (!Children.empty()) {
2316    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2317           "Children flag not set");
2318
2319    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2320      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2321
2322    // End of children marker.
2323    Offset += sizeof(int8_t);
2324  }
2325
2326  Die->setSize(Offset - Die->getOffset());
2327  return Offset;
2328}
2329
2330/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2331///
2332void DwarfDebug::computeSizeAndOffsets() {
2333  // Compute size of compile unit header.
2334  static unsigned Offset =
2335    sizeof(int32_t) + // Length of Compilation Unit Info
2336    sizeof(int16_t) + // DWARF version number
2337    sizeof(int32_t) + // Offset Into Abbrev. Section
2338    sizeof(int8_t);   // Pointer Size (in bytes)
2339
2340  computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2341  CompileUnitOffsets[ModuleCU] = 0;
2342}
2343
2344/// emitInitial - Emit initial Dwarf declarations.  This is necessary for cc
2345/// tools to recognize the object file contains Dwarf information.
2346void DwarfDebug::emitInitial() {
2347  // Check to see if we already emitted intial headers.
2348  if (didInitial) return;
2349  didInitial = true;
2350
2351  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2352
2353  // Dwarf sections base addresses.
2354  if (MAI->doesDwarfRequireFrameSection()) {
2355    Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2356    EmitLabel("section_debug_frame", 0);
2357  }
2358
2359  Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2360  EmitLabel("section_info", 0);
2361  Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2362  EmitLabel("section_abbrev", 0);
2363  Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2364  EmitLabel("section_aranges", 0);
2365
2366  if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2367    Asm->OutStreamer.SwitchSection(LineInfoDirective);
2368    EmitLabel("section_macinfo", 0);
2369  }
2370
2371  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2372  EmitLabel("section_line", 0);
2373  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2374  EmitLabel("section_loc", 0);
2375  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2376  EmitLabel("section_pubnames", 0);
2377  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2378  EmitLabel("section_pubtypes", 0);
2379  Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2380  EmitLabel("section_str", 0);
2381  Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2382  EmitLabel("section_ranges", 0);
2383
2384  Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2385  EmitLabel("text_begin", 0);
2386  Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2387  EmitLabel("data_begin", 0);
2388}
2389
2390/// emitDIE - Recusively Emits a debug information entry.
2391///
2392void DwarfDebug::emitDIE(DIE *Die) {
2393  // Get the abbreviation for this DIE.
2394  unsigned AbbrevNumber = Die->getAbbrevNumber();
2395  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2396
2397  Asm->O << '\n';
2398
2399  // Emit the code (index) for the abbreviation.
2400  if (Asm->VerboseAsm)
2401    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2402                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2403                                Twine::utohexstr(Die->getSize()) + " " +
2404                                dwarf::TagString(Abbrev->getTag()));
2405  EmitULEB128(AbbrevNumber);
2406
2407  SmallVector<DIEValue*, 32> &Values = Die->getValues();
2408  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2409
2410  // Emit the DIE attribute values.
2411  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2412    unsigned Attr = AbbrevData[i].getAttribute();
2413    unsigned Form = AbbrevData[i].getForm();
2414    assert(Form && "Too many attributes for DIE (check abbreviation)");
2415
2416    if (Asm->VerboseAsm)
2417      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2418
2419    switch (Attr) {
2420    case dwarf::DW_AT_sibling:
2421      Asm->EmitInt32(Die->getSiblingOffset());
2422      break;
2423    case dwarf::DW_AT_abstract_origin: {
2424      DIEEntry *E = cast<DIEEntry>(Values[i]);
2425      DIE *Origin = E->getEntry();
2426      unsigned Addr = Origin->getOffset();
2427      Asm->EmitInt32(Addr);
2428      break;
2429    }
2430    default:
2431      // Emit an attribute using the defined form.
2432      Values[i]->EmitValue(this, Form);
2433      O << "\n"; // REMOVE This once all EmitValue impls emit their own newline.
2434      break;
2435    }
2436  }
2437
2438  // Emit the DIE children if any.
2439  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2440    const std::vector<DIE *> &Children = Die->getChildren();
2441
2442    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2443      emitDIE(Children[j]);
2444
2445    Asm->EmitInt8(0); EOL("End Of Children Mark");
2446  }
2447}
2448
2449/// emitDebugInfo - Emit the debug info section.
2450///
2451void DwarfDebug::emitDebugInfo() {
2452  // Start debug info section.
2453  Asm->OutStreamer.SwitchSection(
2454                            Asm->getObjFileLowering().getDwarfInfoSection());
2455  DIE *Die = ModuleCU->getCUDie();
2456
2457  // Emit the compile units header.
2458  EmitLabel("info_begin", ModuleCU->getID());
2459
2460  // Emit size of content not including length itself
2461  unsigned ContentSize = Die->getSize() +
2462    sizeof(int16_t) + // DWARF version number
2463    sizeof(int32_t) + // Offset Into Abbrev. Section
2464    sizeof(int8_t) +  // Pointer Size (in bytes)
2465    sizeof(int32_t);  // FIXME - extra pad for gdb bug.
2466
2467  Asm->EmitInt32(ContentSize);  EOL("Length of Compilation Unit Info");
2468  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2469  EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2470  EOL("Offset Into Abbrev. Section");
2471  Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2472
2473  emitDIE(Die);
2474  // FIXME - extra padding for gdb bug.
2475  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
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  EmitLabel("info_end", ModuleCU->getID());
2480  Asm->O << '\n';
2481}
2482
2483/// emitAbbreviations - Emit the abbreviation section.
2484///
2485void DwarfDebug::emitAbbreviations() const {
2486  // Check to see if it is worth the effort.
2487  if (!Abbreviations.empty()) {
2488    // Start the debug abbrev section.
2489    Asm->OutStreamer.SwitchSection(
2490                            Asm->getObjFileLowering().getDwarfAbbrevSection());
2491
2492    EmitLabel("abbrev_begin", 0);
2493
2494    // For each abbrevation.
2495    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2496      // Get abbreviation data
2497      const DIEAbbrev *Abbrev = Abbreviations[i];
2498
2499      // Emit the abbrevations code (base 1 index.)
2500      EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2501
2502      // Emit the abbreviations data.
2503      Abbrev->Emit(this);
2504      Asm->O << '\n';
2505    }
2506
2507    // Mark end of abbreviations.
2508    EmitULEB128(0, "EOM(3)");
2509
2510    EmitLabel("abbrev_end", 0);
2511    Asm->O << '\n';
2512  }
2513}
2514
2515/// emitEndOfLineMatrix - Emit the last address of the section and the end of
2516/// the line matrix.
2517///
2518void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2519  // Define last address of section.
2520  Asm->EmitInt8(0); EOL("Extended Op");
2521  Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2522  Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2523  EmitReference("section_end", SectionEnd); EOL("Section end label");
2524
2525  // Mark end of matrix.
2526  Asm->EmitInt8(0); EOL("DW_LNE_end_sequence");
2527  Asm->EmitInt8(1);
2528  Asm->EmitInt8(1);
2529}
2530
2531/// emitDebugLines - Emit source line information.
2532///
2533void DwarfDebug::emitDebugLines() {
2534  // If the target is using .loc/.file, the assembler will be emitting the
2535  // .debug_line table automatically.
2536  if (MAI->hasDotLocAndDotFile())
2537    return;
2538
2539  // Minimum line delta, thus ranging from -10..(255-10).
2540  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2541  // Maximum line delta, thus ranging from -10..(255-10).
2542  const int MaxLineDelta = 255 + MinLineDelta;
2543
2544  // Start the dwarf line section.
2545  Asm->OutStreamer.SwitchSection(
2546                            Asm->getObjFileLowering().getDwarfLineSection());
2547
2548  // Construct the section header.
2549  EmitDifference("line_end", 0, "line_begin", 0, true);
2550  EOL("Length of Source Line Info");
2551  EmitLabel("line_begin", 0);
2552
2553  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2554
2555  EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2556  EOL("Prolog Length");
2557  EmitLabel("line_prolog_begin", 0);
2558
2559  Asm->EmitInt8(1); EOL("Minimum Instruction Length");
2560  Asm->EmitInt8(1); EOL("Default is_stmt_start flag");
2561  Asm->EmitInt8(MinLineDelta); EOL("Line Base Value (Special Opcodes)");
2562  Asm->EmitInt8(MaxLineDelta); EOL("Line Range Value (Special Opcodes)");
2563  Asm->EmitInt8(-MinLineDelta); EOL("Special Opcode Base");
2564
2565  // Line number standard opcode encodings argument count
2566  Asm->EmitInt8(0); EOL("DW_LNS_copy arg count");
2567  Asm->EmitInt8(1); EOL("DW_LNS_advance_pc arg count");
2568  Asm->EmitInt8(1); EOL("DW_LNS_advance_line arg count");
2569  Asm->EmitInt8(1); EOL("DW_LNS_set_file arg count");
2570  Asm->EmitInt8(1); EOL("DW_LNS_set_column arg count");
2571  Asm->EmitInt8(0); EOL("DW_LNS_negate_stmt arg count");
2572  Asm->EmitInt8(0); EOL("DW_LNS_set_basic_block arg count");
2573  Asm->EmitInt8(0); EOL("DW_LNS_const_add_pc arg count");
2574  Asm->EmitInt8(1); EOL("DW_LNS_fixed_advance_pc arg count");
2575
2576  // Emit directories.
2577  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2578    const std::string &Dir = getSourceDirectoryName(DI);
2579    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2580    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2581  }
2582
2583  Asm->EmitInt8(0); EOL("End of directories");
2584
2585  // Emit files.
2586  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2587    // Remember source id starts at 1.
2588    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2589    const std::string &FN = getSourceFileName(Id.second);
2590    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2591    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2592
2593    EmitULEB128(Id.first, "Directory #");
2594    EmitULEB128(0, "Mod date");
2595    EmitULEB128(0, "File size");
2596  }
2597
2598  Asm->EmitInt8(0); EOL("End of files");
2599
2600  EmitLabel("line_prolog_end", 0);
2601
2602  // A sequence for each text section.
2603  unsigned SecSrcLinesSize = SectionSourceLines.size();
2604
2605  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2606    // Isolate current sections line info.
2607    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2608
2609    /*if (Asm->isVerbose()) {
2610      const MCSection *S = SectionMap[j + 1];
2611      O << '\t' << MAI->getCommentString() << " Section"
2612        << S->getName() << '\n';
2613    }*/
2614    Asm->O << '\n';
2615
2616    // Dwarf assumes we start with first line of first source file.
2617    unsigned Source = 1;
2618    unsigned Line = 1;
2619
2620    // Construct rows of the address, source, line, column matrix.
2621    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2622      const SrcLineInfo &LineInfo = LineInfos[i];
2623      unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2624      if (!LabelID) continue;
2625
2626      if (LineInfo.getLine() == 0) continue;
2627
2628      if (!Asm->isVerbose())
2629        Asm->O << '\n';
2630      else {
2631        std::pair<unsigned, unsigned> SourceID =
2632          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2633        O << '\t' << MAI->getCommentString() << ' '
2634          << getSourceDirectoryName(SourceID.first) << '/'
2635          << getSourceFileName(SourceID.second)
2636          << ':' << utostr_32(LineInfo.getLine()) << '\n';
2637      }
2638
2639      // Define the line address.
2640      Asm->EmitInt8(0); EOL("Extended Op");
2641      Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2642      Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2643      EmitReference("label",  LabelID); EOL("Location label");
2644
2645      // If change of source, then switch to the new source.
2646      if (Source != LineInfo.getSourceID()) {
2647        Source = LineInfo.getSourceID();
2648        Asm->EmitInt8(dwarf::DW_LNS_set_file); EOL("DW_LNS_set_file");
2649        EmitULEB128(Source, "New Source");
2650      }
2651
2652      // If change of line.
2653      if (Line != LineInfo.getLine()) {
2654        // Determine offset.
2655        int Offset = LineInfo.getLine() - Line;
2656        int Delta = Offset - MinLineDelta;
2657
2658        // Update line.
2659        Line = LineInfo.getLine();
2660
2661        // If delta is small enough and in range...
2662        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2663          // ... then use fast opcode.
2664          Asm->EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
2665        } else {
2666          // ... otherwise use long hand.
2667          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2668          EOL("DW_LNS_advance_line");
2669          EmitSLEB128(Offset, "Line Offset");
2670          Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2671        }
2672      } else {
2673        // Copy the previous row (different address or source)
2674        Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2675      }
2676    }
2677
2678    emitEndOfLineMatrix(j + 1);
2679  }
2680
2681  if (SecSrcLinesSize == 0)
2682    // Because we're emitting a debug_line section, we still need a line
2683    // table. The linker and friends expect it to exist. If there's nothing to
2684    // put into it, emit an empty table.
2685    emitEndOfLineMatrix(1);
2686
2687  EmitLabel("line_end", 0);
2688  Asm->O << '\n';
2689}
2690
2691/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2692///
2693void DwarfDebug::emitCommonDebugFrame() {
2694  if (!MAI->doesDwarfRequireFrameSection())
2695    return;
2696
2697  int stackGrowth =
2698    Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2699      TargetFrameInfo::StackGrowsUp ?
2700    TD->getPointerSize() : -TD->getPointerSize();
2701
2702  // Start the dwarf frame section.
2703  Asm->OutStreamer.SwitchSection(
2704                              Asm->getObjFileLowering().getDwarfFrameSection());
2705
2706  EmitLabel("debug_frame_common", 0);
2707  EmitDifference("debug_frame_common_end", 0,
2708                 "debug_frame_common_begin", 0, true);
2709  EOL("Length of Common Information Entry");
2710
2711  EmitLabel("debug_frame_common_begin", 0);
2712  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2713  EOL("CIE Identifier Tag");
2714  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2715  EOL("CIE Version");
2716  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2717  EOL("CIE Augmentation");
2718  EmitULEB128(1, "CIE Code Alignment Factor");
2719  EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2720  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2721  EOL("CIE RA Column");
2722
2723  std::vector<MachineMove> Moves;
2724  RI->getInitialFrameState(Moves);
2725
2726  EmitFrameMoves(NULL, 0, Moves, false);
2727
2728  Asm->EmitAlignment(2, 0, 0, false);
2729  EmitLabel("debug_frame_common_end", 0);
2730  Asm->O << '\n';
2731}
2732
2733/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2734/// section.
2735void
2736DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
2737  if (!MAI->doesDwarfRequireFrameSection())
2738    return;
2739
2740  // Start the dwarf frame section.
2741  Asm->OutStreamer.SwitchSection(
2742                              Asm->getObjFileLowering().getDwarfFrameSection());
2743
2744  EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2745                 "debug_frame_begin", DebugFrameInfo.Number, true);
2746  EOL("Length of Frame Information Entry");
2747
2748  EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2749
2750  EmitSectionOffset("debug_frame_common", "section_debug_frame",
2751                    0, 0, true, false);
2752  EOL("FDE CIE offset");
2753
2754  EmitReference("func_begin", DebugFrameInfo.Number);
2755  EOL("FDE initial location");
2756  EmitDifference("func_end", DebugFrameInfo.Number,
2757                 "func_begin", DebugFrameInfo.Number);
2758  EOL("FDE address range");
2759
2760  EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2761                 false);
2762
2763  Asm->EmitAlignment(2, 0, 0, false);
2764  EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2765  Asm->O << '\n';
2766}
2767
2768/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2769///
2770void DwarfDebug::emitDebugPubNames() {
2771  // Start the dwarf pubnames section.
2772  Asm->OutStreamer.SwitchSection(
2773                          Asm->getObjFileLowering().getDwarfPubNamesSection());
2774
2775  EmitDifference("pubnames_end", ModuleCU->getID(),
2776                 "pubnames_begin", ModuleCU->getID(), true);
2777  EOL("Length of Public Names Info");
2778
2779  EmitLabel("pubnames_begin", ModuleCU->getID());
2780
2781  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
2782
2783  EmitSectionOffset("info_begin", "section_info",
2784                    ModuleCU->getID(), 0, true, false);
2785  EOL("Offset of Compilation Unit Info");
2786
2787  EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2788                 true);
2789  EOL("Compilation Unit Length");
2790
2791  const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2792  for (StringMap<DIE*>::const_iterator
2793         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2794    const char *Name = GI->getKeyData();
2795    DIE * Entity = GI->second;
2796
2797    Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
2798
2799    if (Asm->VerboseAsm)
2800      Asm->OutStreamer.AddComment("External Name");
2801    Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2802  }
2803
2804  Asm->EmitInt32(0); EOL("End Mark");
2805  EmitLabel("pubnames_end", ModuleCU->getID());
2806  Asm->O << '\n';
2807}
2808
2809void DwarfDebug::emitDebugPubTypes() {
2810  // Start the dwarf pubnames section.
2811  Asm->OutStreamer.SwitchSection(
2812                          Asm->getObjFileLowering().getDwarfPubTypesSection());
2813  EmitDifference("pubtypes_end", ModuleCU->getID(),
2814                 "pubtypes_begin", ModuleCU->getID(), true);
2815  EOL("Length of Public Types Info");
2816
2817  EmitLabel("pubtypes_begin", ModuleCU->getID());
2818
2819  if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2820  Asm->EmitInt16(dwarf::DWARF_VERSION);
2821
2822  EmitSectionOffset("info_begin", "section_info",
2823                    ModuleCU->getID(), 0, true, false);
2824  EOL("Offset of Compilation ModuleCU Info");
2825
2826  EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2827                 true);
2828  EOL("Compilation ModuleCU Length");
2829
2830  const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2831  for (StringMap<DIE*>::const_iterator
2832         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2833    const char *Name = GI->getKeyData();
2834    DIE * Entity = GI->second;
2835
2836    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2837    Asm->EmitInt32(Entity->getOffset());
2838
2839    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2840    Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2841  }
2842
2843  Asm->EmitInt32(0); EOL("End Mark");
2844  EmitLabel("pubtypes_end", ModuleCU->getID());
2845  Asm->O << '\n';
2846}
2847
2848/// emitDebugStr - Emit visible names into a debug str section.
2849///
2850void DwarfDebug::emitDebugStr() {
2851  // Check to see if it is worth the effort.
2852  if (!StringPool.empty()) {
2853    // Start the dwarf str section.
2854    Asm->OutStreamer.SwitchSection(
2855                                Asm->getObjFileLowering().getDwarfStrSection());
2856
2857    // For each of strings in the string pool.
2858    for (unsigned StringID = 1, N = StringPool.size();
2859         StringID <= N; ++StringID) {
2860      // Emit a label for reference from debug information entries.
2861      EmitLabel("string", StringID);
2862
2863      // Emit the string itself.
2864      const std::string &String = StringPool[StringID];
2865      Asm->OutStreamer.EmitBytes(StringRef(String.c_str(), String.size()+1), 0);
2866    }
2867
2868    Asm->O << '\n';
2869  }
2870}
2871
2872/// emitDebugLoc - Emit visible names into a debug loc section.
2873///
2874void DwarfDebug::emitDebugLoc() {
2875  // Start the dwarf loc section.
2876  Asm->OutStreamer.SwitchSection(
2877                              Asm->getObjFileLowering().getDwarfLocSection());
2878}
2879
2880/// EmitDebugARanges - Emit visible names into a debug aranges section.
2881///
2882void DwarfDebug::EmitDebugARanges() {
2883  // Start the dwarf aranges section.
2884  Asm->OutStreamer.SwitchSection(
2885                          Asm->getObjFileLowering().getDwarfARangesSection());
2886
2887  // FIXME - Mock up
2888#if 0
2889  CompileUnit *Unit = GetBaseCompileUnit();
2890
2891  // Don't include size of length
2892  Asm->EmitInt32(0x1c); EOL("Length of Address Ranges Info");
2893
2894  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2895
2896  EmitReference("info_begin", Unit->getID());
2897  EOL("Offset of Compilation Unit Info");
2898
2899  Asm->EmitInt8(TD->getPointerSize()); EOL("Size of Address");
2900
2901  Asm->EmitInt8(0); EOL("Size of Segment Descriptor");
2902
2903  Asm->EmitInt16(0);  EOL("Pad (1)");
2904  Asm->EmitInt16(0);  EOL("Pad (2)");
2905
2906  // Range 1
2907  EmitReference("text_begin", 0); EOL("Address");
2908  EmitDifference("text_end", 0, "text_begin", 0, true); EOL("Length");
2909
2910  Asm->EmitInt32(0); EOL("EOM (1)");
2911  Asm->EmitInt32(0); EOL("EOM (2)");
2912#endif
2913}
2914
2915/// emitDebugRanges - Emit visible names into a debug ranges section.
2916///
2917void DwarfDebug::emitDebugRanges() {
2918  // Start the dwarf ranges section.
2919  Asm->OutStreamer.SwitchSection(
2920                            Asm->getObjFileLowering().getDwarfRangesSection());
2921}
2922
2923/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2924///
2925void DwarfDebug::emitDebugMacInfo() {
2926  if (const MCSection *LineInfo =
2927      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2928    // Start the dwarf macinfo section.
2929    Asm->OutStreamer.SwitchSection(LineInfo);
2930  }
2931}
2932
2933/// emitDebugInlineInfo - Emit inline info using following format.
2934/// Section Header:
2935/// 1. length of section
2936/// 2. Dwarf version number
2937/// 3. address size.
2938///
2939/// Entries (one "entry" for each function that was inlined):
2940///
2941/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2942///   otherwise offset into __debug_str for regular function name.
2943/// 2. offset into __debug_str section for regular function name.
2944/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2945/// instances for the function.
2946///
2947/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2948/// inlined instance; the die_offset points to the inlined_subroutine die in the
2949/// __debug_info section, and the low_pc is the starting address for the
2950/// inlining instance.
2951void DwarfDebug::emitDebugInlineInfo() {
2952  if (!MAI->doesDwarfUsesInlineInfoSection())
2953    return;
2954
2955  if (!ModuleCU)
2956    return;
2957
2958  Asm->OutStreamer.SwitchSection(
2959                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
2960
2961  EmitDifference("debug_inlined_end", 1,
2962                 "debug_inlined_begin", 1, true);
2963  EOL("Length of Debug Inlined Information Entry");
2964
2965  EmitLabel("debug_inlined_begin", 1);
2966
2967  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2968  Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2969
2970  for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2971         E = InlinedSPNodes.end(); I != E; ++I) {
2972
2973    MDNode *Node = *I;
2974    DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2975      = InlineInfo.find(Node);
2976    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2977    DISubprogram SP(Node);
2978    StringRef LName = SP.getLinkageName();
2979    StringRef Name = SP.getName();
2980
2981    if (LName.empty()) {
2982      Asm->OutStreamer.EmitBytes(Name, 0);
2983      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2984    } else
2985      EmitSectionOffset("string", "section_str",
2986                      StringPool.idFor(getRealLinkageName(LName)), false, true);
2987
2988    EOL("MIPS linkage name");
2989    EmitSectionOffset("string", "section_str",
2990                      StringPool.idFor(Name), false, true);
2991    EOL("Function name");
2992    EmitULEB128(Labels.size(), "Inline count");
2993
2994    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2995           LE = Labels.end(); LI != LE; ++LI) {
2996      DIE *SP = LI->second;
2997      Asm->EmitInt32(SP->getOffset()); EOL("DIE offset");
2998
2999      if (TD->getPointerSize() == sizeof(int32_t))
3000        O << MAI->getData32bitsDirective();
3001      else
3002        O << MAI->getData64bitsDirective();
3003
3004      PrintLabelName("label", LI->first); EOL("low_pc");
3005    }
3006  }
3007
3008  EmitLabel("debug_inlined_end", 1);
3009  Asm->O << '\n';
3010}
3011