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