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