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