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