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