DwarfDebug.cpp revision 98ca237866b93f0905a5262263713921dea4a265
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    return;
2071  }
2072
2073  // Emit a label to indicate location change. This is used for line
2074  // table even if this instruction does start a new scope.
2075  MCSymbol *Label = recordSourceLine(DILoc.getLineNumber(),
2076                                     DILoc.getColumnNumber(),
2077                                     DILoc.getScope().getNode());
2078
2079  // update DbgScope if this instruction starts a new scope.
2080  InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
2081  if (I == DbgScopeBeginMap.end())
2082    return;
2083
2084  ScopeVector &SD = I->second;
2085  for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
2086       SDI != SDE; ++SDI)
2087    (*SDI)->setStartLabel(Label);
2088}
2089
2090/// endScope - Process end of a scope.
2091void DwarfDebug::endScope(const MachineInstr *MI) {
2092  // Ignore DBG_VALUE instruction.
2093  if (MI->getOpcode() == TargetOpcode::DBG_VALUE)
2094    return;
2095
2096  // Check location.
2097  DebugLoc DL = MI->getDebugLoc();
2098  if (DL.isUnknown())
2099    return;
2100  DILocation DILoc = MF->getDILocation(DL);
2101  if (!DILoc.getScope().Verify())
2102    return;
2103
2104  // Emit a label and update DbgScope if this instruction ends a scope.
2105  InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
2106  if (I == DbgScopeEndMap.end())
2107    return;
2108
2109  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2110  Asm->OutStreamer.EmitLabel(Label);
2111
2112  SmallVector<DbgScope*, 2> &SD = I->second;
2113  for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
2114       SDI != SDE; ++SDI)
2115    (*SDI)->setEndLabel(Label);
2116  return;
2117}
2118
2119/// createDbgScope - Create DbgScope for the scope.
2120void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
2121
2122  if (!InlinedAt) {
2123    DbgScope *WScope = DbgScopeMap.lookup(Scope);
2124    if (WScope)
2125      return;
2126    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2127    DbgScopeMap.insert(std::make_pair(Scope, WScope));
2128    if (DIDescriptor(Scope).isLexicalBlock())
2129      createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
2130    return;
2131  }
2132
2133  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2134  if (WScope)
2135    return;
2136
2137  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2138  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2139  DILocation DL(InlinedAt);
2140  createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2141}
2142
2143/// extractScopeInformation - Scan machine instructions in this function
2144/// and collect DbgScopes. Return true, if atleast one scope was found.
2145bool DwarfDebug::extractScopeInformation() {
2146  // If scope information was extracted using .dbg intrinsics then there is not
2147  // any need to extract these information by scanning each instruction.
2148  if (!DbgScopeMap.empty())
2149    return false;
2150
2151  DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2152  unsigned MIIndex = 0;
2153  // Scan each instruction and create scopes. First build working set of scopes.
2154  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2155       I != E; ++I) {
2156    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2157         II != IE; ++II) {
2158      const MachineInstr *MInsn = II;
2159      // FIXME : Remove DBG_VALUE check.
2160      if (MInsn->getOpcode() == TargetOpcode::DBG_VALUE) continue;
2161      MIIndexMap[MInsn] = MIIndex++;
2162      DebugLoc DL = MInsn->getDebugLoc();
2163      if (DL.isUnknown()) continue;
2164      DILocation DLT = MF->getDILocation(DL);
2165      DIScope DLTScope = DLT.getScope();
2166      // There is no need to create another DIE for compile unit. For all
2167      // other scopes, create one DbgScope now. This will be translated
2168      // into a scope DIE at the end.
2169      if (DLTScope.isCompileUnit()) continue;
2170      createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2171    }
2172  }
2173
2174
2175  // Build scope hierarchy using working set of scopes.
2176  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2177       I != E; ++I) {
2178    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2179         II != IE; ++II) {
2180      const MachineInstr *MInsn = II;
2181      // FIXME : Remove DBG_VALUE check.
2182      if (MInsn->getOpcode() == TargetOpcode::DBG_VALUE) continue;
2183      DebugLoc DL = MInsn->getDebugLoc();
2184      if (DL.isUnknown())  continue;
2185      DILocation DLT = MF->getDILocation(DL);
2186      DIScope DLTScope = DLT.getScope();
2187      // There is no need to create another DIE for compile unit. For all
2188      // other scopes, create one DbgScope now. This will be translated
2189      // into a scope DIE at the end.
2190      if (DLTScope.isCompileUnit()) continue;
2191      DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2192                                           DLT.getOrigLocation().getNode());
2193      Scope->setLastInsn(MInsn);
2194    }
2195  }
2196
2197  if (!CurrentFnDbgScope)
2198    return false;
2199
2200  CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2201
2202  // Each scope has first instruction and last instruction to mark beginning
2203  // and end of a scope respectively. Create an inverse map that list scopes
2204  // starts (and ends) with an instruction. One instruction may start (or end)
2205  // multiple scopes. Ignore scopes that are not reachable.
2206  SmallVector<DbgScope *, 4> WorkList;
2207  WorkList.push_back(CurrentFnDbgScope);
2208  while (!WorkList.empty()) {
2209    DbgScope *S = WorkList.back(); WorkList.pop_back();
2210
2211    const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2212    if (!Children.empty())
2213      for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2214             SE = Children.end(); SI != SE; ++SI)
2215        WorkList.push_back(*SI);
2216
2217    if (S->isAbstractScope())
2218      continue;
2219    const MachineInstr *MI = S->getFirstInsn();
2220    assert (MI && "DbgScope does not have first instruction!");
2221
2222    InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2223    if (IDI != DbgScopeBeginMap.end())
2224      IDI->second.push_back(S);
2225    else
2226      DbgScopeBeginMap[MI].push_back(S);
2227
2228    MI = S->getLastInsn();
2229    assert (MI && "DbgScope does not have last instruction!");
2230    IDI = DbgScopeEndMap.find(MI);
2231    if (IDI != DbgScopeEndMap.end())
2232      IDI->second.push_back(S);
2233    else
2234      DbgScopeEndMap[MI].push_back(S);
2235  }
2236
2237  return !DbgScopeMap.empty();
2238}
2239
2240/// beginFunction - Gather pre-function debug information.  Assumes being
2241/// emitted immediately after the function entry point.
2242void DwarfDebug::beginFunction(const MachineFunction *MF) {
2243  this->MF = MF;
2244
2245  if (!ShouldEmitDwarfDebug()) return;
2246  if (!extractScopeInformation())
2247    return;
2248
2249  TimeRegion Timer(DebugTimer);
2250
2251  collectVariableInfo();
2252
2253  // Assumes in correct section after the entry point.
2254  Asm->OutStreamer.EmitLabel(getDWLabel("func_begin", ++SubprogramCount));
2255
2256  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2257  // function.
2258  DebugLoc FDL = MF->getDefaultDebugLoc();
2259  if (!FDL.isUnknown()) {
2260    DILocation DLT = MF->getDILocation(FDL);
2261    DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2262    unsigned Line, Col;
2263    if (SP.Verify()) {
2264      Line = SP.getLineNumber();
2265      Col = 0;
2266    } else {
2267      Line = DLT.getLineNumber();
2268      Col = DLT.getColumnNumber();
2269    }
2270
2271    recordSourceLine(Line, Col, DLT.getScope().getNode());
2272  }
2273}
2274
2275/// endFunction - Gather and emit post-function debug information.
2276///
2277void DwarfDebug::endFunction(const MachineFunction *MF) {
2278  if (!ShouldEmitDwarfDebug()) return;
2279  if (DbgScopeMap.empty()) return;
2280
2281  TimeRegion Timer(DebugTimer);
2282
2283  if (CurrentFnDbgScope) {
2284    // Define end label for subprogram.
2285    Asm->OutStreamer.EmitLabel(getDWLabel("func_end", SubprogramCount));
2286
2287    // Get function line info.
2288    if (!Lines.empty()) {
2289      // Get section line info.
2290      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2291      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2292      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2293      // Append the function info to section info.
2294      SectionLineInfos.insert(SectionLineInfos.end(),
2295                              Lines.begin(), Lines.end());
2296    }
2297
2298    // Construct abstract scopes.
2299    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2300           AE = AbstractScopesList.end(); AI != AE; ++AI)
2301      constructScopeDIE(*AI);
2302
2303    constructScopeDIE(CurrentFnDbgScope);
2304
2305    DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount,
2306                                                 MMI->getFrameMoves()));
2307  }
2308
2309  // Clear debug info
2310  CurrentFnDbgScope = NULL;
2311  DeleteContainerSeconds(DbgScopeMap);
2312  DbgScopeBeginMap.clear();
2313  DbgScopeEndMap.clear();
2314  DbgValueStartMap.clear();
2315  ConcreteScopes.clear();
2316  DeleteContainerSeconds(AbstractScopes);
2317  AbstractScopesList.clear();
2318  AbstractVariables.clear();
2319  Lines.clear();
2320}
2321
2322/// recordSourceLine - Register a source line with debug info. Returns the
2323/// unique label that was emitted and which provides correspondence to
2324/// the source line list.
2325MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, MDNode *S) {
2326  if (!MMI)
2327    return 0;
2328
2329  TimeRegion Timer(DebugTimer);
2330
2331  StringRef Dir;
2332  StringRef Fn;
2333
2334  DIDescriptor Scope(S);
2335  if (Scope.isCompileUnit()) {
2336    DICompileUnit CU(S);
2337    Dir = CU.getDirectory();
2338    Fn = CU.getFilename();
2339  } else if (Scope.isSubprogram()) {
2340    DISubprogram SP(S);
2341    Dir = SP.getDirectory();
2342    Fn = SP.getFilename();
2343  } else if (Scope.isLexicalBlock()) {
2344    DILexicalBlock DB(S);
2345    Dir = DB.getDirectory();
2346    Fn = DB.getFilename();
2347  } else
2348    assert(0 && "Unexpected scope info");
2349
2350  unsigned Src = GetOrCreateSourceID(Dir, Fn);
2351  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2352  Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2353
2354  Asm->OutStreamer.EmitLabel(Label);
2355  return Label;
2356}
2357
2358/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2359/// timed. Look up the source id with the given directory and source file
2360/// names. If none currently exists, create a new id and insert it in the
2361/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2362/// well.
2363unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2364                                         const std::string &FileName) {
2365  TimeRegion Timer(DebugTimer);
2366  return GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2367}
2368
2369//===----------------------------------------------------------------------===//
2370// Emit Methods
2371//===----------------------------------------------------------------------===//
2372
2373/// computeSizeAndOffset - Compute the size and offset of a DIE.
2374///
2375unsigned
2376DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2377  // Get the children.
2378  const std::vector<DIE *> &Children = Die->getChildren();
2379
2380  // If not last sibling and has children then add sibling offset attribute.
2381  if (!Last && !Children.empty())
2382    DIEValues.push_back(Die->addSiblingOffset());
2383
2384  // Record the abbreviation.
2385  assignAbbrevNumber(Die->getAbbrev());
2386
2387  // Get the abbreviation for this DIE.
2388  unsigned AbbrevNumber = Die->getAbbrevNumber();
2389  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2390
2391  // Set DIE offset
2392  Die->setOffset(Offset);
2393
2394  // Start the size with the size of abbreviation code.
2395  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2396
2397  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2398  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2399
2400  // Size the DIE attribute values.
2401  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2402    // Size attribute value.
2403    Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2404
2405  // Size the DIE children if any.
2406  if (!Children.empty()) {
2407    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2408           "Children flag not set");
2409
2410    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2411      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2412
2413    // End of children marker.
2414    Offset += sizeof(int8_t);
2415  }
2416
2417  Die->setSize(Offset - Die->getOffset());
2418  return Offset;
2419}
2420
2421/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2422///
2423void DwarfDebug::computeSizeAndOffsets() {
2424  // Compute size of compile unit header.
2425  static unsigned Offset =
2426    sizeof(int32_t) + // Length of Compilation Unit Info
2427    sizeof(int16_t) + // DWARF version number
2428    sizeof(int32_t) + // Offset Into Abbrev. Section
2429    sizeof(int8_t);   // Pointer Size (in bytes)
2430
2431  computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2432  CompileUnitOffsets[ModuleCU] = 0;
2433}
2434
2435/// emitInitial - Emit initial Dwarf declarations.  This is necessary for cc
2436/// tools to recognize the object file contains Dwarf information.
2437void DwarfDebug::emitInitial() {
2438  // Check to see if we already emitted intial headers.
2439  if (didInitial) return;
2440  didInitial = true;
2441
2442  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2443
2444  // Dwarf sections base addresses.
2445  if (MAI->doesDwarfRequireFrameSection()) {
2446    Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2447    Asm->OutStreamer.EmitLabel(getTempLabel("section_debug_frame"));
2448  }
2449
2450  Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2451  Asm->OutStreamer.EmitLabel(getTempLabel("section_info"));
2452  Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2453  Asm->OutStreamer.EmitLabel(getTempLabel("section_abbrev"));
2454  Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2455  Asm->OutStreamer.EmitLabel(getTempLabel("section_aranges"));
2456
2457  if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2458    Asm->OutStreamer.SwitchSection(LineInfoDirective);
2459    Asm->OutStreamer.EmitLabel(getTempLabel("section_macinfo"));
2460  }
2461
2462  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2463  Asm->OutStreamer.EmitLabel(getTempLabel("section_line"));
2464  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2465  Asm->OutStreamer.EmitLabel(getTempLabel("section_loc"));
2466  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2467  Asm->OutStreamer.EmitLabel(getTempLabel("section_pubnames"));
2468  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2469  Asm->OutStreamer.EmitLabel(getTempLabel("section_pubtypes"));
2470  Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2471  Asm->OutStreamer.EmitLabel(getTempLabel("section_str"));
2472  Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2473  Asm->OutStreamer.EmitLabel(getTempLabel("section_ranges"));
2474
2475  Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2476  Asm->OutStreamer.EmitLabel(getTempLabel("text_begin"));
2477  Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2478  Asm->OutStreamer.EmitLabel(getTempLabel("data_begin"));
2479}
2480
2481/// emitDIE - Recusively Emits a debug information entry.
2482///
2483void DwarfDebug::emitDIE(DIE *Die) {
2484  // Get the abbreviation for this DIE.
2485  unsigned AbbrevNumber = Die->getAbbrevNumber();
2486  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2487
2488  // Emit the code (index) for the abbreviation.
2489  if (Asm->VerboseAsm)
2490    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2491                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2492                                Twine::utohexstr(Die->getSize()) + " " +
2493                                dwarf::TagString(Abbrev->getTag()));
2494  EmitULEB128(AbbrevNumber);
2495
2496  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2497  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2498
2499  // Emit the DIE attribute values.
2500  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2501    unsigned Attr = AbbrevData[i].getAttribute();
2502    unsigned Form = AbbrevData[i].getForm();
2503    assert(Form && "Too many attributes for DIE (check abbreviation)");
2504
2505    if (Asm->VerboseAsm)
2506      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2507
2508    switch (Attr) {
2509    case dwarf::DW_AT_sibling:
2510      Asm->EmitInt32(Die->getSiblingOffset());
2511      break;
2512    case dwarf::DW_AT_abstract_origin: {
2513      DIEEntry *E = cast<DIEEntry>(Values[i]);
2514      DIE *Origin = E->getEntry();
2515      unsigned Addr = Origin->getOffset();
2516      Asm->EmitInt32(Addr);
2517      break;
2518    }
2519    default:
2520      // Emit an attribute using the defined form.
2521      Values[i]->EmitValue(this, Form);
2522      break;
2523    }
2524  }
2525
2526  // Emit the DIE children if any.
2527  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2528    const std::vector<DIE *> &Children = Die->getChildren();
2529
2530    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2531      emitDIE(Children[j]);
2532
2533    if (Asm->VerboseAsm)
2534      Asm->OutStreamer.AddComment("End Of Children Mark");
2535    Asm->EmitInt8(0);
2536  }
2537}
2538
2539/// emitDebugInfo - Emit the debug info section.
2540///
2541void DwarfDebug::emitDebugInfo() {
2542  // Start debug info section.
2543  Asm->OutStreamer.SwitchSection(
2544                            Asm->getObjFileLowering().getDwarfInfoSection());
2545  DIE *Die = ModuleCU->getCUDie();
2546
2547  // Emit the compile units header.
2548  Asm->OutStreamer.EmitLabel(getDWLabel("info_begin", ModuleCU->getID()));
2549
2550  // Emit size of content not including length itself
2551  unsigned ContentSize = Die->getSize() +
2552    sizeof(int16_t) + // DWARF version number
2553    sizeof(int32_t) + // Offset Into Abbrev. Section
2554    sizeof(int8_t) +  // Pointer Size (in bytes)
2555    sizeof(int32_t);  // FIXME - extra pad for gdb bug.
2556
2557  Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2558  Asm->EmitInt32(ContentSize);
2559  Asm->OutStreamer.AddComment("DWARF version number");
2560  Asm->EmitInt16(dwarf::DWARF_VERSION);
2561  Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2562  EmitSectionOffset(getTempLabel("abbrev_begin"),getTempLabel("section_abbrev"),
2563                    true);
2564  Asm->OutStreamer.AddComment("Address Size (in bytes)");
2565  Asm->EmitInt8(TD->getPointerSize());
2566
2567  emitDIE(Die);
2568  // FIXME - extra padding for gdb bug.
2569  Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
2570  Asm->EmitInt8(0);
2571  Asm->EmitInt8(0);
2572  Asm->EmitInt8(0);
2573  Asm->EmitInt8(0);
2574  Asm->OutStreamer.EmitLabel(getDWLabel("info_end", ModuleCU->getID()));
2575}
2576
2577/// emitAbbreviations - Emit the abbreviation section.
2578///
2579void DwarfDebug::emitAbbreviations() const {
2580  // Check to see if it is worth the effort.
2581  if (!Abbreviations.empty()) {
2582    // Start the debug abbrev section.
2583    Asm->OutStreamer.SwitchSection(
2584                            Asm->getObjFileLowering().getDwarfAbbrevSection());
2585
2586    Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_begin"));
2587
2588    // For each abbrevation.
2589    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2590      // Get abbreviation data
2591      const DIEAbbrev *Abbrev = Abbreviations[i];
2592
2593      // Emit the abbrevations code (base 1 index.)
2594      EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2595
2596      // Emit the abbreviations data.
2597      Abbrev->Emit(this);
2598    }
2599
2600    // Mark end of abbreviations.
2601    EmitULEB128(0, "EOM(3)");
2602
2603    Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_end"));
2604  }
2605}
2606
2607/// emitEndOfLineMatrix - Emit the last address of the section and the end of
2608/// the line matrix.
2609///
2610void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2611  // Define last address of section.
2612  Asm->OutStreamer.AddComment("Extended Op");
2613  Asm->EmitInt8(0);
2614
2615  Asm->OutStreamer.AddComment("Op size");
2616  Asm->EmitInt8(TD->getPointerSize() + 1);
2617  Asm->OutStreamer.AddComment("DW_LNE_set_address");
2618  Asm->EmitInt8(dwarf::DW_LNE_set_address);
2619
2620  Asm->OutStreamer.AddComment("Section end label");
2621
2622  Asm->OutStreamer.EmitSymbolValue(getDWLabel("section_end", SectionEnd),
2623                                   TD->getPointerSize(), 0/*AddrSpace*/);
2624
2625  // Mark end of matrix.
2626  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2627  Asm->EmitInt8(0);
2628  Asm->EmitInt8(1);
2629  Asm->EmitInt8(1);
2630}
2631
2632/// emitDebugLines - Emit source line information.
2633///
2634void DwarfDebug::emitDebugLines() {
2635  // If the target is using .loc/.file, the assembler will be emitting the
2636  // .debug_line table automatically.
2637  if (MAI->hasDotLocAndDotFile())
2638    return;
2639
2640  // Minimum line delta, thus ranging from -10..(255-10).
2641  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2642  // Maximum line delta, thus ranging from -10..(255-10).
2643  const int MaxLineDelta = 255 + MinLineDelta;
2644
2645  // Start the dwarf line section.
2646  Asm->OutStreamer.SwitchSection(
2647                            Asm->getObjFileLowering().getDwarfLineSection());
2648
2649  // Construct the section header.
2650  Asm->OutStreamer.AddComment("Length of Source Line Info");
2651  EmitDifference(getTempLabel("line_end"), getTempLabel("line_begin"), true);
2652  Asm->OutStreamer.EmitLabel(getTempLabel("line_begin"));
2653
2654  Asm->OutStreamer.AddComment("DWARF version number");
2655  Asm->EmitInt16(dwarf::DWARF_VERSION);
2656
2657  Asm->OutStreamer.AddComment("Prolog Length");
2658  EmitDifference(getTempLabel("line_prolog_end"),
2659                 getTempLabel("line_prolog_begin"), true);
2660  Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_begin"));
2661
2662  Asm->OutStreamer.AddComment("Minimum Instruction Length");
2663  Asm->EmitInt8(1);
2664  Asm->OutStreamer.AddComment("Default is_stmt_start flag");
2665  Asm->EmitInt8(1);
2666  Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
2667  Asm->EmitInt8(MinLineDelta);
2668  Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
2669  Asm->EmitInt8(MaxLineDelta);
2670  Asm->OutStreamer.AddComment("Special Opcode Base");
2671  Asm->EmitInt8(-MinLineDelta);
2672
2673  // Line number standard opcode encodings argument count
2674  Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
2675  Asm->EmitInt8(0);
2676  Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
2677  Asm->EmitInt8(1);
2678  Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
2679  Asm->EmitInt8(1);
2680  Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
2681  Asm->EmitInt8(1);
2682  Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
2683  Asm->EmitInt8(1);
2684  Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
2685  Asm->EmitInt8(0);
2686  Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
2687  Asm->EmitInt8(0);
2688  Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
2689  Asm->EmitInt8(0);
2690  Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
2691  Asm->EmitInt8(1);
2692
2693  // Emit directories.
2694  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2695    const std::string &Dir = getSourceDirectoryName(DI);
2696    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2697    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2698  }
2699
2700  Asm->OutStreamer.AddComment("End of directories");
2701  Asm->EmitInt8(0);
2702
2703  // Emit files.
2704  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2705    // Remember source id starts at 1.
2706    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2707    const std::string &FN = getSourceFileName(Id.second);
2708    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2709    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2710
2711    EmitULEB128(Id.first, "Directory #");
2712    EmitULEB128(0, "Mod date");
2713    EmitULEB128(0, "File size");
2714  }
2715
2716  Asm->OutStreamer.AddComment("End of files");
2717  Asm->EmitInt8(0);
2718
2719  Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_end"));
2720
2721  // A sequence for each text section.
2722  unsigned SecSrcLinesSize = SectionSourceLines.size();
2723
2724  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2725    // Isolate current sections line info.
2726    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2727
2728    // Dwarf assumes we start with first line of first source file.
2729    unsigned Source = 1;
2730    unsigned Line = 1;
2731
2732    // Construct rows of the address, source, line, column matrix.
2733    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2734      const SrcLineInfo &LineInfo = LineInfos[i];
2735      MCSymbol *Label = LineInfo.getLabel();
2736      if (!Label->isDefined()) continue; // Not emitted, in dead code.
2737
2738      if (LineInfo.getLine() == 0) continue;
2739
2740      if (Asm->isVerbose()) {
2741        std::pair<unsigned, unsigned> SrcID =
2742          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2743        Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
2744                                    "/" +
2745                                    Twine(getSourceFileName(SrcID.second)) +
2746                                    ":" + Twine(LineInfo.getLine()));
2747      }
2748
2749      // Define the line address.
2750      Asm->OutStreamer.AddComment("Extended Op");
2751      Asm->EmitInt8(0);
2752      Asm->OutStreamer.AddComment("Op size");
2753      Asm->EmitInt8(TD->getPointerSize() + 1);
2754
2755      Asm->OutStreamer.AddComment("DW_LNE_set_address");
2756      Asm->EmitInt8(dwarf::DW_LNE_set_address);
2757
2758      Asm->OutStreamer.AddComment("Location label");
2759      Asm->OutStreamer.EmitSymbolValue(Label, TD->getPointerSize(),
2760                                       0/*AddrSpace*/);
2761
2762      // If change of source, then switch to the new source.
2763      if (Source != LineInfo.getSourceID()) {
2764        Source = LineInfo.getSourceID();
2765        Asm->OutStreamer.AddComment("DW_LNS_set_file");
2766        Asm->EmitInt8(dwarf::DW_LNS_set_file);
2767        EmitULEB128(Source, "New Source");
2768      }
2769
2770      // If change of line.
2771      if (Line != LineInfo.getLine()) {
2772        // Determine offset.
2773        int Offset = LineInfo.getLine() - Line;
2774        int Delta = Offset - MinLineDelta;
2775
2776        // Update line.
2777        Line = LineInfo.getLine();
2778
2779        // If delta is small enough and in range...
2780        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2781          // ... then use fast opcode.
2782          Asm->OutStreamer.AddComment("Line Delta");
2783          Asm->EmitInt8(Delta - MinLineDelta);
2784        } else {
2785          // ... otherwise use long hand.
2786          Asm->OutStreamer.AddComment("DW_LNS_advance_line");
2787          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2788          EmitSLEB128(Offset, "Line Offset");
2789          Asm->OutStreamer.AddComment("DW_LNS_copy");
2790          Asm->EmitInt8(dwarf::DW_LNS_copy);
2791        }
2792      } else {
2793        // Copy the previous row (different address or source)
2794        Asm->OutStreamer.AddComment("DW_LNS_copy");
2795        Asm->EmitInt8(dwarf::DW_LNS_copy);
2796      }
2797    }
2798
2799    emitEndOfLineMatrix(j + 1);
2800  }
2801
2802  if (SecSrcLinesSize == 0)
2803    // Because we're emitting a debug_line section, we still need a line
2804    // table. The linker and friends expect it to exist. If there's nothing to
2805    // put into it, emit an empty table.
2806    emitEndOfLineMatrix(1);
2807
2808  Asm->OutStreamer.EmitLabel(getTempLabel("line_end"));
2809}
2810
2811/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2812///
2813void DwarfDebug::emitCommonDebugFrame() {
2814  if (!MAI->doesDwarfRequireFrameSection())
2815    return;
2816
2817  int stackGrowth =
2818    Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2819      TargetFrameInfo::StackGrowsUp ?
2820    TD->getPointerSize() : -TD->getPointerSize();
2821
2822  // Start the dwarf frame section.
2823  Asm->OutStreamer.SwitchSection(
2824                              Asm->getObjFileLowering().getDwarfFrameSection());
2825
2826  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common"));
2827  Asm->OutStreamer.AddComment("Length of Common Information Entry");
2828  EmitDifference(getTempLabel("debug_frame_common_end"),
2829                 getTempLabel("debug_frame_common_begin"), true);
2830
2831  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_begin"));
2832  Asm->OutStreamer.AddComment("CIE Identifier Tag");
2833  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2834  Asm->OutStreamer.AddComment("CIE Version");
2835  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2836  Asm->OutStreamer.AddComment("CIE Augmentation");
2837  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2838  EmitULEB128(1, "CIE Code Alignment Factor");
2839  EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2840  Asm->OutStreamer.AddComment("CIE RA Column");
2841  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2842
2843  std::vector<MachineMove> Moves;
2844  RI->getInitialFrameState(Moves);
2845
2846  EmitFrameMoves(0, Moves, false);
2847
2848  Asm->EmitAlignment(2, 0, 0, false);
2849  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_end"));
2850}
2851
2852/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2853/// section.
2854void DwarfDebug::
2855emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2856  if (!MAI->doesDwarfRequireFrameSection())
2857    return;
2858
2859  // Start the dwarf frame section.
2860  Asm->OutStreamer.SwitchSection(
2861                              Asm->getObjFileLowering().getDwarfFrameSection());
2862
2863  Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2864  MCSymbol *DebugFrameBegin =
2865    getDWLabel("debug_frame_begin", DebugFrameInfo.Number);
2866  MCSymbol *DebugFrameEnd =
2867    getDWLabel("debug_frame_end", DebugFrameInfo.Number);
2868  EmitDifference(DebugFrameEnd, DebugFrameBegin, true);
2869
2870  Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2871
2872  Asm->OutStreamer.AddComment("FDE CIE offset");
2873  EmitSectionOffset(getTempLabel("debug_frame_common"),
2874                    getTempLabel("section_debug_frame"), true);
2875
2876  Asm->OutStreamer.AddComment("FDE initial location");
2877  MCSymbol *FuncBeginSym = getDWLabel("func_begin", DebugFrameInfo.Number);
2878  Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2879                                   TD->getPointerSize(), 0/*AddrSpace*/);
2880
2881
2882  Asm->OutStreamer.AddComment("FDE address range");
2883  EmitDifference(getDWLabel("func_end", DebugFrameInfo.Number), FuncBeginSym);
2884
2885  EmitFrameMoves(FuncBeginSym, DebugFrameInfo.Moves, false);
2886
2887  Asm->EmitAlignment(2, 0, 0, false);
2888  Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2889}
2890
2891/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2892///
2893void DwarfDebug::emitDebugPubNames() {
2894  // Start the dwarf pubnames section.
2895  Asm->OutStreamer.SwitchSection(
2896                          Asm->getObjFileLowering().getDwarfPubNamesSection());
2897
2898  Asm->OutStreamer.AddComment("Length of Public Names Info");
2899  EmitDifference(getDWLabel("pubnames_end", ModuleCU->getID()),
2900                 getDWLabel("pubnames_begin", ModuleCU->getID()), true);
2901
2902  Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_begin", ModuleCU->getID()));
2903
2904  Asm->OutStreamer.AddComment("DWARF Version");
2905  Asm->EmitInt16(dwarf::DWARF_VERSION);
2906
2907  Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2908  EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2909                    getTempLabel("section_info"), true);
2910
2911  Asm->OutStreamer.AddComment("Compilation Unit Length");
2912  EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2913                 getDWLabel("info_begin", ModuleCU->getID()),
2914                 true);
2915
2916  const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2917  for (StringMap<DIE*>::const_iterator
2918         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2919    const char *Name = GI->getKeyData();
2920    DIE *Entity = GI->second;
2921
2922    Asm->OutStreamer.AddComment("DIE offset");
2923    Asm->EmitInt32(Entity->getOffset());
2924
2925    if (Asm->VerboseAsm)
2926      Asm->OutStreamer.AddComment("External Name");
2927    Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2928  }
2929
2930  Asm->OutStreamer.AddComment("End Mark");
2931  Asm->EmitInt32(0);
2932  Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_end", ModuleCU->getID()));
2933}
2934
2935void DwarfDebug::emitDebugPubTypes() {
2936  // Start the dwarf pubnames section.
2937  Asm->OutStreamer.SwitchSection(
2938                          Asm->getObjFileLowering().getDwarfPubTypesSection());
2939  Asm->OutStreamer.AddComment("Length of Public Types Info");
2940  EmitDifference(getDWLabel("pubtypes_end", ModuleCU->getID()),
2941                 getDWLabel("pubtypes_begin", ModuleCU->getID()), true);
2942
2943  Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_begin", ModuleCU->getID()));
2944
2945  if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2946  Asm->EmitInt16(dwarf::DWARF_VERSION);
2947
2948  Asm->OutStreamer.AddComment("Offset of Compilation ModuleCU Info");
2949  EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2950                    getTempLabel("section_info"), true);
2951
2952  Asm->OutStreamer.AddComment("Compilation ModuleCU Length");
2953  EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2954                 getDWLabel("info_begin", ModuleCU->getID()),
2955                 true);
2956
2957  const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2958  for (StringMap<DIE*>::const_iterator
2959         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2960    const char *Name = GI->getKeyData();
2961    DIE * Entity = GI->second;
2962
2963    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2964    Asm->EmitInt32(Entity->getOffset());
2965
2966    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2967    Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2968  }
2969
2970  Asm->OutStreamer.AddComment("End Mark");
2971  Asm->EmitInt32(0);
2972  Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_end", ModuleCU->getID()));
2973}
2974
2975/// emitDebugStr - Emit visible names into a debug str section.
2976///
2977void DwarfDebug::emitDebugStr() {
2978  // Check to see if it is worth the effort.
2979  if (StringPool.empty()) return;
2980
2981  // Start the dwarf str section.
2982  Asm->OutStreamer.SwitchSection(
2983                                Asm->getObjFileLowering().getDwarfStrSection());
2984
2985  // Get all of the string pool entries and put them in an array by their ID so
2986  // we can sort them.
2987  SmallVector<std::pair<unsigned,
2988      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2989
2990  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2991       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2992    Entries.push_back(std::make_pair(I->second.second, &*I));
2993
2994  array_pod_sort(Entries.begin(), Entries.end());
2995
2996  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2997    // Emit a label for reference from debug information entries.
2998    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2999
3000    // Emit the string itself.
3001    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3002  }
3003}
3004
3005/// emitDebugLoc - Emit visible names into a debug loc section.
3006///
3007void DwarfDebug::emitDebugLoc() {
3008  // Start the dwarf loc section.
3009  Asm->OutStreamer.SwitchSection(
3010                              Asm->getObjFileLowering().getDwarfLocSection());
3011}
3012
3013/// EmitDebugARanges - Emit visible names into a debug aranges section.
3014///
3015void DwarfDebug::EmitDebugARanges() {
3016  // Start the dwarf aranges section.
3017  Asm->OutStreamer.SwitchSection(
3018                          Asm->getObjFileLowering().getDwarfARangesSection());
3019}
3020
3021/// emitDebugRanges - Emit visible names into a debug ranges section.
3022///
3023void DwarfDebug::emitDebugRanges() {
3024  // Start the dwarf ranges section.
3025  Asm->OutStreamer.SwitchSection(
3026                            Asm->getObjFileLowering().getDwarfRangesSection());
3027}
3028
3029/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3030///
3031void DwarfDebug::emitDebugMacInfo() {
3032  if (const MCSection *LineInfo =
3033      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3034    // Start the dwarf macinfo section.
3035    Asm->OutStreamer.SwitchSection(LineInfo);
3036  }
3037}
3038
3039/// emitDebugInlineInfo - Emit inline info using following format.
3040/// Section Header:
3041/// 1. length of section
3042/// 2. Dwarf version number
3043/// 3. address size.
3044///
3045/// Entries (one "entry" for each function that was inlined):
3046///
3047/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3048///   otherwise offset into __debug_str for regular function name.
3049/// 2. offset into __debug_str section for regular function name.
3050/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3051/// instances for the function.
3052///
3053/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3054/// inlined instance; the die_offset points to the inlined_subroutine die in the
3055/// __debug_info section, and the low_pc is the starting address for the
3056/// inlining instance.
3057void DwarfDebug::emitDebugInlineInfo() {
3058  if (!MAI->doesDwarfUsesInlineInfoSection())
3059    return;
3060
3061  if (!ModuleCU)
3062    return;
3063
3064  Asm->OutStreamer.SwitchSection(
3065                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
3066
3067  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3068  EmitDifference(getDWLabel("debug_inlined_end", 1),
3069                 getDWLabel("debug_inlined_begin", 1), true);
3070
3071  Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_begin", 1));
3072
3073  Asm->OutStreamer.AddComment("Dwarf Version");
3074  Asm->EmitInt16(dwarf::DWARF_VERSION);
3075  Asm->OutStreamer.AddComment("Address Size (in bytes)");
3076  Asm->EmitInt8(TD->getPointerSize());
3077
3078  for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3079         E = InlinedSPNodes.end(); I != E; ++I) {
3080
3081    MDNode *Node = *I;
3082    DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3083      = InlineInfo.find(Node);
3084    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3085    DISubprogram SP(Node);
3086    StringRef LName = SP.getLinkageName();
3087    StringRef Name = SP.getName();
3088
3089    Asm->OutStreamer.AddComment("MIPS linkage name");
3090    if (LName.empty()) {
3091      Asm->OutStreamer.EmitBytes(Name, 0);
3092      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3093    } else
3094      EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3095                        getTempLabel("section_str"), true);
3096
3097    Asm->OutStreamer.AddComment("Function name");
3098    EmitSectionOffset(getStringPoolEntry(Name), getTempLabel("section_str"),
3099                      true);
3100    EmitULEB128(Labels.size(), "Inline count");
3101
3102    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3103           LE = Labels.end(); LI != LE; ++LI) {
3104      if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
3105      Asm->EmitInt32(LI->second->getOffset());
3106
3107      if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("low_pc");
3108      Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
3109    }
3110  }
3111
3112  Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_end", 1));
3113}
3114