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