DwarfDebug.cpp revision 55e9717e59165d15161991be56c75c3e80220ee8
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    for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2195           ME = DbgValues.end(); MI != ME; ++MI) {
2196      const MDNode *Var =
2197        (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2198      if (Var == DV && isDbgValueInDefinedReg(*MI))
2199        MultipleValues.push_back(*MI);
2200    }
2201
2202    DbgScope *Scope = findDbgScope(MInsn);
2203    if (!Scope && DV.getTag() == dwarf::DW_TAG_arg_variable)
2204      Scope = CurrentFnDbgScope;
2205    // If variable scope is not found then skip this variable.
2206    if (!Scope)
2207      continue;
2208
2209    Processed.insert(DV);
2210    DbgVariable *RegVar = new DbgVariable(DV);
2211    Scope->addVariable(RegVar);
2212    if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2213      DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn);
2214    if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2215      DbgVariableToDbgInstMap[AbsVar] = MInsn;
2216      VarToAbstractVarMap[RegVar] = AbsVar;
2217    }
2218    if (MultipleValues.size() <= 1) {
2219      DbgVariableToDbgInstMap[RegVar] = MInsn;
2220      continue;
2221    }
2222
2223    // handle multiple DBG_VALUE instructions describing one variable.
2224    if (DotDebugLocEntries.empty())
2225      RegVar->setDotDebugLocOffset(0);
2226    else
2227      RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2228    const MachineInstr *Begin = NULL;
2229    const MachineInstr *End = NULL;
2230    for (SmallVector<const MachineInstr *, 4>::iterator
2231           MVI = MultipleValues.begin(), MVE = MultipleValues.end(); MVI != MVE; ++MVI) {
2232      if (!Begin) {
2233        Begin = *MVI;
2234        continue;
2235      }
2236      End = *MVI;
2237      MachineLocation MLoc;
2238      MLoc.set(Begin->getOperand(0).getReg(), 0);
2239      const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2240      const MCSymbol *SLabel = getLabelBeforeInsn(End);
2241      DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2242      Begin = End;
2243      if (MVI + 1 == MVE) {
2244        // If End is the last instruction then its value is valid
2245        // until the end of the funtion.
2246        MLoc.set(End->getOperand(0).getReg(), 0);
2247        DotDebugLocEntries.
2248          push_back(DotDebugLocEntry(SLabel, FunctionEndSym, MLoc));
2249      }
2250    }
2251    DotDebugLocEntries.push_back(DotDebugLocEntry());
2252  }
2253
2254  // Collect info for variables that were optimized out.
2255  if (NamedMDNode *NMD =
2256      MF->getFunction()->getParent()->getNamedMetadata("llvm.dbg.lv")) {
2257    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2258      DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2259      if (!DV || !Processed.insert(DV))
2260        continue;
2261      DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2262      if (Scope)
2263        Scope->addVariable(new DbgVariable(DV));
2264    }
2265  }
2266}
2267
2268/// getLabelBeforeInsn - Return Label preceding the instruction.
2269const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2270  DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2271    LabelsBeforeInsn.find(MI);
2272  if (I == LabelsBeforeInsn.end())
2273    // FunctionBeginSym always preceeds all the instruction in current function.
2274    return FunctionBeginSym;
2275  return I->second;
2276}
2277
2278/// getLabelAfterInsn - Return Label immediately following the instruction.
2279const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2280  DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2281    LabelsAfterInsn.find(MI);
2282  if (I == LabelsAfterInsn.end())
2283    return NULL;
2284  return I->second;
2285}
2286
2287/// beginScope - Process beginning of a scope.
2288void DwarfDebug::beginScope(const MachineInstr *MI) {
2289  if (InsnNeedsLabel.count(MI) == 0) {
2290    LabelsBeforeInsn[MI] = PrevLabel;
2291    return;
2292  }
2293
2294  // Check location.
2295  DebugLoc DL = MI->getDebugLoc();
2296  if (!DL.isUnknown()) {
2297    const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2298    PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2299    PrevInstLoc = DL;
2300    LabelsBeforeInsn[MI] = PrevLabel;
2301    return;
2302  }
2303
2304  // If location is unknown then use temp label for this DBG_VALUE
2305  // instruction.
2306  if (MI->isDebugValue()) {
2307    PrevLabel = MMI->getContext().CreateTempSymbol();
2308    Asm->OutStreamer.EmitLabel(PrevLabel);
2309    LabelsBeforeInsn[MI] = PrevLabel;
2310    return;
2311  }
2312
2313  if (UnknownLocations) {
2314    PrevLabel = recordSourceLine(0, 0, 0);
2315    LabelsBeforeInsn[MI] = PrevLabel;
2316    return;
2317  }
2318
2319  assert (0 && "Instruction is not processed!");
2320}
2321
2322/// endScope - Process end of a scope.
2323void DwarfDebug::endScope(const MachineInstr *MI) {
2324  if (InsnsEndScopeSet.count(MI) != 0) {
2325    // Emit a label if this instruction ends a scope.
2326    MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2327    Asm->OutStreamer.EmitLabel(Label);
2328    LabelsAfterInsn[MI] = Label;
2329  }
2330}
2331
2332/// getOrCreateDbgScope - Create DbgScope for the scope.
2333DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, const MDNode *InlinedAt) {
2334  if (!InlinedAt) {
2335    DbgScope *WScope = DbgScopeMap.lookup(Scope);
2336    if (WScope)
2337      return WScope;
2338    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2339    DbgScopeMap.insert(std::make_pair(Scope, WScope));
2340    if (DIDescriptor(Scope).isLexicalBlock()) {
2341      DbgScope *Parent =
2342        getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2343      WScope->setParent(Parent);
2344      Parent->addScope(WScope);
2345    }
2346
2347    if (!WScope->getParent()) {
2348      StringRef SPName = DISubprogram(Scope).getLinkageName();
2349      if (SPName == Asm->MF->getFunction()->getName())
2350        CurrentFnDbgScope = WScope;
2351    }
2352
2353    return WScope;
2354  }
2355
2356  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2357  if (WScope)
2358    return WScope;
2359
2360  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2361  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2362  DILocation DL(InlinedAt);
2363  DbgScope *Parent =
2364    getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2365  WScope->setParent(Parent);
2366  Parent->addScope(WScope);
2367
2368  ConcreteScopes[InlinedAt] = WScope;
2369  getOrCreateAbstractScope(Scope);
2370
2371  return WScope;
2372}
2373
2374/// hasValidLocation - Return true if debug location entry attached with
2375/// machine instruction encodes valid location info.
2376static bool hasValidLocation(LLVMContext &Ctx,
2377                             const MachineInstr *MInsn,
2378                             const MDNode *&Scope, const MDNode *&InlinedAt) {
2379  if (MInsn->isDebugValue())
2380    return false;
2381  DebugLoc DL = MInsn->getDebugLoc();
2382  if (DL.isUnknown()) return false;
2383
2384  const MDNode *S = DL.getScope(Ctx);
2385
2386  // There is no need to create another DIE for compile unit. For all
2387  // other scopes, create one DbgScope now. This will be translated
2388  // into a scope DIE at the end.
2389  if (DIScope(S).isCompileUnit()) return false;
2390
2391  Scope = S;
2392  InlinedAt = DL.getInlinedAt(Ctx);
2393  return true;
2394}
2395
2396/// calculateDominanceGraph - Calculate dominance graph for DbgScope
2397/// hierarchy.
2398static void calculateDominanceGraph(DbgScope *Scope) {
2399  assert (Scope && "Unable to calculate scop edominance graph!");
2400  SmallVector<DbgScope *, 4> WorkStack;
2401  WorkStack.push_back(Scope);
2402  unsigned Counter = 0;
2403  while (!WorkStack.empty()) {
2404    DbgScope *WS = WorkStack.back();
2405    const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2406    bool visitedChildren = false;
2407    for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2408           SE = Children.end(); SI != SE; ++SI) {
2409      DbgScope *ChildScope = *SI;
2410      if (!ChildScope->getDFSOut()) {
2411        WorkStack.push_back(ChildScope);
2412        visitedChildren = true;
2413        ChildScope->setDFSIn(++Counter);
2414        break;
2415      }
2416    }
2417    if (!visitedChildren) {
2418      WorkStack.pop_back();
2419      WS->setDFSOut(++Counter);
2420    }
2421  }
2422}
2423
2424/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2425static
2426void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2427                       DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2428{
2429#ifndef NDEBUG
2430  unsigned PrevDFSIn = 0;
2431  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2432       I != E; ++I) {
2433    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2434         II != IE; ++II) {
2435      const MachineInstr *MInsn = II;
2436      const MDNode *Scope = NULL;
2437      const MDNode *InlinedAt = NULL;
2438
2439      // Check if instruction has valid location information.
2440      if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2441        dbgs() << " [ ";
2442        if (InlinedAt)
2443          dbgs() << "*";
2444        DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2445          MI2ScopeMap.find(MInsn);
2446        if (DI != MI2ScopeMap.end()) {
2447          DbgScope *S = DI->second;
2448          dbgs() << S->getDFSIn();
2449          PrevDFSIn = S->getDFSIn();
2450        } else
2451          dbgs() << PrevDFSIn;
2452      } else
2453        dbgs() << " [ x" << PrevDFSIn;
2454      dbgs() << " ]";
2455      MInsn->dump();
2456    }
2457    dbgs() << "\n";
2458  }
2459#endif
2460}
2461/// extractScopeInformation - Scan machine instructions in this function
2462/// and collect DbgScopes. Return true, if at least one scope was found.
2463bool DwarfDebug::extractScopeInformation() {
2464  // If scope information was extracted using .dbg intrinsics then there is not
2465  // any need to extract these information by scanning each instruction.
2466  if (!DbgScopeMap.empty())
2467    return false;
2468
2469  // Scan each instruction and create scopes. First build working set of scopes.
2470  LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2471  SmallVector<DbgRange, 4> MIRanges;
2472  DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2473  const MDNode *PrevScope = NULL;
2474  const MDNode *PrevInlinedAt = NULL;
2475  const MachineInstr *RangeBeginMI = NULL;
2476  const MachineInstr *PrevMI = NULL;
2477  for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2478       I != E; ++I) {
2479    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2480         II != IE; ++II) {
2481      const MachineInstr *MInsn = II;
2482      const MDNode *Scope = NULL;
2483      const MDNode *InlinedAt = NULL;
2484
2485      // Check if instruction has valid location information.
2486      if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2487        PrevMI = MInsn;
2488        continue;
2489      }
2490
2491      // If scope has not changed then skip this instruction.
2492      if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2493        PrevMI = MInsn;
2494        continue;
2495      }
2496
2497      if (RangeBeginMI) {
2498        // If we have alread seen a beginning of a instruction range and
2499        // current instruction scope does not match scope of first instruction
2500        // in this range then create a new instruction range.
2501        DbgRange R(RangeBeginMI, PrevMI);
2502        MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2503        MIRanges.push_back(R);
2504      }
2505
2506      // This is a beginning of a new instruction range.
2507      RangeBeginMI = MInsn;
2508
2509      // Reset previous markers.
2510      PrevMI = MInsn;
2511      PrevScope = Scope;
2512      PrevInlinedAt = InlinedAt;
2513    }
2514  }
2515
2516  // Create last instruction range.
2517  if (RangeBeginMI && PrevMI && PrevScope) {
2518    DbgRange R(RangeBeginMI, PrevMI);
2519    MIRanges.push_back(R);
2520    MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2521  }
2522
2523  if (!CurrentFnDbgScope)
2524    return false;
2525
2526  calculateDominanceGraph(CurrentFnDbgScope);
2527  if (PrintDbgScope)
2528    printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2529
2530  // Find ranges of instructions covered by each DbgScope;
2531  DbgScope *PrevDbgScope = NULL;
2532  for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2533         RE = MIRanges.end(); RI != RE; ++RI) {
2534    const DbgRange &R = *RI;
2535    DbgScope *S = MI2ScopeMap.lookup(R.first);
2536    assert (S && "Lost DbgScope for a machine instruction!");
2537    if (PrevDbgScope && !PrevDbgScope->dominates(S))
2538      PrevDbgScope->closeInsnRange(S);
2539    S->openInsnRange(R.first);
2540    S->extendInsnRange(R.second);
2541    PrevDbgScope = S;
2542  }
2543
2544  if (PrevDbgScope)
2545    PrevDbgScope->closeInsnRange();
2546
2547  identifyScopeMarkers();
2548
2549  return !DbgScopeMap.empty();
2550}
2551
2552/// identifyScopeMarkers() -
2553/// Each DbgScope has first instruction and last instruction to mark beginning
2554/// and end of a scope respectively. Create an inverse map that list scopes
2555/// starts (and ends) with an instruction. One instruction may start (or end)
2556/// multiple scopes. Ignore scopes that are not reachable.
2557void DwarfDebug::identifyScopeMarkers() {
2558  SmallVector<DbgScope *, 4> WorkList;
2559  WorkList.push_back(CurrentFnDbgScope);
2560  while (!WorkList.empty()) {
2561    DbgScope *S = WorkList.pop_back_val();
2562
2563    const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2564    if (!Children.empty())
2565      for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2566             SE = Children.end(); SI != SE; ++SI)
2567        WorkList.push_back(*SI);
2568
2569    if (S->isAbstractScope())
2570      continue;
2571
2572    const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2573    if (Ranges.empty())
2574      continue;
2575    for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2576           RE = Ranges.end(); RI != RE; ++RI) {
2577      assert(RI->first && "DbgRange does not have first instruction!");
2578      assert(RI->second && "DbgRange does not have second instruction!");
2579      InsnsBeginScopeSet.insert(RI->first);
2580      InsnsEndScopeSet.insert(RI->second);
2581    }
2582  }
2583}
2584
2585/// FindFirstDebugLoc - Find the first debug location in the function. This
2586/// is intended to be an approximation for the source position of the
2587/// beginning of the function.
2588static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2589  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2590       I != E; ++I)
2591    for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2592         MBBI != MBBE; ++MBBI) {
2593      DebugLoc DL = MBBI->getDebugLoc();
2594      if (!DL.isUnknown())
2595        return DL;
2596    }
2597  return DebugLoc();
2598}
2599
2600/// beginFunction - Gather pre-function debug information.  Assumes being
2601/// emitted immediately after the function entry point.
2602void DwarfDebug::beginFunction(const MachineFunction *MF) {
2603  if (!MMI->hasDebugInfo()) return;
2604  if (!extractScopeInformation()) return;
2605
2606  FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2607                                        Asm->getFunctionNumber());
2608  // Assumes in correct section after the entry point.
2609  Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2610
2611  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2612  // function.
2613  DebugLoc FDL = FindFirstDebugLoc(MF);
2614  if (FDL.isUnknown()) return;
2615
2616  const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2617
2618  DISubprogram SP = getDISubprogram(Scope);
2619  unsigned Line, Col;
2620  if (SP.Verify()) {
2621    Line = SP.getLineNumber();
2622    Col = 0;
2623  } else {
2624    Line = FDL.getLine();
2625    Col = FDL.getCol();
2626  }
2627
2628  recordSourceLine(Line, Col, Scope);
2629
2630  DebugLoc PrevLoc;
2631  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2632       I != E; ++I)
2633    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2634         II != IE; ++II) {
2635      const MachineInstr *MI = II;
2636      DebugLoc DL = MI->getDebugLoc();
2637      if (MI->isDebugValue()) {
2638        assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2639        DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2640        if (!DV.Verify()) continue;
2641        // If DBG_VALUE is for a local variable then it needs a label.
2642        if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2643          InsnNeedsLabel.insert(MI);
2644        // DBG_VALUE for inlined functions argument needs a label.
2645        else if (!DISubprogram(DV.getContext()).describes(MF->getFunction()))
2646          InsnNeedsLabel.insert(MI);
2647        // DBG_VALUE indicating argument location change needs a label.
2648        else if (!ProcessedArgs.insert(DV))
2649          InsnNeedsLabel.insert(MI);
2650      } else {
2651        // If location is unknown then instruction needs a location only if
2652        // UnknownLocations flag is set.
2653        if (DL.isUnknown()) {
2654          if (UnknownLocations && !PrevLoc.isUnknown())
2655            InsnNeedsLabel.insert(MI);
2656        } else if (DL != PrevLoc)
2657          // Otherwise, instruction needs a location only if it is new location.
2658          InsnNeedsLabel.insert(MI);
2659      }
2660
2661      if (!DL.isUnknown() || UnknownLocations)
2662        PrevLoc = DL;
2663    }
2664
2665  PrevLabel = FunctionBeginSym;
2666}
2667
2668/// endFunction - Gather and emit post-function debug information.
2669///
2670void DwarfDebug::endFunction(const MachineFunction *MF) {
2671  if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2672
2673  if (CurrentFnDbgScope) {
2674
2675    // Define end label for subprogram.
2676    FunctionEndSym = Asm->GetTempSymbol("func_end",
2677                                        Asm->getFunctionNumber());
2678    // Assumes in correct section after the entry point.
2679    Asm->OutStreamer.EmitLabel(FunctionEndSym);
2680
2681    collectVariableInfo(MF);
2682
2683    // Get function line info.
2684    if (!Lines.empty()) {
2685      // Get section line info.
2686      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2687      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2688      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2689      // Append the function info to section info.
2690      SectionLineInfos.insert(SectionLineInfos.end(),
2691                              Lines.begin(), Lines.end());
2692    }
2693
2694    // Construct abstract scopes.
2695    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2696           AE = AbstractScopesList.end(); AI != AE; ++AI)
2697      constructScopeDIE(*AI);
2698
2699    DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2700
2701    if (!DisableFramePointerElim(*MF))
2702      addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2703              dwarf::DW_FORM_flag, 1);
2704
2705
2706    DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2707                                                 MMI->getFrameMoves()));
2708  }
2709
2710  // Clear debug info
2711  CurrentFnDbgScope = NULL;
2712  InsnNeedsLabel.clear();
2713  ProcessedArgs.clear();
2714  DbgVariableToFrameIndexMap.clear();
2715  VarToAbstractVarMap.clear();
2716  DbgVariableToDbgInstMap.clear();
2717  DbgVariableLabelsMap.clear();
2718  DeleteContainerSeconds(DbgScopeMap);
2719  InsnsBeginScopeSet.clear();
2720  InsnsEndScopeSet.clear();
2721  ConcreteScopes.clear();
2722  DeleteContainerSeconds(AbstractScopes);
2723  AbstractScopesList.clear();
2724  AbstractVariables.clear();
2725  LabelsBeforeInsn.clear();
2726  LabelsAfterInsn.clear();
2727  Lines.clear();
2728  PrevLabel = NULL;
2729}
2730
2731/// recordVariableFrameIndex - Record a variable's index.
2732void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2733  assert (V && "Invalid DbgVariable!");
2734  DbgVariableToFrameIndexMap[V] = Index;
2735}
2736
2737/// findVariableFrameIndex - Return true if frame index for the variable
2738/// is found. Update FI to hold value of the index.
2739bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2740  assert (V && "Invalid DbgVariable!");
2741  DenseMap<const DbgVariable *, int>::iterator I =
2742    DbgVariableToFrameIndexMap.find(V);
2743  if (I == DbgVariableToFrameIndexMap.end())
2744    return false;
2745  *FI = I->second;
2746  return true;
2747}
2748
2749/// findVariableLabel - Find MCSymbol for the variable.
2750const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2751  DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2752    = DbgVariableLabelsMap.find(V);
2753  if (I == DbgVariableLabelsMap.end())
2754    return NULL;
2755  else return I->second;
2756}
2757
2758/// findDbgScope - Find DbgScope for the debug loc attached with an
2759/// instruction.
2760DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2761  DbgScope *Scope = NULL;
2762  LLVMContext &Ctx =
2763    MInsn->getParent()->getParent()->getFunction()->getContext();
2764  DebugLoc DL = MInsn->getDebugLoc();
2765
2766  if (DL.isUnknown())
2767    return Scope;
2768
2769  if (const MDNode *IA = DL.getInlinedAt(Ctx))
2770    Scope = ConcreteScopes.lookup(IA);
2771  if (Scope == 0)
2772    Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2773
2774  return Scope;
2775}
2776
2777
2778/// recordSourceLine - Register a source line with debug info. Returns the
2779/// unique label that was emitted and which provides correspondence to
2780/// the source line list.
2781MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S) {
2782  StringRef Dir;
2783  StringRef Fn;
2784
2785  unsigned Src = 1;
2786  if (S) {
2787    DIDescriptor Scope(S);
2788
2789    if (Scope.isCompileUnit()) {
2790      DICompileUnit CU(S);
2791      Dir = CU.getDirectory();
2792      Fn = CU.getFilename();
2793    } else if (Scope.isSubprogram()) {
2794      DISubprogram SP(S);
2795      Dir = SP.getDirectory();
2796      Fn = SP.getFilename();
2797    } else if (Scope.isLexicalBlock()) {
2798      DILexicalBlock DB(S);
2799      Dir = DB.getDirectory();
2800      Fn = DB.getFilename();
2801    } else
2802      assert(0 && "Unexpected scope info");
2803
2804    Src = GetOrCreateSourceID(Dir, Fn);
2805  }
2806
2807  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2808  Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2809
2810  Asm->OutStreamer.EmitLabel(Label);
2811  return Label;
2812}
2813
2814//===----------------------------------------------------------------------===//
2815// Emit Methods
2816//===----------------------------------------------------------------------===//
2817
2818/// computeSizeAndOffset - Compute the size and offset of a DIE.
2819///
2820unsigned
2821DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2822  // Get the children.
2823  const std::vector<DIE *> &Children = Die->getChildren();
2824
2825  // If not last sibling and has children then add sibling offset attribute.
2826  if (!Last && !Children.empty())
2827    Die->addSiblingOffset(DIEValueAllocator);
2828
2829  // Record the abbreviation.
2830  assignAbbrevNumber(Die->getAbbrev());
2831
2832  // Get the abbreviation for this DIE.
2833  unsigned AbbrevNumber = Die->getAbbrevNumber();
2834  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2835
2836  // Set DIE offset
2837  Die->setOffset(Offset);
2838
2839  // Start the size with the size of abbreviation code.
2840  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2841
2842  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2843  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2844
2845  // Size the DIE attribute values.
2846  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2847    // Size attribute value.
2848    Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2849
2850  // Size the DIE children if any.
2851  if (!Children.empty()) {
2852    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2853           "Children flag not set");
2854
2855    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2856      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2857
2858    // End of children marker.
2859    Offset += sizeof(int8_t);
2860  }
2861
2862  Die->setSize(Offset - Die->getOffset());
2863  return Offset;
2864}
2865
2866/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2867///
2868void DwarfDebug::computeSizeAndOffsets() {
2869  unsigned PrevOffset = 0;
2870  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2871         E = CUMap.end(); I != E; ++I) {
2872    // Compute size of compile unit header.
2873    static unsigned Offset = PrevOffset +
2874      sizeof(int32_t) + // Length of Compilation Unit Info
2875      sizeof(int16_t) + // DWARF version number
2876      sizeof(int32_t) + // Offset Into Abbrev. Section
2877      sizeof(int8_t);   // Pointer Size (in bytes)
2878    computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2879    PrevOffset = Offset;
2880  }
2881}
2882
2883/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2884/// temporary label to it if SymbolStem is specified.
2885static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2886                                const char *SymbolStem = 0) {
2887  Asm->OutStreamer.SwitchSection(Section);
2888  if (!SymbolStem) return 0;
2889
2890  MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2891  Asm->OutStreamer.EmitLabel(TmpSym);
2892  return TmpSym;
2893}
2894
2895/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2896/// the start of each one.
2897void DwarfDebug::EmitSectionLabels() {
2898  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2899
2900  // Dwarf sections base addresses.
2901  if (Asm->MAI->doesDwarfRequireFrameSection()) {
2902    DwarfFrameSectionSym =
2903      EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2904   }
2905
2906  DwarfInfoSectionSym =
2907    EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2908  DwarfAbbrevSectionSym =
2909    EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2910  EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2911
2912  if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2913    EmitSectionSym(Asm, MacroInfo);
2914
2915  EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2916  EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2917  EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2918  EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2919  DwarfStrSectionSym =
2920    EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2921  DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2922                                             "debug_range");
2923
2924  DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2925                                           "section_debug_loc");
2926
2927  TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2928  EmitSectionSym(Asm, TLOF.getDataSection());
2929}
2930
2931/// emitDIE - Recusively Emits a debug information entry.
2932///
2933void DwarfDebug::emitDIE(DIE *Die) {
2934  // Get the abbreviation for this DIE.
2935  unsigned AbbrevNumber = Die->getAbbrevNumber();
2936  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2937
2938  // Emit the code (index) for the abbreviation.
2939  if (Asm->isVerbose())
2940    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2941                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2942                                Twine::utohexstr(Die->getSize()) + " " +
2943                                dwarf::TagString(Abbrev->getTag()));
2944  Asm->EmitULEB128(AbbrevNumber);
2945
2946  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2947  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2948
2949  // Emit the DIE attribute values.
2950  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2951    unsigned Attr = AbbrevData[i].getAttribute();
2952    unsigned Form = AbbrevData[i].getForm();
2953    assert(Form && "Too many attributes for DIE (check abbreviation)");
2954
2955    if (Asm->isVerbose())
2956      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2957
2958    switch (Attr) {
2959    case dwarf::DW_AT_sibling:
2960      Asm->EmitInt32(Die->getSiblingOffset());
2961      break;
2962    case dwarf::DW_AT_abstract_origin: {
2963      DIEEntry *E = cast<DIEEntry>(Values[i]);
2964      DIE *Origin = E->getEntry();
2965      unsigned Addr = Origin->getOffset();
2966      Asm->EmitInt32(Addr);
2967      break;
2968    }
2969    case dwarf::DW_AT_ranges: {
2970      // DW_AT_range Value encodes offset in debug_range section.
2971      DIEInteger *V = cast<DIEInteger>(Values[i]);
2972      Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2973                                     V->getValue(),
2974                                     DwarfDebugRangeSectionSym,
2975                                     4);
2976      break;
2977    }
2978    case dwarf::DW_AT_location: {
2979      if (UseDotDebugLocEntry.count(Die) != 0) {
2980        DIELabel *L = cast<DIELabel>(Values[i]);
2981        Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
2982      } else
2983        Values[i]->EmitValue(Asm, Form);
2984      break;
2985    }
2986    default:
2987      // Emit an attribute using the defined form.
2988      Values[i]->EmitValue(Asm, Form);
2989      break;
2990    }
2991  }
2992
2993  // Emit the DIE children if any.
2994  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2995    const std::vector<DIE *> &Children = Die->getChildren();
2996
2997    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2998      emitDIE(Children[j]);
2999
3000    if (Asm->isVerbose())
3001      Asm->OutStreamer.AddComment("End Of Children Mark");
3002    Asm->EmitInt8(0);
3003  }
3004}
3005
3006/// emitDebugInfo - Emit the debug info section.
3007///
3008void DwarfDebug::emitDebugInfo() {
3009  // Start debug info section.
3010  Asm->OutStreamer.SwitchSection(
3011                            Asm->getObjFileLowering().getDwarfInfoSection());
3012  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3013         E = CUMap.end(); I != E; ++I) {
3014    CompileUnit *TheCU = I->second;
3015    DIE *Die = TheCU->getCUDie();
3016
3017    // Emit the compile units header.
3018    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3019                                                  TheCU->getID()));
3020
3021    // Emit size of content not including length itself
3022    unsigned ContentSize = Die->getSize() +
3023      sizeof(int16_t) + // DWARF version number
3024      sizeof(int32_t) + // Offset Into Abbrev. Section
3025      sizeof(int8_t) +  // Pointer Size (in bytes)
3026      sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3027
3028    Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3029    Asm->EmitInt32(ContentSize);
3030    Asm->OutStreamer.AddComment("DWARF version number");
3031    Asm->EmitInt16(dwarf::DWARF_VERSION);
3032    Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3033    Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3034                           DwarfAbbrevSectionSym);
3035    Asm->OutStreamer.AddComment("Address Size (in bytes)");
3036    Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3037
3038    emitDIE(Die);
3039    // FIXME - extra padding for gdb bug.
3040    Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3041    Asm->EmitInt8(0);
3042    Asm->EmitInt8(0);
3043    Asm->EmitInt8(0);
3044    Asm->EmitInt8(0);
3045    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3046  }
3047}
3048
3049/// emitAbbreviations - Emit the abbreviation section.
3050///
3051void DwarfDebug::emitAbbreviations() const {
3052  // Check to see if it is worth the effort.
3053  if (!Abbreviations.empty()) {
3054    // Start the debug abbrev section.
3055    Asm->OutStreamer.SwitchSection(
3056                            Asm->getObjFileLowering().getDwarfAbbrevSection());
3057
3058    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3059
3060    // For each abbrevation.
3061    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3062      // Get abbreviation data
3063      const DIEAbbrev *Abbrev = Abbreviations[i];
3064
3065      // Emit the abbrevations code (base 1 index.)
3066      Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3067
3068      // Emit the abbreviations data.
3069      Abbrev->Emit(Asm);
3070    }
3071
3072    // Mark end of abbreviations.
3073    Asm->EmitULEB128(0, "EOM(3)");
3074
3075    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3076  }
3077}
3078
3079/// emitEndOfLineMatrix - Emit the last address of the section and the end of
3080/// the line matrix.
3081///
3082void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3083  // Define last address of section.
3084  Asm->OutStreamer.AddComment("Extended Op");
3085  Asm->EmitInt8(0);
3086
3087  Asm->OutStreamer.AddComment("Op size");
3088  Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3089  Asm->OutStreamer.AddComment("DW_LNE_set_address");
3090  Asm->EmitInt8(dwarf::DW_LNE_set_address);
3091
3092  Asm->OutStreamer.AddComment("Section end label");
3093
3094  Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3095                                   Asm->getTargetData().getPointerSize(),
3096                                   0/*AddrSpace*/);
3097
3098  // Mark end of matrix.
3099  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3100  Asm->EmitInt8(0);
3101  Asm->EmitInt8(1);
3102  Asm->EmitInt8(1);
3103}
3104
3105/// emitDebugLines - Emit source line information.
3106///
3107void DwarfDebug::emitDebugLines() {
3108  // If the target is using .loc/.file, the assembler will be emitting the
3109  // .debug_line table automatically.
3110  if (Asm->MAI->hasDotLocAndDotFile())
3111    return;
3112
3113  // Minimum line delta, thus ranging from -10..(255-10).
3114  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3115  // Maximum line delta, thus ranging from -10..(255-10).
3116  const int MaxLineDelta = 255 + MinLineDelta;
3117
3118  // Start the dwarf line section.
3119  Asm->OutStreamer.SwitchSection(
3120                            Asm->getObjFileLowering().getDwarfLineSection());
3121
3122  // Construct the section header.
3123  Asm->OutStreamer.AddComment("Length of Source Line Info");
3124  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3125                           Asm->GetTempSymbol("line_begin"), 4);
3126  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3127
3128  Asm->OutStreamer.AddComment("DWARF version number");
3129  Asm->EmitInt16(dwarf::DWARF_VERSION);
3130
3131  Asm->OutStreamer.AddComment("Prolog Length");
3132  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3133                           Asm->GetTempSymbol("line_prolog_begin"), 4);
3134  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3135
3136  Asm->OutStreamer.AddComment("Minimum Instruction Length");
3137  Asm->EmitInt8(1);
3138  Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3139  Asm->EmitInt8(1);
3140  Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3141  Asm->EmitInt8(MinLineDelta);
3142  Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3143  Asm->EmitInt8(MaxLineDelta);
3144  Asm->OutStreamer.AddComment("Special Opcode Base");
3145  Asm->EmitInt8(-MinLineDelta);
3146
3147  // Line number standard opcode encodings argument count
3148  Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3149  Asm->EmitInt8(0);
3150  Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3151  Asm->EmitInt8(1);
3152  Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3153  Asm->EmitInt8(1);
3154  Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3155  Asm->EmitInt8(1);
3156  Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3157  Asm->EmitInt8(1);
3158  Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3159  Asm->EmitInt8(0);
3160  Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3161  Asm->EmitInt8(0);
3162  Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3163  Asm->EmitInt8(0);
3164  Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3165  Asm->EmitInt8(1);
3166
3167  // Emit directories.
3168  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3169    const std::string &Dir = getSourceDirectoryName(DI);
3170    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3171    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3172  }
3173
3174  Asm->OutStreamer.AddComment("End of directories");
3175  Asm->EmitInt8(0);
3176
3177  // Emit files.
3178  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3179    // Remember source id starts at 1.
3180    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3181    const std::string &FN = getSourceFileName(Id.second);
3182    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3183    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3184
3185    Asm->EmitULEB128(Id.first, "Directory #");
3186    Asm->EmitULEB128(0, "Mod date");
3187    Asm->EmitULEB128(0, "File size");
3188  }
3189
3190  Asm->OutStreamer.AddComment("End of files");
3191  Asm->EmitInt8(0);
3192
3193  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3194
3195  // A sequence for each text section.
3196  unsigned SecSrcLinesSize = SectionSourceLines.size();
3197
3198  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3199    // Isolate current sections line info.
3200    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3201
3202    // Dwarf assumes we start with first line of first source file.
3203    unsigned Source = 1;
3204    unsigned Line = 1;
3205
3206    // Construct rows of the address, source, line, column matrix.
3207    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3208      const SrcLineInfo &LineInfo = LineInfos[i];
3209      MCSymbol *Label = LineInfo.getLabel();
3210      if (!Label->isDefined()) continue; // Not emitted, in dead code.
3211
3212      if (Asm->isVerbose()) {
3213        std::pair<unsigned, unsigned> SrcID =
3214          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3215        Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3216                                    "/" +
3217                                    Twine(getSourceFileName(SrcID.second)) +
3218                                    ":" + Twine(LineInfo.getLine()));
3219      }
3220
3221      // Define the line address.
3222      Asm->OutStreamer.AddComment("Extended Op");
3223      Asm->EmitInt8(0);
3224      Asm->OutStreamer.AddComment("Op size");
3225      Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3226
3227      Asm->OutStreamer.AddComment("DW_LNE_set_address");
3228      Asm->EmitInt8(dwarf::DW_LNE_set_address);
3229
3230      Asm->OutStreamer.AddComment("Location label");
3231      Asm->OutStreamer.EmitSymbolValue(Label,
3232                                       Asm->getTargetData().getPointerSize(),
3233                                       0/*AddrSpace*/);
3234
3235      // If change of source, then switch to the new source.
3236      if (Source != LineInfo.getSourceID()) {
3237        Source = LineInfo.getSourceID();
3238        Asm->OutStreamer.AddComment("DW_LNS_set_file");
3239        Asm->EmitInt8(dwarf::DW_LNS_set_file);
3240        Asm->EmitULEB128(Source, "New Source");
3241      }
3242
3243      // If change of line.
3244      if (Line != LineInfo.getLine()) {
3245        // Determine offset.
3246        int Offset = LineInfo.getLine() - Line;
3247        int Delta = Offset - MinLineDelta;
3248
3249        // Update line.
3250        Line = LineInfo.getLine();
3251
3252        // If delta is small enough and in range...
3253        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3254          // ... then use fast opcode.
3255          Asm->OutStreamer.AddComment("Line Delta");
3256          Asm->EmitInt8(Delta - MinLineDelta);
3257        } else {
3258          // ... otherwise use long hand.
3259          Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3260          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3261          Asm->EmitSLEB128(Offset, "Line Offset");
3262          Asm->OutStreamer.AddComment("DW_LNS_copy");
3263          Asm->EmitInt8(dwarf::DW_LNS_copy);
3264        }
3265      } else {
3266        // Copy the previous row (different address or source)
3267        Asm->OutStreamer.AddComment("DW_LNS_copy");
3268        Asm->EmitInt8(dwarf::DW_LNS_copy);
3269      }
3270    }
3271
3272    emitEndOfLineMatrix(j + 1);
3273  }
3274
3275  if (SecSrcLinesSize == 0)
3276    // Because we're emitting a debug_line section, we still need a line
3277    // table. The linker and friends expect it to exist. If there's nothing to
3278    // put into it, emit an empty table.
3279    emitEndOfLineMatrix(1);
3280
3281  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3282}
3283
3284/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3285///
3286void DwarfDebug::emitCommonDebugFrame() {
3287  if (!Asm->MAI->doesDwarfRequireFrameSection())
3288    return;
3289
3290  int stackGrowth = Asm->getTargetData().getPointerSize();
3291  if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3292      TargetFrameInfo::StackGrowsDown)
3293    stackGrowth *= -1;
3294
3295  // Start the dwarf frame section.
3296  Asm->OutStreamer.SwitchSection(
3297                              Asm->getObjFileLowering().getDwarfFrameSection());
3298
3299  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3300  Asm->OutStreamer.AddComment("Length of Common Information Entry");
3301  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3302                           Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3303
3304  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3305  Asm->OutStreamer.AddComment("CIE Identifier Tag");
3306  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3307  Asm->OutStreamer.AddComment("CIE Version");
3308  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3309  Asm->OutStreamer.AddComment("CIE Augmentation");
3310  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3311  Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3312  Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3313  Asm->OutStreamer.AddComment("CIE RA Column");
3314  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3315  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3316
3317  std::vector<MachineMove> Moves;
3318  RI->getInitialFrameState(Moves);
3319
3320  Asm->EmitFrameMoves(Moves, 0, false);
3321
3322  Asm->EmitAlignment(2);
3323  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3324}
3325
3326/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3327/// section.
3328void DwarfDebug::
3329emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3330  if (!Asm->MAI->doesDwarfRequireFrameSection())
3331    return;
3332
3333  // Start the dwarf frame section.
3334  Asm->OutStreamer.SwitchSection(
3335                              Asm->getObjFileLowering().getDwarfFrameSection());
3336
3337  Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3338  MCSymbol *DebugFrameBegin =
3339    Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3340  MCSymbol *DebugFrameEnd =
3341    Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3342  Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3343
3344  Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3345
3346  Asm->OutStreamer.AddComment("FDE CIE offset");
3347  Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3348                         DwarfFrameSectionSym);
3349
3350  Asm->OutStreamer.AddComment("FDE initial location");
3351  MCSymbol *FuncBeginSym =
3352    Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3353  Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3354                                   Asm->getTargetData().getPointerSize(),
3355                                   0/*AddrSpace*/);
3356
3357
3358  Asm->OutStreamer.AddComment("FDE address range");
3359  Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3360                           FuncBeginSym, Asm->getTargetData().getPointerSize());
3361
3362  Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3363
3364  Asm->EmitAlignment(2);
3365  Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3366}
3367
3368/// emitDebugPubNames - Emit visible names into a debug pubnames section.
3369///
3370void DwarfDebug::emitDebugPubNames() {
3371  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3372         E = CUMap.end(); I != E; ++I) {
3373    CompileUnit *TheCU = I->second;
3374    // Start the dwarf pubnames section.
3375    Asm->OutStreamer.SwitchSection(
3376      Asm->getObjFileLowering().getDwarfPubNamesSection());
3377
3378    Asm->OutStreamer.AddComment("Length of Public Names Info");
3379    Asm->EmitLabelDifference(
3380      Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3381      Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3382
3383    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3384                                                  TheCU->getID()));
3385
3386    Asm->OutStreamer.AddComment("DWARF Version");
3387    Asm->EmitInt16(dwarf::DWARF_VERSION);
3388
3389    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3390    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3391                           DwarfInfoSectionSym);
3392
3393    Asm->OutStreamer.AddComment("Compilation Unit Length");
3394    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3395                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3396                             4);
3397
3398    const StringMap<DIE*> &Globals = TheCU->getGlobals();
3399    for (StringMap<DIE*>::const_iterator
3400           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3401      const char *Name = GI->getKeyData();
3402      DIE *Entity = GI->second;
3403
3404      Asm->OutStreamer.AddComment("DIE offset");
3405      Asm->EmitInt32(Entity->getOffset());
3406
3407      if (Asm->isVerbose())
3408        Asm->OutStreamer.AddComment("External Name");
3409      Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3410    }
3411
3412    Asm->OutStreamer.AddComment("End Mark");
3413    Asm->EmitInt32(0);
3414    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3415                                                TheCU->getID()));
3416  }
3417}
3418
3419void DwarfDebug::emitDebugPubTypes() {
3420  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3421         E = CUMap.end(); I != E; ++I) {
3422    CompileUnit *TheCU = I->second;
3423    // Start the dwarf pubnames section.
3424    Asm->OutStreamer.SwitchSection(
3425      Asm->getObjFileLowering().getDwarfPubTypesSection());
3426    Asm->OutStreamer.AddComment("Length of Public Types Info");
3427    Asm->EmitLabelDifference(
3428      Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3429      Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3430
3431    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3432                                                  TheCU->getID()));
3433
3434    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3435    Asm->EmitInt16(dwarf::DWARF_VERSION);
3436
3437    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3438    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3439                           DwarfInfoSectionSym);
3440
3441    Asm->OutStreamer.AddComment("Compilation Unit Length");
3442    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3443                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3444                             4);
3445
3446    const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3447    for (StringMap<DIE*>::const_iterator
3448           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3449      const char *Name = GI->getKeyData();
3450      DIE * Entity = GI->second;
3451
3452      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3453      Asm->EmitInt32(Entity->getOffset());
3454
3455      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3456      Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3457    }
3458
3459    Asm->OutStreamer.AddComment("End Mark");
3460    Asm->EmitInt32(0);
3461    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3462                                                  TheCU->getID()));
3463  }
3464}
3465
3466/// emitDebugStr - Emit visible names into a debug str section.
3467///
3468void DwarfDebug::emitDebugStr() {
3469  // Check to see if it is worth the effort.
3470  if (StringPool.empty()) return;
3471
3472  // Start the dwarf str section.
3473  Asm->OutStreamer.SwitchSection(
3474                                Asm->getObjFileLowering().getDwarfStrSection());
3475
3476  // Get all of the string pool entries and put them in an array by their ID so
3477  // we can sort them.
3478  SmallVector<std::pair<unsigned,
3479      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3480
3481  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3482       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3483    Entries.push_back(std::make_pair(I->second.second, &*I));
3484
3485  array_pod_sort(Entries.begin(), Entries.end());
3486
3487  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3488    // Emit a label for reference from debug information entries.
3489    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3490
3491    // Emit the string itself.
3492    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3493  }
3494}
3495
3496/// emitDebugLoc - Emit visible names into a debug loc section.
3497///
3498void DwarfDebug::emitDebugLoc() {
3499  if (DotDebugLocEntries.empty())
3500    return;
3501
3502  // Start the dwarf loc section.
3503  Asm->OutStreamer.SwitchSection(
3504    Asm->getObjFileLowering().getDwarfLocSection());
3505  unsigned char Size = Asm->getTargetData().getPointerSize();
3506  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3507  unsigned index = 1;
3508  for (SmallVector<DotDebugLocEntry, 4>::iterator I = DotDebugLocEntries.begin(),
3509         E = DotDebugLocEntries.end(); I != E; ++I, ++index) {
3510    DotDebugLocEntry Entry = *I;
3511    if (Entry.isEmpty()) {
3512      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3513      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3514      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3515    } else {
3516      Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3517      Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3518      const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3519      unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3520      if (Reg < 32) {
3521        Asm->OutStreamer.AddComment("Loc expr size");
3522        Asm->EmitInt16(1);
3523        Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3524      } else {
3525        Asm->OutStreamer.AddComment("Loc expr size");
3526        Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg));
3527        Asm->EmitInt8(dwarf::DW_OP_regx);
3528        Asm->EmitULEB128(Reg);
3529      }
3530    }
3531  }
3532}
3533
3534/// EmitDebugARanges - Emit visible names into a debug aranges section.
3535///
3536void DwarfDebug::EmitDebugARanges() {
3537  // Start the dwarf aranges section.
3538  Asm->OutStreamer.SwitchSection(
3539                          Asm->getObjFileLowering().getDwarfARangesSection());
3540}
3541
3542/// emitDebugRanges - Emit visible names into a debug ranges section.
3543///
3544void DwarfDebug::emitDebugRanges() {
3545  // Start the dwarf ranges section.
3546  Asm->OutStreamer.SwitchSection(
3547    Asm->getObjFileLowering().getDwarfRangesSection());
3548  unsigned char Size = Asm->getTargetData().getPointerSize();
3549  for (SmallVector<const MCSymbol *, 8>::iterator
3550         I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3551       I != E; ++I) {
3552    if (*I)
3553      Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3554    else
3555      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3556  }
3557}
3558
3559/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3560///
3561void DwarfDebug::emitDebugMacInfo() {
3562  if (const MCSection *LineInfo =
3563      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3564    // Start the dwarf macinfo section.
3565    Asm->OutStreamer.SwitchSection(LineInfo);
3566  }
3567}
3568
3569/// emitDebugInlineInfo - Emit inline info using following format.
3570/// Section Header:
3571/// 1. length of section
3572/// 2. Dwarf version number
3573/// 3. address size.
3574///
3575/// Entries (one "entry" for each function that was inlined):
3576///
3577/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3578///   otherwise offset into __debug_str for regular function name.
3579/// 2. offset into __debug_str section for regular function name.
3580/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3581/// instances for the function.
3582///
3583/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3584/// inlined instance; the die_offset points to the inlined_subroutine die in the
3585/// __debug_info section, and the low_pc is the starting address for the
3586/// inlining instance.
3587void DwarfDebug::emitDebugInlineInfo() {
3588  if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3589    return;
3590
3591  if (!FirstCU)
3592    return;
3593
3594  Asm->OutStreamer.SwitchSection(
3595                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
3596
3597  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3598  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3599                           Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3600
3601  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3602
3603  Asm->OutStreamer.AddComment("Dwarf Version");
3604  Asm->EmitInt16(dwarf::DWARF_VERSION);
3605  Asm->OutStreamer.AddComment("Address Size (in bytes)");
3606  Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3607
3608  for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3609         E = InlinedSPNodes.end(); I != E; ++I) {
3610
3611    const MDNode *Node = *I;
3612    DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3613      = InlineInfo.find(Node);
3614    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3615    DISubprogram SP(Node);
3616    StringRef LName = SP.getLinkageName();
3617    StringRef Name = SP.getName();
3618
3619    Asm->OutStreamer.AddComment("MIPS linkage name");
3620    if (LName.empty()) {
3621      Asm->OutStreamer.EmitBytes(Name, 0);
3622      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3623    } else
3624      Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3625                             DwarfStrSectionSym);
3626
3627    Asm->OutStreamer.AddComment("Function name");
3628    Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3629    Asm->EmitULEB128(Labels.size(), "Inline count");
3630
3631    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3632           LE = Labels.end(); LI != LE; ++LI) {
3633      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3634      Asm->EmitInt32(LI->second->getOffset());
3635
3636      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3637      Asm->OutStreamer.EmitSymbolValue(LI->first,
3638                                       Asm->getTargetData().getPointerSize(),0);
3639    }
3640  }
3641
3642  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3643}
3644