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