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