DwarfDebug.cpp revision 6d56b9fabcfb1fc874a6122cf41d876c4673e9d4
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 (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
870    ContextDIE->addChild(Die);
871  else
872    getCompileUnit(Context)->addDie(Die);
873}
874
875/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
876/// given DIType.
877DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
878  CompileUnit *TypeCU = getCompileUnit(Ty);
879  DIE *TyDIE = TypeCU->getDIE(Ty);
880  if (TyDIE)
881    return TyDIE;
882
883  // Create new type.
884  TyDIE = new DIE(dwarf::DW_TAG_base_type);
885  TypeCU->insertDIE(Ty, TyDIE);
886  if (Ty.isBasicType())
887    constructTypeDIE(*TyDIE, DIBasicType(Ty));
888  else if (Ty.isCompositeType())
889    constructTypeDIE(*TyDIE, DICompositeType(Ty));
890  else {
891    assert(Ty.isDerivedType() && "Unknown kind of DIType");
892    constructTypeDIE(*TyDIE, DIDerivedType(Ty));
893  }
894
895  addToContextOwner(TyDIE, Ty.getContext());
896  return TyDIE;
897}
898
899/// addType - Add a new type attribute to the specified entity.
900void DwarfDebug::addType(DIE *Entity, DIType Ty) {
901  if (!Ty.Verify())
902    return;
903
904  // Check for pre-existence.
905  CompileUnit *TypeCU = getCompileUnit(Ty);
906  DIEEntry *Entry = TypeCU->getDIEEntry(Ty);
907  // If it exists then use the existing value.
908  if (Entry) {
909    Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
910    return;
911  }
912
913  // Construct type.
914  DIE *Buffer = getOrCreateTypeDIE(Ty);
915
916  // Set up proxy.
917  Entry = createDIEEntry(Buffer);
918  TypeCU->insertDIEEntry(Ty, Entry);
919
920  Entity->addValue(dwarf::DW_AT_type, dwarf::DW_FORM_ref4, Entry);
921}
922
923/// constructTypeDIE - Construct basic type die from DIBasicType.
924void DwarfDebug::constructTypeDIE(DIE &Buffer, DIBasicType BTy) {
925  // Get core information.
926  StringRef Name = BTy.getName();
927  Buffer.setTag(dwarf::DW_TAG_base_type);
928  addUInt(&Buffer, dwarf::DW_AT_encoding,  dwarf::DW_FORM_data1,
929          BTy.getEncoding());
930
931  // Add name if not anonymous or intermediate type.
932  if (!Name.empty())
933    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
934  uint64_t Size = BTy.getSizeInBits() >> 3;
935  addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
936}
937
938/// constructTypeDIE - Construct derived type die from DIDerivedType.
939void DwarfDebug::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
940  // Get core information.
941  StringRef Name = DTy.getName();
942  uint64_t Size = DTy.getSizeInBits() >> 3;
943  unsigned Tag = DTy.getTag();
944
945  // FIXME - Workaround for templates.
946  if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type;
947
948  Buffer.setTag(Tag);
949
950  // Map to main type, void will not have a type.
951  DIType FromTy = DTy.getTypeDerivedFrom();
952  addType(&Buffer, FromTy);
953
954  // Add name if not anonymous or intermediate type.
955  if (!Name.empty())
956    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
957
958  // Add size if non-zero (derived types might be zero-sized.)
959  if (Size)
960    addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
961
962  // Add source line info if available and TyDesc is not a forward declaration.
963  if (!DTy.isForwardDecl())
964    addSourceLine(&Buffer, &DTy);
965}
966
967/// constructTypeDIE - Construct type DIE from DICompositeType.
968void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
969  // Get core information.
970  StringRef Name = CTy.getName();
971
972  uint64_t Size = CTy.getSizeInBits() >> 3;
973  unsigned Tag = CTy.getTag();
974  Buffer.setTag(Tag);
975
976  switch (Tag) {
977  case dwarf::DW_TAG_vector_type:
978  case dwarf::DW_TAG_array_type:
979    constructArrayTypeDIE(Buffer, &CTy);
980    break;
981  case dwarf::DW_TAG_enumeration_type: {
982    DIArray Elements = CTy.getTypeArray();
983
984    // Add enumerators to enumeration type.
985    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
986      DIE *ElemDie = NULL;
987      DIDescriptor Enum(Elements.getElement(i));
988      if (Enum.isEnumerator()) {
989        ElemDie = constructEnumTypeDIE(DIEnumerator(Enum));
990        Buffer.addChild(ElemDie);
991      }
992    }
993  }
994    break;
995  case dwarf::DW_TAG_subroutine_type: {
996    // Add return type.
997    DIArray Elements = CTy.getTypeArray();
998    DIDescriptor RTy = Elements.getElement(0);
999    addType(&Buffer, DIType(RTy));
1000
1001    // Add prototype flag.
1002    addUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1003
1004    // Add arguments.
1005    for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {
1006      DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1007      DIDescriptor Ty = Elements.getElement(i);
1008      addType(Arg, DIType(Ty));
1009      Buffer.addChild(Arg);
1010    }
1011  }
1012    break;
1013  case dwarf::DW_TAG_structure_type:
1014  case dwarf::DW_TAG_union_type:
1015  case dwarf::DW_TAG_class_type: {
1016    // Add elements to structure type.
1017    DIArray Elements = CTy.getTypeArray();
1018
1019    // A forward struct declared type may not have elements available.
1020    unsigned N = Elements.getNumElements();
1021    if (N == 0)
1022      break;
1023
1024    // Add elements to structure type.
1025    for (unsigned i = 0; i < N; ++i) {
1026      DIDescriptor Element = Elements.getElement(i);
1027      DIE *ElemDie = NULL;
1028      if (Element.isSubprogram())
1029        ElemDie = createSubprogramDIE(DISubprogram(Element));
1030      else if (Element.isVariable()) {
1031        DIVariable DV(Element);
1032        ElemDie = new DIE(dwarf::DW_TAG_variable);
1033        addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1034                  DV.getName());
1035        addType(ElemDie, DV.getType());
1036        addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1037        addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1038        addSourceLine(ElemDie, &DV);
1039      } else if (Element.isDerivedType())
1040        ElemDie = createMemberDIE(DIDerivedType(Element));
1041      else
1042        continue;
1043      Buffer.addChild(ElemDie);
1044    }
1045
1046    if (CTy.isAppleBlockExtension())
1047      addUInt(&Buffer, dwarf::DW_AT_APPLE_block, dwarf::DW_FORM_flag, 1);
1048
1049    unsigned RLang = CTy.getRunTimeLang();
1050    if (RLang)
1051      addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
1052              dwarf::DW_FORM_data1, RLang);
1053
1054    DICompositeType ContainingType = CTy.getContainingType();
1055    if (DIDescriptor(ContainingType).isCompositeType())
1056      addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
1057                  getOrCreateTypeDIE(DIType(ContainingType)));
1058    break;
1059  }
1060  default:
1061    break;
1062  }
1063
1064  // Add name if not anonymous or intermediate type.
1065  if (!Name.empty())
1066    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1067
1068  if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type ||
1069      Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) {
1070    // Add size if non-zero (derived types might be zero-sized.)
1071    if (Size)
1072      addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size);
1073    else {
1074      // Add zero size if it is not a forward declaration.
1075      if (CTy.isForwardDecl())
1076        addUInt(&Buffer, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1077      else
1078        addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0);
1079    }
1080
1081    // Add source line info if available.
1082    if (!CTy.isForwardDecl())
1083      addSourceLine(&Buffer, &CTy);
1084  }
1085}
1086
1087/// constructSubrangeDIE - Construct subrange DIE from DISubrange.
1088void DwarfDebug::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy){
1089  int64_t L = SR.getLo();
1090  int64_t H = SR.getHi();
1091  DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
1092
1093  addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
1094  if (L)
1095    addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
1096  addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
1097
1098  Buffer.addChild(DW_Subrange);
1099}
1100
1101/// constructArrayTypeDIE - Construct array type DIE from DICompositeType.
1102void DwarfDebug::constructArrayTypeDIE(DIE &Buffer,
1103                                       DICompositeType *CTy) {
1104  Buffer.setTag(dwarf::DW_TAG_array_type);
1105  if (CTy->getTag() == dwarf::DW_TAG_vector_type)
1106    addUInt(&Buffer, dwarf::DW_AT_GNU_vector, dwarf::DW_FORM_flag, 1);
1107
1108  // Emit derived type.
1109  addType(&Buffer, CTy->getTypeDerivedFrom());
1110  DIArray Elements = CTy->getTypeArray();
1111
1112  // Get an anonymous type for index type.
1113  CompileUnit *TheCU = getCompileUnit(*CTy);
1114  DIE *IdxTy = TheCU->getIndexTyDie();
1115  if (!IdxTy) {
1116    // Construct an anonymous type for index type.
1117    IdxTy = new DIE(dwarf::DW_TAG_base_type);
1118    addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t));
1119    addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1,
1120            dwarf::DW_ATE_signed);
1121    TheCU->addDie(IdxTy);
1122    TheCU->setIndexTyDie(IdxTy);
1123  }
1124
1125  // Add subranges to array type.
1126  for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
1127    DIDescriptor Element = Elements.getElement(i);
1128    if (Element.getTag() == dwarf::DW_TAG_subrange_type)
1129      constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy);
1130  }
1131}
1132
1133/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator.
1134DIE *DwarfDebug::constructEnumTypeDIE(DIEnumerator ETy) {
1135  DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);
1136  StringRef Name = ETy.getName();
1137  addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1138  int64_t Value = ETy.getEnumValue();
1139  addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);
1140  return Enumerator;
1141}
1142
1143/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
1144/// printer to not emit usual symbol prefix before the symbol name is used then
1145/// return linkage name after skipping this special LLVM prefix.
1146static StringRef getRealLinkageName(StringRef LinkageName) {
1147  char One = '\1';
1148  if (LinkageName.startswith(StringRef(&One, 1)))
1149    return LinkageName.substr(1);
1150  return LinkageName;
1151}
1152
1153/// createGlobalVariableDIE - Create new DIE using GV.
1154DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
1155  // If the global variable was optmized out then no need to create debug info
1156  // entry.
1157  if (!GV.getGlobal()) return NULL;
1158  if (GV.getDisplayName().empty()) return NULL;
1159
1160  DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
1161  addString(GVDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1162            GV.getDisplayName());
1163
1164  StringRef LinkageName = GV.getLinkageName();
1165  if (!LinkageName.empty())
1166    addString(GVDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1167              getRealLinkageName(LinkageName));
1168
1169  addType(GVDie, GV.getType());
1170  if (!GV.isLocalToUnit())
1171    addUInt(GVDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1172  addSourceLine(GVDie, &GV);
1173
1174  return GVDie;
1175}
1176
1177/// createMemberDIE - Create new member DIE.
1178DIE *DwarfDebug::createMemberDIE(const DIDerivedType &DT) {
1179  DIE *MemberDie = new DIE(DT.getTag());
1180  StringRef Name = DT.getName();
1181  if (!Name.empty())
1182    addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1183
1184  addType(MemberDie, DT.getTypeDerivedFrom());
1185
1186  addSourceLine(MemberDie, &DT);
1187
1188  DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock();
1189  addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst);
1190
1191  uint64_t Size = DT.getSizeInBits();
1192  uint64_t FieldSize = DT.getOriginalTypeSize();
1193
1194  if (Size != FieldSize) {
1195    // Handle bitfield.
1196    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3);
1197    addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
1198
1199    uint64_t Offset = DT.getOffsetInBits();
1200    uint64_t AlignMask = ~(DT.getAlignInBits() - 1);
1201    uint64_t HiMark = (Offset + FieldSize) & AlignMask;
1202    uint64_t FieldOffset = (HiMark - FieldSize);
1203    Offset -= FieldOffset;
1204
1205    // Maybe we need to work from the other end.
1206    if (Asm->getTargetData().isLittleEndian())
1207      Offset = FieldSize - (Offset + Size);
1208    addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset);
1209
1210    // Here WD_AT_data_member_location points to the anonymous
1211    // field that includes this bit field.
1212    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3);
1213
1214  } else
1215    // This is not a bitfield.
1216    addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3);
1217
1218  if (DT.getTag() == dwarf::DW_TAG_inheritance
1219      && DT.isVirtual()) {
1220
1221    // For C++, virtual base classes are not at fixed offset. Use following
1222    // expression to extract appropriate offset from vtable.
1223    // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1224
1225    DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock();
1226    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup);
1227    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1228    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1229    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits());
1230    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus);
1231    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref);
1232    addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1233
1234    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0,
1235             VBaseLocationDie);
1236  } else
1237    addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie);
1238
1239  if (DT.isProtected())
1240    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1241            dwarf::DW_ACCESS_protected);
1242  else if (DT.isPrivate())
1243    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1244            dwarf::DW_ACCESS_private);
1245  else if (DT.getTag() == dwarf::DW_TAG_inheritance)
1246    addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
1247            dwarf::DW_ACCESS_public);
1248  if (DT.isVirtual())
1249    addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag,
1250            dwarf::DW_VIRTUALITY_virtual);
1251  return MemberDie;
1252}
1253
1254/// createSubprogramDIE - Create new DIE using SP.
1255DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
1256  CompileUnit *SPCU = getCompileUnit(SP);
1257  DIE *SPDie = SPCU->getDIE(SP);
1258  if (SPDie)
1259    return SPDie;
1260
1261  SPDie = new DIE(dwarf::DW_TAG_subprogram);
1262  // Constructors and operators for anonymous aggregates do not have names.
1263  if (!SP.getName().empty())
1264    addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());
1265
1266  StringRef LinkageName = SP.getLinkageName();
1267  if (!LinkageName.empty())
1268    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
1269              getRealLinkageName(LinkageName));
1270
1271  addSourceLine(SPDie, &SP);
1272
1273  // Add prototyped tag, if C or ObjC.
1274  unsigned Lang = SP.getCompileUnit().getLanguage();
1275  if (Lang == dwarf::DW_LANG_C99 || Lang == dwarf::DW_LANG_C89 ||
1276      Lang == dwarf::DW_LANG_ObjC)
1277    addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
1278
1279  // Add Return Type.
1280  DICompositeType SPTy = SP.getType();
1281  DIArray Args = SPTy.getTypeArray();
1282  unsigned SPTag = SPTy.getTag();
1283
1284  if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
1285    addType(SPDie, SPTy);
1286  else
1287    addType(SPDie, DIType(Args.getElement(0)));
1288
1289  unsigned VK = SP.getVirtuality();
1290  if (VK) {
1291    addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
1292    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1293    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1294    addUInt(Block, 0, dwarf::DW_FORM_data1, SP.getVirtualIndex());
1295    addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
1296    ContainingTypeMap.insert(std::make_pair(SPDie,
1297                                            SP.getContainingType()));
1298  }
1299
1300  if (MakeDecl || !SP.isDefinition()) {
1301    addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1302
1303    // Add arguments. Do not add arguments for subprogram definition. They will
1304    // be handled while processing variables.
1305    DICompositeType SPTy = SP.getType();
1306    DIArray Args = SPTy.getTypeArray();
1307    unsigned SPTag = SPTy.getTag();
1308
1309    if (SPTag == dwarf::DW_TAG_subroutine_type)
1310      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1311        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1312        DIType ATy = DIType(DIType(Args.getElement(i)));
1313        addType(Arg, ATy);
1314        if (ATy.isArtificial())
1315          addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1316        SPDie->addChild(Arg);
1317      }
1318  }
1319
1320  if (SP.isArtificial())
1321    addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1322
1323  if (!SP.isLocalToUnit())
1324    addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1325
1326  if (SP.isOptimized())
1327    addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1328
1329  // DW_TAG_inlined_subroutine may refer to this DIE.
1330  SPCU->insertDIE(SP, SPDie);
1331
1332  return SPDie;
1333}
1334
1335DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
1336  assert(N && "Invalid Scope encoding!");
1337
1338  DbgScope *AScope = AbstractScopes.lookup(N);
1339  if (AScope)
1340    return AScope;
1341
1342  DbgScope *Parent = NULL;
1343
1344  DIDescriptor Scope(N);
1345  if (Scope.isLexicalBlock()) {
1346    DILexicalBlock DB(N);
1347    DIDescriptor ParentDesc = DB.getContext();
1348    Parent = getOrCreateAbstractScope(ParentDesc);
1349  }
1350
1351  AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
1352
1353  if (Parent)
1354    Parent->addScope(AScope);
1355  AScope->setAbstractScope();
1356  AbstractScopes[N] = AScope;
1357  if (DIDescriptor(N).isSubprogram())
1358    AbstractScopesList.push_back(AScope);
1359  return AScope;
1360}
1361
1362/// isSubprogramContext - Return true if Context is either a subprogram
1363/// or another context nested inside a subprogram.
1364static bool isSubprogramContext(const MDNode *Context) {
1365  if (!Context)
1366    return false;
1367  DIDescriptor D(Context);
1368  if (D.isSubprogram())
1369    return true;
1370  if (D.isType())
1371    return isSubprogramContext(DIType(Context).getContext());
1372  return false;
1373}
1374
1375/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
1376/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
1377/// If there are global variables in this scope then create and insert
1378/// DIEs for these variables.
1379DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
1380  CompileUnit *SPCU = getCompileUnit(SPNode);
1381  DIE *SPDie = SPCU->getDIE(SPNode);
1382  assert(SPDie && "Unable to find subprogram DIE!");
1383  DISubprogram SP(SPNode);
1384
1385  // There is not any need to generate specification DIE for a function
1386  // defined at compile unit level. If a function is defined inside another
1387  // function then gdb prefers the definition at top level and but does not
1388  // expect specification DIE in parent function. So avoid creating
1389  // specification DIE for a function defined inside a function.
1390  if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
1391      !SP.getContext().isFile() &&
1392      !isSubprogramContext(SP.getContext())) {
1393    addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1394
1395    // Add arguments.
1396    DICompositeType SPTy = SP.getType();
1397    DIArray Args = SPTy.getTypeArray();
1398    unsigned SPTag = SPTy.getTag();
1399    if (SPTag == dwarf::DW_TAG_subroutine_type)
1400      for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
1401        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1402        DIType ATy = DIType(DIType(Args.getElement(i)));
1403        addType(Arg, ATy);
1404        if (ATy.isArtificial())
1405          addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1406        SPDie->addChild(Arg);
1407      }
1408    DIE *SPDeclDie = SPDie;
1409    SPDie = new DIE(dwarf::DW_TAG_subprogram);
1410    addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1411                SPDeclDie);
1412    SPCU->addDie(SPDie);
1413  }
1414
1415  addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1416           Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
1417  addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1418           Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
1419  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1420  MachineLocation Location(RI->getFrameRegister(*Asm->MF));
1421  addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1422
1423  return SPDie;
1424}
1425
1426/// constructLexicalScope - Construct new DW_TAG_lexical_block
1427/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1428DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1429
1430  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1431  if (Scope->isAbstractScope())
1432    return ScopeDIE;
1433
1434  const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1435  if (Ranges.empty())
1436    return 0;
1437
1438  SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1439  if (Ranges.size() > 1) {
1440    // .debug_range section has not been laid out yet. Emit offset in
1441    // .debug_range as a uint, size 4, for now. emitDIE will handle
1442    // DW_AT_ranges appropriately.
1443    addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
1444            DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
1445    for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1446         RE = Ranges.end(); RI != RE; ++RI) {
1447      DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
1448      DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
1449    }
1450    DebugRangeSymbols.push_back(NULL);
1451    DebugRangeSymbols.push_back(NULL);
1452    return ScopeDIE;
1453  }
1454
1455  const MCSymbol *Start = getLabelBeforeInsn(RI->first);
1456  const MCSymbol *End = getLabelAfterInsn(RI->second);
1457
1458  if (End == 0) return 0;
1459
1460  assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
1461  assert(End->isDefined() && "Invalid end label for an inlined scope!");
1462
1463  addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
1464  addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
1465
1466  return ScopeDIE;
1467}
1468
1469/// constructInlinedScopeDIE - This scope represents inlined body of
1470/// a function. Construct DIE to represent this concrete inlined copy
1471/// of the function.
1472DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1473
1474  const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
1475  assert (Ranges.empty() == false
1476          && "DbgScope does not have instruction markers!");
1477
1478  // FIXME : .debug_inlined section specification does not clearly state how
1479  // to emit inlined scope that is split into multiple instruction ranges.
1480  // For now, use first instruction range and emit low_pc/high_pc pair and
1481  // corresponding .debug_inlined section entry for this pair.
1482  SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
1483  const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
1484  const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
1485
1486  if (StartLabel == FunctionBeginSym || EndLabel == 0) {
1487    assert (0 && "Unexpected Start and End  labels for a inlined scope!");
1488    return 0;
1489  }
1490  assert(StartLabel->isDefined() &&
1491         "Invalid starting label for an inlined scope!");
1492  assert(EndLabel->isDefined() &&
1493         "Invalid end label for an inlined scope!");
1494
1495  if (!Scope->getScopeNode())
1496    return NULL;
1497  DIScope DS(Scope->getScopeNode());
1498  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
1499
1500  DISubprogram InlinedSP = getDISubprogram(DS);
1501  CompileUnit *TheCU = getCompileUnit(InlinedSP);
1502  DIE *OriginDIE = TheCU->getDIE(InlinedSP);
1503  assert(OriginDIE && "Unable to find Origin DIE!");
1504  addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
1505              dwarf::DW_FORM_ref4, OriginDIE);
1506
1507  addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1508  addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
1509
1510  InlinedSubprogramDIEs.insert(OriginDIE);
1511
1512  // Track the start label for this inlined function.
1513  DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1514    I = InlineInfo.find(InlinedSP);
1515
1516  if (I == InlineInfo.end()) {
1517    InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
1518                                                             ScopeDIE));
1519    InlinedSPNodes.push_back(InlinedSP);
1520  } else
1521    I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1522
1523  DILocation DL(Scope->getInlinedAt());
1524  addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
1525  addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1526
1527  return ScopeDIE;
1528}
1529
1530
1531/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1532DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1533  // Get the descriptor.
1534  const DIVariable &VD = DV->getVariable();
1535  StringRef Name = VD.getName();
1536  if (Name.empty())
1537    return NULL;
1538
1539  // Translate tag to proper Dwarf tag.  The result variable is dropped for
1540  // now.
1541  unsigned Tag;
1542  switch (VD.getTag()) {
1543  case dwarf::DW_TAG_return_variable:
1544    return NULL;
1545  case dwarf::DW_TAG_arg_variable:
1546    Tag = dwarf::DW_TAG_formal_parameter;
1547    break;
1548  case dwarf::DW_TAG_auto_variable:    // fall thru
1549  default:
1550    Tag = dwarf::DW_TAG_variable;
1551    break;
1552  }
1553
1554  // Define variable debug information entry.
1555  DIE *VariableDie = new DIE(Tag);
1556
1557  DIE *AbsDIE = NULL;
1558  DenseMap<const DbgVariable *, const DbgVariable *>::iterator
1559    V2AVI = VarToAbstractVarMap.find(DV);
1560  if (V2AVI != VarToAbstractVarMap.end())
1561    AbsDIE = V2AVI->second->getDIE();
1562
1563  if (AbsDIE)
1564    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1565                dwarf::DW_FORM_ref4, AbsDIE);
1566  else {
1567    addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1568    addSourceLine(VariableDie, &VD);
1569
1570    // Add variable type.
1571    // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1572    // addresses instead.
1573    if (VD.isBlockByrefVariable())
1574      addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1575    else
1576      addType(VariableDie, VD.getType());
1577  }
1578
1579  if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1580    addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1581
1582  if (Scope->isAbstractScope()) {
1583    DV->setDIE(VariableDie);
1584    return VariableDie;
1585  }
1586
1587  // Add variable address.
1588
1589  unsigned Offset = DV->getDotDebugLocOffset();
1590  if (Offset != ~0U) {
1591    addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
1592             Asm->GetTempSymbol("debug_loc", Offset));
1593    DV->setDIE(VariableDie);
1594    UseDotDebugLocEntry.insert(VariableDie);
1595    return VariableDie;
1596  }
1597
1598  // Check if variable is described by a  DBG_VALUE instruction.
1599  DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
1600    DbgVariableToDbgInstMap.find(DV);
1601  if (DVI != DbgVariableToDbgInstMap.end()) {
1602    const MachineInstr *DVInsn = DVI->second;
1603    const MCSymbol *DVLabel = findVariableLabel(DV);
1604    bool updated = false;
1605    // FIXME : Handle getNumOperands != 3
1606    if (DVInsn->getNumOperands() == 3) {
1607      if (DVInsn->getOperand(0).isReg())
1608        updated = addRegisterAddress(VariableDie, DVLabel, DVInsn->getOperand(0));
1609      else if (DVInsn->getOperand(0).isImm())
1610        updated = addConstantValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1611      else if (DVInsn->getOperand(0).isFPImm())
1612        updated = addConstantFPValue(VariableDie, DVLabel, DVInsn->getOperand(0));
1613    } else {
1614      MachineLocation Location = Asm->getDebugValueLocation(DVInsn);
1615      if (Location.getReg()) {
1616        addAddress(VariableDie, dwarf::DW_AT_location, Location);
1617        if (DVLabel)
1618          addLabel(VariableDie, dwarf::DW_AT_start_scope, dwarf::DW_FORM_addr,
1619                   DVLabel);
1620        updated = true;
1621      }
1622    }
1623    if (!updated) {
1624      // If variableDie is not updated then DBG_VALUE instruction does not
1625      // have valid variable info.
1626      delete VariableDie;
1627      return NULL;
1628    }
1629    DV->setDIE(VariableDie);
1630    return VariableDie;
1631  }
1632
1633  // .. else use frame index, if available.
1634  MachineLocation Location;
1635  unsigned FrameReg;
1636  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
1637  int FI = 0;
1638  if (findVariableFrameIndex(DV, &FI)) {
1639    int Offset = RI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
1640    Location.set(FrameReg, Offset);
1641
1642    if (VD.hasComplexAddress())
1643      addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1644    else if (VD.isBlockByrefVariable())
1645      addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1646    else
1647      addAddress(VariableDie, dwarf::DW_AT_location, Location);
1648  }
1649  DV->setDIE(VariableDie);
1650  return VariableDie;
1651
1652}
1653
1654void DwarfDebug::addPubTypes(DISubprogram SP) {
1655  DICompositeType SPTy = SP.getType();
1656  unsigned SPTag = SPTy.getTag();
1657  if (SPTag != dwarf::DW_TAG_subroutine_type)
1658    return;
1659
1660  DIArray Args = SPTy.getTypeArray();
1661  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1662    DIType ATy(Args.getElement(i));
1663    if (!ATy.Verify())
1664      continue;
1665    DICompositeType CATy = getDICompositeType(ATy);
1666    if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
1667        && !CATy.isForwardDecl()) {
1668      CompileUnit *TheCU = getCompileUnit(CATy);
1669      if (DIEEntry *Entry = TheCU->getDIEEntry(CATy))
1670        TheCU->addGlobalType(CATy.getName(), Entry->getEntry());
1671    }
1672  }
1673}
1674
1675/// constructScopeDIE - Construct a DIE for this scope.
1676DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1677  if (!Scope || !Scope->getScopeNode())
1678    return NULL;
1679
1680  DIScope DS(Scope->getScopeNode());
1681  DIE *ScopeDIE = NULL;
1682  if (Scope->getInlinedAt())
1683    ScopeDIE = constructInlinedScopeDIE(Scope);
1684  else if (DS.isSubprogram()) {
1685    if (Scope->isAbstractScope())
1686      ScopeDIE = getCompileUnit(DS)->getDIE(DS);
1687    else
1688      ScopeDIE = updateSubprogramScopeDIE(DS);
1689  }
1690  else
1691    ScopeDIE = constructLexicalScopeDIE(Scope);
1692  if (!ScopeDIE) return NULL;
1693
1694  // Add variables to scope.
1695  const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1696  for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1697    DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1698    if (VariableDIE)
1699      ScopeDIE->addChild(VariableDIE);
1700  }
1701
1702  // Add nested scopes.
1703  const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1704  for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1705    // Define the Scope debug information entry.
1706    DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1707    if (NestedDIE)
1708      ScopeDIE->addChild(NestedDIE);
1709  }
1710
1711  if (DS.isSubprogram())
1712    addPubTypes(DISubprogram(DS));
1713
1714 return ScopeDIE;
1715}
1716
1717/// GetOrCreateSourceID - Look up the source id with the given directory and
1718/// source file names. If none currently exists, create a new id and insert it
1719/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1720/// maps as well.
1721unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName){
1722  unsigned DId;
1723  StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1724  if (DI != DirectoryIdMap.end()) {
1725    DId = DI->getValue();
1726  } else {
1727    DId = DirectoryNames.size() + 1;
1728    DirectoryIdMap[DirName] = DId;
1729    DirectoryNames.push_back(DirName);
1730  }
1731
1732  unsigned FId;
1733  StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1734  if (FI != SourceFileIdMap.end()) {
1735    FId = FI->getValue();
1736  } else {
1737    FId = SourceFileNames.size() + 1;
1738    SourceFileIdMap[FileName] = FId;
1739    SourceFileNames.push_back(FileName);
1740  }
1741
1742  DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1743    SourceIdMap.find(std::make_pair(DId, FId));
1744  if (SI != SourceIdMap.end())
1745    return SI->second;
1746
1747  unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1748  SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1749  SourceIds.push_back(std::make_pair(DId, FId));
1750
1751  return SrcId;
1752}
1753
1754/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1755DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1756  CompileUnit *TheCU = getCompileUnit(NS);
1757  DIE *NDie = TheCU->getDIE(NS);
1758  if (NDie)
1759    return NDie;
1760  NDie = new DIE(dwarf::DW_TAG_namespace);
1761  TheCU->insertDIE(NS, NDie);
1762  if (!NS.getName().empty())
1763    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1764  addSourceLine(NDie, &NS);
1765  addToContextOwner(NDie, NS.getContext());
1766  return NDie;
1767}
1768
1769/// constructCompileUnit - Create new CompileUnit for the given
1770/// metadata node with tag DW_TAG_compile_unit.
1771void DwarfDebug::constructCompileUnit(const MDNode *N) {
1772  DICompileUnit DIUnit(N);
1773  StringRef FN = DIUnit.getFilename();
1774  StringRef Dir = DIUnit.getDirectory();
1775  unsigned ID = GetOrCreateSourceID(Dir, FN);
1776
1777  DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1778  addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1779            DIUnit.getProducer());
1780  addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1781          DIUnit.getLanguage());
1782  addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1783  // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1784  // simplifies debug range entries.
1785  addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_data4, 0);
1786  // DW_AT_stmt_list is a offset of line number information for this
1787  // compile unit in debug_line section. It is always zero when only one
1788  // compile unit is emitted in one object file.
1789  addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1790
1791  if (!Dir.empty())
1792    addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1793  if (DIUnit.isOptimized())
1794    addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1795
1796  StringRef Flags = DIUnit.getFlags();
1797  if (!Flags.empty())
1798    addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1799
1800  unsigned RVer = DIUnit.getRunTimeVersion();
1801  if (RVer)
1802    addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1803            dwarf::DW_FORM_data1, RVer);
1804
1805  CompileUnit *NewCU = new CompileUnit(ID, Die);
1806  if (!FirstCU)
1807    FirstCU = NewCU;
1808  CUMap.insert(std::make_pair(N, NewCU));
1809}
1810
1811/// getCompielUnit - Get CompileUnit DIE.
1812CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1813  assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1814  DIDescriptor D(N);
1815  const MDNode *CUNode = NULL;
1816  if (D.isCompileUnit())
1817    CUNode = N;
1818  else if (D.isSubprogram())
1819    CUNode = DISubprogram(N).getCompileUnit();
1820  else if (D.isType())
1821    CUNode = DIType(N).getCompileUnit();
1822  else if (D.isGlobalVariable())
1823    CUNode = DIGlobalVariable(N).getCompileUnit();
1824  else if (D.isVariable())
1825    CUNode = DIVariable(N).getCompileUnit();
1826  else if (D.isNameSpace())
1827    CUNode = DINameSpace(N).getCompileUnit();
1828  else if (D.isFile())
1829    CUNode = DIFile(N).getCompileUnit();
1830  else
1831    return FirstCU;
1832
1833  DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1834    = CUMap.find(CUNode);
1835  if (I == CUMap.end())
1836    return FirstCU;
1837  return I->second;
1838}
1839
1840
1841/// constructGlobalVariableDIE - Construct global variable DIE.
1842void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1843  DIGlobalVariable DI_GV(N);
1844
1845  // If debug information is malformed then ignore it.
1846  if (DI_GV.Verify() == false)
1847    return;
1848
1849  // Check for pre-existence.
1850  CompileUnit *TheCU = getCompileUnit(N);
1851  if (TheCU->getDIE(DI_GV))
1852    return;
1853
1854  DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1855  if (!VariableDie)
1856    return;
1857
1858  // Add to map.
1859  TheCU->insertDIE(N, VariableDie);
1860
1861  // Add to context owner.
1862  DIDescriptor GVContext = DI_GV.getContext();
1863  // Do not create specification DIE if context is either compile unit
1864  // or a subprogram.
1865  if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1866      !GVContext.isFile() &&
1867      !isSubprogramContext(GVContext)) {
1868    // Create specification DIE.
1869    DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1870    addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1871                dwarf::DW_FORM_ref4, VariableDie);
1872    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1873    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1874    addLabel(Block, 0, dwarf::DW_FORM_udata,
1875             Asm->Mang->getSymbol(DI_GV.getGlobal()));
1876    addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1877    addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1878    TheCU->addDie(VariableSpecDIE);
1879  } else {
1880    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1881    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1882    addLabel(Block, 0, dwarf::DW_FORM_udata,
1883             Asm->Mang->getSymbol(DI_GV.getGlobal()));
1884    addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1885  }
1886  addToContextOwner(VariableDie, GVContext);
1887
1888  // Expose as global. FIXME - need to check external flag.
1889  TheCU->addGlobal(DI_GV.getName(), VariableDie);
1890
1891  DIType GTy = DI_GV.getType();
1892  if (GTy.isCompositeType() && !GTy.getName().empty()
1893      && !GTy.isForwardDecl()) {
1894    DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1895    assert(Entry && "Missing global type!");
1896    TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1897  }
1898  return;
1899}
1900
1901/// construct SubprogramDIE - Construct subprogram DIE.
1902void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1903  DISubprogram SP(N);
1904
1905  // Check for pre-existence.
1906  CompileUnit *TheCU = getCompileUnit(N);
1907  if (TheCU->getDIE(N))
1908    return;
1909
1910  if (!SP.isDefinition())
1911    // This is a method declaration which will be handled while constructing
1912    // class type.
1913    return;
1914
1915  DIE *SubprogramDie = createSubprogramDIE(SP);
1916
1917  // Add to map.
1918  TheCU->insertDIE(N, SubprogramDie);
1919
1920  // Add to context owner.
1921  addToContextOwner(SubprogramDie, SP.getContext());
1922
1923  // Expose as global.
1924  TheCU->addGlobal(SP.getName(), SubprogramDie);
1925
1926  return;
1927}
1928
1929/// beginModule - Emit all Dwarf sections that should come prior to the
1930/// content. Create global DIEs and emit initial debug info sections.
1931/// This is inovked by the target AsmPrinter.
1932void DwarfDebug::beginModule(Module *M) {
1933  if (DisableDebugInfoPrinting)
1934    return;
1935
1936  DebugInfoFinder DbgFinder;
1937  DbgFinder.processModule(*M);
1938
1939  bool HasDebugInfo = false;
1940
1941  // Scan all the compile-units to see if there are any marked as the main unit.
1942  // if not, we do not generate debug info.
1943  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1944       E = DbgFinder.compile_unit_end(); I != E; ++I) {
1945    if (DICompileUnit(*I).isMain()) {
1946      HasDebugInfo = true;
1947      break;
1948    }
1949  }
1950
1951  if (!HasDebugInfo) return;
1952
1953  // Tell MMI that we have debug info.
1954  MMI->setDebugInfoAvailability(true);
1955
1956  // Emit initial sections.
1957  EmitSectionLabels();
1958
1959  // Create all the compile unit DIEs.
1960  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1961         E = DbgFinder.compile_unit_end(); I != E; ++I)
1962    constructCompileUnit(*I);
1963
1964  // Create DIEs for each subprogram.
1965  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1966         E = DbgFinder.subprogram_end(); I != E; ++I)
1967    constructSubprogramDIE(*I);
1968
1969  // Create DIEs for each global variable.
1970  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1971         E = DbgFinder.global_variable_end(); I != E; ++I)
1972    constructGlobalVariableDIE(*I);
1973
1974  // Prime section data.
1975  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1976
1977  // Print out .file directives to specify files for .loc directives. These are
1978  // printed out early so that they precede any .loc directives.
1979  if (Asm->MAI->hasDotLocAndDotFile()) {
1980    for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1981      // Remember source id starts at 1.
1982      std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1983      // FIXME: don't use sys::path for this!  This should not depend on the
1984      // host.
1985      sys::Path FullPath(getSourceDirectoryName(Id.first));
1986      bool AppendOk =
1987        FullPath.appendComponent(getSourceFileName(Id.second));
1988      assert(AppendOk && "Could not append filename to directory!");
1989      AppendOk = false;
1990      Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1991    }
1992  }
1993}
1994
1995/// endModule - Emit all Dwarf sections that should come after the content.
1996///
1997void DwarfDebug::endModule() {
1998  if (!FirstCU) return;
1999
2000  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2001  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2002         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2003    DIE *ISP = *AI;
2004    addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2005  }
2006
2007  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2008         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2009    DIE *SPDie = CI->first;
2010    const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2011    if (!N) continue;
2012    DIE *NDie = getCompileUnit(N)->getDIE(N);
2013    if (!NDie) continue;
2014    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2015  }
2016
2017  // Standard sections final addresses.
2018  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2019  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2020  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2021  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2022
2023  // End text sections.
2024  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2025    Asm->OutStreamer.SwitchSection(SectionMap[i]);
2026    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2027  }
2028
2029  // Emit common frame information.
2030  emitCommonDebugFrame();
2031
2032  // Emit function debug frame information
2033  for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2034         E = DebugFrames.end(); I != E; ++I)
2035    emitFunctionDebugFrame(*I);
2036
2037  // Compute DIE offsets and sizes.
2038  computeSizeAndOffsets();
2039
2040  // Emit all the DIEs into a debug info section
2041  emitDebugInfo();
2042
2043  // Corresponding abbreviations into a abbrev section.
2044  emitAbbreviations();
2045
2046  // Emit source line correspondence into a debug line section.
2047  emitDebugLines();
2048
2049  // Emit info into a debug pubnames section.
2050  emitDebugPubNames();
2051
2052  // Emit info into a debug pubtypes section.
2053  emitDebugPubTypes();
2054
2055  // Emit info into a debug loc section.
2056  emitDebugLoc();
2057
2058  // Emit info into a debug aranges section.
2059  EmitDebugARanges();
2060
2061  // Emit info into a debug ranges section.
2062  emitDebugRanges();
2063
2064  // Emit info into a debug macinfo section.
2065  emitDebugMacInfo();
2066
2067  // Emit inline info.
2068  emitDebugInlineInfo();
2069
2070  // Emit info into a debug str section.
2071  emitDebugStr();
2072
2073  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2074         E = CUMap.end(); I != E; ++I)
2075    delete I->second;
2076  FirstCU = NULL;  // Reset for the next Module, if any.
2077}
2078
2079/// findAbstractVariable - Find abstract variable, if any, associated with Var.
2080DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2081                                              DebugLoc ScopeLoc) {
2082
2083  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2084  if (AbsDbgVariable)
2085    return AbsDbgVariable;
2086
2087  LLVMContext &Ctx = Var->getContext();
2088  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2089  if (!Scope)
2090    return NULL;
2091
2092  AbsDbgVariable = new DbgVariable(Var);
2093  Scope->addVariable(AbsDbgVariable);
2094  AbstractVariables[Var] = AbsDbgVariable;
2095  return AbsDbgVariable;
2096}
2097
2098/// collectVariableInfoFromMMITable - Collect variable information from
2099/// side table maintained by MMI.
2100void
2101DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2102                                   SmallPtrSet<const MDNode *, 16> &Processed) {
2103  const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2104  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2105  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2106         VE = VMap.end(); VI != VE; ++VI) {
2107    const MDNode *Var = VI->first;
2108    if (!Var) continue;
2109    Processed.insert(Var);
2110    DIVariable DV(Var);
2111    const std::pair<unsigned, DebugLoc> &VP = VI->second;
2112
2113    DbgScope *Scope = 0;
2114    if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2115      Scope = ConcreteScopes.lookup(IA);
2116    if (Scope == 0)
2117      Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2118
2119    // If variable scope is not found then skip this variable.
2120    if (Scope == 0)
2121      continue;
2122
2123    DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2124    DbgVariable *RegVar = new DbgVariable(DV);
2125    recordVariableFrameIndex(RegVar, VP.first);
2126    Scope->addVariable(RegVar);
2127    if (AbsDbgVariable) {
2128      recordVariableFrameIndex(AbsDbgVariable, VP.first);
2129      VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2130    }
2131  }
2132}
2133
2134/// isDbgValueInUndefinedReg - Return true if debug value, encoded by
2135/// DBG_VALUE instruction, is in undefined reg.
2136static bool isDbgValueInUndefinedReg(const MachineInstr *MI) {
2137  assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2138  if (MI->getOperand(0).isReg() && !MI->getOperand(0).getReg())
2139    return true;
2140  return false;
2141}
2142
2143/// isDbgValueInDefinedReg - Return true if debug value, encoded by
2144/// DBG_VALUE instruction, is in a defined reg.
2145static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2146  assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2147  if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2148    return true;
2149  return false;
2150}
2151
2152/// collectVariableInfo - Populate DbgScope entries with variables' info.
2153void DwarfDebug::collectVariableInfo(const MachineFunction *MF) {
2154  SmallPtrSet<const MDNode *, 16> Processed;
2155
2156  /// collection info from MMI table.
2157  collectVariableInfoFromMMITable(MF, Processed);
2158
2159  SmallVector<const MachineInstr *, 8> DbgValues;
2160  // Collect variable information from DBG_VALUE machine instructions;
2161  for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2162       I != E; ++I)
2163    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2164         II != IE; ++II) {
2165      const MachineInstr *MInsn = II;
2166      if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn))
2167        continue;
2168      DbgValues.push_back(MInsn);
2169    }
2170
2171  // This is a collection of DBV_VALUE instructions describing same variable.
2172  SmallVector<const MachineInstr *, 4> MultipleValues;
2173  for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2174        E = DbgValues.end(); I != E; ++I) {
2175    const MachineInstr *MInsn = *I;
2176    MultipleValues.clear();
2177    if (isDbgValueInDefinedReg(MInsn))
2178      MultipleValues.push_back(MInsn);
2179    DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2180    if (Processed.count(DV) != 0)
2181      continue;
2182
2183    const MachineInstr *PrevMI = MInsn;
2184    for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2185           ME = DbgValues.end(); MI != ME; ++MI) {
2186      const MDNode *Var =
2187        (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2188      if (Var == DV && isDbgValueInDefinedReg(*MI) &&
2189          !PrevMI->isIdenticalTo(*MI))
2190        MultipleValues.push_back(*MI);
2191      PrevMI = *MI;
2192    }
2193
2194    DbgScope *Scope = findDbgScope(MInsn);
2195    bool CurFnArg = false;
2196    if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2197        DISubprogram(DV.getContext()).describes(MF->getFunction()))
2198      CurFnArg = true;
2199    if (!Scope && CurFnArg)
2200      Scope = CurrentFnDbgScope;
2201    // If variable scope is not found then skip this variable.
2202    if (!Scope)
2203      continue;
2204
2205    Processed.insert(DV);
2206    DbgVariable *RegVar = new DbgVariable(DV);
2207    Scope->addVariable(RegVar);
2208    if (!CurFnArg)
2209      DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn);
2210    if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2211      DbgVariableToDbgInstMap[AbsVar] = MInsn;
2212      VarToAbstractVarMap[RegVar] = AbsVar;
2213    }
2214    if (MultipleValues.size() <= 1) {
2215      DbgVariableToDbgInstMap[RegVar] = MInsn;
2216      continue;
2217    }
2218
2219    // handle multiple DBG_VALUE instructions describing one variable.
2220    if (DotDebugLocEntries.empty())
2221      RegVar->setDotDebugLocOffset(0);
2222    else
2223      RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2224    const MachineInstr *Begin = NULL;
2225    const MachineInstr *End = NULL;
2226    for (SmallVector<const MachineInstr *, 4>::iterator
2227           MVI = MultipleValues.begin(), MVE = MultipleValues.end(); MVI != MVE; ++MVI) {
2228      if (!Begin) {
2229        Begin = *MVI;
2230        continue;
2231      }
2232      End = *MVI;
2233      MachineLocation MLoc;
2234      MLoc.set(Begin->getOperand(0).getReg(), 0);
2235      const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2236      const MCSymbol *SLabel = getLabelBeforeInsn(End);
2237      DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2238      Begin = End;
2239      if (MVI + 1 == MVE) {
2240        // If End is the last instruction then its value is valid
2241        // until the end of the funtion.
2242        MLoc.set(End->getOperand(0).getReg(), 0);
2243        DotDebugLocEntries.
2244          push_back(DotDebugLocEntry(SLabel, FunctionEndSym, MLoc));
2245      }
2246    }
2247    DotDebugLocEntries.push_back(DotDebugLocEntry());
2248  }
2249
2250  // Collect info for variables that were optimized out.
2251  if (NamedMDNode *NMD =
2252      MF->getFunction()->getParent()->getNamedMetadata("llvm.dbg.lv")) {
2253    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2254      DIVariable DV(cast_or_null<MDNode>(NMD->getOperand(i)));
2255      if (!DV || !Processed.insert(DV))
2256        continue;
2257      DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2258      if (Scope)
2259        Scope->addVariable(new DbgVariable(DV));
2260    }
2261  }
2262}
2263
2264/// getLabelBeforeInsn - Return Label preceding the instruction.
2265const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2266  DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2267    LabelsBeforeInsn.find(MI);
2268  if (I == LabelsBeforeInsn.end())
2269    // FunctionBeginSym always preceeds all the instruction in current function.
2270    return FunctionBeginSym;
2271  return I->second;
2272}
2273
2274/// getLabelAfterInsn - Return Label immediately following the instruction.
2275const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2276  DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2277    LabelsAfterInsn.find(MI);
2278  if (I == LabelsAfterInsn.end())
2279    return NULL;
2280  return I->second;
2281}
2282
2283/// beginScope - Process beginning of a scope.
2284void DwarfDebug::beginScope(const MachineInstr *MI) {
2285  if (InsnNeedsLabel.count(MI) == 0) {
2286    LabelsBeforeInsn[MI] = PrevLabel;
2287    return;
2288  }
2289
2290  // Check location.
2291  DebugLoc DL = MI->getDebugLoc();
2292  if (!DL.isUnknown()) {
2293    const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2294    PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2295    PrevInstLoc = DL;
2296    LabelsBeforeInsn[MI] = PrevLabel;
2297    return;
2298  }
2299
2300  // If location is unknown then use temp label for this DBG_VALUE
2301  // instruction.
2302  if (MI->isDebugValue()) {
2303    PrevLabel = MMI->getContext().CreateTempSymbol();
2304    Asm->OutStreamer.EmitLabel(PrevLabel);
2305    LabelsBeforeInsn[MI] = PrevLabel;
2306    return;
2307  }
2308
2309  if (UnknownLocations) {
2310    PrevLabel = recordSourceLine(0, 0, 0);
2311    LabelsBeforeInsn[MI] = PrevLabel;
2312    return;
2313  }
2314
2315  assert (0 && "Instruction is not processed!");
2316}
2317
2318/// endScope - Process end of a scope.
2319void DwarfDebug::endScope(const MachineInstr *MI) {
2320  if (InsnsEndScopeSet.count(MI) != 0) {
2321    // Emit a label if this instruction ends a scope.
2322    MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2323    Asm->OutStreamer.EmitLabel(Label);
2324    LabelsAfterInsn[MI] = Label;
2325  }
2326}
2327
2328/// getOrCreateDbgScope - Create DbgScope for the scope.
2329DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, const MDNode *InlinedAt) {
2330  if (!InlinedAt) {
2331    DbgScope *WScope = DbgScopeMap.lookup(Scope);
2332    if (WScope)
2333      return WScope;
2334    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2335    DbgScopeMap.insert(std::make_pair(Scope, WScope));
2336    if (DIDescriptor(Scope).isLexicalBlock()) {
2337      DbgScope *Parent =
2338        getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2339      WScope->setParent(Parent);
2340      Parent->addScope(WScope);
2341    }
2342
2343    if (!WScope->getParent()) {
2344      StringRef SPName = DISubprogram(Scope).getLinkageName();
2345      if (SPName == Asm->MF->getFunction()->getName())
2346        CurrentFnDbgScope = WScope;
2347    }
2348
2349    return WScope;
2350  }
2351
2352  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2353  if (WScope)
2354    return WScope;
2355
2356  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2357  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2358  DILocation DL(InlinedAt);
2359  DbgScope *Parent =
2360    getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2361  WScope->setParent(Parent);
2362  Parent->addScope(WScope);
2363
2364  ConcreteScopes[InlinedAt] = WScope;
2365  getOrCreateAbstractScope(Scope);
2366
2367  return WScope;
2368}
2369
2370/// hasValidLocation - Return true if debug location entry attached with
2371/// machine instruction encodes valid location info.
2372static bool hasValidLocation(LLVMContext &Ctx,
2373                             const MachineInstr *MInsn,
2374                             const MDNode *&Scope, const MDNode *&InlinedAt) {
2375  if (MInsn->isDebugValue())
2376    return false;
2377  DebugLoc DL = MInsn->getDebugLoc();
2378  if (DL.isUnknown()) return false;
2379
2380  const MDNode *S = DL.getScope(Ctx);
2381
2382  // There is no need to create another DIE for compile unit. For all
2383  // other scopes, create one DbgScope now. This will be translated
2384  // into a scope DIE at the end.
2385  if (DIScope(S).isCompileUnit()) return false;
2386
2387  Scope = S;
2388  InlinedAt = DL.getInlinedAt(Ctx);
2389  return true;
2390}
2391
2392/// calculateDominanceGraph - Calculate dominance graph for DbgScope
2393/// hierarchy.
2394static void calculateDominanceGraph(DbgScope *Scope) {
2395  assert (Scope && "Unable to calculate scop edominance graph!");
2396  SmallVector<DbgScope *, 4> WorkStack;
2397  WorkStack.push_back(Scope);
2398  unsigned Counter = 0;
2399  while (!WorkStack.empty()) {
2400    DbgScope *WS = WorkStack.back();
2401    const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2402    bool visitedChildren = false;
2403    for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2404           SE = Children.end(); SI != SE; ++SI) {
2405      DbgScope *ChildScope = *SI;
2406      if (!ChildScope->getDFSOut()) {
2407        WorkStack.push_back(ChildScope);
2408        visitedChildren = true;
2409        ChildScope->setDFSIn(++Counter);
2410        break;
2411      }
2412    }
2413    if (!visitedChildren) {
2414      WorkStack.pop_back();
2415      WS->setDFSOut(++Counter);
2416    }
2417  }
2418}
2419
2420/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2421static
2422void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2423                       DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2424{
2425#ifndef NDEBUG
2426  unsigned PrevDFSIn = 0;
2427  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2428       I != E; ++I) {
2429    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2430         II != IE; ++II) {
2431      const MachineInstr *MInsn = II;
2432      const MDNode *Scope = NULL;
2433      const MDNode *InlinedAt = NULL;
2434
2435      // Check if instruction has valid location information.
2436      if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2437        dbgs() << " [ ";
2438        if (InlinedAt)
2439          dbgs() << "*";
2440        DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2441          MI2ScopeMap.find(MInsn);
2442        if (DI != MI2ScopeMap.end()) {
2443          DbgScope *S = DI->second;
2444          dbgs() << S->getDFSIn();
2445          PrevDFSIn = S->getDFSIn();
2446        } else
2447          dbgs() << PrevDFSIn;
2448      } else
2449        dbgs() << " [ x" << PrevDFSIn;
2450      dbgs() << " ]";
2451      MInsn->dump();
2452    }
2453    dbgs() << "\n";
2454  }
2455#endif
2456}
2457/// extractScopeInformation - Scan machine instructions in this function
2458/// and collect DbgScopes. Return true, if at least one scope was found.
2459bool DwarfDebug::extractScopeInformation() {
2460  // If scope information was extracted using .dbg intrinsics then there is not
2461  // any need to extract these information by scanning each instruction.
2462  if (!DbgScopeMap.empty())
2463    return false;
2464
2465  // Scan each instruction and create scopes. First build working set of scopes.
2466  LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2467  SmallVector<DbgRange, 4> MIRanges;
2468  DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2469  const MDNode *PrevScope = NULL;
2470  const MDNode *PrevInlinedAt = NULL;
2471  const MachineInstr *RangeBeginMI = NULL;
2472  const MachineInstr *PrevMI = NULL;
2473  for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2474       I != E; ++I) {
2475    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2476         II != IE; ++II) {
2477      const MachineInstr *MInsn = II;
2478      const MDNode *Scope = NULL;
2479      const MDNode *InlinedAt = NULL;
2480
2481      // Check if instruction has valid location information.
2482      if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2483        PrevMI = MInsn;
2484        continue;
2485      }
2486
2487      // If scope has not changed then skip this instruction.
2488      if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2489        PrevMI = MInsn;
2490        continue;
2491      }
2492
2493      if (RangeBeginMI) {
2494        // If we have alread seen a beginning of a instruction range and
2495        // current instruction scope does not match scope of first instruction
2496        // in this range then create a new instruction range.
2497        DbgRange R(RangeBeginMI, PrevMI);
2498        MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2499        MIRanges.push_back(R);
2500      }
2501
2502      // This is a beginning of a new instruction range.
2503      RangeBeginMI = MInsn;
2504
2505      // Reset previous markers.
2506      PrevMI = MInsn;
2507      PrevScope = Scope;
2508      PrevInlinedAt = InlinedAt;
2509    }
2510  }
2511
2512  // Create last instruction range.
2513  if (RangeBeginMI && PrevMI && PrevScope) {
2514    DbgRange R(RangeBeginMI, PrevMI);
2515    MIRanges.push_back(R);
2516    MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2517  }
2518
2519  if (!CurrentFnDbgScope)
2520    return false;
2521
2522  calculateDominanceGraph(CurrentFnDbgScope);
2523  if (PrintDbgScope)
2524    printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2525
2526  // Find ranges of instructions covered by each DbgScope;
2527  DbgScope *PrevDbgScope = NULL;
2528  for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2529         RE = MIRanges.end(); RI != RE; ++RI) {
2530    const DbgRange &R = *RI;
2531    DbgScope *S = MI2ScopeMap.lookup(R.first);
2532    assert (S && "Lost DbgScope for a machine instruction!");
2533    if (PrevDbgScope && !PrevDbgScope->dominates(S))
2534      PrevDbgScope->closeInsnRange(S);
2535    S->openInsnRange(R.first);
2536    S->extendInsnRange(R.second);
2537    PrevDbgScope = S;
2538  }
2539
2540  if (PrevDbgScope)
2541    PrevDbgScope->closeInsnRange();
2542
2543  identifyScopeMarkers();
2544
2545  return !DbgScopeMap.empty();
2546}
2547
2548/// identifyScopeMarkers() -
2549/// Each DbgScope has first instruction and last instruction to mark beginning
2550/// and end of a scope respectively. Create an inverse map that list scopes
2551/// starts (and ends) with an instruction. One instruction may start (or end)
2552/// multiple scopes. Ignore scopes that are not reachable.
2553void DwarfDebug::identifyScopeMarkers() {
2554  SmallVector<DbgScope *, 4> WorkList;
2555  WorkList.push_back(CurrentFnDbgScope);
2556  while (!WorkList.empty()) {
2557    DbgScope *S = WorkList.pop_back_val();
2558
2559    const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2560    if (!Children.empty())
2561      for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2562             SE = Children.end(); SI != SE; ++SI)
2563        WorkList.push_back(*SI);
2564
2565    if (S->isAbstractScope())
2566      continue;
2567
2568    const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2569    if (Ranges.empty())
2570      continue;
2571    for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2572           RE = Ranges.end(); RI != RE; ++RI) {
2573      assert(RI->first && "DbgRange does not have first instruction!");
2574      assert(RI->second && "DbgRange does not have second instruction!");
2575      InsnsBeginScopeSet.insert(RI->first);
2576      InsnsEndScopeSet.insert(RI->second);
2577    }
2578  }
2579}
2580
2581/// FindFirstDebugLoc - Find the first debug location in the function. This
2582/// is intended to be an approximation for the source position of the
2583/// beginning of the function.
2584static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2585  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2586       I != E; ++I)
2587    for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2588         MBBI != MBBE; ++MBBI) {
2589      DebugLoc DL = MBBI->getDebugLoc();
2590      if (!DL.isUnknown())
2591        return DL;
2592    }
2593  return DebugLoc();
2594}
2595
2596/// beginFunction - Gather pre-function debug information.  Assumes being
2597/// emitted immediately after the function entry point.
2598void DwarfDebug::beginFunction(const MachineFunction *MF) {
2599  if (!MMI->hasDebugInfo()) return;
2600  if (!extractScopeInformation()) return;
2601
2602  FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2603                                        Asm->getFunctionNumber());
2604  // Assumes in correct section after the entry point.
2605  Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2606
2607  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2608  // function.
2609  DebugLoc FDL = FindFirstDebugLoc(MF);
2610  if (FDL.isUnknown()) return;
2611
2612  const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2613
2614  DISubprogram SP = getDISubprogram(Scope);
2615  unsigned Line, Col;
2616  if (SP.Verify()) {
2617    Line = SP.getLineNumber();
2618    Col = 0;
2619  } else {
2620    Line = FDL.getLine();
2621    Col = FDL.getCol();
2622  }
2623
2624  recordSourceLine(Line, Col, Scope);
2625
2626  /// ProcessedArgs - Collection of arguments already processed.
2627  SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2628
2629  DebugLoc PrevLoc;
2630  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2631       I != E; ++I)
2632    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2633         II != IE; ++II) {
2634      const MachineInstr *MI = II;
2635      DebugLoc DL = MI->getDebugLoc();
2636      if (MI->isDebugValue()) {
2637        assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2638        DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2639        if (!DV.Verify()) continue;
2640        if (isDbgValueInUndefinedReg(MI)) continue;
2641        // If DBG_VALUE is for a local variable then it needs a label.
2642        if (DV.getTag() != dwarf::DW_TAG_arg_variable)
2643          InsnNeedsLabel.insert(MI);
2644        // DBG_VALUE for inlined functions argument needs a label.
2645        else if (!DISubprogram(DV.getContext()).describes(MF->getFunction()))
2646          InsnNeedsLabel.insert(MI);
2647        // DBG_VALUE indicating argument location change needs a label.
2648        else if (!ProcessedArgs.insert(DV))
2649          InsnNeedsLabel.insert(MI);
2650      } else {
2651        // If location is unknown then instruction needs a location only if
2652        // UnknownLocations flag is set.
2653        if (DL.isUnknown()) {
2654          if (UnknownLocations && !PrevLoc.isUnknown())
2655            InsnNeedsLabel.insert(MI);
2656        } else if (DL != PrevLoc)
2657          // Otherwise, instruction needs a location only if it is new location.
2658          InsnNeedsLabel.insert(MI);
2659      }
2660
2661      if (!DL.isUnknown() || UnknownLocations)
2662        PrevLoc = DL;
2663    }
2664
2665  PrevLabel = FunctionBeginSym;
2666}
2667
2668/// endFunction - Gather and emit post-function debug information.
2669///
2670void DwarfDebug::endFunction(const MachineFunction *MF) {
2671  if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2672
2673  if (CurrentFnDbgScope) {
2674
2675    // Define end label for subprogram.
2676    FunctionEndSym = Asm->GetTempSymbol("func_end",
2677                                        Asm->getFunctionNumber());
2678    // Assumes in correct section after the entry point.
2679    Asm->OutStreamer.EmitLabel(FunctionEndSym);
2680
2681    collectVariableInfo(MF);
2682
2683    // Get function line info.
2684    if (!Lines.empty()) {
2685      // Get section line info.
2686      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2687      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2688      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2689      // Append the function info to section info.
2690      SectionLineInfos.insert(SectionLineInfos.end(),
2691                              Lines.begin(), Lines.end());
2692    }
2693
2694    // Construct abstract scopes.
2695    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2696           AE = AbstractScopesList.end(); AI != AE; ++AI)
2697      constructScopeDIE(*AI);
2698
2699    DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2700
2701    if (!DisableFramePointerElim(*MF))
2702      addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2703              dwarf::DW_FORM_flag, 1);
2704
2705
2706    DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2707                                                 MMI->getFrameMoves()));
2708  }
2709
2710  // Clear debug info
2711  CurrentFnDbgScope = NULL;
2712  InsnNeedsLabel.clear();
2713  DbgVariableToFrameIndexMap.clear();
2714  VarToAbstractVarMap.clear();
2715  DbgVariableToDbgInstMap.clear();
2716  DbgVariableLabelsMap.clear();
2717  DeleteContainerSeconds(DbgScopeMap);
2718  InsnsBeginScopeSet.clear();
2719  InsnsEndScopeSet.clear();
2720  ConcreteScopes.clear();
2721  DeleteContainerSeconds(AbstractScopes);
2722  AbstractScopesList.clear();
2723  AbstractVariables.clear();
2724  LabelsBeforeInsn.clear();
2725  LabelsAfterInsn.clear();
2726  Lines.clear();
2727  PrevLabel = NULL;
2728}
2729
2730/// recordVariableFrameIndex - Record a variable's index.
2731void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2732  assert (V && "Invalid DbgVariable!");
2733  DbgVariableToFrameIndexMap[V] = Index;
2734}
2735
2736/// findVariableFrameIndex - Return true if frame index for the variable
2737/// is found. Update FI to hold value of the index.
2738bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2739  assert (V && "Invalid DbgVariable!");
2740  DenseMap<const DbgVariable *, int>::iterator I =
2741    DbgVariableToFrameIndexMap.find(V);
2742  if (I == DbgVariableToFrameIndexMap.end())
2743    return false;
2744  *FI = I->second;
2745  return true;
2746}
2747
2748/// findVariableLabel - Find MCSymbol for the variable.
2749const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2750  DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2751    = DbgVariableLabelsMap.find(V);
2752  if (I == DbgVariableLabelsMap.end())
2753    return NULL;
2754  else return I->second;
2755}
2756
2757/// findDbgScope - Find DbgScope for the debug loc attached with an
2758/// instruction.
2759DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2760  DbgScope *Scope = NULL;
2761  LLVMContext &Ctx =
2762    MInsn->getParent()->getParent()->getFunction()->getContext();
2763  DebugLoc DL = MInsn->getDebugLoc();
2764
2765  if (DL.isUnknown())
2766    return Scope;
2767
2768  if (const MDNode *IA = DL.getInlinedAt(Ctx))
2769    Scope = ConcreteScopes.lookup(IA);
2770  if (Scope == 0)
2771    Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2772
2773  return Scope;
2774}
2775
2776
2777/// recordSourceLine - Register a source line with debug info. Returns the
2778/// unique label that was emitted and which provides correspondence to
2779/// the source line list.
2780MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S) {
2781  StringRef Dir;
2782  StringRef Fn;
2783
2784  unsigned Src = 1;
2785  if (S) {
2786    DIDescriptor Scope(S);
2787
2788    if (Scope.isCompileUnit()) {
2789      DICompileUnit CU(S);
2790      Dir = CU.getDirectory();
2791      Fn = CU.getFilename();
2792    } else if (Scope.isSubprogram()) {
2793      DISubprogram SP(S);
2794      Dir = SP.getDirectory();
2795      Fn = SP.getFilename();
2796    } else if (Scope.isLexicalBlock()) {
2797      DILexicalBlock DB(S);
2798      Dir = DB.getDirectory();
2799      Fn = DB.getFilename();
2800    } else
2801      assert(0 && "Unexpected scope info");
2802
2803    Src = GetOrCreateSourceID(Dir, Fn);
2804  }
2805
2806  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2807  Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2808
2809  Asm->OutStreamer.EmitLabel(Label);
2810  return Label;
2811}
2812
2813//===----------------------------------------------------------------------===//
2814// Emit Methods
2815//===----------------------------------------------------------------------===//
2816
2817/// computeSizeAndOffset - Compute the size and offset of a DIE.
2818///
2819unsigned
2820DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2821  // Get the children.
2822  const std::vector<DIE *> &Children = Die->getChildren();
2823
2824  // If not last sibling and has children then add sibling offset attribute.
2825  if (!Last && !Children.empty())
2826    Die->addSiblingOffset(DIEValueAllocator);
2827
2828  // Record the abbreviation.
2829  assignAbbrevNumber(Die->getAbbrev());
2830
2831  // Get the abbreviation for this DIE.
2832  unsigned AbbrevNumber = Die->getAbbrevNumber();
2833  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2834
2835  // Set DIE offset
2836  Die->setOffset(Offset);
2837
2838  // Start the size with the size of abbreviation code.
2839  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2840
2841  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2842  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2843
2844  // Size the DIE attribute values.
2845  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2846    // Size attribute value.
2847    Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2848
2849  // Size the DIE children if any.
2850  if (!Children.empty()) {
2851    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2852           "Children flag not set");
2853
2854    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2855      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2856
2857    // End of children marker.
2858    Offset += sizeof(int8_t);
2859  }
2860
2861  Die->setSize(Offset - Die->getOffset());
2862  return Offset;
2863}
2864
2865/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2866///
2867void DwarfDebug::computeSizeAndOffsets() {
2868  unsigned PrevOffset = 0;
2869  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2870         E = CUMap.end(); I != E; ++I) {
2871    // Compute size of compile unit header.
2872    static unsigned Offset = PrevOffset +
2873      sizeof(int32_t) + // Length of Compilation Unit Info
2874      sizeof(int16_t) + // DWARF version number
2875      sizeof(int32_t) + // Offset Into Abbrev. Section
2876      sizeof(int8_t);   // Pointer Size (in bytes)
2877    computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2878    PrevOffset = Offset;
2879  }
2880}
2881
2882/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2883/// temporary label to it if SymbolStem is specified.
2884static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2885                                const char *SymbolStem = 0) {
2886  Asm->OutStreamer.SwitchSection(Section);
2887  if (!SymbolStem) return 0;
2888
2889  MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2890  Asm->OutStreamer.EmitLabel(TmpSym);
2891  return TmpSym;
2892}
2893
2894/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2895/// the start of each one.
2896void DwarfDebug::EmitSectionLabels() {
2897  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2898
2899  // Dwarf sections base addresses.
2900  if (Asm->MAI->doesDwarfRequireFrameSection()) {
2901    DwarfFrameSectionSym =
2902      EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2903   }
2904
2905  DwarfInfoSectionSym =
2906    EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2907  DwarfAbbrevSectionSym =
2908    EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2909  EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2910
2911  if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2912    EmitSectionSym(Asm, MacroInfo);
2913
2914  EmitSectionSym(Asm, TLOF.getDwarfLineSection());
2915  EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2916  EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2917  EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2918  DwarfStrSectionSym =
2919    EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2920  DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2921                                             "debug_range");
2922
2923  DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2924                                           "section_debug_loc");
2925
2926  TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2927  EmitSectionSym(Asm, TLOF.getDataSection());
2928}
2929
2930/// emitDIE - Recusively Emits a debug information entry.
2931///
2932void DwarfDebug::emitDIE(DIE *Die) {
2933  // Get the abbreviation for this DIE.
2934  unsigned AbbrevNumber = Die->getAbbrevNumber();
2935  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2936
2937  // Emit the code (index) for the abbreviation.
2938  if (Asm->isVerbose())
2939    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2940                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2941                                Twine::utohexstr(Die->getSize()) + " " +
2942                                dwarf::TagString(Abbrev->getTag()));
2943  Asm->EmitULEB128(AbbrevNumber);
2944
2945  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2946  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2947
2948  // Emit the DIE attribute values.
2949  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2950    unsigned Attr = AbbrevData[i].getAttribute();
2951    unsigned Form = AbbrevData[i].getForm();
2952    assert(Form && "Too many attributes for DIE (check abbreviation)");
2953
2954    if (Asm->isVerbose())
2955      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2956
2957    switch (Attr) {
2958    case dwarf::DW_AT_sibling:
2959      Asm->EmitInt32(Die->getSiblingOffset());
2960      break;
2961    case dwarf::DW_AT_abstract_origin: {
2962      DIEEntry *E = cast<DIEEntry>(Values[i]);
2963      DIE *Origin = E->getEntry();
2964      unsigned Addr = Origin->getOffset();
2965      Asm->EmitInt32(Addr);
2966      break;
2967    }
2968    case dwarf::DW_AT_ranges: {
2969      // DW_AT_range Value encodes offset in debug_range section.
2970      DIEInteger *V = cast<DIEInteger>(Values[i]);
2971      Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2972                                     V->getValue(),
2973                                     DwarfDebugRangeSectionSym,
2974                                     4);
2975      break;
2976    }
2977    case dwarf::DW_AT_location: {
2978      if (UseDotDebugLocEntry.count(Die) != 0) {
2979        DIELabel *L = cast<DIELabel>(Values[i]);
2980        Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
2981      } else
2982        Values[i]->EmitValue(Asm, Form);
2983      break;
2984    }
2985    default:
2986      // Emit an attribute using the defined form.
2987      Values[i]->EmitValue(Asm, Form);
2988      break;
2989    }
2990  }
2991
2992  // Emit the DIE children if any.
2993  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2994    const std::vector<DIE *> &Children = Die->getChildren();
2995
2996    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2997      emitDIE(Children[j]);
2998
2999    if (Asm->isVerbose())
3000      Asm->OutStreamer.AddComment("End Of Children Mark");
3001    Asm->EmitInt8(0);
3002  }
3003}
3004
3005/// emitDebugInfo - Emit the debug info section.
3006///
3007void DwarfDebug::emitDebugInfo() {
3008  // Start debug info section.
3009  Asm->OutStreamer.SwitchSection(
3010                            Asm->getObjFileLowering().getDwarfInfoSection());
3011  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3012         E = CUMap.end(); I != E; ++I) {
3013    CompileUnit *TheCU = I->second;
3014    DIE *Die = TheCU->getCUDie();
3015
3016    // Emit the compile units header.
3017    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3018                                                  TheCU->getID()));
3019
3020    // Emit size of content not including length itself
3021    unsigned ContentSize = Die->getSize() +
3022      sizeof(int16_t) + // DWARF version number
3023      sizeof(int32_t) + // Offset Into Abbrev. Section
3024      sizeof(int8_t) +  // Pointer Size (in bytes)
3025      sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3026
3027    Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3028    Asm->EmitInt32(ContentSize);
3029    Asm->OutStreamer.AddComment("DWARF version number");
3030    Asm->EmitInt16(dwarf::DWARF_VERSION);
3031    Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3032    Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3033                           DwarfAbbrevSectionSym);
3034    Asm->OutStreamer.AddComment("Address Size (in bytes)");
3035    Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3036
3037    emitDIE(Die);
3038    // FIXME - extra padding for gdb bug.
3039    Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3040    Asm->EmitInt8(0);
3041    Asm->EmitInt8(0);
3042    Asm->EmitInt8(0);
3043    Asm->EmitInt8(0);
3044    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3045  }
3046}
3047
3048/// emitAbbreviations - Emit the abbreviation section.
3049///
3050void DwarfDebug::emitAbbreviations() const {
3051  // Check to see if it is worth the effort.
3052  if (!Abbreviations.empty()) {
3053    // Start the debug abbrev section.
3054    Asm->OutStreamer.SwitchSection(
3055                            Asm->getObjFileLowering().getDwarfAbbrevSection());
3056
3057    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3058
3059    // For each abbrevation.
3060    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3061      // Get abbreviation data
3062      const DIEAbbrev *Abbrev = Abbreviations[i];
3063
3064      // Emit the abbrevations code (base 1 index.)
3065      Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3066
3067      // Emit the abbreviations data.
3068      Abbrev->Emit(Asm);
3069    }
3070
3071    // Mark end of abbreviations.
3072    Asm->EmitULEB128(0, "EOM(3)");
3073
3074    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3075  }
3076}
3077
3078/// emitEndOfLineMatrix - Emit the last address of the section and the end of
3079/// the line matrix.
3080///
3081void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3082  // Define last address of section.
3083  Asm->OutStreamer.AddComment("Extended Op");
3084  Asm->EmitInt8(0);
3085
3086  Asm->OutStreamer.AddComment("Op size");
3087  Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3088  Asm->OutStreamer.AddComment("DW_LNE_set_address");
3089  Asm->EmitInt8(dwarf::DW_LNE_set_address);
3090
3091  Asm->OutStreamer.AddComment("Section end label");
3092
3093  Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3094                                   Asm->getTargetData().getPointerSize(),
3095                                   0/*AddrSpace*/);
3096
3097  // Mark end of matrix.
3098  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3099  Asm->EmitInt8(0);
3100  Asm->EmitInt8(1);
3101  Asm->EmitInt8(1);
3102}
3103
3104/// emitDebugLines - Emit source line information.
3105///
3106void DwarfDebug::emitDebugLines() {
3107  // If the target is using .loc/.file, the assembler will be emitting the
3108  // .debug_line table automatically.
3109  if (Asm->MAI->hasDotLocAndDotFile())
3110    return;
3111
3112  // Minimum line delta, thus ranging from -10..(255-10).
3113  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3114  // Maximum line delta, thus ranging from -10..(255-10).
3115  const int MaxLineDelta = 255 + MinLineDelta;
3116
3117  // Start the dwarf line section.
3118  Asm->OutStreamer.SwitchSection(
3119                            Asm->getObjFileLowering().getDwarfLineSection());
3120
3121  // Construct the section header.
3122  Asm->OutStreamer.AddComment("Length of Source Line Info");
3123  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3124                           Asm->GetTempSymbol("line_begin"), 4);
3125  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3126
3127  Asm->OutStreamer.AddComment("DWARF version number");
3128  Asm->EmitInt16(dwarf::DWARF_VERSION);
3129
3130  Asm->OutStreamer.AddComment("Prolog Length");
3131  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3132                           Asm->GetTempSymbol("line_prolog_begin"), 4);
3133  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3134
3135  Asm->OutStreamer.AddComment("Minimum Instruction Length");
3136  Asm->EmitInt8(1);
3137  Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3138  Asm->EmitInt8(1);
3139  Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3140  Asm->EmitInt8(MinLineDelta);
3141  Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3142  Asm->EmitInt8(MaxLineDelta);
3143  Asm->OutStreamer.AddComment("Special Opcode Base");
3144  Asm->EmitInt8(-MinLineDelta);
3145
3146  // Line number standard opcode encodings argument count
3147  Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3148  Asm->EmitInt8(0);
3149  Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3150  Asm->EmitInt8(1);
3151  Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3152  Asm->EmitInt8(1);
3153  Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3154  Asm->EmitInt8(1);
3155  Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3156  Asm->EmitInt8(1);
3157  Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3158  Asm->EmitInt8(0);
3159  Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3160  Asm->EmitInt8(0);
3161  Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3162  Asm->EmitInt8(0);
3163  Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3164  Asm->EmitInt8(1);
3165
3166  // Emit directories.
3167  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3168    const std::string &Dir = getSourceDirectoryName(DI);
3169    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3170    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3171  }
3172
3173  Asm->OutStreamer.AddComment("End of directories");
3174  Asm->EmitInt8(0);
3175
3176  // Emit files.
3177  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3178    // Remember source id starts at 1.
3179    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3180    const std::string &FN = getSourceFileName(Id.second);
3181    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3182    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3183
3184    Asm->EmitULEB128(Id.first, "Directory #");
3185    Asm->EmitULEB128(0, "Mod date");
3186    Asm->EmitULEB128(0, "File size");
3187  }
3188
3189  Asm->OutStreamer.AddComment("End of files");
3190  Asm->EmitInt8(0);
3191
3192  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3193
3194  // A sequence for each text section.
3195  unsigned SecSrcLinesSize = SectionSourceLines.size();
3196
3197  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3198    // Isolate current sections line info.
3199    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3200
3201    // Dwarf assumes we start with first line of first source file.
3202    unsigned Source = 1;
3203    unsigned Line = 1;
3204
3205    // Construct rows of the address, source, line, column matrix.
3206    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3207      const SrcLineInfo &LineInfo = LineInfos[i];
3208      MCSymbol *Label = LineInfo.getLabel();
3209      if (!Label->isDefined()) continue; // Not emitted, in dead code.
3210
3211      if (Asm->isVerbose()) {
3212        std::pair<unsigned, unsigned> SrcID =
3213          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3214        Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3215                                    "/" +
3216                                    Twine(getSourceFileName(SrcID.second)) +
3217                                    ":" + Twine(LineInfo.getLine()));
3218      }
3219
3220      // Define the line address.
3221      Asm->OutStreamer.AddComment("Extended Op");
3222      Asm->EmitInt8(0);
3223      Asm->OutStreamer.AddComment("Op size");
3224      Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3225
3226      Asm->OutStreamer.AddComment("DW_LNE_set_address");
3227      Asm->EmitInt8(dwarf::DW_LNE_set_address);
3228
3229      Asm->OutStreamer.AddComment("Location label");
3230      Asm->OutStreamer.EmitSymbolValue(Label,
3231                                       Asm->getTargetData().getPointerSize(),
3232                                       0/*AddrSpace*/);
3233
3234      // If change of source, then switch to the new source.
3235      if (Source != LineInfo.getSourceID()) {
3236        Source = LineInfo.getSourceID();
3237        Asm->OutStreamer.AddComment("DW_LNS_set_file");
3238        Asm->EmitInt8(dwarf::DW_LNS_set_file);
3239        Asm->EmitULEB128(Source, "New Source");
3240      }
3241
3242      // If change of line.
3243      if (Line != LineInfo.getLine()) {
3244        // Determine offset.
3245        int Offset = LineInfo.getLine() - Line;
3246        int Delta = Offset - MinLineDelta;
3247
3248        // Update line.
3249        Line = LineInfo.getLine();
3250
3251        // If delta is small enough and in range...
3252        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3253          // ... then use fast opcode.
3254          Asm->OutStreamer.AddComment("Line Delta");
3255          Asm->EmitInt8(Delta - MinLineDelta);
3256        } else {
3257          // ... otherwise use long hand.
3258          Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3259          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3260          Asm->EmitSLEB128(Offset, "Line Offset");
3261          Asm->OutStreamer.AddComment("DW_LNS_copy");
3262          Asm->EmitInt8(dwarf::DW_LNS_copy);
3263        }
3264      } else {
3265        // Copy the previous row (different address or source)
3266        Asm->OutStreamer.AddComment("DW_LNS_copy");
3267        Asm->EmitInt8(dwarf::DW_LNS_copy);
3268      }
3269    }
3270
3271    emitEndOfLineMatrix(j + 1);
3272  }
3273
3274  if (SecSrcLinesSize == 0)
3275    // Because we're emitting a debug_line section, we still need a line
3276    // table. The linker and friends expect it to exist. If there's nothing to
3277    // put into it, emit an empty table.
3278    emitEndOfLineMatrix(1);
3279
3280  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3281}
3282
3283/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3284///
3285void DwarfDebug::emitCommonDebugFrame() {
3286  if (!Asm->MAI->doesDwarfRequireFrameSection())
3287    return;
3288
3289  int stackGrowth = Asm->getTargetData().getPointerSize();
3290  if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3291      TargetFrameInfo::StackGrowsDown)
3292    stackGrowth *= -1;
3293
3294  // Start the dwarf frame section.
3295  Asm->OutStreamer.SwitchSection(
3296                              Asm->getObjFileLowering().getDwarfFrameSection());
3297
3298  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3299  Asm->OutStreamer.AddComment("Length of Common Information Entry");
3300  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3301                           Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3302
3303  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3304  Asm->OutStreamer.AddComment("CIE Identifier Tag");
3305  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3306  Asm->OutStreamer.AddComment("CIE Version");
3307  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3308  Asm->OutStreamer.AddComment("CIE Augmentation");
3309  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3310  Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3311  Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3312  Asm->OutStreamer.AddComment("CIE RA Column");
3313  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3314  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3315
3316  std::vector<MachineMove> Moves;
3317  RI->getInitialFrameState(Moves);
3318
3319  Asm->EmitFrameMoves(Moves, 0, false);
3320
3321  Asm->EmitAlignment(2);
3322  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3323}
3324
3325/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3326/// section.
3327void DwarfDebug::
3328emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3329  if (!Asm->MAI->doesDwarfRequireFrameSection())
3330    return;
3331
3332  // Start the dwarf frame section.
3333  Asm->OutStreamer.SwitchSection(
3334                              Asm->getObjFileLowering().getDwarfFrameSection());
3335
3336  Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3337  MCSymbol *DebugFrameBegin =
3338    Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3339  MCSymbol *DebugFrameEnd =
3340    Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3341  Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3342
3343  Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3344
3345  Asm->OutStreamer.AddComment("FDE CIE offset");
3346  Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3347                         DwarfFrameSectionSym);
3348
3349  Asm->OutStreamer.AddComment("FDE initial location");
3350  MCSymbol *FuncBeginSym =
3351    Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3352  Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3353                                   Asm->getTargetData().getPointerSize(),
3354                                   0/*AddrSpace*/);
3355
3356
3357  Asm->OutStreamer.AddComment("FDE address range");
3358  Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3359                           FuncBeginSym, Asm->getTargetData().getPointerSize());
3360
3361  Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3362
3363  Asm->EmitAlignment(2);
3364  Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3365}
3366
3367/// emitDebugPubNames - Emit visible names into a debug pubnames section.
3368///
3369void DwarfDebug::emitDebugPubNames() {
3370  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3371         E = CUMap.end(); I != E; ++I) {
3372    CompileUnit *TheCU = I->second;
3373    // Start the dwarf pubnames section.
3374    Asm->OutStreamer.SwitchSection(
3375      Asm->getObjFileLowering().getDwarfPubNamesSection());
3376
3377    Asm->OutStreamer.AddComment("Length of Public Names Info");
3378    Asm->EmitLabelDifference(
3379      Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3380      Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3381
3382    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3383                                                  TheCU->getID()));
3384
3385    Asm->OutStreamer.AddComment("DWARF Version");
3386    Asm->EmitInt16(dwarf::DWARF_VERSION);
3387
3388    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3389    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3390                           DwarfInfoSectionSym);
3391
3392    Asm->OutStreamer.AddComment("Compilation Unit Length");
3393    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3394                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3395                             4);
3396
3397    const StringMap<DIE*> &Globals = TheCU->getGlobals();
3398    for (StringMap<DIE*>::const_iterator
3399           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3400      const char *Name = GI->getKeyData();
3401      DIE *Entity = GI->second;
3402
3403      Asm->OutStreamer.AddComment("DIE offset");
3404      Asm->EmitInt32(Entity->getOffset());
3405
3406      if (Asm->isVerbose())
3407        Asm->OutStreamer.AddComment("External Name");
3408      Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3409    }
3410
3411    Asm->OutStreamer.AddComment("End Mark");
3412    Asm->EmitInt32(0);
3413    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3414                                                TheCU->getID()));
3415  }
3416}
3417
3418void DwarfDebug::emitDebugPubTypes() {
3419  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3420         E = CUMap.end(); I != E; ++I) {
3421    CompileUnit *TheCU = I->second;
3422    // Start the dwarf pubnames section.
3423    Asm->OutStreamer.SwitchSection(
3424      Asm->getObjFileLowering().getDwarfPubTypesSection());
3425    Asm->OutStreamer.AddComment("Length of Public Types Info");
3426    Asm->EmitLabelDifference(
3427      Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3428      Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3429
3430    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3431                                                  TheCU->getID()));
3432
3433    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3434    Asm->EmitInt16(dwarf::DWARF_VERSION);
3435
3436    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3437    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3438                           DwarfInfoSectionSym);
3439
3440    Asm->OutStreamer.AddComment("Compilation Unit Length");
3441    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3442                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3443                             4);
3444
3445    const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3446    for (StringMap<DIE*>::const_iterator
3447           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3448      const char *Name = GI->getKeyData();
3449      DIE * Entity = GI->second;
3450
3451      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3452      Asm->EmitInt32(Entity->getOffset());
3453
3454      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3455      Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3456    }
3457
3458    Asm->OutStreamer.AddComment("End Mark");
3459    Asm->EmitInt32(0);
3460    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3461                                                  TheCU->getID()));
3462  }
3463}
3464
3465/// emitDebugStr - Emit visible names into a debug str section.
3466///
3467void DwarfDebug::emitDebugStr() {
3468  // Check to see if it is worth the effort.
3469  if (StringPool.empty()) return;
3470
3471  // Start the dwarf str section.
3472  Asm->OutStreamer.SwitchSection(
3473                                Asm->getObjFileLowering().getDwarfStrSection());
3474
3475  // Get all of the string pool entries and put them in an array by their ID so
3476  // we can sort them.
3477  SmallVector<std::pair<unsigned,
3478      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3479
3480  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3481       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3482    Entries.push_back(std::make_pair(I->second.second, &*I));
3483
3484  array_pod_sort(Entries.begin(), Entries.end());
3485
3486  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3487    // Emit a label for reference from debug information entries.
3488    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3489
3490    // Emit the string itself.
3491    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3492  }
3493}
3494
3495/// emitDebugLoc - Emit visible names into a debug loc section.
3496///
3497void DwarfDebug::emitDebugLoc() {
3498  if (DotDebugLocEntries.empty())
3499    return;
3500
3501  // Start the dwarf loc section.
3502  Asm->OutStreamer.SwitchSection(
3503    Asm->getObjFileLowering().getDwarfLocSection());
3504  unsigned char Size = Asm->getTargetData().getPointerSize();
3505  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3506  unsigned index = 1;
3507  for (SmallVector<DotDebugLocEntry, 4>::iterator I = DotDebugLocEntries.begin(),
3508         E = DotDebugLocEntries.end(); I != E; ++I, ++index) {
3509    DotDebugLocEntry Entry = *I;
3510    if (Entry.isEmpty()) {
3511      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3512      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3513      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3514    } else {
3515      Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3516      Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3517      const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3518      unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3519      if (Reg < 32) {
3520        Asm->OutStreamer.AddComment("Loc expr size");
3521        Asm->EmitInt16(1);
3522        Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3523      } else {
3524        Asm->OutStreamer.AddComment("Loc expr size");
3525        Asm->EmitInt16(1+MCAsmInfo::getULEB128Size(Reg));
3526        Asm->EmitInt8(dwarf::DW_OP_regx);
3527        Asm->EmitULEB128(Reg);
3528      }
3529    }
3530  }
3531}
3532
3533/// EmitDebugARanges - Emit visible names into a debug aranges section.
3534///
3535void DwarfDebug::EmitDebugARanges() {
3536  // Start the dwarf aranges section.
3537  Asm->OutStreamer.SwitchSection(
3538                          Asm->getObjFileLowering().getDwarfARangesSection());
3539}
3540
3541/// emitDebugRanges - Emit visible names into a debug ranges section.
3542///
3543void DwarfDebug::emitDebugRanges() {
3544  // Start the dwarf ranges section.
3545  Asm->OutStreamer.SwitchSection(
3546    Asm->getObjFileLowering().getDwarfRangesSection());
3547  unsigned char Size = Asm->getTargetData().getPointerSize();
3548  for (SmallVector<const MCSymbol *, 8>::iterator
3549         I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3550       I != E; ++I) {
3551    if (*I)
3552      Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3553    else
3554      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3555  }
3556}
3557
3558/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3559///
3560void DwarfDebug::emitDebugMacInfo() {
3561  if (const MCSection *LineInfo =
3562      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3563    // Start the dwarf macinfo section.
3564    Asm->OutStreamer.SwitchSection(LineInfo);
3565  }
3566}
3567
3568/// emitDebugInlineInfo - Emit inline info using following format.
3569/// Section Header:
3570/// 1. length of section
3571/// 2. Dwarf version number
3572/// 3. address size.
3573///
3574/// Entries (one "entry" for each function that was inlined):
3575///
3576/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3577///   otherwise offset into __debug_str for regular function name.
3578/// 2. offset into __debug_str section for regular function name.
3579/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3580/// instances for the function.
3581///
3582/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3583/// inlined instance; the die_offset points to the inlined_subroutine die in the
3584/// __debug_info section, and the low_pc is the starting address for the
3585/// inlining instance.
3586void DwarfDebug::emitDebugInlineInfo() {
3587  if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3588    return;
3589
3590  if (!FirstCU)
3591    return;
3592
3593  Asm->OutStreamer.SwitchSection(
3594                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
3595
3596  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3597  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3598                           Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3599
3600  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3601
3602  Asm->OutStreamer.AddComment("Dwarf Version");
3603  Asm->EmitInt16(dwarf::DWARF_VERSION);
3604  Asm->OutStreamer.AddComment("Address Size (in bytes)");
3605  Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3606
3607  for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3608         E = InlinedSPNodes.end(); I != E; ++I) {
3609
3610    const MDNode *Node = *I;
3611    DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3612      = InlineInfo.find(Node);
3613    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3614    DISubprogram SP(Node);
3615    StringRef LName = SP.getLinkageName();
3616    StringRef Name = SP.getName();
3617
3618    Asm->OutStreamer.AddComment("MIPS linkage name");
3619    if (LName.empty()) {
3620      Asm->OutStreamer.EmitBytes(Name, 0);
3621      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3622    } else
3623      Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3624                             DwarfStrSectionSym);
3625
3626    Asm->OutStreamer.AddComment("Function name");
3627    Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3628    Asm->EmitULEB128(Labels.size(), "Inline count");
3629
3630    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3631           LE = Labels.end(); LI != LE; ++LI) {
3632      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3633      Asm->EmitInt32(LI->second->getOffset());
3634
3635      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3636      Asm->OutStreamer.EmitSymbolValue(LI->first,
3637                                       Asm->getTargetData().getPointerSize(),0);
3638    }
3639  }
3640
3641  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3642}
3643