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