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