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