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