DwarfDebug.cpp revision 94e59a01f9c8930c75906988d293b93d01d1c59b
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<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  const MDNode *TheScope = 0;
2687
2688  DISubprogram SP = getDISubprogram(Scope);
2689  unsigned Line, Col;
2690  if (SP.Verify()) {
2691    Line = SP.getLineNumber();
2692    Col = 0;
2693    TheScope = SP;
2694  } else {
2695    Line = FDL.getLine();
2696    Col = FDL.getCol();
2697    TheScope = Scope;
2698  }
2699
2700  recordSourceLine(Line, Col, TheScope);
2701
2702  /// ProcessedArgs - Collection of arguments already processed.
2703  SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2704
2705  DebugLoc PrevLoc;
2706  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2707       I != E; ++I)
2708    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2709         II != IE; ++II) {
2710      const MachineInstr *MI = II;
2711      DebugLoc DL = MI->getDebugLoc();
2712      if (MI->isDebugValue()) {
2713        assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2714        DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2715        if (!DV.Verify()) continue;
2716        // If DBG_VALUE is for a local variable then it needs a label.
2717        if (DV.getTag() != dwarf::DW_TAG_arg_variable
2718            && isDbgValueInUndefinedReg(MI) == false)
2719          InsnNeedsLabel.insert(MI);
2720        // DBG_VALUE for inlined functions argument needs a label.
2721        else if (!DISubprogram(getDISubprogram(DV.getContext())).
2722                 describes(MF->getFunction()))
2723          InsnNeedsLabel.insert(MI);
2724        // DBG_VALUE indicating argument location change needs a label.
2725        else if (isDbgValueInUndefinedReg(MI) == false && !ProcessedArgs.insert(DV))
2726          InsnNeedsLabel.insert(MI);
2727      } else {
2728        // If location is unknown then instruction needs a location only if
2729        // UnknownLocations flag is set.
2730        if (DL.isUnknown()) {
2731          if (UnknownLocations && !PrevLoc.isUnknown())
2732            InsnNeedsLabel.insert(MI);
2733        } else if (DL != PrevLoc)
2734          // Otherwise, instruction needs a location only if it is new location.
2735          InsnNeedsLabel.insert(MI);
2736      }
2737
2738      if (!DL.isUnknown() || UnknownLocations)
2739        PrevLoc = DL;
2740    }
2741
2742  PrevLabel = FunctionBeginSym;
2743}
2744
2745/// endFunction - Gather and emit post-function debug information.
2746///
2747void DwarfDebug::endFunction(const MachineFunction *MF) {
2748  if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2749
2750  if (CurrentFnDbgScope) {
2751
2752    // Define end label for subprogram.
2753    FunctionEndSym = Asm->GetTempSymbol("func_end",
2754                                        Asm->getFunctionNumber());
2755    // Assumes in correct section after the entry point.
2756    Asm->OutStreamer.EmitLabel(FunctionEndSym);
2757
2758    SmallPtrSet<const MDNode *, 16> ProcessedVars;
2759    collectVariableInfo(MF, ProcessedVars);
2760
2761    // Get function line info.
2762    if (!Lines.empty()) {
2763      // Get section line info.
2764      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2765      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2766      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2767      // Append the function info to section info.
2768      SectionLineInfos.insert(SectionLineInfos.end(),
2769                              Lines.begin(), Lines.end());
2770    }
2771
2772    // Construct abstract scopes.
2773    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2774           AE = AbstractScopesList.end(); AI != AE; ++AI) {
2775      DISubprogram SP((*AI)->getScopeNode());
2776      if (SP.Verify()) {
2777        // Collect info for variables that were optimized out.
2778        StringRef FName = SP.getLinkageName();
2779        if (FName.empty())
2780          FName = SP.getName();
2781        const Module *M = MF->getFunction()->getParent();
2782        if (NamedMDNode *NMD =
2783            M->getNamedMetadata(Twine("llvm.dbg.lv.",
2784                                      getRealLinkageName(FName)))) {
2785          for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2786          DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2787          if (!DV || !ProcessedVars.insert(DV))
2788            continue;
2789          DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2790          if (Scope)
2791            Scope->addVariable(new DbgVariable(DV));
2792          }
2793        }
2794      }
2795      if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2796        constructScopeDIE(*AI);
2797    }
2798
2799    DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2800
2801    if (!DisableFramePointerElim(*MF))
2802      addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2803              dwarf::DW_FORM_flag, 1);
2804
2805
2806    DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2807                                                 MMI->getFrameMoves()));
2808  }
2809
2810  // Clear debug info
2811  CurrentFnDbgScope = NULL;
2812  InsnNeedsLabel.clear();
2813  DbgVariableToFrameIndexMap.clear();
2814  VarToAbstractVarMap.clear();
2815  DbgVariableToDbgInstMap.clear();
2816  DbgVariableLabelsMap.clear();
2817  DeleteContainerSeconds(DbgScopeMap);
2818  InsnsEndScopeSet.clear();
2819  ConcreteScopes.clear();
2820  DeleteContainerSeconds(AbstractScopes);
2821  AbstractScopesList.clear();
2822  AbstractVariables.clear();
2823  LabelsBeforeInsn.clear();
2824  LabelsAfterInsn.clear();
2825  Lines.clear();
2826  PrevLabel = NULL;
2827}
2828
2829/// recordVariableFrameIndex - Record a variable's index.
2830void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2831  assert (V && "Invalid DbgVariable!");
2832  DbgVariableToFrameIndexMap[V] = Index;
2833}
2834
2835/// findVariableFrameIndex - Return true if frame index for the variable
2836/// is found. Update FI to hold value of the index.
2837bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2838  assert (V && "Invalid DbgVariable!");
2839  DenseMap<const DbgVariable *, int>::iterator I =
2840    DbgVariableToFrameIndexMap.find(V);
2841  if (I == DbgVariableToFrameIndexMap.end())
2842    return false;
2843  *FI = I->second;
2844  return true;
2845}
2846
2847/// findVariableLabel - Find MCSymbol for the variable.
2848const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2849  DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2850    = DbgVariableLabelsMap.find(V);
2851  if (I == DbgVariableLabelsMap.end())
2852    return NULL;
2853  else return I->second;
2854}
2855
2856/// findDbgScope - Find DbgScope for the debug loc attached with an
2857/// instruction.
2858DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2859  DbgScope *Scope = NULL;
2860  LLVMContext &Ctx =
2861    MInsn->getParent()->getParent()->getFunction()->getContext();
2862  DebugLoc DL = MInsn->getDebugLoc();
2863
2864  if (DL.isUnknown())
2865    return Scope;
2866
2867  if (const MDNode *IA = DL.getInlinedAt(Ctx))
2868    Scope = ConcreteScopes.lookup(IA);
2869  if (Scope == 0)
2870    Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2871
2872  return Scope;
2873}
2874
2875
2876/// recordSourceLine - Register a source line with debug info. Returns the
2877/// unique label that was emitted and which provides correspondence to
2878/// the source line list.
2879MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2880                                       const MDNode *S) {
2881  StringRef Dir;
2882  StringRef Fn;
2883
2884  unsigned Src = 1;
2885  if (S) {
2886    DIDescriptor Scope(S);
2887
2888    if (Scope.isCompileUnit()) {
2889      DICompileUnit CU(S);
2890      Dir = CU.getDirectory();
2891      Fn = CU.getFilename();
2892    } else if (Scope.isSubprogram()) {
2893      DISubprogram SP(S);
2894      Dir = SP.getDirectory();
2895      Fn = SP.getFilename();
2896    } else if (Scope.isLexicalBlock()) {
2897      DILexicalBlock DB(S);
2898      Dir = DB.getDirectory();
2899      Fn = DB.getFilename();
2900    } else
2901      assert(0 && "Unexpected scope info");
2902
2903    Src = GetOrCreateSourceID(Dir, Fn);
2904  }
2905
2906  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2907  Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2908
2909  Asm->OutStreamer.EmitLabel(Label);
2910  return Label;
2911}
2912
2913//===----------------------------------------------------------------------===//
2914// Emit Methods
2915//===----------------------------------------------------------------------===//
2916
2917/// computeSizeAndOffset - Compute the size and offset of a DIE.
2918///
2919unsigned
2920DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2921  // Get the children.
2922  const std::vector<DIE *> &Children = Die->getChildren();
2923
2924  // If not last sibling and has children then add sibling offset attribute.
2925  if (!Last && !Children.empty())
2926    Die->addSiblingOffset(DIEValueAllocator);
2927
2928  // Record the abbreviation.
2929  assignAbbrevNumber(Die->getAbbrev());
2930
2931  // Get the abbreviation for this DIE.
2932  unsigned AbbrevNumber = Die->getAbbrevNumber();
2933  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2934
2935  // Set DIE offset
2936  Die->setOffset(Offset);
2937
2938  // Start the size with the size of abbreviation code.
2939  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2940
2941  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2942  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2943
2944  // Size the DIE attribute values.
2945  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2946    // Size attribute value.
2947    Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2948
2949  // Size the DIE children if any.
2950  if (!Children.empty()) {
2951    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2952           "Children flag not set");
2953
2954    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2955      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2956
2957    // End of children marker.
2958    Offset += sizeof(int8_t);
2959  }
2960
2961  Die->setSize(Offset - Die->getOffset());
2962  return Offset;
2963}
2964
2965/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2966///
2967void DwarfDebug::computeSizeAndOffsets() {
2968  unsigned PrevOffset = 0;
2969  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2970         E = CUMap.end(); I != E; ++I) {
2971    // Compute size of compile unit header.
2972    static unsigned Offset = PrevOffset +
2973      sizeof(int32_t) + // Length of Compilation Unit Info
2974      sizeof(int16_t) + // DWARF version number
2975      sizeof(int32_t) + // Offset Into Abbrev. Section
2976      sizeof(int8_t);   // Pointer Size (in bytes)
2977    computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2978    PrevOffset = Offset;
2979  }
2980}
2981
2982/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2983/// temporary label to it if SymbolStem is specified.
2984static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2985                                const char *SymbolStem = 0) {
2986  Asm->OutStreamer.SwitchSection(Section);
2987  if (!SymbolStem) return 0;
2988
2989  MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2990  Asm->OutStreamer.EmitLabel(TmpSym);
2991  return TmpSym;
2992}
2993
2994/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2995/// the start of each one.
2996void DwarfDebug::EmitSectionLabels() {
2997  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2998
2999  // Dwarf sections base addresses.
3000  if (Asm->MAI->doesDwarfRequireFrameSection()) {
3001    DwarfFrameSectionSym =
3002      EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3003   }
3004
3005  DwarfInfoSectionSym =
3006    EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3007  DwarfAbbrevSectionSym =
3008    EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3009  EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3010
3011  if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3012    EmitSectionSym(Asm, MacroInfo);
3013
3014  DwarfDebugLineSectionSym =
3015    EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3016  EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3017  EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3018  EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3019  DwarfStrSectionSym =
3020    EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3021  DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3022                                             "debug_range");
3023
3024  DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3025                                           "section_debug_loc");
3026
3027  TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3028  EmitSectionSym(Asm, TLOF.getDataSection());
3029}
3030
3031/// emitDIE - Recusively Emits a debug information entry.
3032///
3033void DwarfDebug::emitDIE(DIE *Die) {
3034  // Get the abbreviation for this DIE.
3035  unsigned AbbrevNumber = Die->getAbbrevNumber();
3036  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3037
3038  // Emit the code (index) for the abbreviation.
3039  if (Asm->isVerbose())
3040    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3041                                Twine::utohexstr(Die->getOffset()) + ":0x" +
3042                                Twine::utohexstr(Die->getSize()) + " " +
3043                                dwarf::TagString(Abbrev->getTag()));
3044  Asm->EmitULEB128(AbbrevNumber);
3045
3046  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3047  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3048
3049  // Emit the DIE attribute values.
3050  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3051    unsigned Attr = AbbrevData[i].getAttribute();
3052    unsigned Form = AbbrevData[i].getForm();
3053    assert(Form && "Too many attributes for DIE (check abbreviation)");
3054
3055    if (Asm->isVerbose())
3056      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3057
3058    switch (Attr) {
3059    case dwarf::DW_AT_sibling:
3060      Asm->EmitInt32(Die->getSiblingOffset());
3061      break;
3062    case dwarf::DW_AT_abstract_origin: {
3063      DIEEntry *E = cast<DIEEntry>(Values[i]);
3064      DIE *Origin = E->getEntry();
3065      unsigned Addr = Origin->getOffset();
3066      Asm->EmitInt32(Addr);
3067      break;
3068    }
3069    case dwarf::DW_AT_ranges: {
3070      // DW_AT_range Value encodes offset in debug_range section.
3071      DIEInteger *V = cast<DIEInteger>(Values[i]);
3072      Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3073                                     V->getValue(),
3074                                     DwarfDebugRangeSectionSym,
3075                                     4);
3076      break;
3077    }
3078    case dwarf::DW_AT_stmt_list: {
3079      Asm->EmitLabelDifference(CurrentLineSectionSym,
3080                               DwarfDebugLineSectionSym, 4);
3081      break;
3082    }
3083    case dwarf::DW_AT_location: {
3084      if (UseDotDebugLocEntry.count(Die) != 0) {
3085        DIELabel *L = cast<DIELabel>(Values[i]);
3086        Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3087      } else
3088        Values[i]->EmitValue(Asm, Form);
3089      break;
3090    }
3091    default:
3092      // Emit an attribute using the defined form.
3093      Values[i]->EmitValue(Asm, Form);
3094      break;
3095    }
3096  }
3097
3098  // Emit the DIE children if any.
3099  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3100    const std::vector<DIE *> &Children = Die->getChildren();
3101
3102    for (unsigned j = 0, M = Children.size(); j < M; ++j)
3103      emitDIE(Children[j]);
3104
3105    if (Asm->isVerbose())
3106      Asm->OutStreamer.AddComment("End Of Children Mark");
3107    Asm->EmitInt8(0);
3108  }
3109}
3110
3111/// emitDebugInfo - Emit the debug info section.
3112///
3113void DwarfDebug::emitDebugInfo() {
3114  // Start debug info section.
3115  Asm->OutStreamer.SwitchSection(
3116                            Asm->getObjFileLowering().getDwarfInfoSection());
3117  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3118         E = CUMap.end(); I != E; ++I) {
3119    CompileUnit *TheCU = I->second;
3120    DIE *Die = TheCU->getCUDie();
3121
3122    // Emit the compile units header.
3123    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3124                                                  TheCU->getID()));
3125
3126    // Emit size of content not including length itself
3127    unsigned ContentSize = Die->getSize() +
3128      sizeof(int16_t) + // DWARF version number
3129      sizeof(int32_t) + // Offset Into Abbrev. Section
3130      sizeof(int8_t) +  // Pointer Size (in bytes)
3131      sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3132
3133    Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3134    Asm->EmitInt32(ContentSize);
3135    Asm->OutStreamer.AddComment("DWARF version number");
3136    Asm->EmitInt16(dwarf::DWARF_VERSION);
3137    Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3138    Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3139                           DwarfAbbrevSectionSym);
3140    Asm->OutStreamer.AddComment("Address Size (in bytes)");
3141    Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3142
3143    emitDIE(Die);
3144    // FIXME - extra padding for gdb bug.
3145    Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3146    Asm->EmitInt8(0);
3147    Asm->EmitInt8(0);
3148    Asm->EmitInt8(0);
3149    Asm->EmitInt8(0);
3150    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3151  }
3152}
3153
3154/// emitAbbreviations - Emit the abbreviation section.
3155///
3156void DwarfDebug::emitAbbreviations() const {
3157  // Check to see if it is worth the effort.
3158  if (!Abbreviations.empty()) {
3159    // Start the debug abbrev section.
3160    Asm->OutStreamer.SwitchSection(
3161                            Asm->getObjFileLowering().getDwarfAbbrevSection());
3162
3163    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3164
3165    // For each abbrevation.
3166    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3167      // Get abbreviation data
3168      const DIEAbbrev *Abbrev = Abbreviations[i];
3169
3170      // Emit the abbrevations code (base 1 index.)
3171      Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3172
3173      // Emit the abbreviations data.
3174      Abbrev->Emit(Asm);
3175    }
3176
3177    // Mark end of abbreviations.
3178    Asm->EmitULEB128(0, "EOM(3)");
3179
3180    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3181  }
3182}
3183
3184/// emitEndOfLineMatrix - Emit the last address of the section and the end of
3185/// the line matrix.
3186///
3187void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3188  // Define last address of section.
3189  Asm->OutStreamer.AddComment("Extended Op");
3190  Asm->EmitInt8(0);
3191
3192  Asm->OutStreamer.AddComment("Op size");
3193  Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3194  Asm->OutStreamer.AddComment("DW_LNE_set_address");
3195  Asm->EmitInt8(dwarf::DW_LNE_set_address);
3196
3197  Asm->OutStreamer.AddComment("Section end label");
3198
3199  Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3200                                   Asm->getTargetData().getPointerSize(),
3201                                   0/*AddrSpace*/);
3202
3203  // Mark end of matrix.
3204  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3205  Asm->EmitInt8(0);
3206  Asm->EmitInt8(1);
3207  Asm->EmitInt8(1);
3208}
3209
3210/// emitDebugLines - Emit source line information.
3211///
3212void DwarfDebug::emitDebugLines() {
3213  // If the target is using .loc/.file, the assembler will be emitting the
3214  // .debug_line table automatically.
3215  if (Asm->MAI->hasDotLocAndDotFile())
3216    return;
3217
3218  // Minimum line delta, thus ranging from -10..(255-10).
3219  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3220  // Maximum line delta, thus ranging from -10..(255-10).
3221  const int MaxLineDelta = 255 + MinLineDelta;
3222
3223  // Start the dwarf line section.
3224  Asm->OutStreamer.SwitchSection(
3225                            Asm->getObjFileLowering().getDwarfLineSection());
3226
3227  // Construct the section header.
3228  CurrentLineSectionSym = Asm->GetTempSymbol("section_line_begin");
3229  Asm->OutStreamer.EmitLabel(CurrentLineSectionSym);
3230  Asm->OutStreamer.AddComment("Length of Source Line Info");
3231  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3232                           Asm->GetTempSymbol("line_begin"), 4);
3233  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3234
3235  Asm->OutStreamer.AddComment("DWARF version number");
3236  Asm->EmitInt16(dwarf::DWARF_VERSION);
3237
3238  Asm->OutStreamer.AddComment("Prolog Length");
3239  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3240                           Asm->GetTempSymbol("line_prolog_begin"), 4);
3241  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3242
3243  Asm->OutStreamer.AddComment("Minimum Instruction Length");
3244  Asm->EmitInt8(1);
3245  Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3246  Asm->EmitInt8(1);
3247  Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3248  Asm->EmitInt8(MinLineDelta);
3249  Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3250  Asm->EmitInt8(MaxLineDelta);
3251  Asm->OutStreamer.AddComment("Special Opcode Base");
3252  Asm->EmitInt8(-MinLineDelta);
3253
3254  // Line number standard opcode encodings argument count
3255  Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3256  Asm->EmitInt8(0);
3257  Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3258  Asm->EmitInt8(1);
3259  Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3260  Asm->EmitInt8(1);
3261  Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3262  Asm->EmitInt8(1);
3263  Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3264  Asm->EmitInt8(1);
3265  Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3266  Asm->EmitInt8(0);
3267  Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3268  Asm->EmitInt8(0);
3269  Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3270  Asm->EmitInt8(0);
3271  Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3272  Asm->EmitInt8(1);
3273
3274  // Emit directories.
3275  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3276    const std::string &Dir = getSourceDirectoryName(DI);
3277    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3278    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3279  }
3280
3281  Asm->OutStreamer.AddComment("End of directories");
3282  Asm->EmitInt8(0);
3283
3284  // Emit files.
3285  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3286    // Remember source id starts at 1.
3287    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3288    const std::string &FN = getSourceFileName(Id.second);
3289    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3290    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3291
3292    Asm->EmitULEB128(Id.first, "Directory #");
3293    Asm->EmitULEB128(0, "Mod date");
3294    Asm->EmitULEB128(0, "File size");
3295  }
3296
3297  Asm->OutStreamer.AddComment("End of files");
3298  Asm->EmitInt8(0);
3299
3300  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3301
3302  // A sequence for each text section.
3303  unsigned SecSrcLinesSize = SectionSourceLines.size();
3304
3305  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3306    // Isolate current sections line info.
3307    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3308
3309    // Dwarf assumes we start with first line of first source file.
3310    unsigned Source = 1;
3311    unsigned Line = 1;
3312
3313    // Construct rows of the address, source, line, column matrix.
3314    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3315      const SrcLineInfo &LineInfo = LineInfos[i];
3316      MCSymbol *Label = LineInfo.getLabel();
3317      if (!Label->isDefined()) continue; // Not emitted, in dead code.
3318
3319      if (Asm->isVerbose()) {
3320        std::pair<unsigned, unsigned> SrcID =
3321          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3322        Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3323                                    "/" +
3324                                    Twine(getSourceFileName(SrcID.second)) +
3325                                    ":" + Twine(LineInfo.getLine()));
3326      }
3327
3328      // Define the line address.
3329      Asm->OutStreamer.AddComment("Extended Op");
3330      Asm->EmitInt8(0);
3331      Asm->OutStreamer.AddComment("Op size");
3332      Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3333
3334      Asm->OutStreamer.AddComment("DW_LNE_set_address");
3335      Asm->EmitInt8(dwarf::DW_LNE_set_address);
3336
3337      Asm->OutStreamer.AddComment("Location label");
3338      Asm->OutStreamer.EmitSymbolValue(Label,
3339                                       Asm->getTargetData().getPointerSize(),
3340                                       0/*AddrSpace*/);
3341
3342      // If change of source, then switch to the new source.
3343      if (Source != LineInfo.getSourceID()) {
3344        Source = LineInfo.getSourceID();
3345        Asm->OutStreamer.AddComment("DW_LNS_set_file");
3346        Asm->EmitInt8(dwarf::DW_LNS_set_file);
3347        Asm->EmitULEB128(Source, "New Source");
3348      }
3349
3350      // If change of line.
3351      if (Line != LineInfo.getLine()) {
3352        // Determine offset.
3353        int Offset = LineInfo.getLine() - Line;
3354        int Delta = Offset - MinLineDelta;
3355
3356        // Update line.
3357        Line = LineInfo.getLine();
3358
3359        // If delta is small enough and in range...
3360        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3361          // ... then use fast opcode.
3362          Asm->OutStreamer.AddComment("Line Delta");
3363          Asm->EmitInt8(Delta - MinLineDelta);
3364        } else {
3365          // ... otherwise use long hand.
3366          Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3367          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3368          Asm->EmitSLEB128(Offset, "Line Offset");
3369          Asm->OutStreamer.AddComment("DW_LNS_copy");
3370          Asm->EmitInt8(dwarf::DW_LNS_copy);
3371        }
3372      } else {
3373        // Copy the previous row (different address or source)
3374        Asm->OutStreamer.AddComment("DW_LNS_copy");
3375        Asm->EmitInt8(dwarf::DW_LNS_copy);
3376      }
3377    }
3378
3379    emitEndOfLineMatrix(j + 1);
3380  }
3381
3382  if (SecSrcLinesSize == 0)
3383    // Because we're emitting a debug_line section, we still need a line
3384    // table. The linker and friends expect it to exist. If there's nothing to
3385    // put into it, emit an empty table.
3386    emitEndOfLineMatrix(1);
3387
3388  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3389}
3390
3391/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3392///
3393void DwarfDebug::emitCommonDebugFrame() {
3394  if (!Asm->MAI->doesDwarfRequireFrameSection())
3395    return;
3396
3397  int stackGrowth = Asm->getTargetData().getPointerSize();
3398  if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3399      TargetFrameInfo::StackGrowsDown)
3400    stackGrowth *= -1;
3401
3402  // Start the dwarf frame section.
3403  Asm->OutStreamer.SwitchSection(
3404                              Asm->getObjFileLowering().getDwarfFrameSection());
3405
3406  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3407  Asm->OutStreamer.AddComment("Length of Common Information Entry");
3408  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3409                           Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3410
3411  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3412  Asm->OutStreamer.AddComment("CIE Identifier Tag");
3413  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3414  Asm->OutStreamer.AddComment("CIE Version");
3415  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3416  Asm->OutStreamer.AddComment("CIE Augmentation");
3417  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3418  Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3419  Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3420  Asm->OutStreamer.AddComment("CIE RA Column");
3421  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3422  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3423
3424  std::vector<MachineMove> Moves;
3425  RI->getInitialFrameState(Moves);
3426
3427  Asm->EmitFrameMoves(Moves, 0, false);
3428
3429  Asm->EmitAlignment(2);
3430  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3431}
3432
3433/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3434/// section.
3435void DwarfDebug::
3436emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3437  if (!Asm->MAI->doesDwarfRequireFrameSection())
3438    return;
3439
3440  // Start the dwarf frame section.
3441  Asm->OutStreamer.SwitchSection(
3442                              Asm->getObjFileLowering().getDwarfFrameSection());
3443
3444  Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3445  MCSymbol *DebugFrameBegin =
3446    Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3447  MCSymbol *DebugFrameEnd =
3448    Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3449  Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3450
3451  Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3452
3453  Asm->OutStreamer.AddComment("FDE CIE offset");
3454  Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3455                         DwarfFrameSectionSym);
3456
3457  Asm->OutStreamer.AddComment("FDE initial location");
3458  MCSymbol *FuncBeginSym =
3459    Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3460  Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3461                                   Asm->getTargetData().getPointerSize(),
3462                                   0/*AddrSpace*/);
3463
3464
3465  Asm->OutStreamer.AddComment("FDE address range");
3466  Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3467                           FuncBeginSym, Asm->getTargetData().getPointerSize());
3468
3469  Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3470
3471  Asm->EmitAlignment(2);
3472  Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3473}
3474
3475/// emitDebugPubNames - Emit visible names into a debug pubnames section.
3476///
3477void DwarfDebug::emitDebugPubNames() {
3478  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3479         E = CUMap.end(); I != E; ++I) {
3480    CompileUnit *TheCU = I->second;
3481    // Start the dwarf pubnames section.
3482    Asm->OutStreamer.SwitchSection(
3483      Asm->getObjFileLowering().getDwarfPubNamesSection());
3484
3485    Asm->OutStreamer.AddComment("Length of Public Names Info");
3486    Asm->EmitLabelDifference(
3487      Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3488      Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3489
3490    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3491                                                  TheCU->getID()));
3492
3493    Asm->OutStreamer.AddComment("DWARF Version");
3494    Asm->EmitInt16(dwarf::DWARF_VERSION);
3495
3496    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3497    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3498                           DwarfInfoSectionSym);
3499
3500    Asm->OutStreamer.AddComment("Compilation Unit Length");
3501    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3502                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3503                             4);
3504
3505    const StringMap<DIE*> &Globals = TheCU->getGlobals();
3506    for (StringMap<DIE*>::const_iterator
3507           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3508      const char *Name = GI->getKeyData();
3509      DIE *Entity = GI->second;
3510
3511      Asm->OutStreamer.AddComment("DIE offset");
3512      Asm->EmitInt32(Entity->getOffset());
3513
3514      if (Asm->isVerbose())
3515        Asm->OutStreamer.AddComment("External Name");
3516      Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3517    }
3518
3519    Asm->OutStreamer.AddComment("End Mark");
3520    Asm->EmitInt32(0);
3521    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3522                                                TheCU->getID()));
3523  }
3524}
3525
3526void DwarfDebug::emitDebugPubTypes() {
3527  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3528         E = CUMap.end(); I != E; ++I) {
3529    CompileUnit *TheCU = I->second;
3530    // Start the dwarf pubnames section.
3531    Asm->OutStreamer.SwitchSection(
3532      Asm->getObjFileLowering().getDwarfPubTypesSection());
3533    Asm->OutStreamer.AddComment("Length of Public Types Info");
3534    Asm->EmitLabelDifference(
3535      Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3536      Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3537
3538    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3539                                                  TheCU->getID()));
3540
3541    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3542    Asm->EmitInt16(dwarf::DWARF_VERSION);
3543
3544    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3545    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3546                           DwarfInfoSectionSym);
3547
3548    Asm->OutStreamer.AddComment("Compilation Unit Length");
3549    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3550                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3551                             4);
3552
3553    const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3554    for (StringMap<DIE*>::const_iterator
3555           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3556      const char *Name = GI->getKeyData();
3557      DIE * Entity = GI->second;
3558
3559      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3560      Asm->EmitInt32(Entity->getOffset());
3561
3562      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3563      Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3564    }
3565
3566    Asm->OutStreamer.AddComment("End Mark");
3567    Asm->EmitInt32(0);
3568    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3569                                                  TheCU->getID()));
3570  }
3571}
3572
3573/// emitDebugStr - Emit visible names into a debug str section.
3574///
3575void DwarfDebug::emitDebugStr() {
3576  // Check to see if it is worth the effort.
3577  if (StringPool.empty()) return;
3578
3579  // Start the dwarf str section.
3580  Asm->OutStreamer.SwitchSection(
3581                                Asm->getObjFileLowering().getDwarfStrSection());
3582
3583  // Get all of the string pool entries and put them in an array by their ID so
3584  // we can sort them.
3585  SmallVector<std::pair<unsigned,
3586      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3587
3588  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3589       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3590    Entries.push_back(std::make_pair(I->second.second, &*I));
3591
3592  array_pod_sort(Entries.begin(), Entries.end());
3593
3594  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3595    // Emit a label for reference from debug information entries.
3596    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3597
3598    // Emit the string itself.
3599    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3600  }
3601}
3602
3603/// emitDebugLoc - Emit visible names into a debug loc section.
3604///
3605void DwarfDebug::emitDebugLoc() {
3606  if (DotDebugLocEntries.empty())
3607    return;
3608
3609  // Start the dwarf loc section.
3610  Asm->OutStreamer.SwitchSection(
3611    Asm->getObjFileLowering().getDwarfLocSection());
3612  unsigned char Size = Asm->getTargetData().getPointerSize();
3613  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3614  unsigned index = 1;
3615  for (SmallVector<DotDebugLocEntry, 4>::iterator
3616         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3617       I != E; ++I, ++index) {
3618    DotDebugLocEntry Entry = *I;
3619    if (Entry.isEmpty()) {
3620      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3621      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3622      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3623    } else {
3624      Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3625      Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3626      const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3627      unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3628      if (Reg < 32) {
3629        Asm->OutStreamer.AddComment("Loc expr size");
3630        Asm->EmitInt16(1);
3631        Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3632      } else {
3633        Asm->OutStreamer.AddComment("Loc expr size");
3634        Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg));
3635        Asm->EmitInt8(dwarf::DW_OP_regx);
3636        Asm->EmitULEB128(Reg);
3637      }
3638    }
3639  }
3640}
3641
3642/// EmitDebugARanges - Emit visible names into a debug aranges section.
3643///
3644void DwarfDebug::EmitDebugARanges() {
3645  // Start the dwarf aranges section.
3646  Asm->OutStreamer.SwitchSection(
3647                          Asm->getObjFileLowering().getDwarfARangesSection());
3648}
3649
3650/// emitDebugRanges - Emit visible names into a debug ranges section.
3651///
3652void DwarfDebug::emitDebugRanges() {
3653  // Start the dwarf ranges section.
3654  Asm->OutStreamer.SwitchSection(
3655    Asm->getObjFileLowering().getDwarfRangesSection());
3656  unsigned char Size = Asm->getTargetData().getPointerSize();
3657  for (SmallVector<const MCSymbol *, 8>::iterator
3658         I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3659       I != E; ++I) {
3660    if (*I)
3661      Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3662    else
3663      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3664  }
3665}
3666
3667/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3668///
3669void DwarfDebug::emitDebugMacInfo() {
3670  if (const MCSection *LineInfo =
3671      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3672    // Start the dwarf macinfo section.
3673    Asm->OutStreamer.SwitchSection(LineInfo);
3674  }
3675}
3676
3677/// emitDebugInlineInfo - Emit inline info using following format.
3678/// Section Header:
3679/// 1. length of section
3680/// 2. Dwarf version number
3681/// 3. address size.
3682///
3683/// Entries (one "entry" for each function that was inlined):
3684///
3685/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3686///   otherwise offset into __debug_str for regular function name.
3687/// 2. offset into __debug_str section for regular function name.
3688/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3689/// instances for the function.
3690///
3691/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3692/// inlined instance; the die_offset points to the inlined_subroutine die in the
3693/// __debug_info section, and the low_pc is the starting address for the
3694/// inlining instance.
3695void DwarfDebug::emitDebugInlineInfo() {
3696  if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3697    return;
3698
3699  if (!FirstCU)
3700    return;
3701
3702  Asm->OutStreamer.SwitchSection(
3703                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
3704
3705  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3706  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3707                           Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3708
3709  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3710
3711  Asm->OutStreamer.AddComment("Dwarf Version");
3712  Asm->EmitInt16(dwarf::DWARF_VERSION);
3713  Asm->OutStreamer.AddComment("Address Size (in bytes)");
3714  Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3715
3716  for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3717         E = InlinedSPNodes.end(); I != E; ++I) {
3718
3719    const MDNode *Node = *I;
3720    DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3721      = InlineInfo.find(Node);
3722    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3723    DISubprogram SP(Node);
3724    StringRef LName = SP.getLinkageName();
3725    StringRef Name = SP.getName();
3726
3727    Asm->OutStreamer.AddComment("MIPS linkage name");
3728    if (LName.empty()) {
3729      Asm->OutStreamer.EmitBytes(Name, 0);
3730      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3731    } else
3732      Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3733                             DwarfStrSectionSym);
3734
3735    Asm->OutStreamer.AddComment("Function name");
3736    Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3737    Asm->EmitULEB128(Labels.size(), "Inline count");
3738
3739    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3740           LE = Labels.end(); LI != LE; ++LI) {
3741      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3742      Asm->EmitInt32(LI->second->getOffset());
3743
3744      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3745      Asm->OutStreamer.EmitSymbolValue(LI->first,
3746                                       Asm->getTargetData().getPointerSize(),0);
3747    }
3748  }
3749
3750  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3751}
3752