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