DwarfDebug.cpp revision ae89d3b83bf8b2c3cf0be362ab872c162bad23ec
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
943        ElemDie = createMemberDIE(DIDerivedType(Element.getNode()));
944      Buffer.addChild(ElemDie);
945    }
946
947    if (CTy.isAppleBlockExtension())
948      addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
949
950    unsigned RLang = CTy.getRunTimeLang();
951    if (RLang)
952      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
953              dwarf::DW_FORM_data1, RLang);
954
955    DICompositeType ContainingType = CTy.getContainingType();
956    if (!ContainingType.isNull())
957      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
958                  getOrCreateTypeDIE(DIType(ContainingType.getNode())));
959    break;
960  }
961  default:
962    break;
963  }
964
965  // Add name if not anonymous or intermediate type.
966  if (!Name.empty())
967    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
968
969  if (Tag == dwarf::DW_TAG_enumeration_type ||
970      Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
971    // Add size if non-zero (derived types might be zero-sized.)
972    if (Size)
973      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
974    else {
975      // Add zero size if it is not a forward declaration.
976      if (CTy.isForwardDecl())
977        addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
978      else
979        addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
980    }
981
982    // Add source line info if available.
983    if (!CTy.isForwardDecl())
984      addSourceLine(&Buffer, &CTy);
985  }
986}
987
988/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
989void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
990  int64_t L = SR.getLo();
991  int64_t H = SR.getHi();
992  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
993
994  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
995  if (L)
996    addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
997  addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
998
999  Buffer.addChild(DW_Subrange);
1000}
1001
1002/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1003void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1004                                       DICompositeType *CTy) {
1005  Buffer.setTag(dwarf::DW_TAG_array_type);
1006  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1007    addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1008
1009  // Emit derived type.
1010  addType(&Buffer, CTy->getTypeDerivedFrom());
1011  DIArray Elements = CTy->getTypeArray();
1012
1013  // Get an anonymous type for index type.
1014  DIE *IdxTy = ModuleCU->getIndexTyDie();
1015  if (!IdxTy) {
1016    // Construct an anonymous type for index type.
1017    IdxTy = new DIE(dwarf::DW_TAG_base_type);
1018    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1019    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1020            dwarf::DW_ATE_signed);
1021    ModuleCU->addDie(IdxTy);
1022    ModuleCU->setIndexTyDie(IdxTy);
1023  }
1024
1025  // Add subranges to array type.
1026  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1027    DIDescriptor Element = Elements.getElement(i);
1028    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1029      constructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IdxTy);
1030  }
1031}
1032
1033/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1034DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator *ETy) {
1035  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1036  StringRef Name = ETy->getName();
1037  addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1038  int64_t Value = ETy->getEnumValue();
1039  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1040  return Enumerator;
1041}
1042
1043/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1044/// printer to not emit usual symbol prefix before the symbol name is used then
1045/// return linkage name after skipping this special LLVM prefix.
1046static StringRef getRealLinkageName(StringRef LinkageName) {
1047  char One = '\1';
1048  if (LinkageName.startswith(StringRef(&One, 1)))
1049    return LinkageName.substr(1);
1050  return LinkageName;
1051}
1052
1053/// createGlobalVariableDIE - Create new DIE using GV.
1054DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1055  // If the global variable was optmized out then no need to create debug info
1056  // entry.
1057  if (!GV.getGlobal()) return NULL;
1058  if (GV.getDisplayName().empty()) return NULL;
1059
1060  DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1061  addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1062            GV.getDisplayName());
1063
1064  StringRef LinkageName = GV.getLinkageName();
1065  if (!LinkageName.empty())
1066    addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1067              getRealLinkageName(LinkageName));
1068
1069  addType(GVDie, GV.getType());
1070  if (!GV.isLocalToUnit())
1071    addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1072  addSourceLine(GVDie, &GV);
1073
1074  return GVDie;
1075}
1076
1077/// createMemberDIE - Create new member DIE.
1078DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1079  DIE *MemberDie = new DIE(DT.getTag());
1080  StringRef Name = DT.getName();
1081  if (!Name.empty())
1082    addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1083
1084  addType(MemberDie, DT.getTypeDerivedFrom());
1085
1086  addSourceLine(MemberDie, &DT);
1087
1088  DIEBlock *MemLocationDie = new DIEBlock();
1089  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1090
1091  uint64_t Size = DT.getSizeInBits();
1092  uint64_t FieldSize = DT.getOriginalTypeSize();
1093
1094  if (Size != FieldSize) {
1095    // Handle bitfield.
1096    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1097    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1098
1099    uint64_t Offset = DT.getOffsetInBits();
1100    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1101    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1102    uint64_t FieldOffset = (HiMark - FieldSize);
1103    Offset -= FieldOffset;
1104
1105    // Maybe we need to work from the other end.
1106    if (TD->isLittleEndian()) Offset = FieldSize - (Offset + Size);
1107    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1108
1109    // Here WD_AT_data_member_location points to the anonymous
1110    // field that includes this bit field.
1111    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1112
1113  } else
1114    // This is not a bitfield.
1115    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1116
1117  addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1118
1119  if (DT.isProtected())
1120    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1121            dwarf::DW_ACCESS_protected);
1122  else if (DT.isPrivate())
1123    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1124            dwarf::DW_ACCESS_private);
1125  else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1126    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1127            dwarf::DW_ACCESS_public);
1128  if (DT.isVirtual())
1129    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1130            dwarf::DW_VIRTUALITY_virtual);
1131  return MemberDie;
1132}
1133
1134/// createSubprogramDIE - Create new DIE using SP.
1135DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1136  DIE *SPDie = ModuleCU->getDIE(SP.getNode());
1137  if (SPDie)
1138    return SPDie;
1139
1140  SPDie = new DIE(dwarf::DW_TAG_subprogram);
1141  addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1142
1143  StringRef LinkageName = SP.getLinkageName();
1144  if (!LinkageName.empty())
1145    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1146              getRealLinkageName(LinkageName));
1147
1148  addSourceLine(SPDie, &SP);
1149
1150  // Add prototyped tag, if C or ObjC.
1151  unsigned Lang = SP.getCompileUnit().getLanguage();
1152  if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1153      Lang == dwarf::DW_LANG_ObjC)
1154    addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1155
1156  // Add Return Type.
1157  DICompositeType SPTy = SP.getType();
1158  DIArray Args = SPTy.getTypeArray();
1159  unsigned SPTag = SPTy.getTag();
1160
1161  if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)
1162    addType(SPDie, SPTy);
1163  else
1164    addType(SPDie, DIType(Args.getElement(0).getNode()));
1165
1166  unsigned VK = SP.getVirtuality();
1167  if (VK) {
1168    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1169    DIEBlock *Block = new DIEBlock();
1170    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1171    addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1172    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1173    ContainingTypeMap.insert(std::make_pair(SPDie,
1174                                            SP.getContainingType().getNode()));
1175  }
1176
1177  if (MakeDecl || !SP.isDefinition()) {
1178    addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1179
1180    // Add arguments. Do not add arguments for subprogram definition. They will
1181    // be handled while processing variables.
1182    DICompositeType SPTy = SP.getType();
1183    DIArray Args = SPTy.getTypeArray();
1184    unsigned SPTag = SPTy.getTag();
1185
1186    if (SPTag == dwarf::DW_TAG_subroutine_type)
1187      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1188        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1189        addType(Arg, DIType(Args.getElement(i).getNode()));
1190        addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1191        SPDie->addChild(Arg);
1192      }
1193  }
1194
1195  // DW_TAG_inlined_subroutine may refer to this DIE.
1196  ModuleCU->insertDIE(SP.getNode(), SPDie);
1197  return SPDie;
1198}
1199
1200/// findCompileUnit - Get the compile unit for the given descriptor.
1201///
1202CompileUnit *DwarfDebug::findCompileUnit(DICompileUnit Unit) {
1203  DenseMap<Value *, CompileUnit *>::const_iterator I =
1204    CompileUnitMap.find(Unit.getNode());
1205  if (I == CompileUnitMap.end())
1206    return constructCompileUnit(Unit.getNode());
1207  return I->second;
1208}
1209
1210/// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction.
1211/// Initialize scope and update scope hierarchy.
1212DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
1213  MDNode *InlinedAt) {
1214  assert (N && "Invalid Scope encoding!");
1215  assert (MI && "Missing machine instruction!");
1216  bool GetConcreteScope = (MI && InlinedAt);
1217
1218  DbgScope *NScope = NULL;
1219
1220  if (InlinedAt)
1221    NScope = DbgScopeMap.lookup(InlinedAt);
1222  else
1223    NScope = DbgScopeMap.lookup(N);
1224  assert (NScope && "Unable to find working scope!");
1225
1226  if (NScope->getFirstInsn())
1227    return NScope;
1228
1229  DbgScope *Parent = NULL;
1230  if (GetConcreteScope) {
1231    DILocation IL(InlinedAt);
1232    Parent = getUpdatedDbgScope(IL.getScope().getNode(), MI,
1233                         IL.getOrigLocation().getNode());
1234    assert (Parent && "Unable to find Parent scope!");
1235    NScope->setParent(Parent);
1236    Parent->addScope(NScope);
1237  } else if (DIDescriptor(N).isLexicalBlock()) {
1238    DILexicalBlock DB(N);
1239    if (!DB.getContext().isNull()) {
1240      Parent = getUpdatedDbgScope(DB.getContext().getNode(), MI, InlinedAt);
1241      NScope->setParent(Parent);
1242      Parent->addScope(NScope);
1243    }
1244  }
1245
1246  NScope->setFirstInsn(MI);
1247
1248  if (!Parent && !InlinedAt) {
1249    StringRef SPName = DISubprogram(N).getLinkageName();
1250    if (SPName == MF->getFunction()->getName())
1251      CurrentFnDbgScope = NScope;
1252  }
1253
1254  if (GetConcreteScope) {
1255    ConcreteScopes[InlinedAt] = NScope;
1256    getOrCreateAbstractScope(N);
1257  }
1258
1259  return NScope;
1260}
1261
1262DbgScope *DwarfDebug::getOrCreateAbstractScope(MDNode *N) {
1263  assert (N && "Invalid Scope encoding!");
1264
1265  DbgScope *AScope = AbstractScopes.lookup(N);
1266  if (AScope)
1267    return AScope;
1268
1269  DbgScope *Parent = NULL;
1270
1271  DIDescriptor Scope(N);
1272  if (Scope.isLexicalBlock()) {
1273    DILexicalBlock DB(N);
1274    DIDescriptor ParentDesc = DB.getContext();
1275    if (!ParentDesc.isNull())
1276      Parent = getOrCreateAbstractScope(ParentDesc.getNode());
1277  }
1278
1279  AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1280
1281  if (Parent)
1282    Parent->addScope(AScope);
1283  AScope->setAbstractScope();
1284  AbstractScopes[N] = AScope;
1285  if (DIDescriptor(N).isSubprogram())
1286    AbstractScopesList.push_back(AScope);
1287  return AScope;
1288}
1289
1290/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1291/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1292/// If there are global variables in this scope then create and insert
1293/// DIEs for these variables.
1294DIE *DwarfDebug::updateSubprogramScopeDIE(MDNode *SPNode) {
1295
1296 DIE *SPDie = ModuleCU->getDIE(SPNode);
1297 assert (SPDie && "Unable to find subprogram DIE!");
1298 DISubprogram SP(SPNode);
1299 if (SP.isDefinition() && !SP.getContext().isCompileUnit()) {
1300   addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1301  // Add arguments.
1302   DICompositeType SPTy = SP.getType();
1303   DIArray Args = SPTy.getTypeArray();
1304   unsigned SPTag = SPTy.getTag();
1305   if (SPTag == dwarf::DW_TAG_subroutine_type)
1306     for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1307       DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1308       addType(Arg, DIType(Args.getElement(i).getNode()));
1309       addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??
1310       SPDie->addChild(Arg);
1311     }
1312   DIE *SPDeclDie = SPDie;
1313   SPDie = new DIE(dwarf::DW_TAG_subprogram);
1314   addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1315               SPDeclDie);
1316   ModuleCU->addDie(SPDie);
1317 }
1318
1319 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1320          DWLabel("func_begin", SubprogramCount));
1321 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1322          DWLabel("func_end", SubprogramCount));
1323 MachineLocation Location(RI->getFrameRegister(*MF));
1324 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1325
1326 if (!DISubprogram(SPNode).isLocalToUnit())
1327   addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1328
1329 return SPDie;
1330}
1331
1332/// constructLexicalScope - Construct new DW_TAG_lexical_block
1333/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1334DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1335  unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1336  unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1337
1338  // Ignore empty scopes.
1339  if (StartID == EndID && StartID != 0)
1340    return NULL;
1341
1342  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1343  if (Scope->isAbstractScope())
1344    return ScopeDIE;
1345
1346  addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1347           StartID ?
1348             DWLabel("label", StartID)
1349           : DWLabel("func_begin", SubprogramCount));
1350  addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1351           EndID ?
1352             DWLabel("label", EndID)
1353           : DWLabel("func_end", SubprogramCount));
1354
1355
1356
1357  return ScopeDIE;
1358}
1359
1360/// constructInlinedScopeDIE - This scope represents inlined body of
1361/// a function. Construct DIE to represent this concrete inlined copy
1362/// of the function.
1363DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1364  unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1365  unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1366  assert (StartID && "Invalid starting label for an inlined scope!");
1367  assert (EndID && "Invalid end label for an inlined scope!");
1368  // Ignore empty scopes.
1369  if (StartID == EndID && StartID != 0)
1370    return NULL;
1371
1372  DIScope DS(Scope->getScopeNode());
1373  if (DS.isNull())
1374    return NULL;
1375  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1376
1377  DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1378  DIE *OriginDIE = ModuleCU->getDIE(InlinedSP.getNode());
1379  assert (OriginDIE && "Unable to find Origin DIE!");
1380  addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1381              dwarf::DW_FORM_ref4, OriginDIE);
1382
1383  addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1384           DWLabel("label", StartID));
1385  addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1386           DWLabel("label", EndID));
1387
1388  InlinedSubprogramDIEs.insert(OriginDIE);
1389
1390  // Track the start label for this inlined function.
1391  DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1392    I = InlineInfo.find(InlinedSP.getNode());
1393
1394  if (I == InlineInfo.end()) {
1395    InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartID,
1396                                                             ScopeDIE));
1397    InlinedSPNodes.push_back(InlinedSP.getNode());
1398  } else
1399    I->second.push_back(std::make_pair(StartID, ScopeDIE));
1400
1401  StringPool.insert(InlinedSP.getName());
1402  StringPool.insert(getRealLinkageName(InlinedSP.getLinkageName()));
1403
1404  DILocation DL(Scope->getInlinedAt());
1405  addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1406  addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1407
1408  return ScopeDIE;
1409}
1410
1411
1412/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1413DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1414  // Get the descriptor.
1415  const DIVariable &VD = DV->getVariable();
1416  StringRef Name = VD.getName();
1417  if (Name.empty())
1418    return NULL;
1419
1420  // Translate tag to proper Dwarf tag.  The result variable is dropped for
1421  // now.
1422  unsigned Tag;
1423  switch (VD.getTag()) {
1424  case dwarf::DW_TAG_return_variable:
1425    return NULL;
1426  case dwarf::DW_TAG_arg_variable:
1427    Tag = dwarf::DW_TAG_formal_parameter;
1428    break;
1429  case dwarf::DW_TAG_auto_variable:    // fall thru
1430  default:
1431    Tag = dwarf::DW_TAG_variable;
1432    break;
1433  }
1434
1435  // Define variable debug information entry.
1436  DIE *VariableDie = new DIE(Tag);
1437
1438
1439  DIE *AbsDIE = NULL;
1440  if (DbgVariable *AV = DV->getAbstractVariable())
1441    AbsDIE = AV->getDIE();
1442
1443  if (AbsDIE) {
1444    DIScope DS(Scope->getScopeNode());
1445    DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1446    DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1447    (void) OriginSPDIE;
1448    assert (OriginSPDIE && "Unable to find Origin DIE for the SP!");
1449    DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1450    assert (AbsDIE && "Unable to find Origin DIE for the Variable!");
1451    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1452                dwarf::DW_FORM_ref4, AbsDIE);
1453  }
1454  else {
1455    addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1456    addSourceLine(VariableDie, &VD);
1457
1458    // Add variable type.
1459    // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1460    // addresses instead.
1461    if (VD.isBlockByrefVariable())
1462      addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1463    else
1464      addType(VariableDie, VD.getType());
1465  }
1466
1467  // Add variable address.
1468  if (!Scope->isAbstractScope()) {
1469    MachineLocation Location;
1470    unsigned FrameReg;
1471    int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1472    Location.set(FrameReg, Offset);
1473
1474    if (VD.hasComplexAddress())
1475      addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1476    else if (VD.isBlockByrefVariable())
1477      addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1478    else
1479      addAddress(VariableDie, dwarf::DW_AT_location, Location);
1480  }
1481  DV->setDIE(VariableDie);
1482  return VariableDie;
1483
1484}
1485
1486void DwarfDebug::addPubTypes(DISubprogram SP) {
1487  DICompositeType SPTy = SP.getType();
1488  unsigned SPTag = SPTy.getTag();
1489  if (SPTag != dwarf::DW_TAG_subroutine_type)
1490    return;
1491
1492  DIArray Args = SPTy.getTypeArray();
1493  if (Args.isNull())
1494    return;
1495
1496  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1497    DIType ATy(Args.getElement(i).getNode());
1498    if (ATy.isNull())
1499      continue;
1500    DICompositeType CATy = getDICompositeType(ATy);
1501    if (!CATy.isNull() && !CATy.getName().empty()) {
1502      if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1503        ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1504    }
1505  }
1506}
1507
1508/// constructScopeDIE - Construct a DIE for this scope.
1509DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1510 if (!Scope)
1511  return NULL;
1512 DIScope DS(Scope->getScopeNode());
1513 if (DS.isNull())
1514   return NULL;
1515
1516 DIE *ScopeDIE = NULL;
1517 if (Scope->getInlinedAt())
1518   ScopeDIE = constructInlinedScopeDIE(Scope);
1519 else if (DS.isSubprogram()) {
1520   if (Scope->isAbstractScope())
1521     ScopeDIE = ModuleCU->getDIE(DS.getNode());
1522   else
1523     ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1524 }
1525 else {
1526   ScopeDIE = constructLexicalScopeDIE(Scope);
1527   if (!ScopeDIE) return NULL;
1528 }
1529
1530  // Add variables to scope.
1531  SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1532  for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1533    DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1534    if (VariableDIE)
1535      ScopeDIE->addChild(VariableDIE);
1536  }
1537
1538  // Add nested scopes.
1539  SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1540  for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1541    // Define the Scope debug information entry.
1542    DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1543    if (NestedDIE)
1544      ScopeDIE->addChild(NestedDIE);
1545  }
1546
1547  if (DS.isSubprogram())
1548    addPubTypes(DISubprogram(DS.getNode()));
1549
1550 return ScopeDIE;
1551}
1552
1553/// GetOrCreateSourceID - Look up the source id with the given directory and
1554/// source file names. If none currently exists, create a new id and insert it
1555/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1556/// maps as well.
1557unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) {
1558  unsigned DId;
1559  StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1560  if (DI != DirectoryIdMap.end()) {
1561    DId = DI->getValue();
1562  } else {
1563    DId = DirectoryNames.size() + 1;
1564    DirectoryIdMap[DirName] = DId;
1565    DirectoryNames.push_back(DirName);
1566  }
1567
1568  unsigned FId;
1569  StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1570  if (FI != SourceFileIdMap.end()) {
1571    FId = FI->getValue();
1572  } else {
1573    FId = SourceFileNames.size() + 1;
1574    SourceFileIdMap[FileName] = FId;
1575    SourceFileNames.push_back(FileName);
1576  }
1577
1578  DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1579    SourceIdMap.find(std::make_pair(DId, FId));
1580  if (SI != SourceIdMap.end())
1581    return SI->second;
1582
1583  unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1584  SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1585  SourceIds.push_back(std::make_pair(DId, FId));
1586
1587  return SrcId;
1588}
1589
1590/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1591DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1592  DIE *NDie = ModuleCU->getDIE(NS.getNode());
1593  if (NDie)
1594    return NDie;
1595  NDie = new DIE(dwarf::DW_TAG_namespace);
1596  ModuleCU->insertDIE(NS.getNode(), NDie);
1597  if (!NS.getName().empty())
1598    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1599  addSourceLine(NDie, &NS);
1600  addToContextOwner(NDie, NS.getContext());
1601  return NDie;
1602}
1603
1604CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) {
1605  DICompileUnit DIUnit(N);
1606  StringRef FN = DIUnit.getFilename();
1607  StringRef Dir = DIUnit.getDirectory();
1608  unsigned ID = GetOrCreateSourceID(Dir, FN);
1609
1610  DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1611  addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1612                   DWLabel("section_line", 0), DWLabel("section_line", 0),
1613                   false);
1614  addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1615            DIUnit.getProducer());
1616  addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1617          DIUnit.getLanguage());
1618  addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1619
1620  if (!Dir.empty())
1621    addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1622  if (DIUnit.isOptimized())
1623    addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1624
1625  StringRef Flags = DIUnit.getFlags();
1626  if (!Flags.empty())
1627    addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1628
1629  unsigned RVer = DIUnit.getRunTimeVersion();
1630  if (RVer)
1631    addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1632            dwarf::DW_FORM_data1, RVer);
1633
1634  CompileUnit *Unit = new CompileUnit(ID, Die);
1635  if (!ModuleCU && DIUnit.isMain()) {
1636    // Use first compile unit marked as isMain as the compile unit
1637    // for this module.
1638    ModuleCU = Unit;
1639  }
1640
1641  CompileUnitMap[DIUnit.getNode()] = Unit;
1642  CompileUnits.push_back(Unit);
1643  return Unit;
1644}
1645
1646void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1647  DIGlobalVariable DI_GV(N);
1648
1649  // If debug information is malformed then ignore it.
1650  if (DI_GV.Verify() == false)
1651    return;
1652
1653  // Check for pre-existence.
1654  if (ModuleCU->getDIE(DI_GV.getNode()))
1655    return;
1656
1657  DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1658  if (!VariableDie)
1659    return;
1660
1661  // Add to map.
1662  ModuleCU->insertDIE(N, VariableDie);
1663
1664  // Add to context owner.
1665  DIDescriptor GVContext = DI_GV.getContext();
1666  // Do not create specification DIE if context is either compile unit
1667  // or a subprogram.
1668  if (DI_GV.isDefinition() && !GVContext.isCompileUnit()
1669      && !GVContext.isSubprogram()) {
1670    // Create specification DIE.
1671    DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1672    addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1673                dwarf::DW_FORM_ref4, VariableDie);
1674    DIEBlock *Block = new DIEBlock();
1675    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1676    addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1677                   Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1678    addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1679    ModuleCU->addDie(VariableSpecDIE);
1680  } else {
1681    DIEBlock *Block = new DIEBlock();
1682    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1683    addObjectLabel(Block, 0, dwarf::DW_FORM_udata,
1684                   Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1685    addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1686  }
1687  addToContextOwner(VariableDie, GVContext);
1688
1689  // Expose as global. FIXME - need to check external flag.
1690  ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1691
1692  DIType GTy = DI_GV.getType();
1693  if (GTy.isCompositeType() && !GTy.getName().empty()) {
1694    DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1695    assert (Entry && "Missing global type!");
1696    ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1697  }
1698  return;
1699}
1700
1701void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1702  DISubprogram SP(N);
1703
1704  // Check for pre-existence.
1705  if (ModuleCU->getDIE(N))
1706    return;
1707
1708  if (!SP.isDefinition())
1709    // This is a method declaration which will be handled while constructing
1710    // class type.
1711    return;
1712
1713  DIE *SubprogramDie = createSubprogramDIE(SP);
1714
1715  // Add to map.
1716  ModuleCU->insertDIE(N, SubprogramDie);
1717
1718  // Add to context owner.
1719  addToContextOwner(SubprogramDie, SP.getContext());
1720
1721  // Expose as global.
1722  ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1723
1724  return;
1725}
1726
1727/// beginModule - Emit all Dwarf sections that should come prior to the
1728/// content. Create global DIEs and emit initial debug info sections.
1729/// This is inovked by the target AsmPrinter.
1730void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
1731  this->M = M;
1732
1733  if (TimePassesIsEnabled)
1734    DebugTimer->startTimer();
1735
1736  if (!MAI->doesSupportDebugInformation())
1737    return;
1738
1739  DebugInfoFinder DbgFinder;
1740  DbgFinder.processModule(*M);
1741
1742  // Create all the compile unit DIEs.
1743  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1744         E = DbgFinder.compile_unit_end(); I != E; ++I)
1745    constructCompileUnit(*I);
1746
1747  if (CompileUnits.empty()) {
1748    if (TimePassesIsEnabled)
1749      DebugTimer->stopTimer();
1750
1751    return;
1752  }
1753
1754  // If main compile unit for this module is not seen than randomly
1755  // select first compile unit.
1756  if (!ModuleCU)
1757    ModuleCU = CompileUnits[0];
1758
1759  // Create DIEs for each subprogram.
1760  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1761         E = DbgFinder.subprogram_end(); I != E; ++I)
1762    constructSubprogramDIE(*I);
1763
1764  // Create DIEs for each global variable.
1765  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1766         E = DbgFinder.global_variable_end(); I != E; ++I)
1767    constructGlobalVariableDIE(*I);
1768
1769  MMI = mmi;
1770  shouldEmit = true;
1771  MMI->setDebugInfoAvailability(true);
1772
1773  // Prime section data.
1774  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1775
1776  // Print out .file directives to specify files for .loc directives. These are
1777  // printed out early so that they precede any .loc directives.
1778  if (MAI->hasDotLocAndDotFile()) {
1779    for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1780      // Remember source id starts at 1.
1781      std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1782      // FIXME: don't use sys::path for this!  This should not depend on the
1783      // host.
1784      sys::Path FullPath(getSourceDirectoryName(Id.first));
1785      bool AppendOk =
1786        FullPath.appendComponent(getSourceFileName(Id.second));
1787      assert(AppendOk && "Could not append filename to directory!");
1788      AppendOk = false;
1789      Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1790    }
1791  }
1792
1793  // Emit initial sections
1794  emitInitial();
1795
1796  if (TimePassesIsEnabled)
1797    DebugTimer->stopTimer();
1798}
1799
1800/// endModule - Emit all Dwarf sections that should come after the content.
1801///
1802void DwarfDebug::endModule() {
1803  if (!ModuleCU)
1804    return;
1805
1806  if (TimePassesIsEnabled)
1807    DebugTimer->startTimer();
1808
1809  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1810  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1811         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1812    DIE *ISP = *AI;
1813    addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1814  }
1815
1816  // Insert top level DIEs.
1817  for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1818         TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1819    ModuleCU->getCUDie()->addChild(*TI);
1820
1821  for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1822         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1823    DIE *SPDie = CI->first;
1824    MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1825    if (!N) continue;
1826    DIE *NDie = ModuleCU->getDIE(N);
1827    if (!NDie) continue;
1828    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1829    // FIXME - This is not the correct approach.
1830    // addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1831  }
1832
1833  // Standard sections final addresses.
1834  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1835  EmitLabel("text_end", 0);
1836  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1837  EmitLabel("data_end", 0);
1838
1839  // End text sections.
1840  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1841    Asm->OutStreamer.SwitchSection(SectionMap[i]);
1842    EmitLabel("section_end", i);
1843  }
1844
1845  // Emit common frame information.
1846  emitCommonDebugFrame();
1847
1848  // Emit function debug frame information
1849  for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1850         E = DebugFrames.end(); I != E; ++I)
1851    emitFunctionDebugFrame(*I);
1852
1853  // Compute DIE offsets and sizes.
1854  computeSizeAndOffsets();
1855
1856  // Emit all the DIEs into a debug info section
1857  emitDebugInfo();
1858
1859  // Corresponding abbreviations into a abbrev section.
1860  emitAbbreviations();
1861
1862  // Emit source line correspondence into a debug line section.
1863  emitDebugLines();
1864
1865  // Emit info into a debug pubnames section.
1866  emitDebugPubNames();
1867
1868  // Emit info into a debug pubtypes section.
1869  emitDebugPubTypes();
1870
1871  // Emit info into a debug str section.
1872  emitDebugStr();
1873
1874  // Emit info into a debug loc section.
1875  emitDebugLoc();
1876
1877  // Emit info into a debug aranges section.
1878  EmitDebugARanges();
1879
1880  // Emit info into a debug ranges section.
1881  emitDebugRanges();
1882
1883  // Emit info into a debug macinfo section.
1884  emitDebugMacInfo();
1885
1886  // Emit inline info.
1887  emitDebugInlineInfo();
1888
1889  if (TimePassesIsEnabled)
1890    DebugTimer->stopTimer();
1891}
1892
1893/// findAbstractVariable - Find abstract variable, if any, associated with Var.
1894DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1895                                              unsigned FrameIdx,
1896                                              DILocation &ScopeLoc) {
1897
1898  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1899  if (AbsDbgVariable)
1900    return AbsDbgVariable;
1901
1902  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1903  if (!Scope)
1904    return NULL;
1905
1906  AbsDbgVariable = new DbgVariable(Var, FrameIdx);
1907  Scope->addVariable(AbsDbgVariable);
1908  AbstractVariables[Var.getNode()] = AbsDbgVariable;
1909  return AbsDbgVariable;
1910}
1911
1912/// collectVariableInfo - Populate DbgScope entries with variables' info.
1913void DwarfDebug::collectVariableInfo() {
1914  if (!MMI) return;
1915
1916  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1917  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1918         VE = VMap.end(); VI != VE; ++VI) {
1919    MDNode *Var = VI->first;
1920    if (!Var) continue;
1921    DIVariable DV (Var);
1922    std::pair< unsigned, MDNode *> VP = VI->second;
1923    DILocation ScopeLoc(VP.second);
1924
1925    DbgScope *Scope =
1926      ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1927    if (!Scope)
1928      Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
1929    // If variable scope is not found then skip this variable.
1930    if (!Scope)
1931      continue;
1932
1933    DbgVariable *RegVar = new DbgVariable(DV, VP.first);
1934    Scope->addVariable(RegVar);
1935    if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1936                                                           ScopeLoc))
1937      RegVar->setAbstractVariable(AbsDbgVariable);
1938  }
1939}
1940
1941/// beginScope - Process beginning of a scope starting at Label.
1942void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
1943  InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1944  if (I == DbgScopeBeginMap.end())
1945    return;
1946  ScopeVector &SD = I->second;
1947  for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
1948       SDI != SDE; ++SDI)
1949    (*SDI)->setStartLabelID(Label);
1950}
1951
1952/// endScope - Process end of a scope.
1953void DwarfDebug::endScope(const MachineInstr *MI) {
1954  InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
1955  if (I == DbgScopeEndMap.end())
1956    return;
1957
1958  unsigned Label = MMI->NextLabelID();
1959  Asm->printLabel(Label);
1960  O << '\n';
1961
1962  SmallVector<DbgScope *, 2> &SD = I->second;
1963  for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1964       SDI != SDE; ++SDI)
1965    (*SDI)->setEndLabelID(Label);
1966  return;
1967}
1968
1969/// createDbgScope - Create DbgScope for the scope.
1970void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
1971
1972  if (!InlinedAt) {
1973    DbgScope *WScope = DbgScopeMap.lookup(Scope);
1974    if (WScope)
1975      return;
1976    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1977    DbgScopeMap.insert(std::make_pair(Scope, WScope));
1978    if (DIDescriptor(Scope).isLexicalBlock())
1979      createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
1980    return;
1981  }
1982
1983  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1984  if (WScope)
1985    return;
1986
1987  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1988  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
1989  DILocation DL(InlinedAt);
1990  createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
1991}
1992
1993/// extractScopeInformation - Scan machine instructions in this function
1994/// and collect DbgScopes. Return true, if atleast one scope was found.
1995bool DwarfDebug::extractScopeInformation(MachineFunction *MF) {
1996  // If scope information was extracted using .dbg intrinsics then there is not
1997  // any need to extract these information by scanning each instruction.
1998  if (!DbgScopeMap.empty())
1999    return false;
2000
2001  DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2002  unsigned MIIndex = 0;
2003  // Scan each instruction and create scopes. First build working set of scopes.
2004  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2005       I != E; ++I) {
2006    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2007         II != IE; ++II) {
2008      const MachineInstr *MInsn = II;
2009      MIIndexMap[MInsn] = MIIndex++;
2010      DebugLoc DL = MInsn->getDebugLoc();
2011      if (DL.isUnknown()) continue;
2012      DILocation DLT = MF->getDILocation(DL);
2013      DIScope DLTScope = DLT.getScope();
2014      if (DLTScope.isNull()) continue;
2015      // There is no need to create another DIE for compile unit. For all
2016      // other scopes, create one DbgScope now. This will be translated
2017      // into a scope DIE at the end.
2018      if (DLTScope.isCompileUnit()) continue;
2019      createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2020    }
2021  }
2022
2023
2024  // Build scope hierarchy using working set of scopes.
2025  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2026       I != E; ++I) {
2027    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2028         II != IE; ++II) {
2029      const MachineInstr *MInsn = II;
2030      DebugLoc DL = MInsn->getDebugLoc();
2031      if (DL.isUnknown())  continue;
2032      DILocation DLT = MF->getDILocation(DL);
2033      DIScope DLTScope = DLT.getScope();
2034      if (DLTScope.isNull())  continue;
2035      // There is no need to create another DIE for compile unit. For all
2036      // other scopes, create one DbgScope now. This will be translated
2037      // into a scope DIE at the end.
2038      if (DLTScope.isCompileUnit()) continue;
2039      DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2040                                           DLT.getOrigLocation().getNode());
2041      Scope->setLastInsn(MInsn);
2042    }
2043  }
2044
2045  if (!CurrentFnDbgScope)
2046    return false;
2047
2048  CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2049
2050  // Each scope has first instruction and last instruction to mark beginning
2051  // and end of a scope respectively. Create an inverse map that list scopes
2052  // starts (and ends) with an instruction. One instruction may start (or end)
2053  // multiple scopes. Ignore scopes that are not reachable.
2054  SmallVector<DbgScope *, 4> WorkList;
2055  WorkList.push_back(CurrentFnDbgScope);
2056  while (!WorkList.empty()) {
2057    DbgScope *S = WorkList.back(); WorkList.pop_back();
2058
2059    SmallVector<DbgScope *, 4> &Children = S->getScopes();
2060    if (!Children.empty())
2061      for (SmallVector<DbgScope *, 4>::iterator SI = Children.begin(),
2062             SE = Children.end(); SI != SE; ++SI)
2063        WorkList.push_back(*SI);
2064
2065    if (S->isAbstractScope())
2066      continue;
2067    const MachineInstr *MI = S->getFirstInsn();
2068    assert (MI && "DbgScope does not have first instruction!");
2069
2070    InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2071    if (IDI != DbgScopeBeginMap.end())
2072      IDI->second.push_back(S);
2073    else
2074      DbgScopeBeginMap[MI].push_back(S);
2075
2076    MI = S->getLastInsn();
2077    assert (MI && "DbgScope does not have last instruction!");
2078    IDI = DbgScopeEndMap.find(MI);
2079    if (IDI != DbgScopeEndMap.end())
2080      IDI->second.push_back(S);
2081    else
2082      DbgScopeEndMap[MI].push_back(S);
2083  }
2084
2085  return !DbgScopeMap.empty();
2086}
2087
2088/// beginFunction - Gather pre-function debug information.  Assumes being
2089/// emitted immediately after the function entry point.
2090void DwarfDebug::beginFunction(MachineFunction *MF) {
2091  this->MF = MF;
2092
2093  if (!ShouldEmitDwarfDebug()) return;
2094
2095  if (TimePassesIsEnabled)
2096    DebugTimer->startTimer();
2097
2098  if (!extractScopeInformation(MF))
2099    return;
2100
2101  collectVariableInfo();
2102
2103  // Begin accumulating function debug information.
2104  MMI->BeginFunction(MF);
2105
2106  // Assumes in correct section after the entry point.
2107  EmitLabel("func_begin", ++SubprogramCount);
2108
2109  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2110  // function.
2111  DebugLoc FDL = MF->getDefaultDebugLoc();
2112  if (!FDL.isUnknown()) {
2113    DILocation DLT = MF->getDILocation(FDL);
2114    unsigned LabelID = 0;
2115    DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2116    if (!SP.isNull())
2117      LabelID = recordSourceLine(SP.getLineNumber(), 0,
2118                                 DLT.getScope().getNode());
2119    else
2120      LabelID = recordSourceLine(DLT.getLineNumber(),
2121                                 DLT.getColumnNumber(),
2122                                 DLT.getScope().getNode());
2123    Asm->printLabel(LabelID);
2124    O << '\n';
2125  }
2126  if (TimePassesIsEnabled)
2127    DebugTimer->stopTimer();
2128}
2129
2130/// endFunction - Gather and emit post-function debug information.
2131///
2132void DwarfDebug::endFunction(MachineFunction *MF) {
2133  if (!ShouldEmitDwarfDebug()) return;
2134
2135  if (TimePassesIsEnabled)
2136    DebugTimer->startTimer();
2137
2138  if (DbgScopeMap.empty())
2139    return;
2140
2141  if (CurrentFnDbgScope) {
2142    // Define end label for subprogram.
2143    EmitLabel("func_end", SubprogramCount);
2144
2145    // Get function line info.
2146    if (!Lines.empty()) {
2147      // Get section line info.
2148      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2149      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2150      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2151      // Append the function info to section info.
2152      SectionLineInfos.insert(SectionLineInfos.end(),
2153                              Lines.begin(), Lines.end());
2154    }
2155
2156    // Construct abstract scopes.
2157    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2158           AE = AbstractScopesList.end(); AI != AE; ++AI)
2159      constructScopeDIE(*AI);
2160
2161    constructScopeDIE(CurrentFnDbgScope);
2162
2163    DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2164                                                 MMI->getFrameMoves()));
2165  }
2166
2167  // Clear debug info
2168  CurrentFnDbgScope = NULL;
2169  DbgScopeMap.clear();
2170  DbgScopeBeginMap.clear();
2171  DbgScopeEndMap.clear();
2172  ConcreteScopes.clear();
2173  AbstractScopesList.clear();
2174  Lines.clear();
2175
2176  if (TimePassesIsEnabled)
2177    DebugTimer->stopTimer();
2178}
2179
2180/// recordSourceLine - Records location information and associates it with a
2181/// label. Returns a unique label ID used to generate a label and provide
2182/// correspondence to the source line list.
2183unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2184                                      MDNode *S) {
2185  if (!MMI)
2186    return 0;
2187
2188  if (TimePassesIsEnabled)
2189    DebugTimer->startTimer();
2190
2191  StringRef Dir;
2192  StringRef Fn;
2193
2194  DIDescriptor Scope(S);
2195  if (Scope.isCompileUnit()) {
2196    DICompileUnit CU(S);
2197    Dir = CU.getDirectory();
2198    Fn = CU.getFilename();
2199  } else if (Scope.isSubprogram()) {
2200    DISubprogram SP(S);
2201    Dir = SP.getDirectory();
2202    Fn = SP.getFilename();
2203  } else if (Scope.isLexicalBlock()) {
2204    DILexicalBlock DB(S);
2205    Dir = DB.getDirectory();
2206    Fn = DB.getFilename();
2207  } else
2208    assert (0 && "Unexpected scope info");
2209
2210  unsigned Src = GetOrCreateSourceID(Dir, Fn);
2211  unsigned ID = MMI->NextLabelID();
2212  Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2213
2214  if (TimePassesIsEnabled)
2215    DebugTimer->stopTimer();
2216
2217  return ID;
2218}
2219
2220/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2221/// timed. Look up the source id with the given directory and source file
2222/// names. If none currently exists, create a new id and insert it in the
2223/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2224/// well.
2225unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2226                                         const std::string &FileName) {
2227  if (TimePassesIsEnabled)
2228    DebugTimer->startTimer();
2229
2230  unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2231
2232  if (TimePassesIsEnabled)
2233    DebugTimer->stopTimer();
2234
2235  return SrcId;
2236}
2237
2238//===----------------------------------------------------------------------===//
2239// Emit Methods
2240//===----------------------------------------------------------------------===//
2241
2242/// computeSizeAndOffset - Compute the size and offset of a DIE.
2243///
2244unsigned
2245DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2246  // Get the children.
2247  const std::vector<DIE *> &Children = Die->getChildren();
2248
2249  // If not last sibling and has children then add sibling offset attribute.
2250  if (!Last && !Children.empty()) Die->addSiblingOffset();
2251
2252  // Record the abbreviation.
2253  assignAbbrevNumber(Die->getAbbrev());
2254
2255  // Get the abbreviation for this DIE.
2256  unsigned AbbrevNumber = Die->getAbbrevNumber();
2257  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2258
2259  // Set DIE offset
2260  Die->setOffset(Offset);
2261
2262  // Start the size with the size of abbreviation code.
2263  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2264
2265  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2266  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2267
2268  // Size the DIE attribute values.
2269  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2270    // Size attribute value.
2271    Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2272
2273  // Size the DIE children if any.
2274  if (!Children.empty()) {
2275    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2276           "Children flag not set");
2277
2278    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2279      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2280
2281    // End of children marker.
2282    Offset += sizeof(int8_t);
2283  }
2284
2285  Die->setSize(Offset - Die->getOffset());
2286  return Offset;
2287}
2288
2289/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2290///
2291void DwarfDebug::computeSizeAndOffsets() {
2292  // Compute size of compile unit header.
2293  static unsigned Offset =
2294    sizeof(int32_t) + // Length of Compilation Unit Info
2295    sizeof(int16_t) + // DWARF version number
2296    sizeof(int32_t) + // Offset Into Abbrev. Section
2297    sizeof(int8_t);   // Pointer Size (in bytes)
2298
2299  computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2300  CompileUnitOffsets[ModuleCU] = 0;
2301}
2302
2303/// emitInitial - Emit initial Dwarf declarations.  This is necessary for cc
2304/// tools to recognize the object file contains Dwarf information.
2305void DwarfDebug::emitInitial() {
2306  // Check to see if we already emitted intial headers.
2307  if (didInitial) return;
2308  didInitial = true;
2309
2310  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2311
2312  // Dwarf sections base addresses.
2313  if (MAI->doesDwarfRequireFrameSection()) {
2314    Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2315    EmitLabel("section_debug_frame", 0);
2316  }
2317
2318  Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2319  EmitLabel("section_info", 0);
2320  Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2321  EmitLabel("section_abbrev", 0);
2322  Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2323  EmitLabel("section_aranges", 0);
2324
2325  if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2326    Asm->OutStreamer.SwitchSection(LineInfoDirective);
2327    EmitLabel("section_macinfo", 0);
2328  }
2329
2330  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2331  EmitLabel("section_line", 0);
2332  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2333  EmitLabel("section_loc", 0);
2334  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2335  EmitLabel("section_pubnames", 0);
2336  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2337  EmitLabel("section_pubtypes", 0);
2338  Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2339  EmitLabel("section_str", 0);
2340  Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2341  EmitLabel("section_ranges", 0);
2342
2343  Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2344  EmitLabel("text_begin", 0);
2345  Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2346  EmitLabel("data_begin", 0);
2347}
2348
2349/// emitDIE - Recusively Emits a debug information entry.
2350///
2351void DwarfDebug::emitDIE(DIE *Die) {
2352  // Get the abbreviation for this DIE.
2353  unsigned AbbrevNumber = Die->getAbbrevNumber();
2354  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2355
2356  Asm->O << '\n';
2357
2358  // Emit the code (index) for the abbreviation.
2359  if (Asm->VerboseAsm)
2360    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2361                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2362                                Twine::utohexstr(Die->getSize()) + " " +
2363                                dwarf::TagString(Abbrev->getTag()));
2364  EmitULEB128(AbbrevNumber);
2365
2366  SmallVector<DIEValue*, 32> &Values = Die->getValues();
2367  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2368
2369  // Emit the DIE attribute values.
2370  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2371    unsigned Attr = AbbrevData[i].getAttribute();
2372    unsigned Form = AbbrevData[i].getForm();
2373    assert(Form && "Too many attributes for DIE (check abbreviation)");
2374
2375    if (Asm->VerboseAsm)
2376      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2377
2378    switch (Attr) {
2379    case dwarf::DW_AT_sibling:
2380      Asm->EmitInt32(Die->getSiblingOffset());
2381      break;
2382    case dwarf::DW_AT_abstract_origin: {
2383      DIEEntry *E = cast<DIEEntry>(Values[i]);
2384      DIE *Origin = E->getEntry();
2385      unsigned Addr = Origin->getOffset();
2386      Asm->EmitInt32(Addr);
2387      break;
2388    }
2389    default:
2390      // Emit an attribute using the defined form.
2391      Values[i]->EmitValue(this, Form);
2392      O << "\n"; // REMOVE This once all EmitValue impls emit their own newline.
2393      break;
2394    }
2395  }
2396
2397  // Emit the DIE children if any.
2398  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2399    const std::vector<DIE *> &Children = Die->getChildren();
2400
2401    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2402      emitDIE(Children[j]);
2403
2404    Asm->EmitInt8(0); EOL("End Of Children Mark");
2405  }
2406}
2407
2408/// emitDebugInfo - Emit the debug info section.
2409///
2410void DwarfDebug::emitDebugInfo() {
2411  // Start debug info section.
2412  Asm->OutStreamer.SwitchSection(
2413                            Asm->getObjFileLowering().getDwarfInfoSection());
2414  DIE *Die = ModuleCU->getCUDie();
2415
2416  // Emit the compile units header.
2417  EmitLabel("info_begin", ModuleCU->getID());
2418
2419  // Emit size of content not including length itself
2420  unsigned ContentSize = Die->getSize() +
2421    sizeof(int16_t) + // DWARF version number
2422    sizeof(int32_t) + // Offset Into Abbrev. Section
2423    sizeof(int8_t) +  // Pointer Size (in bytes)
2424    sizeof(int32_t);  // FIXME - extra pad for gdb bug.
2425
2426  Asm->EmitInt32(ContentSize);  EOL("Length of Compilation Unit Info");
2427  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2428  EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
2429  EOL("Offset Into Abbrev. Section");
2430  Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2431
2432  emitDIE(Die);
2433  // FIXME - extra padding for gdb bug.
2434  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2435  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2436  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2437  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2438  EmitLabel("info_end", ModuleCU->getID());
2439  Asm->O << '\n';
2440}
2441
2442/// emitAbbreviations - Emit the abbreviation section.
2443///
2444void DwarfDebug::emitAbbreviations() const {
2445  // Check to see if it is worth the effort.
2446  if (!Abbreviations.empty()) {
2447    // Start the debug abbrev section.
2448    Asm->OutStreamer.SwitchSection(
2449                            Asm->getObjFileLowering().getDwarfAbbrevSection());
2450
2451    EmitLabel("abbrev_begin", 0);
2452
2453    // For each abbrevation.
2454    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2455      // Get abbreviation data
2456      const DIEAbbrev *Abbrev = Abbreviations[i];
2457
2458      // Emit the abbrevations code (base 1 index.)
2459      EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2460
2461      // Emit the abbreviations data.
2462      Abbrev->Emit(this);
2463      Asm->O << '\n';
2464    }
2465
2466    // Mark end of abbreviations.
2467    EmitULEB128(0, "EOM(3)");
2468
2469    EmitLabel("abbrev_end", 0);
2470    Asm->O << '\n';
2471  }
2472}
2473
2474/// emitEndOfLineMatrix - Emit the last address of the section and the end of
2475/// the line matrix.
2476///
2477void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2478  // Define last address of section.
2479  Asm->EmitInt8(0); EOL("Extended Op");
2480  Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2481  Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2482  EmitReference("section_end", SectionEnd); EOL("Section end label");
2483
2484  // Mark end of matrix.
2485  Asm->EmitInt8(0); EOL("DW_LNE_end_sequence");
2486  Asm->EmitInt8(1);
2487  Asm->EmitInt8(1);
2488}
2489
2490/// emitDebugLines - Emit source line information.
2491///
2492void DwarfDebug::emitDebugLines() {
2493  // If the target is using .loc/.file, the assembler will be emitting the
2494  // .debug_line table automatically.
2495  if (MAI->hasDotLocAndDotFile())
2496    return;
2497
2498  // Minimum line delta, thus ranging from -10..(255-10).
2499  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2500  // Maximum line delta, thus ranging from -10..(255-10).
2501  const int MaxLineDelta = 255 + MinLineDelta;
2502
2503  // Start the dwarf line section.
2504  Asm->OutStreamer.SwitchSection(
2505                            Asm->getObjFileLowering().getDwarfLineSection());
2506
2507  // Construct the section header.
2508  EmitDifference("line_end", 0, "line_begin", 0, true);
2509  EOL("Length of Source Line Info");
2510  EmitLabel("line_begin", 0);
2511
2512  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2513
2514  EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
2515  EOL("Prolog Length");
2516  EmitLabel("line_prolog_begin", 0);
2517
2518  Asm->EmitInt8(1); EOL("Minimum Instruction Length");
2519  Asm->EmitInt8(1); EOL("Default is_stmt_start flag");
2520  Asm->EmitInt8(MinLineDelta); EOL("Line Base Value (Special Opcodes)");
2521  Asm->EmitInt8(MaxLineDelta); EOL("Line Range Value (Special Opcodes)");
2522  Asm->EmitInt8(-MinLineDelta); EOL("Special Opcode Base");
2523
2524  // Line number standard opcode encodings argument count
2525  Asm->EmitInt8(0); EOL("DW_LNS_copy arg count");
2526  Asm->EmitInt8(1); EOL("DW_LNS_advance_pc arg count");
2527  Asm->EmitInt8(1); EOL("DW_LNS_advance_line arg count");
2528  Asm->EmitInt8(1); EOL("DW_LNS_set_file arg count");
2529  Asm->EmitInt8(1); EOL("DW_LNS_set_column arg count");
2530  Asm->EmitInt8(0); EOL("DW_LNS_negate_stmt arg count");
2531  Asm->EmitInt8(0); EOL("DW_LNS_set_basic_block arg count");
2532  Asm->EmitInt8(0); EOL("DW_LNS_const_add_pc arg count");
2533  Asm->EmitInt8(1); EOL("DW_LNS_fixed_advance_pc arg count");
2534
2535  // Emit directories.
2536  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2537    const std::string &Dir = getSourceDirectoryName(DI);
2538    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2539    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2540  }
2541
2542  Asm->EmitInt8(0); EOL("End of directories");
2543
2544  // Emit files.
2545  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2546    // Remember source id starts at 1.
2547    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2548    const std::string &FN = getSourceFileName(Id.second);
2549    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2550    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2551
2552    EmitULEB128(Id.first, "Directory #");
2553    EmitULEB128(0, "Mod date");
2554    EmitULEB128(0, "File size");
2555  }
2556
2557  Asm->EmitInt8(0); EOL("End of files");
2558
2559  EmitLabel("line_prolog_end", 0);
2560
2561  // A sequence for each text section.
2562  unsigned SecSrcLinesSize = SectionSourceLines.size();
2563
2564  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2565    // Isolate current sections line info.
2566    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2567
2568    /*if (Asm->isVerbose()) {
2569      const MCSection *S = SectionMap[j + 1];
2570      O << '\t' << MAI->getCommentString() << " Section"
2571        << S->getName() << '\n';
2572    }*/
2573    Asm->O << '\n';
2574
2575    // Dwarf assumes we start with first line of first source file.
2576    unsigned Source = 1;
2577    unsigned Line = 1;
2578
2579    // Construct rows of the address, source, line, column matrix.
2580    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2581      const SrcLineInfo &LineInfo = LineInfos[i];
2582      unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2583      if (!LabelID) continue;
2584
2585      if (LineInfo.getLine() == 0) continue;
2586
2587      if (!Asm->isVerbose())
2588        Asm->O << '\n';
2589      else {
2590        std::pair<unsigned, unsigned> SourceID =
2591          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2592        O << '\t' << MAI->getCommentString() << ' '
2593          << getSourceDirectoryName(SourceID.first) << '/'
2594          << getSourceFileName(SourceID.second)
2595          << ':' << utostr_32(LineInfo.getLine()) << '\n';
2596      }
2597
2598      // Define the line address.
2599      Asm->EmitInt8(0); EOL("Extended Op");
2600      Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2601      Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2602      EmitReference("label",  LabelID); EOL("Location label");
2603
2604      // If change of source, then switch to the new source.
2605      if (Source != LineInfo.getSourceID()) {
2606        Source = LineInfo.getSourceID();
2607        Asm->EmitInt8(dwarf::DW_LNS_set_file); EOL("DW_LNS_set_file");
2608        EmitULEB128(Source, "New Source");
2609      }
2610
2611      // If change of line.
2612      if (Line != LineInfo.getLine()) {
2613        // Determine offset.
2614        int Offset = LineInfo.getLine() - Line;
2615        int Delta = Offset - MinLineDelta;
2616
2617        // Update line.
2618        Line = LineInfo.getLine();
2619
2620        // If delta is small enough and in range...
2621        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2622          // ... then use fast opcode.
2623          Asm->EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
2624        } else {
2625          // ... otherwise use long hand.
2626          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2627          EOL("DW_LNS_advance_line");
2628          EmitSLEB128(Offset, "Line Offset");
2629          Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2630        }
2631      } else {
2632        // Copy the previous row (different address or source)
2633        Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2634      }
2635    }
2636
2637    emitEndOfLineMatrix(j + 1);
2638  }
2639
2640  if (SecSrcLinesSize == 0)
2641    // Because we're emitting a debug_line section, we still need a line
2642    // table. The linker and friends expect it to exist. If there's nothing to
2643    // put into it, emit an empty table.
2644    emitEndOfLineMatrix(1);
2645
2646  EmitLabel("line_end", 0);
2647  Asm->O << '\n';
2648}
2649
2650/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2651///
2652void DwarfDebug::emitCommonDebugFrame() {
2653  if (!MAI->doesDwarfRequireFrameSection())
2654    return;
2655
2656  int stackGrowth =
2657    Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2658      TargetFrameInfo::StackGrowsUp ?
2659    TD->getPointerSize() : -TD->getPointerSize();
2660
2661  // Start the dwarf frame section.
2662  Asm->OutStreamer.SwitchSection(
2663                              Asm->getObjFileLowering().getDwarfFrameSection());
2664
2665  EmitLabel("debug_frame_common", 0);
2666  EmitDifference("debug_frame_common_end", 0,
2667                 "debug_frame_common_begin", 0, true);
2668  EOL("Length of Common Information Entry");
2669
2670  EmitLabel("debug_frame_common_begin", 0);
2671  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2672  EOL("CIE Identifier Tag");
2673  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2674  EOL("CIE Version");
2675  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2676  EOL("CIE Augmentation");
2677  EmitULEB128(1, "CIE Code Alignment Factor");
2678  EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2679  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2680  EOL("CIE RA Column");
2681
2682  std::vector<MachineMove> Moves;
2683  RI->getInitialFrameState(Moves);
2684
2685  EmitFrameMoves(NULL, 0, Moves, false);
2686
2687  Asm->EmitAlignment(2, 0, 0, false);
2688  EmitLabel("debug_frame_common_end", 0);
2689  Asm->O << '\n';
2690}
2691
2692/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2693/// section.
2694void
2695DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
2696  if (!MAI->doesDwarfRequireFrameSection())
2697    return;
2698
2699  // Start the dwarf frame section.
2700  Asm->OutStreamer.SwitchSection(
2701                              Asm->getObjFileLowering().getDwarfFrameSection());
2702
2703  EmitDifference("debug_frame_end", DebugFrameInfo.Number,
2704                 "debug_frame_begin", DebugFrameInfo.Number, true);
2705  EOL("Length of Frame Information Entry");
2706
2707  EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
2708
2709  EmitSectionOffset("debug_frame_common", "section_debug_frame",
2710                    0, 0, true, false);
2711  EOL("FDE CIE offset");
2712
2713  EmitReference("func_begin", DebugFrameInfo.Number);
2714  EOL("FDE initial location");
2715  EmitDifference("func_end", DebugFrameInfo.Number,
2716                 "func_begin", DebugFrameInfo.Number);
2717  EOL("FDE address range");
2718
2719  EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2720                 false);
2721
2722  Asm->EmitAlignment(2, 0, 0, false);
2723  EmitLabel("debug_frame_end", DebugFrameInfo.Number);
2724  Asm->O << '\n';
2725}
2726
2727/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2728///
2729void DwarfDebug::emitDebugPubNames() {
2730  // Start the dwarf pubnames section.
2731  Asm->OutStreamer.SwitchSection(
2732                          Asm->getObjFileLowering().getDwarfPubNamesSection());
2733
2734  EmitDifference("pubnames_end", ModuleCU->getID(),
2735                 "pubnames_begin", ModuleCU->getID(), true);
2736  EOL("Length of Public Names Info");
2737
2738  EmitLabel("pubnames_begin", ModuleCU->getID());
2739
2740  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
2741
2742  EmitSectionOffset("info_begin", "section_info",
2743                    ModuleCU->getID(), 0, true, false);
2744  EOL("Offset of Compilation Unit Info");
2745
2746  EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2747                 true);
2748  EOL("Compilation Unit Length");
2749
2750  const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2751  for (StringMap<DIE*>::const_iterator
2752         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2753    const char *Name = GI->getKeyData();
2754    DIE * Entity = GI->second;
2755
2756    Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
2757
2758    if (Asm->VerboseAsm)
2759      Asm->OutStreamer.AddComment("External Name");
2760    Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2761  }
2762
2763  Asm->EmitInt32(0); EOL("End Mark");
2764  EmitLabel("pubnames_end", ModuleCU->getID());
2765  Asm->O << '\n';
2766}
2767
2768void DwarfDebug::emitDebugPubTypes() {
2769  // Start the dwarf pubnames section.
2770  Asm->OutStreamer.SwitchSection(
2771                          Asm->getObjFileLowering().getDwarfPubTypesSection());
2772  EmitDifference("pubtypes_end", ModuleCU->getID(),
2773                 "pubtypes_begin", ModuleCU->getID(), true);
2774  EOL("Length of Public Types Info");
2775
2776  EmitLabel("pubtypes_begin", ModuleCU->getID());
2777
2778  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
2779
2780  EmitSectionOffset("info_begin", "section_info",
2781                    ModuleCU->getID(), 0, true, false);
2782  EOL("Offset of Compilation ModuleCU Info");
2783
2784  EmitDifference("info_end", ModuleCU->getID(), "info_begin", ModuleCU->getID(),
2785                 true);
2786  EOL("Compilation ModuleCU Length");
2787
2788  const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2789  for (StringMap<DIE*>::const_iterator
2790         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2791    const char *Name = GI->getKeyData();
2792    DIE * Entity = GI->second;
2793
2794    Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
2795
2796    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2797    Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)), 0);
2798  }
2799
2800  Asm->EmitInt32(0); EOL("End Mark");
2801  EmitLabel("pubtypes_end", ModuleCU->getID());
2802  Asm->O << '\n';
2803}
2804
2805/// emitDebugStr - Emit visible names into a debug str section.
2806///
2807void DwarfDebug::emitDebugStr() {
2808  // Check to see if it is worth the effort.
2809  if (!StringPool.empty()) {
2810    // Start the dwarf str section.
2811    Asm->OutStreamer.SwitchSection(
2812                                Asm->getObjFileLowering().getDwarfStrSection());
2813
2814    // For each of strings in the string pool.
2815    for (unsigned StringID = 1, N = StringPool.size();
2816         StringID <= N; ++StringID) {
2817      // Emit a label for reference from debug information entries.
2818      EmitLabel("string", StringID);
2819
2820      // Emit the string itself.
2821      const std::string &String = StringPool[StringID];
2822      Asm->OutStreamer.EmitBytes(StringRef(String.c_str(), String.size()+1), 0);
2823    }
2824
2825    Asm->O << '\n';
2826  }
2827}
2828
2829/// emitDebugLoc - Emit visible names into a debug loc section.
2830///
2831void DwarfDebug::emitDebugLoc() {
2832  // Start the dwarf loc section.
2833  Asm->OutStreamer.SwitchSection(
2834                              Asm->getObjFileLowering().getDwarfLocSection());
2835}
2836
2837/// EmitDebugARanges - Emit visible names into a debug aranges section.
2838///
2839void DwarfDebug::EmitDebugARanges() {
2840  // Start the dwarf aranges section.
2841  Asm->OutStreamer.SwitchSection(
2842                          Asm->getObjFileLowering().getDwarfARangesSection());
2843
2844  // FIXME - Mock up
2845#if 0
2846  CompileUnit *Unit = GetBaseCompileUnit();
2847
2848  // Don't include size of length
2849  Asm->EmitInt32(0x1c); EOL("Length of Address Ranges Info");
2850
2851  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2852
2853  EmitReference("info_begin", Unit->getID());
2854  EOL("Offset of Compilation Unit Info");
2855
2856  Asm->EmitInt8(TD->getPointerSize()); EOL("Size of Address");
2857
2858  Asm->EmitInt8(0); EOL("Size of Segment Descriptor");
2859
2860  Asm->EmitInt16(0);  EOL("Pad (1)");
2861  Asm->EmitInt16(0);  EOL("Pad (2)");
2862
2863  // Range 1
2864  EmitReference("text_begin", 0); EOL("Address");
2865  EmitDifference("text_end", 0, "text_begin", 0, true); EOL("Length");
2866
2867  Asm->EmitInt32(0); EOL("EOM (1)");
2868  Asm->EmitInt32(0); EOL("EOM (2)");
2869#endif
2870}
2871
2872/// emitDebugRanges - Emit visible names into a debug ranges section.
2873///
2874void DwarfDebug::emitDebugRanges() {
2875  // Start the dwarf ranges section.
2876  Asm->OutStreamer.SwitchSection(
2877                            Asm->getObjFileLowering().getDwarfRangesSection());
2878}
2879
2880/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2881///
2882void DwarfDebug::emitDebugMacInfo() {
2883  if (const MCSection *LineInfo =
2884      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2885    // Start the dwarf macinfo section.
2886    Asm->OutStreamer.SwitchSection(LineInfo);
2887  }
2888}
2889
2890/// emitDebugInlineInfo - Emit inline info using following format.
2891/// Section Header:
2892/// 1. length of section
2893/// 2. Dwarf version number
2894/// 3. address size.
2895///
2896/// Entries (one "entry" for each function that was inlined):
2897///
2898/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2899///   otherwise offset into __debug_str for regular function name.
2900/// 2. offset into __debug_str section for regular function name.
2901/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2902/// instances for the function.
2903///
2904/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2905/// inlined instance; the die_offset points to the inlined_subroutine die in the
2906/// __debug_info section, and the low_pc is the starting address for the
2907/// inlining instance.
2908void DwarfDebug::emitDebugInlineInfo() {
2909  if (!MAI->doesDwarfUsesInlineInfoSection())
2910    return;
2911
2912  if (!ModuleCU)
2913    return;
2914
2915  Asm->OutStreamer.SwitchSection(
2916                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
2917
2918  EmitDifference("debug_inlined_end", 1,
2919                 "debug_inlined_begin", 1, true);
2920  EOL("Length of Debug Inlined Information Entry");
2921
2922  EmitLabel("debug_inlined_begin", 1);
2923
2924  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2925  Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2926
2927  for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2928         E = InlinedSPNodes.end(); I != E; ++I) {
2929
2930    MDNode *Node = *I;
2931    DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2932      = InlineInfo.find(Node);
2933    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2934    DISubprogram SP(Node);
2935    StringRef LName = SP.getLinkageName();
2936    StringRef Name = SP.getName();
2937
2938    if (LName.empty()) {
2939      Asm->OutStreamer.EmitBytes(Name, 0);
2940      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2941    } else
2942      EmitSectionOffset("string", "section_str",
2943                      StringPool.idFor(getRealLinkageName(LName)), false, true);
2944
2945    EOL("MIPS linkage name");
2946    EmitSectionOffset("string", "section_str",
2947                      StringPool.idFor(Name), false, true);
2948    EOL("Function name");
2949    EmitULEB128(Labels.size(), "Inline count");
2950
2951    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2952           LE = Labels.end(); LI != LE; ++LI) {
2953      DIE *SP = LI->second;
2954      Asm->EmitInt32(SP->getOffset()); EOL("DIE offset");
2955
2956      if (TD->getPointerSize() == sizeof(int32_t))
2957        O << MAI->getData32bitsDirective();
2958      else
2959        O << MAI->getData64bitsDirective();
2960
2961      PrintLabelName("label", LI->first); EOL("low_pc");
2962    }
2963  }
2964
2965  EmitLabel("debug_inlined_end", 1);
2966  Asm->O << '\n';
2967}
2968