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