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