DwarfDebug.cpp revision 3221d8addafdf734a26b83c84265e24497154b16
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  assert (DirName.empty() == false && "Invalid directory name!");
1757
1758  StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1759  if (DI != DirectoryIdMap.end()) {
1760    DId = DI->getValue();
1761  } else {
1762    DId = DirectoryNames.size() + 1;
1763    DirectoryIdMap[DirName] = DId;
1764    DirectoryNames.push_back(DirName);
1765  }
1766
1767  unsigned FId;
1768  StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1769  if (FI != SourceFileIdMap.end()) {
1770    FId = FI->getValue();
1771  } else {
1772    FId = SourceFileNames.size() + 1;
1773    SourceFileIdMap[FileName] = FId;
1774    SourceFileNames.push_back(FileName);
1775  }
1776
1777  DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1778    SourceIdMap.find(std::make_pair(DId, FId));
1779  if (SI != SourceIdMap.end())
1780    return SI->second;
1781
1782  unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1783  SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1784  SourceIds.push_back(std::make_pair(DId, FId));
1785
1786  return SrcId;
1787}
1788
1789/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1790DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1791  CompileUnit *TheCU = getCompileUnit(NS);
1792  DIE *NDie = TheCU->getDIE(NS);
1793  if (NDie)
1794    return NDie;
1795  NDie = new DIE(dwarf::DW_TAG_namespace);
1796  TheCU->insertDIE(NS, NDie);
1797  if (!NS.getName().empty())
1798    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1799  addSourceLine(NDie, &NS);
1800  addToContextOwner(NDie, NS.getContext());
1801  return NDie;
1802}
1803
1804/// constructCompileUnit - Create new CompileUnit for the given
1805/// metadata node with tag DW_TAG_compile_unit.
1806void DwarfDebug::constructCompileUnit(const MDNode *N) {
1807  DICompileUnit DIUnit(N);
1808  StringRef FN = DIUnit.getFilename();
1809  StringRef Dir = DIUnit.getDirectory();
1810  unsigned ID = GetOrCreateSourceID(Dir, FN);
1811
1812  DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1813  addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1814            DIUnit.getProducer());
1815  addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1816          DIUnit.getLanguage());
1817  addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1818  // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
1819  // simplifies debug range entries.
1820  addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
1821  // DW_AT_stmt_list is a offset of line number information for this
1822  // compile unit in debug_line section. This offset is calculated
1823  // during endMoudle().
1824  addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
1825
1826  if (!Dir.empty())
1827    addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1828  if (DIUnit.isOptimized())
1829    addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1830
1831  StringRef Flags = DIUnit.getFlags();
1832  if (!Flags.empty())
1833    addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1834
1835  unsigned RVer = DIUnit.getRunTimeVersion();
1836  if (RVer)
1837    addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1838            dwarf::DW_FORM_data1, RVer);
1839
1840  CompileUnit *NewCU = new CompileUnit(ID, Die);
1841  if (!FirstCU)
1842    FirstCU = NewCU;
1843  CUMap.insert(std::make_pair(N, NewCU));
1844}
1845
1846/// getCompielUnit - Get CompileUnit DIE.
1847CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
1848  assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
1849  DIDescriptor D(N);
1850  const MDNode *CUNode = NULL;
1851  if (D.isCompileUnit())
1852    CUNode = N;
1853  else if (D.isSubprogram())
1854    CUNode = DISubprogram(N).getCompileUnit();
1855  else if (D.isType())
1856    CUNode = DIType(N).getCompileUnit();
1857  else if (D.isGlobalVariable())
1858    CUNode = DIGlobalVariable(N).getCompileUnit();
1859  else if (D.isVariable())
1860    CUNode = DIVariable(N).getCompileUnit();
1861  else if (D.isNameSpace())
1862    CUNode = DINameSpace(N).getCompileUnit();
1863  else if (D.isFile())
1864    CUNode = DIFile(N).getCompileUnit();
1865  else
1866    return FirstCU;
1867
1868  DenseMap<const MDNode *, CompileUnit *>::const_iterator I
1869    = CUMap.find(CUNode);
1870  if (I == CUMap.end())
1871    return FirstCU;
1872  return I->second;
1873}
1874
1875
1876/// constructGlobalVariableDIE - Construct global variable DIE.
1877void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
1878  DIGlobalVariable DI_GV(N);
1879
1880  // If debug information is malformed then ignore it.
1881  if (DI_GV.Verify() == false)
1882    return;
1883
1884  // Check for pre-existence.
1885  CompileUnit *TheCU = getCompileUnit(N);
1886  if (TheCU->getDIE(DI_GV))
1887    return;
1888
1889  DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1890  if (!VariableDie)
1891    return;
1892
1893  // Add to map.
1894  TheCU->insertDIE(N, VariableDie);
1895
1896  // Add to context owner.
1897  DIDescriptor GVContext = DI_GV.getContext();
1898  // Do not create specification DIE if context is either compile unit
1899  // or a subprogram.
1900  if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
1901      !GVContext.isFile() &&
1902      !isSubprogramContext(GVContext)) {
1903    // Create specification DIE.
1904    DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1905    addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1906                dwarf::DW_FORM_ref4, VariableDie);
1907    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1908    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1909    addLabel(Block, 0, dwarf::DW_FORM_udata,
1910             Asm->Mang->getSymbol(DI_GV.getGlobal()));
1911    addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1912    addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1913    TheCU->addDie(VariableSpecDIE);
1914  } else {
1915    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1916    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1917    addLabel(Block, 0, dwarf::DW_FORM_udata,
1918             Asm->Mang->getSymbol(DI_GV.getGlobal()));
1919    addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1920  }
1921  addToContextOwner(VariableDie, GVContext);
1922
1923  // Expose as global. FIXME - need to check external flag.
1924  TheCU->addGlobal(DI_GV.getName(), VariableDie);
1925
1926  DIType GTy = DI_GV.getType();
1927  if (GTy.isCompositeType() && !GTy.getName().empty()
1928      && !GTy.isForwardDecl()) {
1929    DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1930    assert(Entry && "Missing global type!");
1931    TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1932  }
1933  return;
1934}
1935
1936/// construct SubprogramDIE - Construct subprogram DIE.
1937void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1938  DISubprogram SP(N);
1939
1940  // Check for pre-existence.
1941  CompileUnit *TheCU = getCompileUnit(N);
1942  if (TheCU->getDIE(N))
1943    return;
1944
1945  if (!SP.isDefinition())
1946    // This is a method declaration which will be handled while constructing
1947    // class type.
1948    return;
1949
1950  DIE *SubprogramDie = createSubprogramDIE(SP);
1951
1952  // Add to map.
1953  TheCU->insertDIE(N, SubprogramDie);
1954
1955  // Add to context owner.
1956  addToContextOwner(SubprogramDie, SP.getContext());
1957
1958  // Expose as global.
1959  TheCU->addGlobal(SP.getName(), SubprogramDie);
1960
1961  return;
1962}
1963
1964/// beginModule - Emit all Dwarf sections that should come prior to the
1965/// content. Create global DIEs and emit initial debug info sections.
1966/// This is inovked by the target AsmPrinter.
1967void DwarfDebug::beginModule(Module *M) {
1968  if (DisableDebugInfoPrinting)
1969    return;
1970
1971  DebugInfoFinder DbgFinder;
1972  DbgFinder.processModule(*M);
1973
1974  bool HasDebugInfo = false;
1975
1976  // Scan all the compile-units to see if there are any marked as the main unit.
1977  // if not, we do not generate debug info.
1978  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1979       E = DbgFinder.compile_unit_end(); I != E; ++I) {
1980    if (DICompileUnit(*I).isMain()) {
1981      HasDebugInfo = true;
1982      break;
1983    }
1984  }
1985
1986  if (!HasDebugInfo) return;
1987
1988  // Tell MMI that we have debug info.
1989  MMI->setDebugInfoAvailability(true);
1990
1991  // Emit initial sections.
1992  EmitSectionLabels();
1993
1994  // Create all the compile unit DIEs.
1995  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1996         E = DbgFinder.compile_unit_end(); I != E; ++I)
1997    constructCompileUnit(*I);
1998
1999  // Create DIEs for each subprogram.
2000  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
2001         E = DbgFinder.subprogram_end(); I != E; ++I)
2002    constructSubprogramDIE(*I);
2003
2004  // Create DIEs for each global variable.
2005  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
2006         E = DbgFinder.global_variable_end(); I != E; ++I)
2007    constructGlobalVariableDIE(*I);
2008
2009  // Prime section data.
2010  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
2011
2012  // Print out .file directives to specify files for .loc directives. These are
2013  // printed out early so that they precede any .loc directives.
2014  if (Asm->MAI->hasDotLocAndDotFile()) {
2015    for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
2016      // Remember source id starts at 1.
2017      std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
2018      // FIXME: don't use sys::path for this!  This should not depend on the
2019      // host.
2020      sys::Path FullPath(getSourceDirectoryName(Id.first));
2021      bool AppendOk =
2022        FullPath.appendComponent(getSourceFileName(Id.second));
2023      assert(AppendOk && "Could not append filename to directory!");
2024      AppendOk = false;
2025      Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
2026    }
2027  }
2028}
2029
2030/// endModule - Emit all Dwarf sections that should come after the content.
2031///
2032void DwarfDebug::endModule() {
2033  if (!FirstCU) return;
2034  const Module *M = MMI->getModule();
2035  DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
2036  if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
2037    for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
2038      if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
2039      DISubprogram SP(AllSPs->getOperand(SI));
2040      if (!SP.Verify()) continue;
2041
2042      // Collect info for variables that were optimized out.
2043      if (!SP.isDefinition()) continue;
2044      StringRef FName = SP.getLinkageName();
2045      if (FName.empty())
2046        FName = SP.getName();
2047      NamedMDNode *NMD =
2048        M->getNamedMetadata(Twine("llvm.dbg.lv.", getRealLinkageName(FName)));
2049      if (!NMD) continue;
2050      unsigned E = NMD->getNumOperands();
2051      if (!E) continue;
2052      DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
2053      DeadFnScopeMap[SP] = Scope;
2054      for (unsigned I = 0; I != E; ++I) {
2055        DIVariable DV(NMD->getOperand(I));
2056        if (!DV.Verify()) continue;
2057        Scope->addVariable(new DbgVariable(DV));
2058      }
2059
2060      // Construct subprogram DIE and add variables DIEs.
2061      constructSubprogramDIE(SP);
2062      DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
2063      const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
2064      for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
2065        DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
2066        if (VariableDIE)
2067          ScopeDIE->addChild(VariableDIE);
2068      }
2069    }
2070  }
2071
2072  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
2073  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
2074         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
2075    DIE *ISP = *AI;
2076    addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
2077  }
2078
2079  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
2080         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
2081    DIE *SPDie = CI->first;
2082    const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
2083    if (!N) continue;
2084    DIE *NDie = getCompileUnit(N)->getDIE(N);
2085    if (!NDie) continue;
2086    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
2087  }
2088
2089  // Standard sections final addresses.
2090  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
2091  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
2092  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
2093  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
2094
2095  // End text sections.
2096  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
2097    Asm->OutStreamer.SwitchSection(SectionMap[i]);
2098    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
2099  }
2100
2101  // Emit common frame information.
2102  emitCommonDebugFrame();
2103
2104  // Emit function debug frame information
2105  for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
2106         E = DebugFrames.end(); I != E; ++I)
2107    emitFunctionDebugFrame(*I);
2108
2109  // Compute DIE offsets and sizes.
2110  computeSizeAndOffsets();
2111
2112  // Emit source line correspondence into a debug line section.
2113  emitDebugLines();
2114
2115  // Emit all the DIEs into a debug info section
2116  emitDebugInfo();
2117
2118  // Corresponding abbreviations into a abbrev section.
2119  emitAbbreviations();
2120
2121  // Emit info into a debug pubnames section.
2122  emitDebugPubNames();
2123
2124  // Emit info into a debug pubtypes section.
2125  emitDebugPubTypes();
2126
2127  // Emit info into a debug loc section.
2128  emitDebugLoc();
2129
2130  // Emit info into a debug aranges section.
2131  EmitDebugARanges();
2132
2133  // Emit info into a debug ranges section.
2134  emitDebugRanges();
2135
2136  // Emit info into a debug macinfo section.
2137  emitDebugMacInfo();
2138
2139  // Emit inline info.
2140  emitDebugInlineInfo();
2141
2142  // Emit info into a debug str section.
2143  emitDebugStr();
2144
2145  // clean up.
2146  DeleteContainerSeconds(DeadFnScopeMap);
2147  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2148         E = CUMap.end(); I != E; ++I)
2149    delete I->second;
2150  FirstCU = NULL;  // Reset for the next Module, if any.
2151}
2152
2153/// findAbstractVariable - Find abstract variable, if any, associated with Var.
2154DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
2155                                              DebugLoc ScopeLoc) {
2156
2157  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
2158  if (AbsDbgVariable)
2159    return AbsDbgVariable;
2160
2161  LLVMContext &Ctx = Var->getContext();
2162  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
2163  if (!Scope)
2164    return NULL;
2165
2166  AbsDbgVariable = new DbgVariable(Var);
2167  Scope->addVariable(AbsDbgVariable);
2168  AbstractVariables[Var] = AbsDbgVariable;
2169  return AbsDbgVariable;
2170}
2171
2172/// collectVariableInfoFromMMITable - Collect variable information from
2173/// side table maintained by MMI.
2174void
2175DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
2176                                   SmallPtrSet<const MDNode *, 16> &Processed) {
2177  const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2178  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
2179  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
2180         VE = VMap.end(); VI != VE; ++VI) {
2181    const MDNode *Var = VI->first;
2182    if (!Var) continue;
2183    Processed.insert(Var);
2184    DIVariable DV(Var);
2185    const std::pair<unsigned, DebugLoc> &VP = VI->second;
2186
2187    DbgScope *Scope = 0;
2188    if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
2189      Scope = ConcreteScopes.lookup(IA);
2190    if (Scope == 0)
2191      Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
2192
2193    // If variable scope is not found then skip this variable.
2194    if (Scope == 0)
2195      continue;
2196
2197    DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
2198    DbgVariable *RegVar = new DbgVariable(DV);
2199    recordVariableFrameIndex(RegVar, VP.first);
2200    Scope->addVariable(RegVar);
2201    if (AbsDbgVariable) {
2202      recordVariableFrameIndex(AbsDbgVariable, VP.first);
2203      VarToAbstractVarMap[RegVar] = AbsDbgVariable;
2204    }
2205  }
2206}
2207
2208/// isDbgValueInUndefinedReg - Return true if debug value, encoded by
2209/// DBG_VALUE instruction, is in undefined reg.
2210static bool isDbgValueInUndefinedReg(const MachineInstr *MI) {
2211  assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2212  if (MI->getOperand(0).isReg() && !MI->getOperand(0).getReg())
2213    return true;
2214  return false;
2215}
2216
2217/// isDbgValueInDefinedReg - Return true if debug value, encoded by
2218/// DBG_VALUE instruction, is in a defined reg.
2219static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
2220  assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
2221  if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg())
2222    return true;
2223  return false;
2224}
2225
2226/// collectVariableInfo - Populate DbgScope entries with variables' info.
2227void
2228DwarfDebug::collectVariableInfo(const MachineFunction *MF,
2229                                SmallPtrSet<const MDNode *, 16> &Processed) {
2230
2231  /// collection info from MMI table.
2232  collectVariableInfoFromMMITable(MF, Processed);
2233
2234  SmallVector<const MachineInstr *, 8> DbgValues;
2235  // Collect variable information from DBG_VALUE machine instructions;
2236  for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2237       I != E; ++I)
2238    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2239         II != IE; ++II) {
2240      const MachineInstr *MInsn = II;
2241      if (!MInsn->isDebugValue() || isDbgValueInUndefinedReg(MInsn))
2242        continue;
2243      DbgValues.push_back(MInsn);
2244    }
2245
2246  // This is a collection of DBV_VALUE instructions describing same variable.
2247  SmallVector<const MachineInstr *, 4> MultipleValues;
2248  for(SmallVector<const MachineInstr *, 8>::iterator I = DbgValues.begin(),
2249        E = DbgValues.end(); I != E; ++I) {
2250    const MachineInstr *MInsn = *I;
2251    MultipleValues.clear();
2252    if (isDbgValueInDefinedReg(MInsn))
2253      MultipleValues.push_back(MInsn);
2254    DIVariable DV(MInsn->getOperand(MInsn->getNumOperands() - 1).getMetadata());
2255    if (Processed.count(DV) != 0)
2256      continue;
2257
2258    const MachineInstr *PrevMI = MInsn;
2259    for (SmallVector<const MachineInstr *, 8>::iterator MI = I+1,
2260           ME = DbgValues.end(); MI != ME; ++MI) {
2261      const MDNode *Var =
2262        (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
2263      if (Var == DV && isDbgValueInDefinedReg(*MI) &&
2264          !PrevMI->isIdenticalTo(*MI))
2265        MultipleValues.push_back(*MI);
2266      PrevMI = *MI;
2267    }
2268
2269    DbgScope *Scope = findDbgScope(MInsn);
2270    bool CurFnArg = false;
2271    if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
2272        DISubprogram(DV.getContext()).describes(MF->getFunction()))
2273      CurFnArg = true;
2274    if (!Scope && CurFnArg)
2275      Scope = CurrentFnDbgScope;
2276    // If variable scope is not found then skip this variable.
2277    if (!Scope)
2278      continue;
2279
2280    Processed.insert(DV);
2281    DbgVariable *RegVar = new DbgVariable(DV);
2282    Scope->addVariable(RegVar);
2283    if (!CurFnArg)
2284      DbgVariableLabelsMap[RegVar] = getLabelBeforeInsn(MInsn);
2285    if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
2286      DbgVariableToDbgInstMap[AbsVar] = MInsn;
2287      VarToAbstractVarMap[RegVar] = AbsVar;
2288    }
2289    if (MultipleValues.size() <= 1) {
2290      DbgVariableToDbgInstMap[RegVar] = MInsn;
2291      continue;
2292    }
2293
2294    // handle multiple DBG_VALUE instructions describing one variable.
2295    if (DotDebugLocEntries.empty())
2296      RegVar->setDotDebugLocOffset(0);
2297    else
2298      RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
2299    const MachineInstr *Begin = NULL;
2300    const MachineInstr *End = NULL;
2301    for (SmallVector<const MachineInstr *, 4>::iterator
2302           MVI = MultipleValues.begin(), MVE = MultipleValues.end();
2303         MVI != MVE; ++MVI) {
2304      if (!Begin) {
2305        Begin = *MVI;
2306        continue;
2307      }
2308      End = *MVI;
2309      MachineLocation MLoc;
2310      if (Begin->getNumOperands() == 3) {
2311        if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2312          MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2313      } else
2314        MLoc = Asm->getDebugValueLocation(Begin);
2315
2316      const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
2317      const MCSymbol *SLabel = getLabelBeforeInsn(End);
2318      DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
2319      Begin = End;
2320      if (MVI + 1 == MVE) {
2321        // If End is the last instruction then its value is valid
2322        // until the end of the funtion.
2323        MachineLocation EMLoc;
2324        if (End->getNumOperands() == 3) {
2325          if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm())
2326          EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
2327        } else
2328          EMLoc = Asm->getDebugValueLocation(End);
2329        DotDebugLocEntries.
2330          push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc));
2331      }
2332    }
2333    DotDebugLocEntries.push_back(DotDebugLocEntry());
2334  }
2335
2336  // Collect info for variables that were optimized out.
2337  const Function *F = MF->getFunction();
2338  const Module *M = F->getParent();
2339  if (NamedMDNode *NMD =
2340      M->getNamedMetadata(Twine("llvm.dbg.lv.",
2341                                getRealLinkageName(F->getName())))) {
2342    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2343      DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2344      if (!DV || !Processed.insert(DV))
2345        continue;
2346      DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
2347      if (Scope)
2348        Scope->addVariable(new DbgVariable(DV));
2349    }
2350  }
2351}
2352
2353/// getLabelBeforeInsn - Return Label preceding the instruction.
2354const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
2355  DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2356    LabelsBeforeInsn.find(MI);
2357  if (I == LabelsBeforeInsn.end())
2358    // FunctionBeginSym always preceeds all the instruction in current function.
2359    return FunctionBeginSym;
2360  return I->second;
2361}
2362
2363/// getLabelAfterInsn - Return Label immediately following the instruction.
2364const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
2365  DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
2366    LabelsAfterInsn.find(MI);
2367  if (I == LabelsAfterInsn.end())
2368    return NULL;
2369  return I->second;
2370}
2371
2372/// beginScope - Process beginning of a scope.
2373void DwarfDebug::beginScope(const MachineInstr *MI) {
2374  if (InsnNeedsLabel.count(MI) == 0) {
2375    LabelsBeforeInsn[MI] = PrevLabel;
2376    return;
2377  }
2378
2379  // Check location.
2380  DebugLoc DL = MI->getDebugLoc();
2381  if (!DL.isUnknown()) {
2382    const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
2383    PrevLabel = recordSourceLine(DL.getLine(), DL.getCol(), Scope);
2384    PrevInstLoc = DL;
2385    LabelsBeforeInsn[MI] = PrevLabel;
2386    return;
2387  }
2388
2389  // If location is unknown then use temp label for this DBG_VALUE
2390  // instruction.
2391  if (MI->isDebugValue()) {
2392    PrevLabel = MMI->getContext().CreateTempSymbol();
2393    Asm->OutStreamer.EmitLabel(PrevLabel);
2394    LabelsBeforeInsn[MI] = PrevLabel;
2395    return;
2396  }
2397
2398  if (UnknownLocations) {
2399    PrevLabel = recordSourceLine(0, 0, 0);
2400    LabelsBeforeInsn[MI] = PrevLabel;
2401    return;
2402  }
2403
2404  assert (0 && "Instruction is not processed!");
2405}
2406
2407/// endScope - Process end of a scope.
2408void DwarfDebug::endScope(const MachineInstr *MI) {
2409  if (InsnsEndScopeSet.count(MI) != 0) {
2410    // Emit a label if this instruction ends a scope.
2411    MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2412    Asm->OutStreamer.EmitLabel(Label);
2413    LabelsAfterInsn[MI] = Label;
2414  }
2415}
2416
2417/// getOrCreateDbgScope - Create DbgScope for the scope.
2418DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
2419                                          const MDNode *InlinedAt) {
2420  if (!InlinedAt) {
2421    DbgScope *WScope = DbgScopeMap.lookup(Scope);
2422    if (WScope)
2423      return WScope;
2424    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
2425    DbgScopeMap.insert(std::make_pair(Scope, WScope));
2426    if (DIDescriptor(Scope).isLexicalBlock()) {
2427      DbgScope *Parent =
2428        getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
2429      WScope->setParent(Parent);
2430      Parent->addScope(WScope);
2431    }
2432
2433    if (!WScope->getParent()) {
2434      StringRef SPName = DISubprogram(Scope).getLinkageName();
2435      // We used to check only for a linkage name, but that fails
2436      // since we began omitting the linkage name for private
2437      // functions.  The new way is to check for the name in metadata,
2438      // but that's not supported in old .ll test cases.  Ergo, we
2439      // check both.
2440      if (SPName == Asm->MF->getFunction()->getName() ||
2441          DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
2442        CurrentFnDbgScope = WScope;
2443    }
2444
2445    return WScope;
2446  }
2447
2448  getOrCreateAbstractScope(Scope);
2449  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
2450  if (WScope)
2451    return WScope;
2452
2453  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2454  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2455  DILocation DL(InlinedAt);
2456  DbgScope *Parent =
2457    getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
2458  WScope->setParent(Parent);
2459  Parent->addScope(WScope);
2460
2461  ConcreteScopes[InlinedAt] = WScope;
2462
2463  return WScope;
2464}
2465
2466/// hasValidLocation - Return true if debug location entry attached with
2467/// machine instruction encodes valid location info.
2468static bool hasValidLocation(LLVMContext &Ctx,
2469                             const MachineInstr *MInsn,
2470                             const MDNode *&Scope, const MDNode *&InlinedAt) {
2471  DebugLoc DL = MInsn->getDebugLoc();
2472  if (DL.isUnknown()) return false;
2473
2474  const MDNode *S = DL.getScope(Ctx);
2475
2476  // There is no need to create another DIE for compile unit. For all
2477  // other scopes, create one DbgScope now. This will be translated
2478  // into a scope DIE at the end.
2479  if (DIScope(S).isCompileUnit()) return false;
2480
2481  Scope = S;
2482  InlinedAt = DL.getInlinedAt(Ctx);
2483  return true;
2484}
2485
2486/// calculateDominanceGraph - Calculate dominance graph for DbgScope
2487/// hierarchy.
2488static void calculateDominanceGraph(DbgScope *Scope) {
2489  assert (Scope && "Unable to calculate scop edominance graph!");
2490  SmallVector<DbgScope *, 4> WorkStack;
2491  WorkStack.push_back(Scope);
2492  unsigned Counter = 0;
2493  while (!WorkStack.empty()) {
2494    DbgScope *WS = WorkStack.back();
2495    const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
2496    bool visitedChildren = false;
2497    for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2498           SE = Children.end(); SI != SE; ++SI) {
2499      DbgScope *ChildScope = *SI;
2500      if (!ChildScope->getDFSOut()) {
2501        WorkStack.push_back(ChildScope);
2502        visitedChildren = true;
2503        ChildScope->setDFSIn(++Counter);
2504        break;
2505      }
2506    }
2507    if (!visitedChildren) {
2508      WorkStack.pop_back();
2509      WS->setDFSOut(++Counter);
2510    }
2511  }
2512}
2513
2514/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
2515static
2516void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
2517                       DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
2518{
2519#ifndef NDEBUG
2520  unsigned PrevDFSIn = 0;
2521  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2522       I != E; ++I) {
2523    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2524         II != IE; ++II) {
2525      const MachineInstr *MInsn = II;
2526      const MDNode *Scope = NULL;
2527      const MDNode *InlinedAt = NULL;
2528
2529      // Check if instruction has valid location information.
2530      if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2531        dbgs() << " [ ";
2532        if (InlinedAt)
2533          dbgs() << "*";
2534        DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
2535          MI2ScopeMap.find(MInsn);
2536        if (DI != MI2ScopeMap.end()) {
2537          DbgScope *S = DI->second;
2538          dbgs() << S->getDFSIn();
2539          PrevDFSIn = S->getDFSIn();
2540        } else
2541          dbgs() << PrevDFSIn;
2542      } else
2543        dbgs() << " [ x" << PrevDFSIn;
2544      dbgs() << " ]";
2545      MInsn->dump();
2546    }
2547    dbgs() << "\n";
2548  }
2549#endif
2550}
2551/// extractScopeInformation - Scan machine instructions in this function
2552/// and collect DbgScopes. Return true, if at least one scope was found.
2553bool DwarfDebug::extractScopeInformation() {
2554  // If scope information was extracted using .dbg intrinsics then there is not
2555  // any need to extract these information by scanning each instruction.
2556  if (!DbgScopeMap.empty())
2557    return false;
2558
2559  // Scan each instruction and create scopes. First build working set of scopes.
2560  LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
2561  SmallVector<DbgRange, 4> MIRanges;
2562  DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
2563  const MDNode *PrevScope = NULL;
2564  const MDNode *PrevInlinedAt = NULL;
2565  const MachineInstr *RangeBeginMI = NULL;
2566  const MachineInstr *PrevMI = NULL;
2567  for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
2568       I != E; ++I) {
2569    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2570         II != IE; ++II) {
2571      const MachineInstr *MInsn = II;
2572      const MDNode *Scope = NULL;
2573      const MDNode *InlinedAt = NULL;
2574
2575      // Check if instruction has valid location information.
2576      if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
2577        PrevMI = MInsn;
2578        continue;
2579      }
2580
2581      // If scope has not changed then skip this instruction.
2582      if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
2583        PrevMI = MInsn;
2584        continue;
2585      }
2586
2587      if (RangeBeginMI) {
2588        // If we have alread seen a beginning of a instruction range and
2589        // current instruction scope does not match scope of first instruction
2590        // in this range then create a new instruction range.
2591        DbgRange R(RangeBeginMI, PrevMI);
2592        MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
2593                                                        PrevInlinedAt);
2594        MIRanges.push_back(R);
2595      }
2596
2597      // This is a beginning of a new instruction range.
2598      RangeBeginMI = MInsn;
2599
2600      // Reset previous markers.
2601      PrevMI = MInsn;
2602      PrevScope = Scope;
2603      PrevInlinedAt = InlinedAt;
2604    }
2605  }
2606
2607  // Create last instruction range.
2608  if (RangeBeginMI && PrevMI && PrevScope) {
2609    DbgRange R(RangeBeginMI, PrevMI);
2610    MIRanges.push_back(R);
2611    MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
2612  }
2613
2614  if (!CurrentFnDbgScope)
2615    return false;
2616
2617  calculateDominanceGraph(CurrentFnDbgScope);
2618  if (PrintDbgScope)
2619    printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
2620
2621  // Find ranges of instructions covered by each DbgScope;
2622  DbgScope *PrevDbgScope = NULL;
2623  for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
2624         RE = MIRanges.end(); RI != RE; ++RI) {
2625    const DbgRange &R = *RI;
2626    DbgScope *S = MI2ScopeMap.lookup(R.first);
2627    assert (S && "Lost DbgScope for a machine instruction!");
2628    if (PrevDbgScope && !PrevDbgScope->dominates(S))
2629      PrevDbgScope->closeInsnRange(S);
2630    S->openInsnRange(R.first);
2631    S->extendInsnRange(R.second);
2632    PrevDbgScope = S;
2633  }
2634
2635  if (PrevDbgScope)
2636    PrevDbgScope->closeInsnRange();
2637
2638  identifyScopeMarkers();
2639
2640  return !DbgScopeMap.empty();
2641}
2642
2643/// identifyScopeMarkers() -
2644/// Each DbgScope has first instruction and last instruction to mark beginning
2645/// and end of a scope respectively. Create an inverse map that list scopes
2646/// starts (and ends) with an instruction. One instruction may start (or end)
2647/// multiple scopes. Ignore scopes that are not reachable.
2648void DwarfDebug::identifyScopeMarkers() {
2649  SmallVector<DbgScope *, 4> WorkList;
2650  WorkList.push_back(CurrentFnDbgScope);
2651  while (!WorkList.empty()) {
2652    DbgScope *S = WorkList.pop_back_val();
2653
2654    const SmallVector<DbgScope *, 4> &Children = S->getScopes();
2655    if (!Children.empty())
2656      for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
2657             SE = Children.end(); SI != SE; ++SI)
2658        WorkList.push_back(*SI);
2659
2660    if (S->isAbstractScope())
2661      continue;
2662
2663    const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
2664    if (Ranges.empty())
2665      continue;
2666    for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
2667           RE = Ranges.end(); RI != RE; ++RI) {
2668      assert(RI->first && "DbgRange does not have first instruction!");
2669      assert(RI->second && "DbgRange does not have second instruction!");
2670      InsnsEndScopeSet.insert(RI->second);
2671    }
2672  }
2673}
2674
2675/// FindFirstDebugLoc - Find the first debug location in the function. This
2676/// is intended to be an approximation for the source position of the
2677/// beginning of the function.
2678static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
2679  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2680       I != E; ++I)
2681    for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
2682         MBBI != MBBE; ++MBBI) {
2683      DebugLoc DL = MBBI->getDebugLoc();
2684      if (!DL.isUnknown())
2685        return DL;
2686    }
2687  return DebugLoc();
2688}
2689
2690/// beginFunction - Gather pre-function debug information.  Assumes being
2691/// emitted immediately after the function entry point.
2692void DwarfDebug::beginFunction(const MachineFunction *MF) {
2693  if (!MMI->hasDebugInfo()) return;
2694  if (!extractScopeInformation()) return;
2695
2696  FunctionBeginSym = Asm->GetTempSymbol("func_begin",
2697                                        Asm->getFunctionNumber());
2698  // Assumes in correct section after the entry point.
2699  Asm->OutStreamer.EmitLabel(FunctionBeginSym);
2700
2701  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2702  // function.
2703  DebugLoc FDL = FindFirstDebugLoc(MF);
2704  if (FDL.isUnknown()) return;
2705
2706  const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
2707  const MDNode *TheScope = 0;
2708
2709  DISubprogram SP = getDISubprogram(Scope);
2710  unsigned Line, Col;
2711  if (SP.Verify()) {
2712    Line = SP.getLineNumber();
2713    Col = 0;
2714    TheScope = SP;
2715  } else {
2716    Line = FDL.getLine();
2717    Col = FDL.getCol();
2718    TheScope = Scope;
2719  }
2720
2721  recordSourceLine(Line, Col, TheScope);
2722
2723  /// ProcessedArgs - Collection of arguments already processed.
2724  SmallPtrSet<const MDNode *, 8> ProcessedArgs;
2725
2726  DebugLoc PrevLoc;
2727  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2728       I != E; ++I)
2729    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2730         II != IE; ++II) {
2731      const MachineInstr *MI = II;
2732      DebugLoc DL = MI->getDebugLoc();
2733      if (MI->isDebugValue()) {
2734        assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
2735        DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
2736        if (!DV.Verify()) continue;
2737        // If DBG_VALUE is for a local variable then it needs a label.
2738        if (DV.getTag() != dwarf::DW_TAG_arg_variable
2739            && isDbgValueInUndefinedReg(MI) == false)
2740          InsnNeedsLabel.insert(MI);
2741        // DBG_VALUE for inlined functions argument needs a label.
2742        else if (!DISubprogram(getDISubprogram(DV.getContext())).
2743                 describes(MF->getFunction()))
2744          InsnNeedsLabel.insert(MI);
2745        // DBG_VALUE indicating argument location change needs a label.
2746        else if (isDbgValueInUndefinedReg(MI) == false
2747                 && !ProcessedArgs.insert(DV))
2748          InsnNeedsLabel.insert(MI);
2749      } else {
2750        // If location is unknown then instruction needs a location only if
2751        // UnknownLocations flag is set.
2752        if (DL.isUnknown()) {
2753          if (UnknownLocations && !PrevLoc.isUnknown())
2754            InsnNeedsLabel.insert(MI);
2755        } else if (DL != PrevLoc)
2756          // Otherwise, instruction needs a location only if it is new location.
2757          InsnNeedsLabel.insert(MI);
2758      }
2759
2760      if (!DL.isUnknown() || UnknownLocations)
2761        PrevLoc = DL;
2762    }
2763
2764  PrevLabel = FunctionBeginSym;
2765}
2766
2767/// endFunction - Gather and emit post-function debug information.
2768///
2769void DwarfDebug::endFunction(const MachineFunction *MF) {
2770  if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2771
2772  if (CurrentFnDbgScope) {
2773
2774    // Define end label for subprogram.
2775    FunctionEndSym = Asm->GetTempSymbol("func_end",
2776                                        Asm->getFunctionNumber());
2777    // Assumes in correct section after the entry point.
2778    Asm->OutStreamer.EmitLabel(FunctionEndSym);
2779
2780    SmallPtrSet<const MDNode *, 16> ProcessedVars;
2781    collectVariableInfo(MF, ProcessedVars);
2782
2783    // Get function line info.
2784    if (!Lines.empty()) {
2785      // Get section line info.
2786      unsigned ID = SectionMap.insert(Asm->getCurrentSection());
2787      if (SectionSourceLines.size() < ID) SectionSourceLines.resize(ID);
2788      std::vector<SrcLineInfo> &SectionLineInfos = SectionSourceLines[ID-1];
2789      // Append the function info to section info.
2790      SectionLineInfos.insert(SectionLineInfos.end(),
2791                              Lines.begin(), Lines.end());
2792    }
2793
2794    // Construct abstract scopes.
2795    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2796           AE = AbstractScopesList.end(); AI != AE; ++AI) {
2797      DISubprogram SP((*AI)->getScopeNode());
2798      if (SP.Verify()) {
2799        // Collect info for variables that were optimized out.
2800        StringRef FName = SP.getLinkageName();
2801        if (FName.empty())
2802          FName = SP.getName();
2803        const Module *M = MF->getFunction()->getParent();
2804        if (NamedMDNode *NMD =
2805            M->getNamedMetadata(Twine("llvm.dbg.lv.",
2806                                      getRealLinkageName(FName)))) {
2807          for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2808          DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2809          if (!DV || !ProcessedVars.insert(DV))
2810            continue;
2811          DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2812          if (Scope)
2813            Scope->addVariable(new DbgVariable(DV));
2814          }
2815        }
2816      }
2817      if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2818        constructScopeDIE(*AI);
2819    }
2820
2821    DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2822
2823    if (!DisableFramePointerElim(*MF))
2824      addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
2825              dwarf::DW_FORM_flag, 1);
2826
2827
2828    DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2829                                                 MMI->getFrameMoves()));
2830  }
2831
2832  // Clear debug info
2833  CurrentFnDbgScope = NULL;
2834  InsnNeedsLabel.clear();
2835  DbgVariableToFrameIndexMap.clear();
2836  VarToAbstractVarMap.clear();
2837  DbgVariableToDbgInstMap.clear();
2838  DbgVariableLabelsMap.clear();
2839  DeleteContainerSeconds(DbgScopeMap);
2840  InsnsEndScopeSet.clear();
2841  ConcreteScopes.clear();
2842  DeleteContainerSeconds(AbstractScopes);
2843  AbstractScopesList.clear();
2844  AbstractVariables.clear();
2845  LabelsBeforeInsn.clear();
2846  LabelsAfterInsn.clear();
2847  Lines.clear();
2848  PrevLabel = NULL;
2849}
2850
2851/// recordVariableFrameIndex - Record a variable's index.
2852void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2853  assert (V && "Invalid DbgVariable!");
2854  DbgVariableToFrameIndexMap[V] = Index;
2855}
2856
2857/// findVariableFrameIndex - Return true if frame index for the variable
2858/// is found. Update FI to hold value of the index.
2859bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2860  assert (V && "Invalid DbgVariable!");
2861  DenseMap<const DbgVariable *, int>::iterator I =
2862    DbgVariableToFrameIndexMap.find(V);
2863  if (I == DbgVariableToFrameIndexMap.end())
2864    return false;
2865  *FI = I->second;
2866  return true;
2867}
2868
2869/// findVariableLabel - Find MCSymbol for the variable.
2870const MCSymbol *DwarfDebug::findVariableLabel(const DbgVariable *V) {
2871  DenseMap<const DbgVariable *, const MCSymbol *>::iterator I
2872    = DbgVariableLabelsMap.find(V);
2873  if (I == DbgVariableLabelsMap.end())
2874    return NULL;
2875  else return I->second;
2876}
2877
2878/// findDbgScope - Find DbgScope for the debug loc attached with an
2879/// instruction.
2880DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2881  DbgScope *Scope = NULL;
2882  LLVMContext &Ctx =
2883    MInsn->getParent()->getParent()->getFunction()->getContext();
2884  DebugLoc DL = MInsn->getDebugLoc();
2885
2886  if (DL.isUnknown())
2887    return Scope;
2888
2889  if (const MDNode *IA = DL.getInlinedAt(Ctx))
2890    Scope = ConcreteScopes.lookup(IA);
2891  if (Scope == 0)
2892    Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2893
2894  return Scope;
2895}
2896
2897
2898/// recordSourceLine - Register a source line with debug info. Returns the
2899/// unique label that was emitted and which provides correspondence to
2900/// the source line list.
2901MCSymbol *DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2902                                       const MDNode *S) {
2903  StringRef Dir;
2904  StringRef Fn;
2905
2906  unsigned Src = 1;
2907  if (S) {
2908    DIDescriptor Scope(S);
2909
2910    if (Scope.isCompileUnit()) {
2911      DICompileUnit CU(S);
2912      Dir = CU.getDirectory();
2913      Fn = CU.getFilename();
2914    } else if (Scope.isSubprogram()) {
2915      DISubprogram SP(S);
2916      Dir = SP.getDirectory();
2917      Fn = SP.getFilename();
2918    } else if (Scope.isLexicalBlock()) {
2919      DILexicalBlock DB(S);
2920      Dir = DB.getDirectory();
2921      Fn = DB.getFilename();
2922    } else
2923      assert(0 && "Unexpected scope info");
2924
2925    Src = GetOrCreateSourceID(Dir, Fn);
2926  }
2927
2928  MCSymbol *Label = MMI->getContext().CreateTempSymbol();
2929  Lines.push_back(SrcLineInfo(Line, Col, Src, Label));
2930
2931  Asm->OutStreamer.EmitLabel(Label);
2932  return Label;
2933}
2934
2935//===----------------------------------------------------------------------===//
2936// Emit Methods
2937//===----------------------------------------------------------------------===//
2938
2939/// computeSizeAndOffset - Compute the size and offset of a DIE.
2940///
2941unsigned
2942DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2943  // Get the children.
2944  const std::vector<DIE *> &Children = Die->getChildren();
2945
2946  // If not last sibling and has children then add sibling offset attribute.
2947  if (!Last && !Children.empty())
2948    Die->addSiblingOffset(DIEValueAllocator);
2949
2950  // Record the abbreviation.
2951  assignAbbrevNumber(Die->getAbbrev());
2952
2953  // Get the abbreviation for this DIE.
2954  unsigned AbbrevNumber = Die->getAbbrevNumber();
2955  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2956
2957  // Set DIE offset
2958  Die->setOffset(Offset);
2959
2960  // Start the size with the size of abbreviation code.
2961  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2962
2963  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2964  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2965
2966  // Size the DIE attribute values.
2967  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2968    // Size attribute value.
2969    Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2970
2971  // Size the DIE children if any.
2972  if (!Children.empty()) {
2973    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2974           "Children flag not set");
2975
2976    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2977      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2978
2979    // End of children marker.
2980    Offset += sizeof(int8_t);
2981  }
2982
2983  Die->setSize(Offset - Die->getOffset());
2984  return Offset;
2985}
2986
2987/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2988///
2989void DwarfDebug::computeSizeAndOffsets() {
2990  unsigned PrevOffset = 0;
2991  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2992         E = CUMap.end(); I != E; ++I) {
2993    // Compute size of compile unit header.
2994    static unsigned Offset = PrevOffset +
2995      sizeof(int32_t) + // Length of Compilation Unit Info
2996      sizeof(int16_t) + // DWARF version number
2997      sizeof(int32_t) + // Offset Into Abbrev. Section
2998      sizeof(int8_t);   // Pointer Size (in bytes)
2999    computeSizeAndOffset(I->second->getCUDie(), Offset, true);
3000    PrevOffset = Offset;
3001  }
3002}
3003
3004/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
3005/// temporary label to it if SymbolStem is specified.
3006static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
3007                                const char *SymbolStem = 0) {
3008  Asm->OutStreamer.SwitchSection(Section);
3009  if (!SymbolStem) return 0;
3010
3011  MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
3012  Asm->OutStreamer.EmitLabel(TmpSym);
3013  return TmpSym;
3014}
3015
3016/// EmitSectionLabels - Emit initial Dwarf sections with a label at
3017/// the start of each one.
3018void DwarfDebug::EmitSectionLabels() {
3019  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
3020
3021  // Dwarf sections base addresses.
3022  if (Asm->MAI->doesDwarfRequireFrameSection()) {
3023    DwarfFrameSectionSym =
3024      EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
3025   }
3026
3027  DwarfInfoSectionSym =
3028    EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
3029  DwarfAbbrevSectionSym =
3030    EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
3031  EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
3032
3033  if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
3034    EmitSectionSym(Asm, MacroInfo);
3035
3036  DwarfDebugLineSectionSym =
3037    EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
3038  EmitSectionSym(Asm, TLOF.getDwarfLocSection());
3039  EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
3040  EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
3041  DwarfStrSectionSym =
3042    EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
3043  DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
3044                                             "debug_range");
3045
3046  DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
3047                                           "section_debug_loc");
3048
3049  TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
3050  EmitSectionSym(Asm, TLOF.getDataSection());
3051}
3052
3053/// emitDIE - Recusively Emits a debug information entry.
3054///
3055void DwarfDebug::emitDIE(DIE *Die) {
3056  // Get the abbreviation for this DIE.
3057  unsigned AbbrevNumber = Die->getAbbrevNumber();
3058  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
3059
3060  // Emit the code (index) for the abbreviation.
3061  if (Asm->isVerbose())
3062    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
3063                                Twine::utohexstr(Die->getOffset()) + ":0x" +
3064                                Twine::utohexstr(Die->getSize()) + " " +
3065                                dwarf::TagString(Abbrev->getTag()));
3066  Asm->EmitULEB128(AbbrevNumber);
3067
3068  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
3069  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
3070
3071  // Emit the DIE attribute values.
3072  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
3073    unsigned Attr = AbbrevData[i].getAttribute();
3074    unsigned Form = AbbrevData[i].getForm();
3075    assert(Form && "Too many attributes for DIE (check abbreviation)");
3076
3077    if (Asm->isVerbose())
3078      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
3079
3080    switch (Attr) {
3081    case dwarf::DW_AT_sibling:
3082      Asm->EmitInt32(Die->getSiblingOffset());
3083      break;
3084    case dwarf::DW_AT_abstract_origin: {
3085      DIEEntry *E = cast<DIEEntry>(Values[i]);
3086      DIE *Origin = E->getEntry();
3087      unsigned Addr = Origin->getOffset();
3088      Asm->EmitInt32(Addr);
3089      break;
3090    }
3091    case dwarf::DW_AT_ranges: {
3092      // DW_AT_range Value encodes offset in debug_range section.
3093      DIEInteger *V = cast<DIEInteger>(Values[i]);
3094      Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
3095                                     V->getValue(),
3096                                     DwarfDebugRangeSectionSym,
3097                                     4);
3098      break;
3099    }
3100    case dwarf::DW_AT_stmt_list: {
3101      Asm->EmitLabelDifference(CurrentLineSectionSym,
3102                               DwarfDebugLineSectionSym, 4);
3103      break;
3104    }
3105    case dwarf::DW_AT_location: {
3106      if (UseDotDebugLocEntry.count(Die) != 0) {
3107        DIELabel *L = cast<DIELabel>(Values[i]);
3108        Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
3109      } else
3110        Values[i]->EmitValue(Asm, Form);
3111      break;
3112    }
3113    default:
3114      // Emit an attribute using the defined form.
3115      Values[i]->EmitValue(Asm, Form);
3116      break;
3117    }
3118  }
3119
3120  // Emit the DIE children if any.
3121  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
3122    const std::vector<DIE *> &Children = Die->getChildren();
3123
3124    for (unsigned j = 0, M = Children.size(); j < M; ++j)
3125      emitDIE(Children[j]);
3126
3127    if (Asm->isVerbose())
3128      Asm->OutStreamer.AddComment("End Of Children Mark");
3129    Asm->EmitInt8(0);
3130  }
3131}
3132
3133/// emitDebugInfo - Emit the debug info section.
3134///
3135void DwarfDebug::emitDebugInfo() {
3136  // Start debug info section.
3137  Asm->OutStreamer.SwitchSection(
3138                            Asm->getObjFileLowering().getDwarfInfoSection());
3139  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3140         E = CUMap.end(); I != E; ++I) {
3141    CompileUnit *TheCU = I->second;
3142    DIE *Die = TheCU->getCUDie();
3143
3144    // Emit the compile units header.
3145    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
3146                                                  TheCU->getID()));
3147
3148    // Emit size of content not including length itself
3149    unsigned ContentSize = Die->getSize() +
3150      sizeof(int16_t) + // DWARF version number
3151      sizeof(int32_t) + // Offset Into Abbrev. Section
3152      sizeof(int8_t) +  // Pointer Size (in bytes)
3153      sizeof(int32_t);  // FIXME - extra pad for gdb bug.
3154
3155    Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
3156    Asm->EmitInt32(ContentSize);
3157    Asm->OutStreamer.AddComment("DWARF version number");
3158    Asm->EmitInt16(dwarf::DWARF_VERSION);
3159    Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
3160    Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
3161                           DwarfAbbrevSectionSym);
3162    Asm->OutStreamer.AddComment("Address Size (in bytes)");
3163    Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3164
3165    emitDIE(Die);
3166    // FIXME - extra padding for gdb bug.
3167    Asm->OutStreamer.AddComment("4 extra padding bytes for GDB");
3168    Asm->EmitInt8(0);
3169    Asm->EmitInt8(0);
3170    Asm->EmitInt8(0);
3171    Asm->EmitInt8(0);
3172    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
3173  }
3174}
3175
3176/// emitAbbreviations - Emit the abbreviation section.
3177///
3178void DwarfDebug::emitAbbreviations() const {
3179  // Check to see if it is worth the effort.
3180  if (!Abbreviations.empty()) {
3181    // Start the debug abbrev section.
3182    Asm->OutStreamer.SwitchSection(
3183                            Asm->getObjFileLowering().getDwarfAbbrevSection());
3184
3185    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
3186
3187    // For each abbrevation.
3188    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
3189      // Get abbreviation data
3190      const DIEAbbrev *Abbrev = Abbreviations[i];
3191
3192      // Emit the abbrevations code (base 1 index.)
3193      Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
3194
3195      // Emit the abbreviations data.
3196      Abbrev->Emit(Asm);
3197    }
3198
3199    // Mark end of abbreviations.
3200    Asm->EmitULEB128(0, "EOM(3)");
3201
3202    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
3203  }
3204}
3205
3206/// emitEndOfLineMatrix - Emit the last address of the section and the end of
3207/// the line matrix.
3208///
3209void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
3210  // Define last address of section.
3211  Asm->OutStreamer.AddComment("Extended Op");
3212  Asm->EmitInt8(0);
3213
3214  Asm->OutStreamer.AddComment("Op size");
3215  Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3216  Asm->OutStreamer.AddComment("DW_LNE_set_address");
3217  Asm->EmitInt8(dwarf::DW_LNE_set_address);
3218
3219  Asm->OutStreamer.AddComment("Section end label");
3220
3221  Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
3222                                   Asm->getTargetData().getPointerSize(),
3223                                   0/*AddrSpace*/);
3224
3225  // Mark end of matrix.
3226  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
3227  Asm->EmitInt8(0);
3228  Asm->EmitInt8(1);
3229  Asm->EmitInt8(1);
3230}
3231
3232/// emitDebugLines - Emit source line information.
3233///
3234void DwarfDebug::emitDebugLines() {
3235  // If the target is using .loc/.file, the assembler will be emitting the
3236  // .debug_line table automatically.
3237  if (Asm->MAI->hasDotLocAndDotFile())
3238    return;
3239
3240  // Minimum line delta, thus ranging from -10..(255-10).
3241  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
3242  // Maximum line delta, thus ranging from -10..(255-10).
3243  const int MaxLineDelta = 255 + MinLineDelta;
3244
3245  // Start the dwarf line section.
3246  Asm->OutStreamer.SwitchSection(
3247                            Asm->getObjFileLowering().getDwarfLineSection());
3248
3249  // Construct the section header.
3250  CurrentLineSectionSym = Asm->GetTempSymbol("section_line_begin");
3251  Asm->OutStreamer.EmitLabel(CurrentLineSectionSym);
3252  Asm->OutStreamer.AddComment("Length of Source Line Info");
3253  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_end"),
3254                           Asm->GetTempSymbol("line_begin"), 4);
3255  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_begin"));
3256
3257  Asm->OutStreamer.AddComment("DWARF version number");
3258  Asm->EmitInt16(dwarf::DWARF_VERSION);
3259
3260  Asm->OutStreamer.AddComment("Prolog Length");
3261  Asm->EmitLabelDifference(Asm->GetTempSymbol("line_prolog_end"),
3262                           Asm->GetTempSymbol("line_prolog_begin"), 4);
3263  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_begin"));
3264
3265  Asm->OutStreamer.AddComment("Minimum Instruction Length");
3266  Asm->EmitInt8(1);
3267  Asm->OutStreamer.AddComment("Default is_stmt_start flag");
3268  Asm->EmitInt8(1);
3269  Asm->OutStreamer.AddComment("Line Base Value (Special Opcodes)");
3270  Asm->EmitInt8(MinLineDelta);
3271  Asm->OutStreamer.AddComment("Line Range Value (Special Opcodes)");
3272  Asm->EmitInt8(MaxLineDelta);
3273  Asm->OutStreamer.AddComment("Special Opcode Base");
3274  Asm->EmitInt8(-MinLineDelta);
3275
3276  // Line number standard opcode encodings argument count
3277  Asm->OutStreamer.AddComment("DW_LNS_copy arg count");
3278  Asm->EmitInt8(0);
3279  Asm->OutStreamer.AddComment("DW_LNS_advance_pc arg count");
3280  Asm->EmitInt8(1);
3281  Asm->OutStreamer.AddComment("DW_LNS_advance_line arg count");
3282  Asm->EmitInt8(1);
3283  Asm->OutStreamer.AddComment("DW_LNS_set_file arg count");
3284  Asm->EmitInt8(1);
3285  Asm->OutStreamer.AddComment("DW_LNS_set_column arg count");
3286  Asm->EmitInt8(1);
3287  Asm->OutStreamer.AddComment("DW_LNS_negate_stmt arg count");
3288  Asm->EmitInt8(0);
3289  Asm->OutStreamer.AddComment("DW_LNS_set_basic_block arg count");
3290  Asm->EmitInt8(0);
3291  Asm->OutStreamer.AddComment("DW_LNS_const_add_pc arg count");
3292  Asm->EmitInt8(0);
3293  Asm->OutStreamer.AddComment("DW_LNS_fixed_advance_pc arg count");
3294  Asm->EmitInt8(1);
3295
3296  // Emit directories.
3297  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
3298    const std::string &Dir = getSourceDirectoryName(DI);
3299    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Directory");
3300    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
3301  }
3302
3303  Asm->OutStreamer.AddComment("End of directories");
3304  Asm->EmitInt8(0);
3305
3306  // Emit files.
3307  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
3308    // Remember source id starts at 1.
3309    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
3310    const std::string &FN = getSourceFileName(Id.second);
3311    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("Source");
3312    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
3313
3314    Asm->EmitULEB128(Id.first, "Directory #");
3315    Asm->EmitULEB128(0, "Mod date");
3316    Asm->EmitULEB128(0, "File size");
3317  }
3318
3319  Asm->OutStreamer.AddComment("End of files");
3320  Asm->EmitInt8(0);
3321
3322  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_prolog_end"));
3323
3324  // A sequence for each text section.
3325  unsigned SecSrcLinesSize = SectionSourceLines.size();
3326
3327  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
3328    // Isolate current sections line info.
3329    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
3330
3331    // Dwarf assumes we start with first line of first source file.
3332    unsigned Source = 1;
3333    unsigned Line = 1;
3334
3335    // Construct rows of the address, source, line, column matrix.
3336    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
3337      const SrcLineInfo &LineInfo = LineInfos[i];
3338      MCSymbol *Label = LineInfo.getLabel();
3339      if (!Label->isDefined()) continue; // Not emitted, in dead code.
3340
3341      if (Asm->isVerbose()) {
3342        std::pair<unsigned, unsigned> SrcID =
3343          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
3344        Asm->OutStreamer.AddComment(Twine(getSourceDirectoryName(SrcID.first)) +
3345                                    "/" +
3346                                    Twine(getSourceFileName(SrcID.second)) +
3347                                    ":" + Twine(LineInfo.getLine()));
3348      }
3349
3350      // Define the line address.
3351      Asm->OutStreamer.AddComment("Extended Op");
3352      Asm->EmitInt8(0);
3353      Asm->OutStreamer.AddComment("Op size");
3354      Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
3355
3356      Asm->OutStreamer.AddComment("DW_LNE_set_address");
3357      Asm->EmitInt8(dwarf::DW_LNE_set_address);
3358
3359      Asm->OutStreamer.AddComment("Location label");
3360      Asm->OutStreamer.EmitSymbolValue(Label,
3361                                       Asm->getTargetData().getPointerSize(),
3362                                       0/*AddrSpace*/);
3363
3364      // If change of source, then switch to the new source.
3365      if (Source != LineInfo.getSourceID()) {
3366        Source = LineInfo.getSourceID();
3367        Asm->OutStreamer.AddComment("DW_LNS_set_file");
3368        Asm->EmitInt8(dwarf::DW_LNS_set_file);
3369        Asm->EmitULEB128(Source, "New Source");
3370      }
3371
3372      // If change of line.
3373      if (Line != LineInfo.getLine()) {
3374        // Determine offset.
3375        int Offset = LineInfo.getLine() - Line;
3376        int Delta = Offset - MinLineDelta;
3377
3378        // Update line.
3379        Line = LineInfo.getLine();
3380
3381        // If delta is small enough and in range...
3382        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
3383          // ... then use fast opcode.
3384          Asm->OutStreamer.AddComment("Line Delta");
3385          Asm->EmitInt8(Delta - MinLineDelta);
3386        } else {
3387          // ... otherwise use long hand.
3388          Asm->OutStreamer.AddComment("DW_LNS_advance_line");
3389          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
3390          Asm->EmitSLEB128(Offset, "Line Offset");
3391          Asm->OutStreamer.AddComment("DW_LNS_copy");
3392          Asm->EmitInt8(dwarf::DW_LNS_copy);
3393        }
3394      } else {
3395        // Copy the previous row (different address or source)
3396        Asm->OutStreamer.AddComment("DW_LNS_copy");
3397        Asm->EmitInt8(dwarf::DW_LNS_copy);
3398      }
3399    }
3400
3401    emitEndOfLineMatrix(j + 1);
3402  }
3403
3404  if (SecSrcLinesSize == 0)
3405    // Because we're emitting a debug_line section, we still need a line
3406    // table. The linker and friends expect it to exist. If there's nothing to
3407    // put into it, emit an empty table.
3408    emitEndOfLineMatrix(1);
3409
3410  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("line_end"));
3411}
3412
3413/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
3414///
3415void DwarfDebug::emitCommonDebugFrame() {
3416  if (!Asm->MAI->doesDwarfRequireFrameSection())
3417    return;
3418
3419  int stackGrowth = Asm->getTargetData().getPointerSize();
3420  if (Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
3421      TargetFrameInfo::StackGrowsDown)
3422    stackGrowth *= -1;
3423
3424  // Start the dwarf frame section.
3425  Asm->OutStreamer.SwitchSection(
3426                              Asm->getObjFileLowering().getDwarfFrameSection());
3427
3428  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
3429  Asm->OutStreamer.AddComment("Length of Common Information Entry");
3430  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
3431                           Asm->GetTempSymbol("debug_frame_common_begin"), 4);
3432
3433  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
3434  Asm->OutStreamer.AddComment("CIE Identifier Tag");
3435  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
3436  Asm->OutStreamer.AddComment("CIE Version");
3437  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
3438  Asm->OutStreamer.AddComment("CIE Augmentation");
3439  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
3440  Asm->EmitULEB128(1, "CIE Code Alignment Factor");
3441  Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
3442  Asm->OutStreamer.AddComment("CIE RA Column");
3443  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3444  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
3445
3446  std::vector<MachineMove> Moves;
3447  RI->getInitialFrameState(Moves);
3448
3449  Asm->EmitFrameMoves(Moves, 0, false);
3450
3451  Asm->EmitAlignment(2);
3452  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
3453}
3454
3455/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
3456/// section.
3457void DwarfDebug::
3458emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
3459  if (!Asm->MAI->doesDwarfRequireFrameSection())
3460    return;
3461
3462  // Start the dwarf frame section.
3463  Asm->OutStreamer.SwitchSection(
3464                              Asm->getObjFileLowering().getDwarfFrameSection());
3465
3466  Asm->OutStreamer.AddComment("Length of Frame Information Entry");
3467  MCSymbol *DebugFrameBegin =
3468    Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
3469  MCSymbol *DebugFrameEnd =
3470    Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
3471  Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
3472
3473  Asm->OutStreamer.EmitLabel(DebugFrameBegin);
3474
3475  Asm->OutStreamer.AddComment("FDE CIE offset");
3476  Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
3477                         DwarfFrameSectionSym);
3478
3479  Asm->OutStreamer.AddComment("FDE initial location");
3480  MCSymbol *FuncBeginSym =
3481    Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
3482  Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
3483                                   Asm->getTargetData().getPointerSize(),
3484                                   0/*AddrSpace*/);
3485
3486
3487  Asm->OutStreamer.AddComment("FDE address range");
3488  Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
3489                           FuncBeginSym, Asm->getTargetData().getPointerSize());
3490
3491  Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
3492
3493  Asm->EmitAlignment(2);
3494  Asm->OutStreamer.EmitLabel(DebugFrameEnd);
3495}
3496
3497/// emitDebugPubNames - Emit visible names into a debug pubnames section.
3498///
3499void DwarfDebug::emitDebugPubNames() {
3500  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3501         E = CUMap.end(); I != E; ++I) {
3502    CompileUnit *TheCU = I->second;
3503    // Start the dwarf pubnames section.
3504    Asm->OutStreamer.SwitchSection(
3505      Asm->getObjFileLowering().getDwarfPubNamesSection());
3506
3507    Asm->OutStreamer.AddComment("Length of Public Names Info");
3508    Asm->EmitLabelDifference(
3509      Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
3510      Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
3511
3512    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
3513                                                  TheCU->getID()));
3514
3515    Asm->OutStreamer.AddComment("DWARF Version");
3516    Asm->EmitInt16(dwarf::DWARF_VERSION);
3517
3518    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3519    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3520                           DwarfInfoSectionSym);
3521
3522    Asm->OutStreamer.AddComment("Compilation Unit Length");
3523    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3524                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3525                             4);
3526
3527    const StringMap<DIE*> &Globals = TheCU->getGlobals();
3528    for (StringMap<DIE*>::const_iterator
3529           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3530      const char *Name = GI->getKeyData();
3531      DIE *Entity = GI->second;
3532
3533      Asm->OutStreamer.AddComment("DIE offset");
3534      Asm->EmitInt32(Entity->getOffset());
3535
3536      if (Asm->isVerbose())
3537        Asm->OutStreamer.AddComment("External Name");
3538      Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
3539    }
3540
3541    Asm->OutStreamer.AddComment("End Mark");
3542    Asm->EmitInt32(0);
3543    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
3544                                                TheCU->getID()));
3545  }
3546}
3547
3548void DwarfDebug::emitDebugPubTypes() {
3549  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
3550         E = CUMap.end(); I != E; ++I) {
3551    CompileUnit *TheCU = I->second;
3552    // Start the dwarf pubnames section.
3553    Asm->OutStreamer.SwitchSection(
3554      Asm->getObjFileLowering().getDwarfPubTypesSection());
3555    Asm->OutStreamer.AddComment("Length of Public Types Info");
3556    Asm->EmitLabelDifference(
3557      Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
3558      Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
3559
3560    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
3561                                                  TheCU->getID()));
3562
3563    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
3564    Asm->EmitInt16(dwarf::DWARF_VERSION);
3565
3566    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
3567    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
3568                           DwarfInfoSectionSym);
3569
3570    Asm->OutStreamer.AddComment("Compilation Unit Length");
3571    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
3572                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
3573                             4);
3574
3575    const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
3576    for (StringMap<DIE*>::const_iterator
3577           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
3578      const char *Name = GI->getKeyData();
3579      DIE * Entity = GI->second;
3580
3581      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3582      Asm->EmitInt32(Entity->getOffset());
3583
3584      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
3585      Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
3586    }
3587
3588    Asm->OutStreamer.AddComment("End Mark");
3589    Asm->EmitInt32(0);
3590    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
3591                                                  TheCU->getID()));
3592  }
3593}
3594
3595/// emitDebugStr - Emit visible names into a debug str section.
3596///
3597void DwarfDebug::emitDebugStr() {
3598  // Check to see if it is worth the effort.
3599  if (StringPool.empty()) return;
3600
3601  // Start the dwarf str section.
3602  Asm->OutStreamer.SwitchSection(
3603                                Asm->getObjFileLowering().getDwarfStrSection());
3604
3605  // Get all of the string pool entries and put them in an array by their ID so
3606  // we can sort them.
3607  SmallVector<std::pair<unsigned,
3608      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
3609
3610  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
3611       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
3612    Entries.push_back(std::make_pair(I->second.second, &*I));
3613
3614  array_pod_sort(Entries.begin(), Entries.end());
3615
3616  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
3617    // Emit a label for reference from debug information entries.
3618    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
3619
3620    // Emit the string itself.
3621    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
3622  }
3623}
3624
3625/// emitDebugLoc - Emit visible names into a debug loc section.
3626///
3627void DwarfDebug::emitDebugLoc() {
3628  if (DotDebugLocEntries.empty())
3629    return;
3630
3631  // Start the dwarf loc section.
3632  Asm->OutStreamer.SwitchSection(
3633    Asm->getObjFileLowering().getDwarfLocSection());
3634  unsigned char Size = Asm->getTargetData().getPointerSize();
3635  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
3636  unsigned index = 1;
3637  for (SmallVector<DotDebugLocEntry, 4>::iterator
3638         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
3639       I != E; ++I, ++index) {
3640    DotDebugLocEntry Entry = *I;
3641    if (Entry.isEmpty()) {
3642      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3643      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3644      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
3645    } else {
3646      Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
3647      Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
3648      const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
3649      unsigned Reg = RI->getDwarfRegNum(Entry.Loc.getReg(), false);
3650      if (int Offset =  Entry.Loc.getOffset()) {
3651        // If the value is at a certain offset from frame register then
3652        // use DW_OP_fbreg.
3653        unsigned OffsetSize = Offset ? MCAsmInfo::getSLEB128Size(Offset) : 1;
3654        Asm->OutStreamer.AddComment("Loc expr size");
3655        Asm->EmitInt16(1 + OffsetSize);
3656        Asm->OutStreamer.AddComment(
3657          dwarf::OperationEncodingString(dwarf::DW_OP_fbreg));
3658        Asm->EmitInt8(dwarf::DW_OP_fbreg);
3659        Asm->OutStreamer.AddComment("Offset");
3660        Asm->EmitSLEB128(Offset);
3661      } else {
3662        if (Reg < 32) {
3663          Asm->OutStreamer.AddComment("Loc expr size");
3664          Asm->EmitInt16(1);
3665          Asm->OutStreamer.AddComment(
3666            dwarf::OperationEncodingString(dwarf::DW_OP_breg0 + Reg));
3667          Asm->EmitInt8(dwarf::DW_OP_reg0 + Reg);
3668        } else {
3669          Asm->OutStreamer.AddComment("Loc expr size");
3670          Asm->EmitInt16(1 + MCAsmInfo::getULEB128Size(Reg));
3671          Asm->EmitInt8(dwarf::DW_OP_regx);
3672          Asm->EmitULEB128(Reg);
3673        }
3674      }
3675    }
3676  }
3677}
3678
3679/// EmitDebugARanges - Emit visible names into a debug aranges section.
3680///
3681void DwarfDebug::EmitDebugARanges() {
3682  // Start the dwarf aranges section.
3683  Asm->OutStreamer.SwitchSection(
3684                          Asm->getObjFileLowering().getDwarfARangesSection());
3685}
3686
3687/// emitDebugRanges - Emit visible names into a debug ranges section.
3688///
3689void DwarfDebug::emitDebugRanges() {
3690  // Start the dwarf ranges section.
3691  Asm->OutStreamer.SwitchSection(
3692    Asm->getObjFileLowering().getDwarfRangesSection());
3693  unsigned char Size = Asm->getTargetData().getPointerSize();
3694  for (SmallVector<const MCSymbol *, 8>::iterator
3695         I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
3696       I != E; ++I) {
3697    if (*I)
3698      Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
3699    else
3700      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
3701  }
3702}
3703
3704/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
3705///
3706void DwarfDebug::emitDebugMacInfo() {
3707  if (const MCSection *LineInfo =
3708      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
3709    // Start the dwarf macinfo section.
3710    Asm->OutStreamer.SwitchSection(LineInfo);
3711  }
3712}
3713
3714/// emitDebugInlineInfo - Emit inline info using following format.
3715/// Section Header:
3716/// 1. length of section
3717/// 2. Dwarf version number
3718/// 3. address size.
3719///
3720/// Entries (one "entry" for each function that was inlined):
3721///
3722/// 1. offset into __debug_str section for MIPS linkage name, if exists;
3723///   otherwise offset into __debug_str for regular function name.
3724/// 2. offset into __debug_str section for regular function name.
3725/// 3. an unsigned LEB128 number indicating the number of distinct inlining
3726/// instances for the function.
3727///
3728/// The rest of the entry consists of a {die_offset, low_pc} pair for each
3729/// inlined instance; the die_offset points to the inlined_subroutine die in the
3730/// __debug_info section, and the low_pc is the starting address for the
3731/// inlining instance.
3732void DwarfDebug::emitDebugInlineInfo() {
3733  if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
3734    return;
3735
3736  if (!FirstCU)
3737    return;
3738
3739  Asm->OutStreamer.SwitchSection(
3740                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
3741
3742  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
3743  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
3744                           Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
3745
3746  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
3747
3748  Asm->OutStreamer.AddComment("Dwarf Version");
3749  Asm->EmitInt16(dwarf::DWARF_VERSION);
3750  Asm->OutStreamer.AddComment("Address Size (in bytes)");
3751  Asm->EmitInt8(Asm->getTargetData().getPointerSize());
3752
3753  for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
3754         E = InlinedSPNodes.end(); I != E; ++I) {
3755
3756    const MDNode *Node = *I;
3757    DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
3758      = InlineInfo.find(Node);
3759    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
3760    DISubprogram SP(Node);
3761    StringRef LName = SP.getLinkageName();
3762    StringRef Name = SP.getName();
3763
3764    Asm->OutStreamer.AddComment("MIPS linkage name");
3765    if (LName.empty()) {
3766      Asm->OutStreamer.EmitBytes(Name, 0);
3767      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
3768    } else
3769      Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
3770                             DwarfStrSectionSym);
3771
3772    Asm->OutStreamer.AddComment("Function name");
3773    Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
3774    Asm->EmitULEB128(Labels.size(), "Inline count");
3775
3776    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
3777           LE = Labels.end(); LI != LE; ++LI) {
3778      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
3779      Asm->EmitInt32(LI->second->getOffset());
3780
3781      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
3782      Asm->OutStreamer.EmitSymbolValue(LI->first,
3783                                       Asm->getTargetData().getPointerSize(),0);
3784    }
3785  }
3786
3787  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
3788}
3789