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