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