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