DwarfDebug.cpp revision bbb88db993af5f30eecc3139f9bf7c703e8ad7c1
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(StringRef Name, DIE *Die) { Globals[Name] = Die; }
96
97  /// addGlobalType - Add a new global type to the compile unit.
98  ///
99  void addGlobalType(StringRef 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  // DbgValueLabel - DBG_VALUE is effective from this label.
153  MCSymbol *DbgValueLabel;
154  DbgVariable *const AbstractVar;    // Abstract variable for this variable.
155  DIE *TheDIE;
156public:
157  // AbsVar may be NULL.
158  DbgVariable(DIVariable V, unsigned I, DbgVariable *AbsVar)
159    : Var(V), FrameIndex(I), DbgValueMInsn(0),
160      DbgValueLabel(0), AbstractVar(AbsVar), TheDIE(0) {}
161  DbgVariable(DIVariable V, const MachineInstr *MI, DbgVariable *AbsVar)
162    : Var(V), FrameIndex(0), DbgValueMInsn(MI), DbgValueLabel(0),
163      AbstractVar(AbsVar), TheDIE(0)
164    {}
165
166  // Accessors.
167  DIVariable getVariable()           const { return Var; }
168  unsigned getFrameIndex()           const { return FrameIndex; }
169  const MachineInstr *getDbgValue()  const { return DbgValueMInsn; }
170  MCSymbol *getDbgValueLabel()       const { return DbgValueLabel; }
171  void setDbgValueLabel(MCSymbol *L)       { DbgValueLabel = L; }
172  DbgVariable *getAbstractVariable() const { return AbstractVar; }
173  void setDIE(DIE *D)                      { TheDIE = D; }
174  DIE *getDIE()                      const { return TheDIE; }
175};
176
177//===----------------------------------------------------------------------===//
178/// DbgScope - This class is used to track scope information.
179///
180class DbgScope {
181  DbgScope *Parent;                   // Parent to this scope.
182  DIDescriptor Desc;                  // Debug info descriptor for scope.
183  // Location at which this scope is inlined.
184  AssertingVH<MDNode> InlinedAtLocation;
185  bool AbstractScope;                 // Abstract Scope
186  MCSymbol *StartLabel;               // Label ID of the beginning of scope.
187  MCSymbol *EndLabel;                 // Label ID of the end of scope.
188  const MachineInstr *LastInsn;       // Last instruction of this scope.
189  const MachineInstr *FirstInsn;      // First instruction of this scope.
190  // Scopes defined in scope.  Contents not owned.
191  SmallVector<DbgScope *, 4> Scopes;
192  // Variables declared in scope.  Contents owned.
193  SmallVector<DbgVariable *, 8> Variables;
194
195  // Private state for dump()
196  mutable unsigned IndentLevel;
197public:
198  DbgScope(DbgScope *P, DIDescriptor D, MDNode *I = 0)
199    : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
200      StartLabel(0), EndLabel(0),
201      LastInsn(0), FirstInsn(0), IndentLevel(0) {}
202  virtual ~DbgScope();
203
204  // Accessors.
205  DbgScope *getParent()          const { return Parent; }
206  void setParent(DbgScope *P)          { Parent = P; }
207  DIDescriptor getDesc()         const { return Desc; }
208  MDNode *getInlinedAt()         const { return InlinedAtLocation; }
209  MDNode *getScopeNode()         const { return Desc.getNode(); }
210  MCSymbol *getStartLabel()      const { return StartLabel; }
211  MCSymbol *getEndLabel()        const { return EndLabel; }
212  const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
213  const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
214  void setStartLabel(MCSymbol *S) { StartLabel = S; }
215  void setEndLabel(MCSymbol *E)   { EndLabel = E; }
216  void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
217  const MachineInstr *getLastInsn()      { return LastInsn; }
218  void setFirstInsn(const MachineInstr *MI) { FirstInsn = MI; }
219  void setAbstractScope() { AbstractScope = true; }
220  bool isAbstractScope() const { return AbstractScope; }
221  const MachineInstr *getFirstInsn()      { return FirstInsn; }
222
223  /// addScope - Add a scope to the scope.
224  ///
225  void addScope(DbgScope *S) { Scopes.push_back(S); }
226
227  /// addVariable - Add a variable to the scope.
228  ///
229  void addVariable(DbgVariable *V) { Variables.push_back(V); }
230
231  void fixInstructionMarkers(DenseMap<const MachineInstr *,
232                             unsigned> &MIIndexMap) {
233    assert(getFirstInsn() && "First instruction is missing!");
234
235    // Use the end of last child scope as end of this scope.
236    const SmallVector<DbgScope *, 4> &Scopes = getScopes();
237    const MachineInstr *LastInsn = getFirstInsn();
238    unsigned LIndex = 0;
239    if (Scopes.empty()) {
240      assert(getLastInsn() && "Inner most scope does not have last insn!");
241      return;
242    }
243    for (SmallVector<DbgScope *, 4>::const_iterator SI = Scopes.begin(),
244           SE = Scopes.end(); SI != SE; ++SI) {
245      DbgScope *DS = *SI;
246      DS->fixInstructionMarkers(MIIndexMap);
247      const MachineInstr *DSLastInsn = DS->getLastInsn();
248      unsigned DSI = MIIndexMap[DSLastInsn];
249      if (DSI > LIndex) {
250        LastInsn = DSLastInsn;
251        LIndex = DSI;
252      }
253    }
254
255    unsigned CurrentLastInsnIndex = 0;
256    if (const MachineInstr *CL = getLastInsn())
257      CurrentLastInsnIndex = MIIndexMap[CL];
258    unsigned FIndex = MIIndexMap[getFirstInsn()];
259
260    // Set LastInsn as the last instruction for this scope only if
261    // it follows
262    //  1) this scope's first instruction and
263    //  2) current last instruction for this scope, if any.
264    if (LIndex >= CurrentLastInsnIndex && LIndex >= FIndex)
265      setLastInsn(LastInsn);
266  }
267
268#ifndef NDEBUG
269  void dump() const;
270#endif
271};
272
273#ifndef NDEBUG
274void DbgScope::dump() const {
275  raw_ostream &err = dbgs();
276  err.indent(IndentLevel);
277  MDNode *N = Desc.getNode();
278  N->dump();
279  err << " [" << StartLabel << ", " << EndLabel << "]\n";
280  if (AbstractScope)
281    err << "Abstract Scope\n";
282
283  IndentLevel += 2;
284  if (!Scopes.empty())
285    err << "Children ...\n";
286  for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
287    if (Scopes[i] != this)
288      Scopes[i]->dump();
289
290  IndentLevel -= 2;
291}
292#endif
293
294DbgScope::~DbgScope() {
295  for (unsigned j = 0, M = Variables.size(); j < M; ++j)
296    delete Variables[j];
297}
298
299} // end llvm namespace
300
301DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T)
302  : DwarfPrinter(OS, A, T), ModuleCU(0),
303    AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(),
304    DIEBlocks(), SectionSourceLines(), didInitial(false), shouldEmit(false),
305    CurrentFnDbgScope(0), PrevDILoc(0), DebugTimer(0) {
306  NextStringPoolNumber = 0;
307  if (TimePassesIsEnabled)
308    DebugTimer = new Timer("Dwarf Debug Writer");
309}
310DwarfDebug::~DwarfDebug() {
311  for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
312    DIEBlocks[j]->~DIEBlock();
313
314  delete DebugTimer;
315}
316
317MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
318  std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
319  if (Entry.first) return Entry.first;
320
321  Entry.second = NextStringPoolNumber++;
322  return Entry.first = getDWLabel("string", Entry.second);
323}
324
325
326/// assignAbbrevNumber - Define a unique number for the abbreviation.
327///
328void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
329  // Profile the node so that we can make it unique.
330  FoldingSetNodeID ID;
331  Abbrev.Profile(ID);
332
333  // Check the set for priors.
334  DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
335
336  // If it's newly added.
337  if (InSet == &Abbrev) {
338    // Add to abbreviation list.
339    Abbreviations.push_back(&Abbrev);
340
341    // Assign the vector position + 1 as its number.
342    Abbrev.setNumber(Abbreviations.size());
343  } else {
344    // Assign existing abbreviation number.
345    Abbrev.setNumber(InSet->getNumber());
346  }
347}
348
349/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
350/// information entry.
351DIEEntry *DwarfDebug::createDIEEntry(DIE *Entry) {
352  DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
353  return Value;
354}
355
356/// addUInt - Add an unsigned integer attribute data and value.
357///
358void DwarfDebug::addUInt(DIE *Die, unsigned Attribute,
359                         unsigned Form, uint64_t Integer) {
360  if (!Form) Form = DIEInteger::BestForm(false, Integer);
361  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
362  Die->addValue(Attribute, Form, Value);
363}
364
365/// addSInt - Add an signed integer attribute data and value.
366///
367void DwarfDebug::addSInt(DIE *Die, unsigned Attribute,
368                         unsigned Form, int64_t Integer) {
369  if (!Form) Form = DIEInteger::BestForm(true, Integer);
370  DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
371  Die->addValue(Attribute, Form, Value);
372}
373
374/// addString - Add a string attribute data and value. DIEString only
375/// keeps string reference.
376void DwarfDebug::addString(DIE *Die, unsigned Attribute, unsigned Form,
377                           StringRef String) {
378  DIEValue *Value = new (DIEValueAllocator) DIEString(String);
379  Die->addValue(Attribute, Form, Value);
380}
381
382/// addLabel - Add a Dwarf label attribute data and value.
383///
384void DwarfDebug::addLabel(DIE *Die, unsigned Attribute, unsigned Form,
385                          const MCSymbol *Label) {
386  DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
387  Die->addValue(Attribute, Form, Value);
388}
389
390/// addDelta - Add a label delta attribute data and value.
391///
392void DwarfDebug::addDelta(DIE *Die, unsigned Attribute, unsigned Form,
393                          const MCSymbol *Hi, const MCSymbol *Lo) {
394  DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
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  DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on.
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 (DIEValueAllocator) 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 forwardingFieldOffset =
690    DIDerivedType(forwardingField.getNode()).getOffsetInBits() >> 3;
691  unsigned 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 (DIEValueAllocator) 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 (DIEValueAllocator) 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 (DIEValueAllocator) 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 (DIEValueAllocator) 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 (DIEValueAllocator) 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 = InlinedAt != 0;
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 || End == 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 || EndLabel == 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          if (MCSymbol *VS = DV->getDbgValueLabel())
1502            addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1503                     VS);
1504        } else if (DbgValueInsn->getOperand(0).getType() ==
1505                   MachineOperand::MO_Immediate) {
1506          DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1507          unsigned Imm = DbgValueInsn->getOperand(0).getImm();
1508          addUInt(Block, 0, dwarf::DW_FORM_udata, Imm);
1509          addBlock(VariableDie, dwarf::DW_AT_const_value, 0, Block);
1510          if (MCSymbol *VS = DV->getDbgValueLabel())
1511            addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1512                     VS);
1513        } else {
1514          //FIXME : Handle other operand types.
1515          delete VariableDie;
1516          return NULL;
1517        }
1518      }
1519    } else {
1520      MachineLocation Location;
1521      unsigned FrameReg;
1522      int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(),
1523                                              FrameReg);
1524      Location.set(FrameReg, Offset);
1525
1526      if (VD.hasComplexAddress())
1527        addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1528      else if (VD.isBlockByrefVariable())
1529        addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1530      else
1531        addAddress(VariableDie, dwarf::DW_AT_location, Location);
1532    }
1533  }
1534
1535  if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1536    addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1537  DV->setDIE(VariableDie);
1538  return VariableDie;
1539
1540}
1541
1542void DwarfDebug::addPubTypes(DISubprogram SP) {
1543  DICompositeType SPTy = SP.getType();
1544  unsigned SPTag = SPTy.getTag();
1545  if (SPTag != dwarf::DW_TAG_subroutine_type)
1546    return;
1547
1548  DIArray Args = SPTy.getTypeArray();
1549  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1550    DIType ATy(Args.getElement(i).getNode());
1551    if (!ATy.isValid())
1552      continue;
1553    DICompositeType CATy = getDICompositeType(ATy);
1554    if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()) {
1555      if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1556        ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1557    }
1558  }
1559}
1560
1561/// constructScopeDIE - Construct a DIE for this scope.
1562DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1563  if (!Scope || !Scope->getScopeNode())
1564    return NULL;
1565
1566  DIScope DS(Scope->getScopeNode());
1567  DIE *ScopeDIE = NULL;
1568  if (Scope->getInlinedAt())
1569    ScopeDIE = constructInlinedScopeDIE(Scope);
1570  else if (DS.isSubprogram()) {
1571    if (Scope->isAbstractScope())
1572      ScopeDIE = ModuleCU->getDIE(DS.getNode());
1573    else
1574      ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1575  }
1576  else
1577    ScopeDIE = constructLexicalScopeDIE(Scope);
1578  if (!ScopeDIE) return NULL;
1579
1580  // Add variables to scope.
1581  const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1582  for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1583    DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1584    if (VariableDIE)
1585      ScopeDIE->addChild(VariableDIE);
1586  }
1587
1588  // Add nested scopes.
1589  const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1590  for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1591    // Define the Scope debug information entry.
1592    DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1593    if (NestedDIE)
1594      ScopeDIE->addChild(NestedDIE);
1595  }
1596
1597  if (DS.isSubprogram())
1598    addPubTypes(DISubprogram(DS.getNode()));
1599
1600 return ScopeDIE;
1601}
1602
1603/// GetOrCreateSourceID - Look up the source id with the given directory and
1604/// source file names. If none currently exists, create a new id and insert it
1605/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1606/// maps as well.
1607unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1608  unsigned DId;
1609  StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1610  if (DI != DirectoryIdMap.end()) {
1611    DId = DI->getValue();
1612  } else {
1613    DId = DirectoryNames.size() + 1;
1614    DirectoryIdMap[DirName] = DId;
1615    DirectoryNames.push_back(DirName);
1616  }
1617
1618  unsigned FId;
1619  StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1620  if (FI != SourceFileIdMap.end()) {
1621    FId = FI->getValue();
1622  } else {
1623    FId = SourceFileNames.size() + 1;
1624    SourceFileIdMap[FileName] = FId;
1625    SourceFileNames.push_back(FileName);
1626  }
1627
1628  DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1629    SourceIdMap.find(std::make_pair(DId, FId));
1630  if (SI != SourceIdMap.end())
1631    return SI->second;
1632
1633  unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1634  SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1635  SourceIds.push_back(std::make_pair(DId, FId));
1636
1637  return SrcId;
1638}
1639
1640/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1641DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1642  DIE *NDie = ModuleCU->getDIE(NS.getNode());
1643  if (NDie)
1644    return NDie;
1645  NDie = new DIE(dwarf::DW_TAG_namespace);
1646  ModuleCU->insertDIE(NS.getNode(), NDie);
1647  if (!NS.getName().empty())
1648    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1649  addSourceLine(NDie, &NS);
1650  addToContextOwner(NDie, NS.getContext());
1651  return NDie;
1652}
1653
1654void DwarfDebug::constructCompileUnit(MDNode *N) {
1655  DICompileUnit DIUnit(N);
1656  // Use first compile unit marked as isMain as the compile unit for this
1657  // module.
1658  if (ModuleCU || !DIUnit.isMain())
1659    return;
1660  StringRef FN = DIUnit.getFilename();
1661  StringRef Dir = DIUnit.getDirectory();
1662  unsigned ID = GetOrCreateSourceID(Dir, FN);
1663
1664  DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1665  addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1666            DIUnit.getProducer());
1667  addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1668          DIUnit.getLanguage());
1669  addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1670  addLabel(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1671           getTempLabel("text_begin"));
1672  addLabel(Die, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1673           getTempLabel("text_end"));
1674  // DW_AT_stmt_list is a offset of line number information for this
1675  // compile unit in debug_line section. It is always zero when only one
1676  // compile unit is emitted in one object file.
1677  addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1678
1679  if (!Dir.empty())
1680    addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1681  if (DIUnit.isOptimized())
1682    addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1683
1684  StringRef Flags = DIUnit.getFlags();
1685  if (!Flags.empty())
1686    addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1687
1688  unsigned RVer = DIUnit.getRunTimeVersion();
1689  if (RVer)
1690    addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1691            dwarf::DW_FORM_data1, RVer);
1692
1693  assert(!ModuleCU &&
1694         "ModuleCU assigned since the top of constructCompileUnit");
1695  ModuleCU = new CompileUnit(ID, Die);
1696}
1697
1698void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1699  DIGlobalVariable DI_GV(N);
1700
1701  // If debug information is malformed then ignore it.
1702  if (DI_GV.Verify() == false)
1703    return;
1704
1705  // Check for pre-existence.
1706  if (ModuleCU->getDIE(DI_GV.getNode()))
1707    return;
1708
1709  DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1710  if (!VariableDie)
1711    return;
1712
1713  // Add to map.
1714  ModuleCU->insertDIE(N, VariableDie);
1715
1716  // Add to context owner.
1717  DIDescriptor GVContext = DI_GV.getContext();
1718  // Do not create specification DIE if context is either compile unit
1719  // or a subprogram.
1720  if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1721      !GVContext.isFile() && !GVContext.isSubprogram()) {
1722    // Create specification DIE.
1723    DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1724    addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1725                dwarf::DW_FORM_ref4, VariableDie);
1726    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1727    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1728    addLabel(Block, 0, dwarf::DW_FORM_udata,
1729             Asm->Mang->getSymbol(DI_GV.getGlobal()));
1730    addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1731    addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1732    ModuleCU->addDie(VariableSpecDIE);
1733  } else {
1734    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1735    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1736    addLabel(Block, 0, dwarf::DW_FORM_udata,
1737             Asm->Mang->getSymbol(DI_GV.getGlobal()));
1738    addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1739  }
1740  addToContextOwner(VariableDie, GVContext);
1741
1742  // Expose as global. FIXME - need to check external flag.
1743  ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1744
1745  DIType GTy = DI_GV.getType();
1746  if (GTy.isCompositeType() && !GTy.getName().empty()) {
1747    DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1748    assert(Entry && "Missing global type!");
1749    ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1750  }
1751  return;
1752}
1753
1754void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1755  DISubprogram SP(N);
1756
1757  // Check for pre-existence.
1758  if (ModuleCU->getDIE(N))
1759    return;
1760
1761  if (!SP.isDefinition())
1762    // This is a method declaration which will be handled while constructing
1763    // class type.
1764    return;
1765
1766  DIE *SubprogramDie = createSubprogramDIE(SP);
1767
1768  // Add to map.
1769  ModuleCU->insertDIE(N, SubprogramDie);
1770
1771  // Add to context owner.
1772  addToContextOwner(SubprogramDie, SP.getContext());
1773
1774  // Expose as global.
1775  ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1776
1777  return;
1778}
1779
1780/// beginModule - Emit all Dwarf sections that should come prior to the
1781/// content. Create global DIEs and emit initial debug info sections.
1782/// This is inovked by the target AsmPrinter.
1783void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
1784  this->M = M;
1785
1786  if (!MAI->doesSupportDebugInformation())
1787    return;
1788
1789  TimeRegion Timer(DebugTimer);
1790
1791  DebugInfoFinder DbgFinder;
1792  DbgFinder.processModule(*M);
1793
1794  // Create all the compile unit DIEs.
1795  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1796         E = DbgFinder.compile_unit_end(); I != E; ++I)
1797    constructCompileUnit(*I);
1798
1799  if (!ModuleCU)
1800    return;
1801
1802  // Create DIEs for each subprogram.
1803  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1804         E = DbgFinder.subprogram_end(); I != E; ++I)
1805    constructSubprogramDIE(*I);
1806
1807  // Create DIEs for each global variable.
1808  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1809         E = DbgFinder.global_variable_end(); I != E; ++I)
1810    constructGlobalVariableDIE(*I);
1811
1812  MMI = mmi;
1813  shouldEmit = true;
1814  MMI->setDebugInfoAvailability(true);
1815
1816  // Prime section data.
1817  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1818
1819  // Print out .file directives to specify files for .loc directives. These are
1820  // printed out early so that they precede any .loc directives.
1821  if (MAI->hasDotLocAndDotFile()) {
1822    for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1823      // Remember source id starts at 1.
1824      std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1825      // FIXME: don't use sys::path for this!  This should not depend on the
1826      // host.
1827      sys::Path FullPath(getSourceDirectoryName(Id.first));
1828      bool AppendOk =
1829        FullPath.appendComponent(getSourceFileName(Id.second));
1830      assert(AppendOk && "Could not append filename to directory!");
1831      AppendOk = false;
1832      Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1833    }
1834  }
1835
1836  // Emit initial sections
1837  emitInitial();
1838}
1839
1840/// endModule - Emit all Dwarf sections that should come after the content.
1841///
1842void DwarfDebug::endModule() {
1843  if (!ModuleCU)
1844    return;
1845
1846  TimeRegion Timer(DebugTimer);
1847
1848  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1849  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1850         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1851    DIE *ISP = *AI;
1852    addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1853  }
1854
1855  // Insert top level DIEs.
1856  for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1857         TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1858    ModuleCU->getCUDie()->addChild(*TI);
1859
1860  for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1861         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1862    DIE *SPDie = CI->first;
1863    MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1864    if (!N) continue;
1865    DIE *NDie = ModuleCU->getDIE(N);
1866    if (!NDie) continue;
1867    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1868    // FIXME - This is not the correct approach.
1869    //addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie
1870  }
1871
1872  // Standard sections final addresses.
1873  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1874  Asm->OutStreamer.EmitLabel(getTempLabel("text_end"));
1875  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1876  Asm->OutStreamer.EmitLabel(getTempLabel("data_end"));
1877
1878  // End text sections.
1879  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1880    Asm->OutStreamer.SwitchSection(SectionMap[i]);
1881    Asm->OutStreamer.EmitLabel(getDWLabel("section_end", i));
1882  }
1883
1884  // Emit common frame information.
1885  emitCommonDebugFrame();
1886
1887  // Emit function debug frame information
1888  for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1889         E = DebugFrames.end(); I != E; ++I)
1890    emitFunctionDebugFrame(*I);
1891
1892  // Compute DIE offsets and sizes.
1893  computeSizeAndOffsets();
1894
1895  // Emit all the DIEs into a debug info section
1896  emitDebugInfo();
1897
1898  // Corresponding abbreviations into a abbrev section.
1899  emitAbbreviations();
1900
1901  // Emit source line correspondence into a debug line section.
1902  emitDebugLines();
1903
1904  // Emit info into a debug pubnames section.
1905  emitDebugPubNames();
1906
1907  // Emit info into a debug pubtypes section.
1908  emitDebugPubTypes();
1909
1910  // Emit info into a debug loc section.
1911  emitDebugLoc();
1912
1913  // Emit info into a debug aranges section.
1914  EmitDebugARanges();
1915
1916  // Emit info into a debug ranges section.
1917  emitDebugRanges();
1918
1919  // Emit info into a debug macinfo section.
1920  emitDebugMacInfo();
1921
1922  // Emit inline info.
1923  emitDebugInlineInfo();
1924
1925  // Emit info into a debug str section.
1926  emitDebugStr();
1927
1928  delete ModuleCU;
1929  ModuleCU = NULL;  // Reset for the next Module, if any.
1930}
1931
1932/// findAbstractVariable - Find abstract variable, if any, associated with Var.
1933DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1934                                              unsigned FrameIdx,
1935                                              DILocation &ScopeLoc) {
1936
1937  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1938  if (AbsDbgVariable)
1939    return AbsDbgVariable;
1940
1941  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1942  if (!Scope)
1943    return NULL;
1944
1945  AbsDbgVariable = new DbgVariable(Var, FrameIdx,
1946                                   NULL /* No more-abstract variable*/);
1947  Scope->addVariable(AbsDbgVariable);
1948  AbstractVariables[Var.getNode()] = AbsDbgVariable;
1949  return AbsDbgVariable;
1950}
1951
1952/// findAbstractVariable - Find abstract variable, if any, associated with Var.
1953/// FIXME : Refactor findAbstractVariable.
1954DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1955                                              const MachineInstr *MI,
1956                                              DILocation &ScopeLoc) {
1957
1958  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1959  if (AbsDbgVariable)
1960    return AbsDbgVariable;
1961
1962  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1963  if (!Scope)
1964    return NULL;
1965
1966  AbsDbgVariable = new DbgVariable(Var, MI,
1967                                   NULL /* No more-abstract variable*/);
1968  Scope->addVariable(AbsDbgVariable);
1969  AbstractVariables[Var.getNode()] = AbsDbgVariable;
1970  DbgValueStartMap[MI] = AbsDbgVariable;
1971  return AbsDbgVariable;
1972}
1973
1974/// collectVariableInfo - Populate DbgScope entries with variables' info.
1975void DwarfDebug::collectVariableInfo() {
1976  if (!MMI) return;
1977
1978  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1979  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1980         VE = VMap.end(); VI != VE; ++VI) {
1981    MDNode *Var = VI->first;
1982    if (!Var) continue;
1983    DIVariable DV (Var);
1984    std::pair< unsigned, MDNode *> VP = VI->second;
1985    DILocation ScopeLoc(VP.second);
1986
1987    DbgScope *Scope =
1988      ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1989    if (!Scope)
1990      Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
1991    // If variable scope is not found then skip this variable.
1992    if (!Scope)
1993      continue;
1994
1995    DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first, ScopeLoc);
1996    DbgVariable *RegVar = new DbgVariable(DV, VP.first, AbsDbgVariable);
1997    Scope->addVariable(RegVar);
1998  }
1999
2000  // Collect variable information from DBG_VALUE machine instructions;
2001  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2002       I != E; ++I) {
2003    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2004         II != IE; ++II) {
2005      const MachineInstr *MInsn = II;
2006      if (!MInsn->isDebugValue())
2007        continue;
2008
2009      // FIXME : Lift this restriction.
2010      if (MInsn->getNumOperands() != 3)
2011        continue;
2012      DIVariable DV((MDNode*)(MInsn->getOperand(MInsn->getNumOperands()
2013                                                - 1).getMetadata()));
2014      if (DV.getTag() == dwarf::DW_TAG_arg_variable)  {
2015        // FIXME Handle inlined subroutine arguments.
2016        DbgVariable *ArgVar = new DbgVariable(DV, MInsn, NULL);
2017        CurrentFnDbgScope->addVariable(ArgVar);
2018        DbgValueStartMap[MInsn] = ArgVar;
2019        continue;
2020      }
2021
2022      DebugLoc DL = MInsn->getDebugLoc();
2023      if (DL.isUnknown()) continue;
2024      DILocation ScopeLoc = MF->getDILocation(DL);
2025      DbgScope *Scope =
2026        ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
2027      if (!Scope)
2028        Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
2029      // If variable scope is not found then skip this variable.
2030      if (!Scope)
2031        continue;
2032
2033      DbgVariable *AbsDbgVariable = findAbstractVariable(DV, MInsn, ScopeLoc);
2034      DbgVariable *RegVar = new DbgVariable(DV, MInsn, AbsDbgVariable);
2035      DbgValueStartMap[MInsn] = RegVar;
2036      Scope->addVariable(RegVar);
2037    }
2038  }
2039}
2040
2041/// beginScope - Process beginning of a scope.
2042void DwarfDebug::beginScope(const MachineInstr *MI) {
2043  // Check location.
2044  DebugLoc DL = MI->getDebugLoc();
2045  if (DL.isUnknown())
2046    return;
2047  DILocation DILoc = MF->getDILocation(DL);
2048  if (!DILoc.getScope().Verify())
2049    return;
2050
2051  // Check and update last known location info.
2052  if(DILoc.getNode() == PrevDILoc)
2053    return;
2054  PrevDILoc = DILoc.getNode();
2055
2056  // DBG_VALUE instruction establishes new value.
2057  if (MI->isDebugValue()) {
2058    DenseMap<const MachineInstr *, DbgVariable *>::iterator DI
2059      = DbgValueStartMap.find(MI);
2060    if (DI != DbgValueStartMap.end()) {
2061      MCSymbol *Label = recordSourceLine(DILoc.getLineNumber(),
2062                                         DILoc.getColumnNumber(),
2063                                         DILoc.getScope().getNode());
2064      DI->second->setDbgValueLabel(Label);
2065    }
2066    return;
2067  }
2068
2069  // Emit a label to indicate location change. This is used for line
2070  // table even if this instruction does start a new scope.
2071  MCSymbol *Label = recordSourceLine(DILoc.getLineNumber(),
2072                                     DILoc.getColumnNumber(),
2073                                     DILoc.getScope().getNode());
2074
2075  // update DbgScope if this instruction starts a new scope.
2076  InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
2077  if (I == DbgScopeBeginMap.end())
2078    return;
2079
2080  ScopeVector &SD = I->second;
2081  for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
2082       SDI != SDE; ++SDI)
2083    (*SDI)->setStartLabel(Label);
2084}
2085
2086/// endScope - Process end of a scope.
2087void DwarfDebug::endScope(const MachineInstr *MI) {
2088  // Ignore DBG_VALUE instruction.
2089  if (MI->isDebugValue())
2090    return;
2091
2092  // Check location.
2093  DebugLoc DL = MI->getDebugLoc();
2094  if (DL.isUnknown())
2095    return;
2096  DILocation DILoc = MF->getDILocation(DL);
2097  if (!DILoc.getScope().Verify())
2098    return;
2099
2100  // Emit a label and update DbgScope if this instruction ends a scope.
2101  InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
2102  if (I == DbgScopeEndMap.end())
2103    return;
2104
2105  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2106  Asm->OutStreamer.EmitLabel(Label);
2107
2108  SmallVector<DbgScope*, 2> &SD = I->second;
2109  for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2110       SDI != SDE; ++SDI)
2111    (*SDI)->setEndLabel(Label);
2112  return;
2113}
2114
2115/// createDbgScope - Create DbgScope for the scope.
2116void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2117
2118  if (!InlinedAt) {
2119    DbgScope *WScope = DbgScopeMap.lookup(Scope);
2120    if (WScope)
2121      return;
2122    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2123    DbgScopeMap.insert(std::make_pair(Scope, WScope));
2124    if (DIDescriptor(Scope).isLexicalBlock())
2125      createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2126    return;
2127  }
2128
2129  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2130  if (WScope)
2131    return;
2132
2133  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2134  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2135  DILocation DL(InlinedAt);
2136  createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2137}
2138
2139/// extractScopeInformation - Scan machine instructions in this function
2140/// and collect DbgScopes. Return true, if at least one scope was found.
2141bool DwarfDebug::extractScopeInformation() {
2142  // If scope information was extracted using .dbg intrinsics then there is not
2143  // any need to extract these information by scanning each instruction.
2144  if (!DbgScopeMap.empty())
2145    return false;
2146
2147  DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2148  unsigned MIIndex = 0;
2149  // Scan each instruction and create scopes. First build working set of scopes.
2150  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2151       I != E; ++I) {
2152    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2153         II != IE; ++II) {
2154      const MachineInstr *MInsn = II;
2155      // FIXME : Remove DBG_VALUE check.
2156      if (MInsn->isDebugValue()) continue;
2157      MIIndexMap[MInsn] = MIIndex++;
2158      DebugLoc DL = MInsn->getDebugLoc();
2159      if (DL.isUnknown()) continue;
2160      DILocation DLT = MF->getDILocation(DL);
2161      DIScope DLTScope = DLT.getScope();
2162      if (!DLTScope.getNode()) continue;
2163      // There is no need to create another DIE for compile unit. For all
2164      // other scopes, create one DbgScope now. This will be translated
2165      // into a scope DIE at the end.
2166      if (DLTScope.isCompileUnit()) continue;
2167      createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2168    }
2169  }
2170
2171
2172  // Build scope hierarchy using working set of scopes.
2173  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2174       I != E; ++I) {
2175    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2176         II != IE; ++II) {
2177      const MachineInstr *MInsn = II;
2178      // FIXME : Remove DBG_VALUE check.
2179      if (MInsn->isDebugValue()) continue;
2180      DebugLoc DL = MInsn->getDebugLoc();
2181      if (DL.isUnknown())  continue;
2182      DILocation DLT = MF->getDILocation(DL);
2183      DIScope DLTScope = DLT.getScope();
2184      if (!DLTScope.getNode()) continue;
2185      // There is no need to create another DIE for compile unit. For all
2186      // other scopes, create one DbgScope now. This will be translated
2187      // into a scope DIE at the end.
2188      if (DLTScope.isCompileUnit()) continue;
2189      DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2190                                           DLT.getOrigLocation().getNode());
2191      Scope->setLastInsn(MInsn);
2192    }
2193  }
2194
2195  if (!CurrentFnDbgScope)
2196    return false;
2197
2198  CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2199
2200  // Each scope has first instruction and last instruction to mark beginning
2201  // and end of a scope respectively. Create an inverse map that list scopes
2202  // starts (and ends) with an instruction. One instruction may start (or end)
2203  // multiple scopes. Ignore scopes that are not reachable.
2204  SmallVector<DbgScope *, 4> WorkList;
2205  WorkList.push_back(CurrentFnDbgScope);
2206  while (!WorkList.empty()) {
2207    DbgScope *S = WorkList.pop_back_val();
2208
2209    const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2210    if (!Children.empty())
2211      for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2212             SE = Children.end(); SI != SE; ++SI)
2213        WorkList.push_back(*SI);
2214
2215    if (S->isAbstractScope())
2216      continue;
2217    const MachineInstr *MI = S->getFirstInsn();
2218    assert(MI && "DbgScope does not have first instruction!");
2219
2220    InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2221    if (IDI != DbgScopeBeginMap.end())
2222      IDI->second.push_back(S);
2223    else
2224      DbgScopeBeginMap[MI].push_back(S);
2225
2226    MI = S->getLastInsn();
2227    assert(MI && "DbgScope does not have last instruction!");
2228    IDI = DbgScopeEndMap.find(MI);
2229    if (IDI != DbgScopeEndMap.end())
2230      IDI->second.push_back(S);
2231    else
2232      DbgScopeEndMap[MI].push_back(S);
2233  }
2234
2235  return !DbgScopeMap.empty();
2236}
2237
2238/// beginFunction - Gather pre-function debug information.  Assumes being
2239/// emitted immediately after the function entry point.
2240void DwarfDebug::beginFunction(const MachineFunction *MF) {
2241  this->MF = MF;
2242
2243  if (!ShouldEmitDwarfDebug()) return;
2244  if (!extractScopeInformation())
2245    return;
2246
2247  TimeRegion Timer(DebugTimer);
2248
2249  collectVariableInfo();
2250
2251  // Assumes in correct section after the entry point.
2252  Asm->OutStreamer.EmitLabel(getDWLabel("func_begin", ++SubprogramCount));
2253
2254  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2255  // function.
2256  DebugLoc FDL = MF->getDefaultDebugLoc();
2257  if (!FDL.isUnknown()) {
2258    DILocation DLT = MF->getDILocation(FDL);
2259    DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2260    unsigned Line, Col;
2261    if (SP.Verify()) {
2262      Line = SP.getLineNumber();
2263      Col = 0;
2264    } else {
2265      Line = DLT.getLineNumber();
2266      Col = DLT.getColumnNumber();
2267    }
2268
2269    recordSourceLine(Line, Col, DLT.getScope().getNode());
2270  }
2271}
2272
2273/// endFunction - Gather and emit post-function debug information.
2274///
2275void DwarfDebug::endFunction(const MachineFunction *MF) {
2276  if (!ShouldEmitDwarfDebug()) return;
2277  if (DbgScopeMap.empty()) return;
2278
2279  TimeRegion Timer(DebugTimer);
2280
2281  if (CurrentFnDbgScope) {
2282    // Define end label for subprogram.
2283    Asm->OutStreamer.EmitLabel(getDWLabel("func_end", SubprogramCount));
2284
2285    // Get function line info.
2286    if (!Lines.empty()) {
2287      // Get section line info.
2288      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2289      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2290      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2291      // Append the function info to section info.
2292      SectionLineInfos.insert(SectionLineInfos.end(),
2293                              Lines.begin(), Lines.end());
2294    }
2295
2296    // Construct abstract scopes.
2297    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2298           AE = AbstractScopesList.end(); AI != AE; ++AI)
2299      constructScopeDIE(*AI);
2300
2301    constructScopeDIE(CurrentFnDbgScope);
2302
2303    DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2304                                                 MMI->getFrameMoves()));
2305  }
2306
2307  // Clear debug info
2308  CurrentFnDbgScope = NULL;
2309  DeleteContainerSeconds(DbgScopeMap);
2310  DbgScopeBeginMap.clear();
2311  DbgScopeEndMap.clear();
2312  DbgValueStartMap.clear();
2313  ConcreteScopes.clear();
2314  DeleteContainerSeconds(AbstractScopes);
2315  AbstractScopesList.clear();
2316  AbstractVariables.clear();
2317  Lines.clear();
2318}
2319
2320/// recordSourceLine - Register a source line with debug info. Returns the
2321/// unique label that was emitted and which provides correspondence to
2322/// the source line list.
2323MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
2324  if (!MMI)
2325    return 0;
2326
2327  TimeRegion Timer(DebugTimer);
2328
2329  StringRef Dir;
2330  StringRef Fn;
2331
2332  DIDescriptor Scope(S);
2333  if (Scope.isCompileUnit()) {
2334    DICompileUnit CU(S);
2335    Dir = CU.getDirectory();
2336    Fn = CU.getFilename();
2337  } else if (Scope.isSubprogram()) {
2338    DISubprogram SP(S);
2339    Dir = SP.getDirectory();
2340    Fn = SP.getFilename();
2341  } else if (Scope.isLexicalBlock()) {
2342    DILexicalBlock DB(S);
2343    Dir = DB.getDirectory();
2344    Fn = DB.getFilename();
2345  } else
2346    assert(0 && "Unexpected scope info");
2347
2348  unsigned Src = GetOrCreateSourceID(Dir, Fn);
2349  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2350  Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2351
2352  Asm->OutStreamer.EmitLabel(Label);
2353  return Label;
2354}
2355
2356/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2357/// timed. Look up the source id with the given directory and source file
2358/// names. If none currently exists, create a new id and insert it in the
2359/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2360/// well.
2361unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2362                                         const std::string &FileName) {
2363  TimeRegion Timer(DebugTimer);
2364  return GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2365}
2366
2367//===----------------------------------------------------------------------===//
2368// Emit Methods
2369//===----------------------------------------------------------------------===//
2370
2371/// computeSizeAndOffset - Compute the size and offset of a DIE.
2372///
2373unsigned
2374DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2375  // Get the children.
2376  const std::vector<DIE *> &Children = Die->getChildren();
2377
2378  // If not last sibling and has children then add sibling offset attribute.
2379  if (!Last && !Children.empty())
2380    Die->addSiblingOffset(DIEValueAllocator);
2381
2382  // Record the abbreviation.
2383  assignAbbrevNumber(Die->getAbbrev());
2384
2385  // Get the abbreviation for this DIE.
2386  unsigned AbbrevNumber = Die->getAbbrevNumber();
2387  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2388
2389  // Set DIE offset
2390  Die->setOffset(Offset);
2391
2392  // Start the size with the size of abbreviation code.
2393  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2394
2395  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2396  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2397
2398  // Size the DIE attribute values.
2399  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2400    // Size attribute value.
2401    Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2402
2403  // Size the DIE children if any.
2404  if (!Children.empty()) {
2405    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2406           "Children flag not set");
2407
2408    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2409      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2410
2411    // End of children marker.
2412    Offset += sizeof(int8_t);
2413  }
2414
2415  Die->setSize(Offset - Die->getOffset());
2416  return Offset;
2417}
2418
2419/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2420///
2421void DwarfDebug::computeSizeAndOffsets() {
2422  // Compute size of compile unit header.
2423  static unsigned Offset =
2424    sizeof(int32_t) + // Length of Compilation Unit Info
2425    sizeof(int16_t) + // DWARF version number
2426    sizeof(int32_t) + // Offset Into Abbrev. Section
2427    sizeof(int8_t);   // Pointer Size (in bytes)
2428
2429  computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2430  CompileUnitOffsets[ModuleCU] = 0;
2431}
2432
2433/// emitInitial - Emit initial Dwarf declarations.  This is necessary for cc
2434/// tools to recognize the object file contains Dwarf information.
2435void DwarfDebug::emitInitial() {
2436  // Check to see if we already emitted intial headers.
2437  if (didInitial) return;
2438  didInitial = true;
2439
2440  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2441
2442  // Dwarf sections base addresses.
2443  if (MAI->doesDwarfRequireFrameSection()) {
2444    Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2445    Asm->OutStreamer.EmitLabel(getTempLabel("section_debug_frame"));
2446  }
2447
2448  Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2449  Asm->OutStreamer.EmitLabel(getTempLabel("section_info"));
2450  Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2451  Asm->OutStreamer.EmitLabel(getTempLabel("section_abbrev"));
2452  Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2453  Asm->OutStreamer.EmitLabel(getTempLabel("section_aranges"));
2454
2455  if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2456    Asm->OutStreamer.SwitchSection(LineInfoDirective);
2457    Asm->OutStreamer.EmitLabel(getTempLabel("section_macinfo"));
2458  }
2459
2460  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2461  Asm->OutStreamer.EmitLabel(getTempLabel("section_line"));
2462  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2463  Asm->OutStreamer.EmitLabel(getTempLabel("section_loc"));
2464  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2465  Asm->OutStreamer.EmitLabel(getTempLabel("section_pubnames"));
2466  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2467  Asm->OutStreamer.EmitLabel(getTempLabel("section_pubtypes"));
2468  Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2469  Asm->OutStreamer.EmitLabel(getTempLabel("section_str"));
2470  Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2471  Asm->OutStreamer.EmitLabel(getTempLabel("section_ranges"));
2472
2473  Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2474  Asm->OutStreamer.EmitLabel(getTempLabel("text_begin"));
2475  Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2476  Asm->OutStreamer.EmitLabel(getTempLabel("data_begin"));
2477}
2478
2479/// emitDIE - Recusively Emits a debug information entry.
2480///
2481void DwarfDebug::emitDIE(DIE *Die) {
2482  // Get the abbreviation for this DIE.
2483  unsigned AbbrevNumber = Die->getAbbrevNumber();
2484  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2485
2486  // Emit the code (index) for the abbreviation.
2487  if (Asm->VerboseAsm)
2488    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2489                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2490                                Twine::utohexstr(Die->getSize()) + " " +
2491                                dwarf::TagString(Abbrev->getTag()));
2492  EmitULEB128(AbbrevNumber);
2493
2494  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2495  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2496
2497  // Emit the DIE attribute values.
2498  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2499    unsigned Attr = AbbrevData[i].getAttribute();
2500    unsigned Form = AbbrevData[i].getForm();
2501    assert(Form && "Too many attributes for DIE (check abbreviation)");
2502
2503    if (Asm->VerboseAsm)
2504      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2505
2506    switch (Attr) {
2507    case dwarf::DW_AT_sibling:
2508      Asm->EmitInt32(Die->getSiblingOffset());
2509      break;
2510    case dwarf::DW_AT_abstract_origin: {
2511      DIEEntry *E = cast<DIEEntry>(Values[i]);
2512      DIE *Origin = E->getEntry();
2513      unsigned Addr = Origin->getOffset();
2514      Asm->EmitInt32(Addr);
2515      break;
2516    }
2517    default:
2518      // Emit an attribute using the defined form.
2519      Values[i]->EmitValue(this, Form);
2520      break;
2521    }
2522  }
2523
2524  // Emit the DIE children if any.
2525  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2526    const std::vector<DIE *> &Children = Die->getChildren();
2527
2528    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2529      emitDIE(Children[j]);
2530
2531    if (Asm->VerboseAsm)
2532      Asm->OutStreamer.AddComment("End Of Children Mark");
2533    Asm->EmitInt8(0);
2534  }
2535}
2536
2537/// emitDebugInfo - Emit the debug info section.
2538///
2539void DwarfDebug::emitDebugInfo() {
2540  // Start debug info section.
2541  Asm->OutStreamer.SwitchSection(
2542                            Asm->getObjFileLowering().getDwarfInfoSection());
2543  DIE *Die = ModuleCU->getCUDie();
2544
2545  // Emit the compile units header.
2546  Asm->OutStreamer.EmitLabel(getDWLabel("info_begin", ModuleCU->getID()));
2547
2548  // Emit size of content not including length itself
2549  unsigned ContentSize = Die->getSize() +
2550    sizeof(int16_t) + // DWARF version number
2551    sizeof(int32_t) + // Offset Into Abbrev. Section
2552    sizeof(int8_t) +  // Pointer Size (in bytes)
2553    sizeof(int32_t);  // FIXME - extra pad for gdb bug.
2554
2555  Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2556  Asm->EmitInt32(ContentSize);
2557  Asm->OutStreamer.AddComment("DWARF version number");
2558  Asm->EmitInt16(dwarf::DWARF_VERSION);
2559  Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2560  EmitSectionOffset(getTempLabel("abbrev_begin"),getTempLabel("section_abbrev"),
2561                    true);
2562  Asm->OutStreamer.AddComment("Address Size (in bytes)");
2563  Asm->EmitInt8(TD->getPointerSize());
2564
2565  emitDIE(Die);
2566  // FIXME - extra padding for gdb bug.
2567  Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2568  Asm->EmitInt8(0);
2569  Asm->EmitInt8(0);
2570  Asm->EmitInt8(0);
2571  Asm->EmitInt8(0);
2572  Asm->OutStreamer.EmitLabel(getDWLabel("info_end", ModuleCU->getID()));
2573}
2574
2575/// emitAbbreviations - Emit the abbreviation section.
2576///
2577void DwarfDebug::emitAbbreviations() const {
2578  // Check to see if it is worth the effort.
2579  if (!Abbreviations.empty()) {
2580    // Start the debug abbrev section.
2581    Asm->OutStreamer.SwitchSection(
2582                            Asm->getObjFileLowering().getDwarfAbbrevSection());
2583
2584    Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_begin"));
2585
2586    // For each abbrevation.
2587    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2588      // Get abbreviation data
2589      const DIEAbbrev *Abbrev = Abbreviations[i];
2590
2591      // Emit the abbrevations code (base 1 index.)
2592      EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2593
2594      // Emit the abbreviations data.
2595      Abbrev->Emit(this);
2596    }
2597
2598    // Mark end of abbreviations.
2599    EmitULEB128(0, "EOM(3)");
2600
2601    Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_end"));
2602  }
2603}
2604
2605/// emitEndOfLineMatrix - Emit the last address of the section and the end of
2606/// the line matrix.
2607///
2608void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2609  // Define last address of section.
2610  Asm->OutStreamer.AddComment("Extended Op");
2611  Asm->EmitInt8(0);
2612
2613  Asm->OutStreamer.AddComment("Op size");
2614  Asm->EmitInt8(TD->getPointerSize() + 1);
2615  Asm->OutStreamer.AddComment("DW_LNE_set_address");
2616  Asm->EmitInt8(dwarf::DW_LNE_set_address);
2617
2618  Asm->OutStreamer.AddComment("Section end label");
2619
2620  Asm->OutStreamer.EmitSymbolValue(getDWLabel("section_end", SectionEnd),
2621                                   TD->getPointerSize(), 0/*AddrSpace*/);
2622
2623  // Mark end of matrix.
2624  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2625  Asm->EmitInt8(0);
2626  Asm->EmitInt8(1);
2627  Asm->EmitInt8(1);
2628}
2629
2630/// emitDebugLines - Emit source line information.
2631///
2632void DwarfDebug::emitDebugLines() {
2633  // If the target is using .loc/.file, the assembler will be emitting the
2634  // .debug_line table automatically.
2635  if (MAI->hasDotLocAndDotFile())
2636    return;
2637
2638  // Minimum line delta, thus ranging from -10..(255-10).
2639  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2640  // Maximum line delta, thus ranging from -10..(255-10).
2641  const int MaxLineDelta = 255 + MinLineDelta;
2642
2643  // Start the dwarf line section.
2644  Asm->OutStreamer.SwitchSection(
2645                            Asm->getObjFileLowering().getDwarfLineSection());
2646
2647  // Construct the section header.
2648  Asm->OutStreamer.AddComment("Length of Source Line Info");
2649  EmitDifference(getTempLabel("line_end"), getTempLabel("line_begin"), true);
2650  Asm->OutStreamer.EmitLabel(getTempLabel("line_begin"));
2651
2652  Asm->OutStreamer.AddComment("DWARF version number");
2653  Asm->EmitInt16(dwarf::DWARF_VERSION);
2654
2655  Asm->OutStreamer.AddComment("Prolog Length");
2656  EmitDifference(getTempLabel("line_prolog_end"),
2657                 getTempLabel("line_prolog_begin"), true);
2658  Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_begin"));
2659
2660  Asm->OutStreamer.AddComment("Minimum Instruction Length");
2661  Asm->EmitInt8(1);
2662  Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2663  Asm->EmitInt8(1);
2664  Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2665  Asm->EmitInt8(MinLineDelta);
2666  Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2667  Asm->EmitInt8(MaxLineDelta);
2668  Asm->OutStreamer.AddComment("Special Opcode Base");
2669  Asm->EmitInt8(-MinLineDelta);
2670
2671  // Line number standard opcode encodings argument count
2672  Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2673  Asm->EmitInt8(0);
2674  Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2675  Asm->EmitInt8(1);
2676  Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2677  Asm->EmitInt8(1);
2678  Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2679  Asm->EmitInt8(1);
2680  Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2681  Asm->EmitInt8(1);
2682  Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2683  Asm->EmitInt8(0);
2684  Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2685  Asm->EmitInt8(0);
2686  Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2687  Asm->EmitInt8(0);
2688  Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2689  Asm->EmitInt8(1);
2690
2691  // Emit directories.
2692  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2693    const std::string &Dir = getSourceDirectoryName(DI);
2694    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2695    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2696  }
2697
2698  Asm->OutStreamer.AddComment("End of directories");
2699  Asm->EmitInt8(0);
2700
2701  // Emit files.
2702  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2703    // Remember source id starts at 1.
2704    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2705    const std::string &FN = getSourceFileName(Id.second);
2706    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2707    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2708
2709    EmitULEB128(Id.first, "Directory #");
2710    EmitULEB128(0, "Mod date");
2711    EmitULEB128(0, "File size");
2712  }
2713
2714  Asm->OutStreamer.AddComment("End of files");
2715  Asm->EmitInt8(0);
2716
2717  Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_end"));
2718
2719  // A sequence for each text section.
2720  unsigned SecSrcLinesSize = SectionSourceLines.size();
2721
2722  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2723    // Isolate current sections line info.
2724    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2725
2726    // Dwarf assumes we start with first line of first source file.
2727    unsigned Source = 1;
2728    unsigned Line = 1;
2729
2730    // Construct rows of the address, source, line, column matrix.
2731    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2732      const SrcLineInfo &LineInfo = LineInfos[i];
2733      MCSymbol *Label = LineInfo.getLabel();
2734      if (!Label->isDefined()) continue; // Not emitted, in dead code.
2735
2736      if (LineInfo.getLine() == 0) continue;
2737
2738      if (Asm->isVerbose()) {
2739        std::pair<unsigned, unsigned> SrcID =
2740          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2741        Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
2742                                    "/" +
2743                                    Twine(getSourceFileName(SrcID.second)) +
2744                                    ":" + Twine(LineInfo.getLine()));
2745      }
2746
2747      // Define the line address.
2748      Asm->OutStreamer.AddComment("Extended Op");
2749      Asm->EmitInt8(0);
2750      Asm->OutStreamer.AddComment("Op size");
2751      Asm->EmitInt8(TD->getPointerSize() + 1);
2752
2753      Asm->OutStreamer.AddComment("DW_LNE_set_address");
2754      Asm->EmitInt8(dwarf::DW_LNE_set_address);
2755
2756      Asm->OutStreamer.AddComment("Location label");
2757      Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(),
2758                                       0/*AddrSpace*/);
2759
2760      // If change of source, then switch to the new source.
2761      if (Source != LineInfo.getSourceID()) {
2762        Source = LineInfo.getSourceID();
2763        Asm->OutStreamer.AddComment("DW_LNS_set_file");
2764        Asm->EmitInt8(dwarf::DW_LNS_set_file);
2765        EmitULEB128(Source, "New Source");
2766      }
2767
2768      // If change of line.
2769      if (Line != LineInfo.getLine()) {
2770        // Determine offset.
2771        int Offset = LineInfo.getLine() - Line;
2772        int Delta = Offset - MinLineDelta;
2773
2774        // Update line.
2775        Line = LineInfo.getLine();
2776
2777        // If delta is small enough and in range...
2778        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2779          // ... then use fast opcode.
2780          Asm->OutStreamer.AddComment("Line Delta");
2781          Asm->EmitInt8(Delta - MinLineDelta);
2782        } else {
2783          // ... otherwise use long hand.
2784          Asm->OutStreamer.AddComment("DW_LNS_advance_line");
2785          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2786          EmitSLEB128(Offset, "Line Offset");
2787          Asm->OutStreamer.AddComment("DW_LNS_copy");
2788          Asm->EmitInt8(dwarf::DW_LNS_copy);
2789        }
2790      } else {
2791        // Copy the previous row (different address or source)
2792        Asm->OutStreamer.AddComment("DW_LNS_copy");
2793        Asm->EmitInt8(dwarf::DW_LNS_copy);
2794      }
2795    }
2796
2797    emitEndOfLineMatrix(j + 1);
2798  }
2799
2800  if (SecSrcLinesSize == 0)
2801    // Because we're emitting a debug_line section, we still need a line
2802    // table. The linker and friends expect it to exist. If there's nothing to
2803    // put into it, emit an empty table.
2804    emitEndOfLineMatrix(1);
2805
2806  Asm->OutStreamer.EmitLabel(getTempLabel("line_end"));
2807}
2808
2809/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2810///
2811void DwarfDebug::emitCommonDebugFrame() {
2812  if (!MAI->doesDwarfRequireFrameSection())
2813    return;
2814
2815  int stackGrowth =
2816    Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2817      TargetFrameInfo::StackGrowsUp ?
2818    TD->getPointerSize() : -TD->getPointerSize();
2819
2820  // Start the dwarf frame section.
2821  Asm->OutStreamer.SwitchSection(
2822                              Asm->getObjFileLowering().getDwarfFrameSection());
2823
2824  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common"));
2825  Asm->OutStreamer.AddComment("Length of Common Information Entry");
2826  EmitDifference(getTempLabel("debug_frame_common_end"),
2827                 getTempLabel("debug_frame_common_begin"), true);
2828
2829  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_begin"));
2830  Asm->OutStreamer.AddComment("CIE Identifier Tag");
2831  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2832  Asm->OutStreamer.AddComment("CIE Version");
2833  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2834  Asm->OutStreamer.AddComment("CIE Augmentation");
2835  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2836  EmitULEB128(1, "CIE Code Alignment Factor");
2837  EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2838  Asm->OutStreamer.AddComment("CIE RA Column");
2839  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2840
2841  std::vector<MachineMove> Moves;
2842  RI->getInitialFrameState(Moves);
2843
2844  EmitFrameMoves(0, Moves, false);
2845
2846  Asm->EmitAlignment(2, 0, 0, false);
2847  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_end"));
2848}
2849
2850/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2851/// section.
2852void DwarfDebug::
2853emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2854  if (!MAI->doesDwarfRequireFrameSection())
2855    return;
2856
2857  // Start the dwarf frame section.
2858  Asm->OutStreamer.SwitchSection(
2859                              Asm->getObjFileLowering().getDwarfFrameSection());
2860
2861  Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2862  MCSymbol *DebugFrameBegin =
2863    getDWLabel("debug_frame_begin", DebugFrameInfo.Number);
2864  MCSymbol *DebugFrameEnd =
2865    getDWLabel("debug_frame_end", DebugFrameInfo.Number);
2866  EmitDifference(DebugFrameEnd, DebugFrameBegin, true);
2867
2868  Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2869
2870  Asm->OutStreamer.AddComment("FDE CIE offset");
2871  EmitSectionOffset(getTempLabel("debug_frame_common"),
2872                    getTempLabel("section_debug_frame"), true);
2873
2874  Asm->OutStreamer.AddComment("FDE initial location");
2875  MCSymbol *FuncBeginSym = getDWLabel("func_begin", DebugFrameInfo.Number);
2876  Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2877                                   TD->getPointerSize(), 0/*AddrSpace*/);
2878
2879
2880  Asm->OutStreamer.AddComment("FDE address range");
2881  EmitDifference(getDWLabel("func_end", DebugFrameInfo.Number), FuncBeginSym);
2882
2883  EmitFrameMoves(FuncBeginSym, DebugFrameInfo.Moves, false);
2884
2885  Asm->EmitAlignment(2, 0, 0, false);
2886  Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2887}
2888
2889/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2890///
2891void DwarfDebug::emitDebugPubNames() {
2892  // Start the dwarf pubnames section.
2893  Asm->OutStreamer.SwitchSection(
2894                          Asm->getObjFileLowering().getDwarfPubNamesSection());
2895
2896  Asm->OutStreamer.AddComment("Length of Public Names Info");
2897  EmitDifference(getDWLabel("pubnames_end", ModuleCU->getID()),
2898                 getDWLabel("pubnames_begin", ModuleCU->getID()), true);
2899
2900  Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_begin", ModuleCU->getID()));
2901
2902  Asm->OutStreamer.AddComment("DWARF Version");
2903  Asm->EmitInt16(dwarf::DWARF_VERSION);
2904
2905  Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2906  EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2907                    getTempLabel("section_info"), true);
2908
2909  Asm->OutStreamer.AddComment("Compilation Unit Length");
2910  EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2911                 getDWLabel("info_begin", ModuleCU->getID()),
2912                 true);
2913
2914  const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2915  for (StringMap<DIE*>::const_iterator
2916         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2917    const char *Name = GI->getKeyData();
2918    DIE *Entity = GI->second;
2919
2920    Asm->OutStreamer.AddComment("DIE offset");
2921    Asm->EmitInt32(Entity->getOffset());
2922
2923    if (Asm->VerboseAsm)
2924      Asm->OutStreamer.AddComment("External Name");
2925    Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2926  }
2927
2928  Asm->OutStreamer.AddComment("End Mark");
2929  Asm->EmitInt32(0);
2930  Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_end", ModuleCU->getID()));
2931}
2932
2933void DwarfDebug::emitDebugPubTypes() {
2934  // Start the dwarf pubnames section.
2935  Asm->OutStreamer.SwitchSection(
2936                          Asm->getObjFileLowering().getDwarfPubTypesSection());
2937  Asm->OutStreamer.AddComment("Length of Public Types Info");
2938  EmitDifference(getDWLabel("pubtypes_end", ModuleCU->getID()),
2939                 getDWLabel("pubtypes_begin", ModuleCU->getID()), true);
2940
2941  Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_begin", ModuleCU->getID()));
2942
2943  if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2944  Asm->EmitInt16(dwarf::DWARF_VERSION);
2945
2946  Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
2947  EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2948                    getTempLabel("section_info"), true);
2949
2950  Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
2951  EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2952                 getDWLabel("info_begin", ModuleCU->getID()),
2953                 true);
2954
2955  const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2956  for (StringMap<DIE*>::const_iterator
2957         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2958    const char *Name = GI->getKeyData();
2959    DIE * Entity = GI->second;
2960
2961    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2962    Asm->EmitInt32(Entity->getOffset());
2963
2964    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2965    Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2966  }
2967
2968  Asm->OutStreamer.AddComment("End Mark");
2969  Asm->EmitInt32(0);
2970  Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_end", ModuleCU->getID()));
2971}
2972
2973/// emitDebugStr - Emit visible names into a debug str section.
2974///
2975void DwarfDebug::emitDebugStr() {
2976  // Check to see if it is worth the effort.
2977  if (StringPool.empty()) return;
2978
2979  // Start the dwarf str section.
2980  Asm->OutStreamer.SwitchSection(
2981                                Asm->getObjFileLowering().getDwarfStrSection());
2982
2983  // Get all of the string pool entries and put them in an array by their ID so
2984  // we can sort them.
2985  SmallVector<std::pair<unsigned,
2986      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2987
2988  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2989       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2990    Entries.push_back(std::make_pair(I->second.second, &*I));
2991
2992  array_pod_sort(Entries.begin(), Entries.end());
2993
2994  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2995    // Emit a label for reference from debug information entries.
2996    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2997
2998    // Emit the string itself.
2999    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3000  }
3001}
3002
3003/// emitDebugLoc - Emit visible names into a debug loc section.
3004///
3005void DwarfDebug::emitDebugLoc() {
3006  // Start the dwarf loc section.
3007  Asm->OutStreamer.SwitchSection(
3008                              Asm->getObjFileLowering().getDwarfLocSection());
3009}
3010
3011/// EmitDebugARanges - Emit visible names into a debug aranges section.
3012///
3013void DwarfDebug::EmitDebugARanges() {
3014  // Start the dwarf aranges section.
3015  Asm->OutStreamer.SwitchSection(
3016                          Asm->getObjFileLowering().getDwarfARangesSection());
3017}
3018
3019/// emitDebugRanges - Emit visible names into a debug ranges section.
3020///
3021void DwarfDebug::emitDebugRanges() {
3022  // Start the dwarf ranges section.
3023  Asm->OutStreamer.SwitchSection(
3024                            Asm->getObjFileLowering().getDwarfRangesSection());
3025}
3026
3027/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3028///
3029void DwarfDebug::emitDebugMacInfo() {
3030  if (const MCSection *LineInfo =
3031      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3032    // Start the dwarf macinfo section.
3033    Asm->OutStreamer.SwitchSection(LineInfo);
3034  }
3035}
3036
3037/// emitDebugInlineInfo - Emit inline info using following format.
3038/// Section Header:
3039/// 1. length of section
3040/// 2. Dwarf version number
3041/// 3. address size.
3042///
3043/// Entries (one "entry" for each function that was inlined):
3044///
3045/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3046///   otherwise offset into __debug_str for regular function name.
3047/// 2. offset into __debug_str section for regular function name.
3048/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3049/// instances for the function.
3050///
3051/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3052/// inlined instance; the die_offset points to the inlined_subroutine die in the
3053/// __debug_info section, and the low_pc is the starting address for the
3054/// inlining instance.
3055void DwarfDebug::emitDebugInlineInfo() {
3056  if (!MAI->doesDwarfUsesInlineInfoSection())
3057    return;
3058
3059  if (!ModuleCU)
3060    return;
3061
3062  Asm->OutStreamer.SwitchSection(
3063                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
3064
3065  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3066  EmitDifference(getDWLabel("debug_inlined_end", 1),
3067                 getDWLabel("debug_inlined_begin", 1), true);
3068
3069  Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_begin", 1));
3070
3071  Asm->OutStreamer.AddComment("Dwarf Version");
3072  Asm->EmitInt16(dwarf::DWARF_VERSION);
3073  Asm->OutStreamer.AddComment("Address Size (in bytes)");
3074  Asm->EmitInt8(TD->getPointerSize());
3075
3076  for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3077         E = InlinedSPNodes.end(); I != E; ++I) {
3078
3079    MDNode *Node = *I;
3080    DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3081      = InlineInfo.find(Node);
3082    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3083    DISubprogram SP(Node);
3084    StringRef LName = SP.getLinkageName();
3085    StringRef Name = SP.getName();
3086
3087    Asm->OutStreamer.AddComment("MIPS linkage name");
3088    if (LName.empty()) {
3089      Asm->OutStreamer.EmitBytes(Name, 0);
3090      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3091    } else
3092      EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3093                        getTempLabel("section_str"), true);
3094
3095    Asm->OutStreamer.AddComment("Function name");
3096    EmitSectionOffset(getStringPoolEntry(Name), getTempLabel("section_str"),
3097                      true);
3098    EmitULEB128(Labels.size(), "Inline count");
3099
3100    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3101           LE = Labels.end(); LI != LE; ++LI) {
3102      if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
3103      Asm->EmitInt32(LI->second->getOffset());
3104
3105      if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("low_pc");
3106      Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
3107    }
3108  }
3109
3110  Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_end", 1));
3111}
3112