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