DwarfDebug.cpp revision b2cc1a39f79742320ee6ba126d9eec4d6770dee7
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/MCSection.h"
20#include "llvm/MC/MCStreamer.h"
21#include "llvm/MC/MCAsmInfo.h"
22#include "llvm/Target/Mangler.h"
23#include "llvm/Target/TargetData.h"
24#include "llvm/Target/TargetFrameInfo.h"
25#include "llvm/Target/TargetLoweringObjectFile.h"
26#include "llvm/Target/TargetRegisterInfo.h"
27#include "llvm/ADT/StringExtras.h"
28#include "llvm/Support/Debug.h"
29#include "llvm/Support/ErrorHandling.h"
30#include "llvm/Support/ValueHandle.h"
31#include "llvm/Support/FormattedStream.h"
32#include "llvm/Support/Timer.h"
33#include "llvm/System/Path.h"
34using namespace llvm;
35
36//===----------------------------------------------------------------------===//
37
38/// Configuration values for initial hash set sizes (log2).
39///
40static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
41
42namespace llvm {
43
44//===----------------------------------------------------------------------===//
45/// CompileUnit - This dwarf writer support class manages information associate
46/// with a source file.
47class CompileUnit {
48  /// ID - File identifier for source.
49  ///
50  unsigned ID;
51
52  /// Die - Compile unit debug information entry.
53  ///
54  DIE *CUDie;
55
56  /// IndexTyDie - An anonymous type for index type.
57  DIE *IndexTyDie;
58
59  /// GVToDieMap - Tracks the mapping of unit level debug informaton
60  /// variables to debug information entries.
61  /// FIXME : Rename GVToDieMap -> NodeToDieMap
62  DenseMap<MDNode *, DIE *> GVToDieMap;
63
64  /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton
65  /// descriptors to debug information entries using a DIEEntry proxy.
66  /// FIXME : Rename
67  DenseMap<MDNode *, DIEEntry *> GVToDIEEntryMap;
68
69  /// Globals - A map of globally visible named entities for this unit.
70  ///
71  StringMap<DIE*> Globals;
72
73  /// GlobalTypes - A map of globally visible types for this unit.
74  ///
75  StringMap<DIE*> GlobalTypes;
76
77public:
78  CompileUnit(unsigned I, DIE *D)
79    : ID(I), CUDie(D), IndexTyDie(0) {}
80  ~CompileUnit() { delete CUDie; delete IndexTyDie; }
81
82  // Accessors.
83  unsigned getID()                  const { return ID; }
84  DIE* getCUDie()                   const { return CUDie; }
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  unsigned StartLabelID;              // Label ID of the beginning of scope.
175  unsigned EndLabelID;                // 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      StartLabelID(0), EndLabelID(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  unsigned getStartLabelID()     const { return StartLabelID; }
199  unsigned getEndLabelID()       const { return EndLabelID; }
200  SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
201  SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
202  void setStartLabelID(unsigned S) { StartLabelID = S; }
203  void setEndLabelID(unsigned E)   { EndLabelID = 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 << " [" << StartLabelID << ", " << EndLabelID << "]\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().isSubprogram()) {
1328   addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1329  // Add arguments.
1330   DICompositeType SPTy = SP.getType();
1331   DIArray Args = SPTy.getTypeArray();
1332   unsigned SPTag = SPTy.getTag();
1333   if (SPTag == dwarf::DW_TAG_subroutine_type)
1334     for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
1335       DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
1336       DIType ATy = DIType(DIType(Args.getElement(i).getNode()));
1337       addType(Arg, ATy);
1338       if (ATy.isArtificial())
1339         addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1340       SPDie->addChild(Arg);
1341     }
1342   DIE *SPDeclDie = SPDie;
1343   SPDie = new DIE(dwarf::DW_TAG_subprogram);
1344   addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
1345               SPDeclDie);
1346   ModuleCU->addDie(SPDie);
1347 }
1348
1349 addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1350          getDWLabel("func_begin", SubprogramCount));
1351 addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1352          getDWLabel("func_end", SubprogramCount));
1353 MachineLocation Location(RI->getFrameRegister(*MF));
1354 addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
1355
1356 if (!DISubprogram(SPNode).isLocalToUnit())
1357   addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1358
1359 return SPDie;
1360}
1361
1362/// constructLexicalScope - Construct new DW_TAG_lexical_block
1363/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
1364DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
1365  unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1366  unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1367
1368  // Ignore empty scopes.
1369  if (StartID == EndID && StartID != 0)
1370    return NULL;
1371
1372  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
1373  if (Scope->isAbstractScope())
1374    return ScopeDIE;
1375
1376  addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
1377           StartID ? getDWLabel("label", StartID)
1378                   : getDWLabel("func_begin", SubprogramCount));
1379  addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1380           EndID ? getDWLabel("label", EndID)
1381                 : getDWLabel("func_end", SubprogramCount));
1382
1383  return ScopeDIE;
1384}
1385
1386/// constructInlinedScopeDIE - This scope represents inlined body of
1387/// a function. Construct DIE to represent this concrete inlined copy
1388/// of the function.
1389DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
1390  unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
1391  unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
1392  assert (StartID && "Invalid starting label for an inlined scope!");
1393  assert (EndID && "Invalid end label for an inlined scope!");
1394  // Ignore empty scopes.
1395  if (StartID == EndID && StartID != 0)
1396    return NULL;
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  MCSymbol *StartLabel = getDWLabel("label", StartID);
1409
1410  addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
1411  addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
1412           getDWLabel("label", EndID));
1413
1414  InlinedSubprogramDIEs.insert(OriginDIE);
1415
1416  // Track the start label for this inlined function.
1417  DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
1418    I = InlineInfo.find(InlinedSP.getNode());
1419
1420  if (I == InlineInfo.end()) {
1421    InlineInfo[InlinedSP.getNode()].push_back(std::make_pair(StartLabel,
1422                                                             ScopeDIE));
1423    InlinedSPNodes.push_back(InlinedSP.getNode());
1424  } else
1425    I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
1426
1427  StringPool.insert(InlinedSP.getName());
1428  StringPool.insert(getRealLinkageName(InlinedSP.getLinkageName()));
1429
1430  DILocation DL(Scope->getInlinedAt());
1431  addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, ModuleCU->getID());
1432  addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
1433
1434  return ScopeDIE;
1435}
1436
1437
1438/// constructVariableDIE - Construct a DIE for the given DbgVariable.
1439DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
1440  // Get the descriptor.
1441  const DIVariable &VD = DV->getVariable();
1442  StringRef Name = VD.getName();
1443  if (Name.empty())
1444    return NULL;
1445
1446  // Translate tag to proper Dwarf tag.  The result variable is dropped for
1447  // now.
1448  unsigned Tag;
1449  switch (VD.getTag()) {
1450  case dwarf::DW_TAG_return_variable:
1451    return NULL;
1452  case dwarf::DW_TAG_arg_variable:
1453    Tag = dwarf::DW_TAG_formal_parameter;
1454    break;
1455  case dwarf::DW_TAG_auto_variable:    // fall thru
1456  default:
1457    Tag = dwarf::DW_TAG_variable;
1458    break;
1459  }
1460
1461  // Define variable debug information entry.
1462  DIE *VariableDie = new DIE(Tag);
1463
1464
1465  DIE *AbsDIE = NULL;
1466  if (DbgVariable *AV = DV->getAbstractVariable())
1467    AbsDIE = AV->getDIE();
1468
1469  if (AbsDIE) {
1470    DIScope DS(Scope->getScopeNode());
1471    DISubprogram InlinedSP = getDISubprogram(DS.getNode());
1472    DIE *OriginSPDIE = ModuleCU->getDIE(InlinedSP.getNode());
1473    (void) OriginSPDIE;
1474    assert (OriginSPDIE && "Unable to find Origin DIE for the SP!");
1475    DIE *AbsDIE = DV->getAbstractVariable()->getDIE();
1476    assert (AbsDIE && "Unable to find Origin DIE for the Variable!");
1477    addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
1478                dwarf::DW_FORM_ref4, AbsDIE);
1479  }
1480  else {
1481    addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);
1482    addSourceLine(VariableDie, &VD);
1483
1484    // Add variable type.
1485    // FIXME: isBlockByrefVariable should be reformulated in terms of complex
1486    // addresses instead.
1487    if (VD.isBlockByrefVariable())
1488      addType(VariableDie, getBlockByrefType(VD.getType(), Name));
1489    else
1490      addType(VariableDie, VD.getType());
1491  }
1492
1493  // Add variable address.
1494  if (!Scope->isAbstractScope()) {
1495    MachineLocation Location;
1496    unsigned FrameReg;
1497    int Offset = RI->getFrameIndexReference(*MF, DV->getFrameIndex(), FrameReg);
1498    Location.set(FrameReg, Offset);
1499
1500    if (VD.hasComplexAddress())
1501      addComplexAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1502    else if (VD.isBlockByrefVariable())
1503      addBlockByrefAddress(DV, VariableDie, dwarf::DW_AT_location, Location);
1504    else
1505      addAddress(VariableDie, dwarf::DW_AT_location, Location);
1506  }
1507
1508  if (Tag == dwarf::DW_TAG_formal_parameter && VD.getType().isArtificial())
1509    addUInt(VariableDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
1510  DV->setDIE(VariableDie);
1511  return VariableDie;
1512
1513}
1514
1515void DwarfDebug::addPubTypes(DISubprogram SP) {
1516  DICompositeType SPTy = SP.getType();
1517  unsigned SPTag = SPTy.getTag();
1518  if (SPTag != dwarf::DW_TAG_subroutine_type)
1519    return;
1520
1521  DIArray Args = SPTy.getTypeArray();
1522  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
1523    DIType ATy(Args.getElement(i).getNode());
1524    if (!ATy.isValid())
1525      continue;
1526    DICompositeType CATy = getDICompositeType(ATy);
1527    if (DIDescriptor(CATy.getNode()).Verify() && !CATy.getName().empty()) {
1528      if (DIEEntry *Entry = ModuleCU->getDIEEntry(CATy.getNode()))
1529        ModuleCU->addGlobalType(CATy.getName(), Entry->getEntry());
1530    }
1531  }
1532}
1533
1534/// constructScopeDIE - Construct a DIE for this scope.
1535DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
1536  if (!Scope || !Scope->getScopeNode())
1537    return NULL;
1538
1539  DIScope DS(Scope->getScopeNode());
1540  DIE *ScopeDIE = NULL;
1541  if (Scope->getInlinedAt())
1542    ScopeDIE = constructInlinedScopeDIE(Scope);
1543  else if (DS.isSubprogram()) {
1544    if (Scope->isAbstractScope())
1545      ScopeDIE = ModuleCU->getDIE(DS.getNode());
1546    else
1547      ScopeDIE = updateSubprogramScopeDIE(DS.getNode());
1548  }
1549  else {
1550    ScopeDIE = constructLexicalScopeDIE(Scope);
1551    if (!ScopeDIE) return NULL;
1552  }
1553
1554  // Add variables to scope.
1555  SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
1556  for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1557    DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1558    if (VariableDIE)
1559      ScopeDIE->addChild(VariableDIE);
1560  }
1561
1562  // Add nested scopes.
1563  SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
1564  for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
1565    // Define the Scope debug information entry.
1566    DIE *NestedDIE = constructScopeDIE(Scopes[j]);
1567    if (NestedDIE)
1568      ScopeDIE->addChild(NestedDIE);
1569  }
1570
1571  if (DS.isSubprogram())
1572    addPubTypes(DISubprogram(DS.getNode()));
1573
1574 return ScopeDIE;
1575}
1576
1577/// GetOrCreateSourceID - Look up the source id with the given directory and
1578/// source file names. If none currently exists, create a new id and insert it
1579/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
1580/// maps as well.
1581unsigned DwarfDebug::GetOrCreateSourceID(StringRef DirName, StringRef FileName) {
1582  unsigned DId;
1583  StringMap<unsigned>::iterator DI = DirectoryIdMap.find(DirName);
1584  if (DI != DirectoryIdMap.end()) {
1585    DId = DI->getValue();
1586  } else {
1587    DId = DirectoryNames.size() + 1;
1588    DirectoryIdMap[DirName] = DId;
1589    DirectoryNames.push_back(DirName);
1590  }
1591
1592  unsigned FId;
1593  StringMap<unsigned>::iterator FI = SourceFileIdMap.find(FileName);
1594  if (FI != SourceFileIdMap.end()) {
1595    FId = FI->getValue();
1596  } else {
1597    FId = SourceFileNames.size() + 1;
1598    SourceFileIdMap[FileName] = FId;
1599    SourceFileNames.push_back(FileName);
1600  }
1601
1602  DenseMap<std::pair<unsigned, unsigned>, unsigned>::iterator SI =
1603    SourceIdMap.find(std::make_pair(DId, FId));
1604  if (SI != SourceIdMap.end())
1605    return SI->second;
1606
1607  unsigned SrcId = SourceIds.size() + 1;  // DW_AT_decl_file cannot be 0.
1608  SourceIdMap[std::make_pair(DId, FId)] = SrcId;
1609  SourceIds.push_back(std::make_pair(DId, FId));
1610
1611  return SrcId;
1612}
1613
1614/// getOrCreateNameSpace - Create a DIE for DINameSpace.
1615DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
1616  DIE *NDie = ModuleCU->getDIE(NS.getNode());
1617  if (NDie)
1618    return NDie;
1619  NDie = new DIE(dwarf::DW_TAG_namespace);
1620  ModuleCU->insertDIE(NS.getNode(), NDie);
1621  if (!NS.getName().empty())
1622    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
1623  addSourceLine(NDie, &NS);
1624  addToContextOwner(NDie, NS.getContext());
1625  return NDie;
1626}
1627
1628CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) {
1629  DICompileUnit DIUnit(N);
1630  StringRef FN = DIUnit.getFilename();
1631  StringRef Dir = DIUnit.getDirectory();
1632  unsigned ID = GetOrCreateSourceID(Dir, FN);
1633
1634  DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
1635  // FIXME: Why getting the delta between two identical labels??
1636  addSectionOffset(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
1637                   getTempLabel("section_line"), getTempLabel("section_line"),
1638                   false);
1639  addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
1640            DIUnit.getProducer());
1641  addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data1,
1642          DIUnit.getLanguage());
1643  addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
1644
1645  if (!Dir.empty())
1646    addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
1647  if (DIUnit.isOptimized())
1648    addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
1649
1650  StringRef Flags = DIUnit.getFlags();
1651  if (!Flags.empty())
1652    addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
1653
1654  unsigned RVer = DIUnit.getRunTimeVersion();
1655  if (RVer)
1656    addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
1657            dwarf::DW_FORM_data1, RVer);
1658
1659  CompileUnit *Unit = new CompileUnit(ID, Die);
1660  if (!ModuleCU && DIUnit.isMain()) {
1661    // Use first compile unit marked as isMain as the compile unit
1662    // for this module.
1663    ModuleCU = Unit;
1664  }
1665
1666  return Unit;
1667}
1668
1669void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
1670  DIGlobalVariable DI_GV(N);
1671
1672  // If debug information is malformed then ignore it.
1673  if (DI_GV.Verify() == false)
1674    return;
1675
1676  // Check for pre-existence.
1677  if (ModuleCU->getDIE(DI_GV.getNode()))
1678    return;
1679
1680  DIE *VariableDie = createGlobalVariableDIE(DI_GV);
1681  if (!VariableDie)
1682    return;
1683
1684  // Add to map.
1685  ModuleCU->insertDIE(N, VariableDie);
1686
1687  // Add to context owner.
1688  DIDescriptor GVContext = DI_GV.getContext();
1689  // Do not create specification DIE if context is either compile unit
1690  // or a subprogram.
1691  if (DI_GV.isDefinition() && !GVContext.isCompileUnit()
1692      && !GVContext.isSubprogram()) {
1693    // Create specification DIE.
1694    DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1695    addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1696                dwarf::DW_FORM_ref4, VariableDie);
1697    DIEBlock *Block = new DIEBlock();
1698    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1699    addLabel(Block, 0, dwarf::DW_FORM_udata,
1700             Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1701    addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1702    addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1703    ModuleCU->addDie(VariableSpecDIE);
1704  } else {
1705    DIEBlock *Block = new DIEBlock();
1706    addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1707    addLabel(Block, 0, dwarf::DW_FORM_udata,
1708             Asm->GetGlobalValueSymbol(DI_GV.getGlobal()));
1709    addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
1710  }
1711  addToContextOwner(VariableDie, GVContext);
1712
1713  // Expose as global. FIXME - need to check external flag.
1714  ModuleCU->addGlobal(DI_GV.getName(), VariableDie);
1715
1716  DIType GTy = DI_GV.getType();
1717  if (GTy.isCompositeType() && !GTy.getName().empty()) {
1718    DIEEntry *Entry = ModuleCU->getDIEEntry(GTy.getNode());
1719    assert (Entry && "Missing global type!");
1720    ModuleCU->addGlobalType(GTy.getName(), Entry->getEntry());
1721  }
1722  return;
1723}
1724
1725void DwarfDebug::constructSubprogramDIE(MDNode *N) {
1726  DISubprogram SP(N);
1727
1728  // Check for pre-existence.
1729  if (ModuleCU->getDIE(N))
1730    return;
1731
1732  if (!SP.isDefinition())
1733    // This is a method declaration which will be handled while constructing
1734    // class type.
1735    return;
1736
1737  DIE *SubprogramDie = createSubprogramDIE(SP);
1738
1739  // Add to map.
1740  ModuleCU->insertDIE(N, SubprogramDie);
1741
1742  // Add to context owner.
1743  addToContextOwner(SubprogramDie, SP.getContext());
1744
1745  // Expose as global.
1746  ModuleCU->addGlobal(SP.getName(), SubprogramDie);
1747
1748  return;
1749}
1750
1751/// beginModule - Emit all Dwarf sections that should come prior to the
1752/// content. Create global DIEs and emit initial debug info sections.
1753/// This is inovked by the target AsmPrinter.
1754void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) {
1755  this->M = M;
1756
1757  if (TimePassesIsEnabled)
1758    DebugTimer->startTimer();
1759
1760  if (!MAI->doesSupportDebugInformation())
1761    return;
1762
1763  DebugInfoFinder DbgFinder;
1764  DbgFinder.processModule(*M);
1765
1766  // Create all the compile unit DIEs.
1767  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1768         E = DbgFinder.compile_unit_end(); I != E; ++I)
1769    constructCompileUnit(*I);
1770
1771  if (!ModuleCU)
1772    return;
1773
1774  // Create DIEs for each subprogram.
1775  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1776         E = DbgFinder.subprogram_end(); I != E; ++I)
1777    constructSubprogramDIE(*I);
1778
1779  // Create DIEs for each global variable.
1780  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1781         E = DbgFinder.global_variable_end(); I != E; ++I)
1782    constructGlobalVariableDIE(*I);
1783
1784  MMI = mmi;
1785  shouldEmit = true;
1786  MMI->setDebugInfoAvailability(true);
1787
1788  // Prime section data.
1789  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1790
1791  // Print out .file directives to specify files for .loc directives. These are
1792  // printed out early so that they precede any .loc directives.
1793  if (MAI->hasDotLocAndDotFile()) {
1794    for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
1795      // Remember source id starts at 1.
1796      std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
1797      // FIXME: don't use sys::path for this!  This should not depend on the
1798      // host.
1799      sys::Path FullPath(getSourceDirectoryName(Id.first));
1800      bool AppendOk =
1801        FullPath.appendComponent(getSourceFileName(Id.second));
1802      assert(AppendOk && "Could not append filename to directory!");
1803      AppendOk = false;
1804      Asm->OutStreamer.EmitDwarfFileDirective(i, FullPath.str());
1805    }
1806  }
1807
1808  // Emit initial sections
1809  emitInitial();
1810
1811  if (TimePassesIsEnabled)
1812    DebugTimer->stopTimer();
1813}
1814
1815/// endModule - Emit all Dwarf sections that should come after the content.
1816///
1817void DwarfDebug::endModule() {
1818  if (!ModuleCU)
1819    return;
1820
1821  if (TimePassesIsEnabled)
1822    DebugTimer->startTimer();
1823
1824  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1825  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1826         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1827    DIE *ISP = *AI;
1828    addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1829  }
1830
1831  // Insert top level DIEs.
1832  for (SmallVector<DIE *, 4>::iterator TI = TopLevelDIEsVector.begin(),
1833         TE = TopLevelDIEsVector.end(); TI != TE; ++TI)
1834    ModuleCU->getCUDie()->addChild(*TI);
1835
1836  for (DenseMap<DIE *, MDNode *>::iterator CI = ContainingTypeMap.begin(),
1837         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1838    DIE *SPDie = CI->first;
1839    MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1840    if (!N) continue;
1841    DIE *NDie = ModuleCU->getDIE(N);
1842    if (!NDie) continue;
1843    addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1844    // FIXME - This is not the correct approach.
1845    // addDIEEntry(NDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie);
1846  }
1847
1848  // Standard sections final addresses.
1849  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1850  Asm->OutStreamer.EmitLabel(getTempLabel("text_end"));
1851  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1852  Asm->OutStreamer.EmitLabel(getTempLabel("data_end"));
1853
1854  // End text sections.
1855  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1856    Asm->OutStreamer.SwitchSection(SectionMap[i]);
1857    Asm->OutStreamer.EmitLabel(getDWLabel("section_end", i));
1858  }
1859
1860  // Emit common frame information.
1861  emitCommonDebugFrame();
1862
1863  // Emit function debug frame information
1864  for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1865         E = DebugFrames.end(); I != E; ++I)
1866    emitFunctionDebugFrame(*I);
1867
1868  // Compute DIE offsets and sizes.
1869  computeSizeAndOffsets();
1870
1871  // Emit all the DIEs into a debug info section
1872  emitDebugInfo();
1873
1874  // Corresponding abbreviations into a abbrev section.
1875  emitAbbreviations();
1876
1877  // Emit source line correspondence into a debug line section.
1878  emitDebugLines();
1879
1880  // Emit info into a debug pubnames section.
1881  emitDebugPubNames();
1882
1883  // Emit info into a debug pubtypes section.
1884  emitDebugPubTypes();
1885
1886  // Emit info into a debug str section.
1887  emitDebugStr();
1888
1889  // Emit info into a debug loc section.
1890  emitDebugLoc();
1891
1892  // Emit info into a debug aranges section.
1893  EmitDebugARanges();
1894
1895  // Emit info into a debug ranges section.
1896  emitDebugRanges();
1897
1898  // Emit info into a debug macinfo section.
1899  emitDebugMacInfo();
1900
1901  // Emit inline info.
1902  emitDebugInlineInfo();
1903
1904  if (TimePassesIsEnabled)
1905    DebugTimer->stopTimer();
1906}
1907
1908/// findAbstractVariable - Find abstract variable, if any, associated with Var.
1909DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1910                                              unsigned FrameIdx,
1911                                              DILocation &ScopeLoc) {
1912
1913  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var.getNode());
1914  if (AbsDbgVariable)
1915    return AbsDbgVariable;
1916
1917  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope().getNode());
1918  if (!Scope)
1919    return NULL;
1920
1921  AbsDbgVariable = new DbgVariable(Var, FrameIdx);
1922  Scope->addVariable(AbsDbgVariable);
1923  AbstractVariables[Var.getNode()] = AbsDbgVariable;
1924  return AbsDbgVariable;
1925}
1926
1927/// collectVariableInfo - Populate DbgScope entries with variables' info.
1928void DwarfDebug::collectVariableInfo() {
1929  if (!MMI) return;
1930
1931  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1932  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1933         VE = VMap.end(); VI != VE; ++VI) {
1934    MDNode *Var = VI->first;
1935    if (!Var) continue;
1936    DIVariable DV (Var);
1937    std::pair< unsigned, MDNode *> VP = VI->second;
1938    DILocation ScopeLoc(VP.second);
1939
1940    DbgScope *Scope =
1941      ConcreteScopes.lookup(ScopeLoc.getOrigLocation().getNode());
1942    if (!Scope)
1943      Scope = DbgScopeMap.lookup(ScopeLoc.getScope().getNode());
1944    // If variable scope is not found then skip this variable.
1945    if (!Scope)
1946      continue;
1947
1948    DbgVariable *RegVar = new DbgVariable(DV, VP.first);
1949    Scope->addVariable(RegVar);
1950    if (DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.first,
1951                                                           ScopeLoc))
1952      RegVar->setAbstractVariable(AbsDbgVariable);
1953  }
1954}
1955
1956/// beginScope - Process beginning of a scope starting at Label.
1957void DwarfDebug::beginScope(const MachineInstr *MI, unsigned Label) {
1958  InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI);
1959  if (I == DbgScopeBeginMap.end())
1960    return;
1961  ScopeVector &SD = I->second;
1962  for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end();
1963       SDI != SDE; ++SDI)
1964    (*SDI)->setStartLabelID(Label);
1965}
1966
1967/// endScope - Process end of a scope.
1968void DwarfDebug::endScope(const MachineInstr *MI) {
1969  InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI);
1970  if (I == DbgScopeEndMap.end())
1971    return;
1972
1973  unsigned Label = MMI->NextLabelID();
1974  Asm->printLabel(Label);
1975
1976  SmallVector<DbgScope *, 2> &SD = I->second;
1977  for (SmallVector<DbgScope *, 2>::iterator SDI = SD.begin(), SDE = SD.end();
1978       SDI != SDE; ++SDI)
1979    (*SDI)->setEndLabelID(Label);
1980  return;
1981}
1982
1983/// createDbgScope - Create DbgScope for the scope.
1984void DwarfDebug::createDbgScope(MDNode *Scope, MDNode *InlinedAt) {
1985
1986  if (!InlinedAt) {
1987    DbgScope *WScope = DbgScopeMap.lookup(Scope);
1988    if (WScope)
1989      return;
1990    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1991    DbgScopeMap.insert(std::make_pair(Scope, WScope));
1992    if (DIDescriptor(Scope).isLexicalBlock())
1993      createDbgScope(DILexicalBlock(Scope).getContext().getNode(), NULL);
1994    return;
1995  }
1996
1997  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1998  if (WScope)
1999    return;
2000
2001  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
2002  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
2003  DILocation DL(InlinedAt);
2004  createDbgScope(DL.getScope().getNode(), DL.getOrigLocation().getNode());
2005}
2006
2007/// extractScopeInformation - Scan machine instructions in this function
2008/// and collect DbgScopes. Return true, if atleast one scope was found.
2009bool DwarfDebug::extractScopeInformation() {
2010  // If scope information was extracted using .dbg intrinsics then there is not
2011  // any need to extract these information by scanning each instruction.
2012  if (!DbgScopeMap.empty())
2013    return false;
2014
2015  DenseMap<const MachineInstr *, unsigned> MIIndexMap;
2016  unsigned MIIndex = 0;
2017  // Scan each instruction and create scopes. First build working set of scopes.
2018  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2019       I != E; ++I) {
2020    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2021         II != IE; ++II) {
2022      const MachineInstr *MInsn = II;
2023      MIIndexMap[MInsn] = MIIndex++;
2024      DebugLoc DL = MInsn->getDebugLoc();
2025      if (DL.isUnknown()) continue;
2026      DILocation DLT = MF->getDILocation(DL);
2027      DIScope DLTScope = DLT.getScope();
2028      // There is no need to create another DIE for compile unit. For all
2029      // other scopes, create one DbgScope now. This will be translated
2030      // into a scope DIE at the end.
2031      if (DLTScope.isCompileUnit()) continue;
2032      createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
2033    }
2034  }
2035
2036
2037  // Build scope hierarchy using working set of scopes.
2038  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
2039       I != E; ++I) {
2040    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
2041         II != IE; ++II) {
2042      const MachineInstr *MInsn = II;
2043      DebugLoc DL = MInsn->getDebugLoc();
2044      if (DL.isUnknown())  continue;
2045      DILocation DLT = MF->getDILocation(DL);
2046      DIScope DLTScope = DLT.getScope();
2047      // There is no need to create another DIE for compile unit. For all
2048      // other scopes, create one DbgScope now. This will be translated
2049      // into a scope DIE at the end.
2050      if (DLTScope.isCompileUnit()) continue;
2051      DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn,
2052                                           DLT.getOrigLocation().getNode());
2053      Scope->setLastInsn(MInsn);
2054    }
2055  }
2056
2057  if (!CurrentFnDbgScope)
2058    return false;
2059
2060  CurrentFnDbgScope->fixInstructionMarkers(MIIndexMap);
2061
2062  // Each scope has first instruction and last instruction to mark beginning
2063  // and end of a scope respectively. Create an inverse map that list scopes
2064  // starts (and ends) with an instruction. One instruction may start (or end)
2065  // multiple scopes. Ignore scopes that are not reachable.
2066  SmallVector<DbgScope *, 4> WorkList;
2067  WorkList.push_back(CurrentFnDbgScope);
2068  while (!WorkList.empty()) {
2069    DbgScope *S = WorkList.back(); WorkList.pop_back();
2070
2071    SmallVector<DbgScope *, 4> &Children = S->getScopes();
2072    if (!Children.empty())
2073      for (SmallVector<DbgScope *, 4>::iterator SI = Children.begin(),
2074             SE = Children.end(); SI != SE; ++SI)
2075        WorkList.push_back(*SI);
2076
2077    if (S->isAbstractScope())
2078      continue;
2079    const MachineInstr *MI = S->getFirstInsn();
2080    assert (MI && "DbgScope does not have first instruction!");
2081
2082    InsnToDbgScopeMapTy::iterator IDI = DbgScopeBeginMap.find(MI);
2083    if (IDI != DbgScopeBeginMap.end())
2084      IDI->second.push_back(S);
2085    else
2086      DbgScopeBeginMap[MI].push_back(S);
2087
2088    MI = S->getLastInsn();
2089    assert (MI && "DbgScope does not have last instruction!");
2090    IDI = DbgScopeEndMap.find(MI);
2091    if (IDI != DbgScopeEndMap.end())
2092      IDI->second.push_back(S);
2093    else
2094      DbgScopeEndMap[MI].push_back(S);
2095  }
2096
2097  return !DbgScopeMap.empty();
2098}
2099
2100/// beginFunction - Gather pre-function debug information.  Assumes being
2101/// emitted immediately after the function entry point.
2102void DwarfDebug::beginFunction(const MachineFunction *MF) {
2103  this->MF = MF;
2104
2105  if (!ShouldEmitDwarfDebug()) return;
2106
2107  if (TimePassesIsEnabled)
2108    DebugTimer->startTimer();
2109
2110  if (!extractScopeInformation())
2111    return;
2112
2113  collectVariableInfo();
2114
2115  // Assumes in correct section after the entry point.
2116  Asm->OutStreamer.EmitLabel(getDWLabel("func_begin", ++SubprogramCount));
2117
2118  // Emit label for the implicitly defined dbg.stoppoint at the start of the
2119  // function.
2120  DebugLoc FDL = MF->getDefaultDebugLoc();
2121  if (!FDL.isUnknown()) {
2122    DILocation DLT = MF->getDILocation(FDL);
2123    unsigned LabelID = 0;
2124    DISubprogram SP = getDISubprogram(DLT.getScope().getNode());
2125    if (SP.Verify())
2126      LabelID = recordSourceLine(SP.getLineNumber(), 0,
2127                                 DLT.getScope().getNode());
2128    else
2129      LabelID = recordSourceLine(DLT.getLineNumber(),
2130                                 DLT.getColumnNumber(),
2131                                 DLT.getScope().getNode());
2132    Asm->printLabel(LabelID);
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 - Records location information and associates it with a
2189/// label. Returns a unique label ID used to generate a label and provide
2190/// correspondence to the source line list.
2191unsigned DwarfDebug::recordSourceLine(unsigned Line, unsigned Col,
2192                                      MDNode *S) {
2193  if (!MMI)
2194    return 0;
2195
2196  if (TimePassesIsEnabled)
2197    DebugTimer->startTimer();
2198
2199  StringRef Dir;
2200  StringRef Fn;
2201
2202  DIDescriptor Scope(S);
2203  if (Scope.isCompileUnit()) {
2204    DICompileUnit CU(S);
2205    Dir = CU.getDirectory();
2206    Fn = CU.getFilename();
2207  } else if (Scope.isSubprogram()) {
2208    DISubprogram SP(S);
2209    Dir = SP.getDirectory();
2210    Fn = SP.getFilename();
2211  } else if (Scope.isLexicalBlock()) {
2212    DILexicalBlock DB(S);
2213    Dir = DB.getDirectory();
2214    Fn = DB.getFilename();
2215  } else
2216    assert (0 && "Unexpected scope info");
2217
2218  unsigned Src = GetOrCreateSourceID(Dir, Fn);
2219  unsigned ID = MMI->NextLabelID();
2220  Lines.push_back(SrcLineInfo(Line, Col, Src, ID));
2221
2222  if (TimePassesIsEnabled)
2223    DebugTimer->stopTimer();
2224
2225  return ID;
2226}
2227
2228/// getOrCreateSourceID - Public version of GetOrCreateSourceID. This can be
2229/// timed. Look up the source id with the given directory and source file
2230/// names. If none currently exists, create a new id and insert it in the
2231/// SourceIds map. This can update DirectoryNames and SourceFileNames maps as
2232/// well.
2233unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,
2234                                         const std::string &FileName) {
2235  if (TimePassesIsEnabled)
2236    DebugTimer->startTimer();
2237
2238  unsigned SrcId = GetOrCreateSourceID(DirName.c_str(), FileName.c_str());
2239
2240  if (TimePassesIsEnabled)
2241    DebugTimer->stopTimer();
2242
2243  return SrcId;
2244}
2245
2246//===----------------------------------------------------------------------===//
2247// Emit Methods
2248//===----------------------------------------------------------------------===//
2249
2250/// computeSizeAndOffset - Compute the size and offset of a DIE.
2251///
2252unsigned
2253DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2254  // Get the children.
2255  const std::vector<DIE *> &Children = Die->getChildren();
2256
2257  // If not last sibling and has children then add sibling offset attribute.
2258  if (!Last && !Children.empty()) Die->addSiblingOffset();
2259
2260  // Record the abbreviation.
2261  assignAbbrevNumber(Die->getAbbrev());
2262
2263  // Get the abbreviation for this DIE.
2264  unsigned AbbrevNumber = Die->getAbbrevNumber();
2265  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2266
2267  // Set DIE offset
2268  Die->setOffset(Offset);
2269
2270  // Start the size with the size of abbreviation code.
2271  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2272
2273  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2274  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2275
2276  // Size the DIE attribute values.
2277  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2278    // Size attribute value.
2279    Offset += Values[i]->SizeOf(TD, AbbrevData[i].getForm());
2280
2281  // Size the DIE children if any.
2282  if (!Children.empty()) {
2283    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2284           "Children flag not set");
2285
2286    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2287      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2288
2289    // End of children marker.
2290    Offset += sizeof(int8_t);
2291  }
2292
2293  Die->setSize(Offset - Die->getOffset());
2294  return Offset;
2295}
2296
2297/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2298///
2299void DwarfDebug::computeSizeAndOffsets() {
2300  // Compute size of compile unit header.
2301  static unsigned Offset =
2302    sizeof(int32_t) + // Length of Compilation Unit Info
2303    sizeof(int16_t) + // DWARF version number
2304    sizeof(int32_t) + // Offset Into Abbrev. Section
2305    sizeof(int8_t);   // Pointer Size (in bytes)
2306
2307  computeSizeAndOffset(ModuleCU->getCUDie(), Offset, true);
2308  CompileUnitOffsets[ModuleCU] = 0;
2309}
2310
2311/// emitInitial - Emit initial Dwarf declarations.  This is necessary for cc
2312/// tools to recognize the object file contains Dwarf information.
2313void DwarfDebug::emitInitial() {
2314  // Check to see if we already emitted intial headers.
2315  if (didInitial) return;
2316  didInitial = true;
2317
2318  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2319
2320  // Dwarf sections base addresses.
2321  if (MAI->doesDwarfRequireFrameSection()) {
2322    Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
2323    Asm->OutStreamer.EmitLabel(getTempLabel("section_debug_frame"));
2324  }
2325
2326  Asm->OutStreamer.SwitchSection(TLOF.getDwarfInfoSection());
2327  Asm->OutStreamer.EmitLabel(getTempLabel("section_info"));
2328  Asm->OutStreamer.SwitchSection(TLOF.getDwarfAbbrevSection());
2329  Asm->OutStreamer.EmitLabel(getTempLabel("section_abbrev"));
2330  Asm->OutStreamer.SwitchSection(TLOF.getDwarfARangesSection());
2331  Asm->OutStreamer.EmitLabel(getTempLabel("section_aranges"));
2332
2333  if (const MCSection *LineInfoDirective = TLOF.getDwarfMacroInfoSection()) {
2334    Asm->OutStreamer.SwitchSection(LineInfoDirective);
2335    Asm->OutStreamer.EmitLabel(getTempLabel("section_macinfo"));
2336  }
2337
2338  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLineSection());
2339  Asm->OutStreamer.EmitLabel(getTempLabel("section_line"));
2340  Asm->OutStreamer.SwitchSection(TLOF.getDwarfLocSection());
2341  Asm->OutStreamer.EmitLabel(getTempLabel("section_loc"));
2342  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubNamesSection());
2343  Asm->OutStreamer.EmitLabel(getTempLabel("section_pubnames"));
2344  Asm->OutStreamer.SwitchSection(TLOF.getDwarfPubTypesSection());
2345  Asm->OutStreamer.EmitLabel(getTempLabel("section_pubtypes"));
2346  Asm->OutStreamer.SwitchSection(TLOF.getDwarfStrSection());
2347  Asm->OutStreamer.EmitLabel(getTempLabel("section_str"));
2348  Asm->OutStreamer.SwitchSection(TLOF.getDwarfRangesSection());
2349  Asm->OutStreamer.EmitLabel(getTempLabel("section_ranges"));
2350
2351  Asm->OutStreamer.SwitchSection(TLOF.getTextSection());
2352  Asm->OutStreamer.EmitLabel(getTempLabel("text_begin"));
2353  Asm->OutStreamer.SwitchSection(TLOF.getDataSection());
2354  Asm->OutStreamer.EmitLabel(getTempLabel("data_begin"));
2355}
2356
2357/// emitDIE - Recusively Emits a debug information entry.
2358///
2359void DwarfDebug::emitDIE(DIE *Die) {
2360  // Get the abbreviation for this DIE.
2361  unsigned AbbrevNumber = Die->getAbbrevNumber();
2362  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2363
2364  Asm->O << '\n';
2365
2366  // Emit the code (index) for the abbreviation.
2367  if (Asm->VerboseAsm)
2368    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2369                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2370                                Twine::utohexstr(Die->getSize()) + " " +
2371                                dwarf::TagString(Abbrev->getTag()));
2372  EmitULEB128(AbbrevNumber);
2373
2374  SmallVector<DIEValue*, 32> &Values = Die->getValues();
2375  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2376
2377  // Emit the DIE attribute values.
2378  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2379    unsigned Attr = AbbrevData[i].getAttribute();
2380    unsigned Form = AbbrevData[i].getForm();
2381    assert(Form && "Too many attributes for DIE (check abbreviation)");
2382
2383    if (Asm->VerboseAsm)
2384      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2385
2386    switch (Attr) {
2387    case dwarf::DW_AT_sibling:
2388      Asm->EmitInt32(Die->getSiblingOffset());
2389      break;
2390    case dwarf::DW_AT_abstract_origin: {
2391      DIEEntry *E = cast<DIEEntry>(Values[i]);
2392      DIE *Origin = E->getEntry();
2393      unsigned Addr = Origin->getOffset();
2394      Asm->EmitInt32(Addr);
2395      break;
2396    }
2397    default:
2398      // Emit an attribute using the defined form.
2399      Values[i]->EmitValue(this, Form);
2400      O << "\n"; // REMOVE This once all EmitValue impls emit their own newline.
2401      break;
2402    }
2403  }
2404
2405  // Emit the DIE children if any.
2406  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2407    const std::vector<DIE *> &Children = Die->getChildren();
2408
2409    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2410      emitDIE(Children[j]);
2411
2412    Asm->EmitInt8(0); EOL("End Of Children Mark");
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->EmitInt32(ContentSize);  EOL("Length of Compilation Unit Info");
2435  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2436  EmitSectionOffset(getTempLabel("abbrev_begin"),getTempLabel("section_abbrev"),
2437                    true, false);
2438  EOL("Offset Into Abbrev. Section");
2439  Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2440
2441  emitDIE(Die);
2442  // FIXME - extra padding for gdb bug.
2443  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2444  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2445  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2446  Asm->EmitInt8(0); EOL("Extra Pad For GDB");
2447  Asm->OutStreamer.EmitLabel(getDWLabel("info_end", ModuleCU->getID()));
2448  Asm->O << '\n';
2449}
2450
2451/// emitAbbreviations - Emit the abbreviation section.
2452///
2453void DwarfDebug::emitAbbreviations() const {
2454  // Check to see if it is worth the effort.
2455  if (!Abbreviations.empty()) {
2456    // Start the debug abbrev section.
2457    Asm->OutStreamer.SwitchSection(
2458                            Asm->getObjFileLowering().getDwarfAbbrevSection());
2459
2460    Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_begin"));
2461
2462    // For each abbrevation.
2463    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2464      // Get abbreviation data
2465      const DIEAbbrev *Abbrev = Abbreviations[i];
2466
2467      // Emit the abbrevations code (base 1 index.)
2468      EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2469
2470      // Emit the abbreviations data.
2471      Abbrev->Emit(this);
2472      Asm->O << '\n';
2473    }
2474
2475    // Mark end of abbreviations.
2476    EmitULEB128(0, "EOM(3)");
2477
2478    Asm->OutStreamer.EmitLabel(getTempLabel("abbrev_end"));
2479  }
2480}
2481
2482/// emitEndOfLineMatrix - Emit the last address of the section and the end of
2483/// the line matrix.
2484///
2485void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2486  // Define last address of section.
2487  Asm->EmitInt8(0); EOL("Extended Op");
2488  Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2489  Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2490  EmitReference(getDWLabel("section_end", SectionEnd));
2491  EOL("Section end label");
2492
2493  // Mark end of matrix.
2494  Asm->EmitInt8(0); EOL("DW_LNE_end_sequence");
2495  Asm->EmitInt8(1);
2496  Asm->EmitInt8(1);
2497}
2498
2499/// emitDebugLines - Emit source line information.
2500///
2501void DwarfDebug::emitDebugLines() {
2502  // If the target is using .loc/.file, the assembler will be emitting the
2503  // .debug_line table automatically.
2504  if (MAI->hasDotLocAndDotFile())
2505    return;
2506
2507  // Minimum line delta, thus ranging from -10..(255-10).
2508  const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
2509  // Maximum line delta, thus ranging from -10..(255-10).
2510  const int MaxLineDelta = 255 + MinLineDelta;
2511
2512  // Start the dwarf line section.
2513  Asm->OutStreamer.SwitchSection(
2514                            Asm->getObjFileLowering().getDwarfLineSection());
2515
2516  // Construct the section header.
2517  EmitDifference(getTempLabel("line_end"), getTempLabel("line_begin"), true);
2518  EOL("Length of Source Line Info");
2519  Asm->OutStreamer.EmitLabel(getTempLabel("line_begin"));
2520
2521  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF version number");
2522
2523  EmitDifference(getTempLabel("line_prolog_end"),
2524                 getTempLabel("line_prolog_begin"), true);
2525  EOL("Prolog Length");
2526  Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_begin"));
2527
2528  Asm->EmitInt8(1); EOL("Minimum Instruction Length");
2529  Asm->EmitInt8(1); EOL("Default is_stmt_start flag");
2530  Asm->EmitInt8(MinLineDelta); EOL("Line Base Value (Special Opcodes)");
2531  Asm->EmitInt8(MaxLineDelta); EOL("Line Range Value (Special Opcodes)");
2532  Asm->EmitInt8(-MinLineDelta); EOL("Special Opcode Base");
2533
2534  // Line number standard opcode encodings argument count
2535  Asm->EmitInt8(0); EOL("DW_LNS_copy arg count");
2536  Asm->EmitInt8(1); EOL("DW_LNS_advance_pc arg count");
2537  Asm->EmitInt8(1); EOL("DW_LNS_advance_line arg count");
2538  Asm->EmitInt8(1); EOL("DW_LNS_set_file arg count");
2539  Asm->EmitInt8(1); EOL("DW_LNS_set_column arg count");
2540  Asm->EmitInt8(0); EOL("DW_LNS_negate_stmt arg count");
2541  Asm->EmitInt8(0); EOL("DW_LNS_set_basic_block arg count");
2542  Asm->EmitInt8(0); EOL("DW_LNS_const_add_pc arg count");
2543  Asm->EmitInt8(1); EOL("DW_LNS_fixed_advance_pc arg count");
2544
2545  // Emit directories.
2546  for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
2547    const std::string &Dir = getSourceDirectoryName(DI);
2548    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Directory");
2549    Asm->OutStreamer.EmitBytes(StringRef(Dir.c_str(), Dir.size()+1), 0);
2550  }
2551
2552  Asm->EmitInt8(0); EOL("End of directories");
2553
2554  // Emit files.
2555  for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
2556    // Remember source id starts at 1.
2557    std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
2558    const std::string &FN = getSourceFileName(Id.second);
2559    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("Source");
2560    Asm->OutStreamer.EmitBytes(StringRef(FN.c_str(), FN.size()+1), 0);
2561
2562    EmitULEB128(Id.first, "Directory #");
2563    EmitULEB128(0, "Mod date");
2564    EmitULEB128(0, "File size");
2565  }
2566
2567  Asm->EmitInt8(0); EOL("End of files");
2568
2569  Asm->OutStreamer.EmitLabel(getTempLabel("line_prolog_end"));
2570
2571  // A sequence for each text section.
2572  unsigned SecSrcLinesSize = SectionSourceLines.size();
2573
2574  for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
2575    // Isolate current sections line info.
2576    const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
2577
2578    /*if (Asm->isVerbose()) {
2579      const MCSection *S = SectionMap[j + 1];
2580      O << '\t' << MAI->getCommentString() << " Section"
2581        << S->getName() << '\n';
2582    }*/
2583    Asm->O << '\n';
2584
2585    // Dwarf assumes we start with first line of first source file.
2586    unsigned Source = 1;
2587    unsigned Line = 1;
2588
2589    // Construct rows of the address, source, line, column matrix.
2590    for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
2591      const SrcLineInfo &LineInfo = LineInfos[i];
2592      unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
2593      if (!LabelID) continue;
2594
2595      if (LineInfo.getLine() == 0) continue;
2596
2597      if (!Asm->isVerbose())
2598        Asm->O << '\n';
2599      else {
2600        std::pair<unsigned, unsigned> SourceID =
2601          getSourceDirectoryAndFileIds(LineInfo.getSourceID());
2602        O << '\t' << MAI->getCommentString() << ' '
2603          << getSourceDirectoryName(SourceID.first) << '/'
2604          << getSourceFileName(SourceID.second)
2605          << ':' << utostr_32(LineInfo.getLine()) << '\n';
2606      }
2607
2608      // Define the line address.
2609      Asm->EmitInt8(0); EOL("Extended Op");
2610      Asm->EmitInt8(TD->getPointerSize() + 1); EOL("Op size");
2611      Asm->EmitInt8(dwarf::DW_LNE_set_address); EOL("DW_LNE_set_address");
2612      EmitReference(getDWLabel("label", LabelID)); EOL("Location label");
2613
2614      // If change of source, then switch to the new source.
2615      if (Source != LineInfo.getSourceID()) {
2616        Source = LineInfo.getSourceID();
2617        Asm->EmitInt8(dwarf::DW_LNS_set_file); EOL("DW_LNS_set_file");
2618        EmitULEB128(Source, "New Source");
2619      }
2620
2621      // If change of line.
2622      if (Line != LineInfo.getLine()) {
2623        // Determine offset.
2624        int Offset = LineInfo.getLine() - Line;
2625        int Delta = Offset - MinLineDelta;
2626
2627        // Update line.
2628        Line = LineInfo.getLine();
2629
2630        // If delta is small enough and in range...
2631        if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
2632          // ... then use fast opcode.
2633          Asm->EmitInt8(Delta - MinLineDelta); EOL("Line Delta");
2634        } else {
2635          // ... otherwise use long hand.
2636          Asm->EmitInt8(dwarf::DW_LNS_advance_line);
2637          EOL("DW_LNS_advance_line");
2638          EmitSLEB128(Offset, "Line Offset");
2639          Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2640        }
2641      } else {
2642        // Copy the previous row (different address or source)
2643        Asm->EmitInt8(dwarf::DW_LNS_copy); EOL("DW_LNS_copy");
2644      }
2645    }
2646
2647    emitEndOfLineMatrix(j + 1);
2648  }
2649
2650  if (SecSrcLinesSize == 0)
2651    // Because we're emitting a debug_line section, we still need a line
2652    // table. The linker and friends expect it to exist. If there's nothing to
2653    // put into it, emit an empty table.
2654    emitEndOfLineMatrix(1);
2655
2656  Asm->OutStreamer.EmitLabel(getTempLabel("line_end"));
2657}
2658
2659/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2660///
2661void DwarfDebug::emitCommonDebugFrame() {
2662  if (!MAI->doesDwarfRequireFrameSection())
2663    return;
2664
2665  int stackGrowth =
2666    Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
2667      TargetFrameInfo::StackGrowsUp ?
2668    TD->getPointerSize() : -TD->getPointerSize();
2669
2670  // Start the dwarf frame section.
2671  Asm->OutStreamer.SwitchSection(
2672                              Asm->getObjFileLowering().getDwarfFrameSection());
2673
2674  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common"));
2675  EmitDifference(getTempLabel("debug_frame_common_end"),
2676                 getTempLabel("debug_frame_common_begin"), true);
2677  EOL("Length of Common Information Entry");
2678
2679  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_begin"));
2680  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2681  EOL("CIE Identifier Tag");
2682  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2683  EOL("CIE Version");
2684  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2685  EOL("CIE Augmentation");
2686  EmitULEB128(1, "CIE Code Alignment Factor");
2687  EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2688  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2689  EOL("CIE RA Column");
2690
2691  std::vector<MachineMove> Moves;
2692  RI->getInitialFrameState(Moves);
2693
2694  EmitFrameMoves(NULL, 0, Moves, false);
2695
2696  Asm->EmitAlignment(2, 0, 0, false);
2697  Asm->OutStreamer.EmitLabel(getTempLabel("debug_frame_common_end"));
2698}
2699
2700/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2701/// section.
2702void
2703DwarfDebug::emitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
2704  if (!MAI->doesDwarfRequireFrameSection())
2705    return;
2706
2707  // Start the dwarf frame section.
2708  Asm->OutStreamer.SwitchSection(
2709                              Asm->getObjFileLowering().getDwarfFrameSection());
2710
2711  EmitDifference(getDWLabel("debug_frame_end", DebugFrameInfo.Number),
2712                 getDWLabel("debug_frame_begin", DebugFrameInfo.Number), true);
2713  EOL("Length of Frame Information Entry");
2714
2715  Asm->OutStreamer.EmitLabel(getDWLabel("debug_frame_begin",
2716                                        DebugFrameInfo.Number));
2717
2718  EmitSectionOffset(getTempLabel("debug_frame_common"),
2719                    getTempLabel("section_debug_frame"), true, false);
2720  EOL("FDE CIE offset");
2721
2722  EmitReference(getDWLabel("func_begin", DebugFrameInfo.Number));
2723  EOL("FDE initial location");
2724  EmitDifference(getDWLabel("func_end", DebugFrameInfo.Number),
2725                 getDWLabel("func_begin", DebugFrameInfo.Number));
2726  EOL("FDE address range");
2727
2728  EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
2729                 false);
2730
2731  Asm->EmitAlignment(2, 0, 0, false);
2732  Asm->OutStreamer.EmitLabel(getDWLabel("debug_frame_end",
2733                                        DebugFrameInfo.Number));
2734}
2735
2736/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2737///
2738void DwarfDebug::emitDebugPubNames() {
2739  // Start the dwarf pubnames section.
2740  Asm->OutStreamer.SwitchSection(
2741                          Asm->getObjFileLowering().getDwarfPubNamesSection());
2742
2743  EmitDifference(getDWLabel("pubnames_end", ModuleCU->getID()),
2744                 getDWLabel("pubnames_begin", ModuleCU->getID()), true);
2745  EOL("Length of Public Names Info");
2746
2747  Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_begin", ModuleCU->getID()));
2748
2749  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("DWARF Version");
2750
2751  EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2752                    getTempLabel("section_info"),
2753                    true, false);
2754  EOL("Offset of Compilation Unit Info");
2755
2756  EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2757                 getDWLabel("info_begin", ModuleCU->getID()),
2758                 true);
2759  EOL("Compilation Unit Length");
2760
2761  const StringMap<DIE*> &Globals = ModuleCU->getGlobals();
2762  for (StringMap<DIE*>::const_iterator
2763         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2764    const char *Name = GI->getKeyData();
2765    DIE * Entity = GI->second;
2766
2767    Asm->EmitInt32(Entity->getOffset()); EOL("DIE offset");
2768
2769    if (Asm->VerboseAsm)
2770      Asm->OutStreamer.AddComment("External Name");
2771    Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2772  }
2773
2774  Asm->EmitInt32(0); EOL("End Mark");
2775  Asm->OutStreamer.EmitLabel(getDWLabel("pubnames_end", ModuleCU->getID()));
2776}
2777
2778void DwarfDebug::emitDebugPubTypes() {
2779  // Start the dwarf pubnames section.
2780  Asm->OutStreamer.SwitchSection(
2781                          Asm->getObjFileLowering().getDwarfPubTypesSection());
2782  EmitDifference(getDWLabel("pubtypes_end", ModuleCU->getID()),
2783                 getDWLabel("pubtypes_begin", ModuleCU->getID()), true);
2784  EOL("Length of Public Types Info");
2785
2786  Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_begin", ModuleCU->getID()));
2787
2788  if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DWARF Version");
2789  Asm->EmitInt16(dwarf::DWARF_VERSION);
2790
2791  EmitSectionOffset(getDWLabel("info_begin", ModuleCU->getID()),
2792                    getTempLabel("section_info"), true, false);
2793  EOL("Offset of Compilation ModuleCU Info");
2794
2795  EmitDifference(getDWLabel("info_end", ModuleCU->getID()),
2796                 getDWLabel("info_begin", ModuleCU->getID()),
2797                 true);
2798  EOL("Compilation ModuleCU Length");
2799
2800  const StringMap<DIE*> &Globals = ModuleCU->getGlobalTypes();
2801  for (StringMap<DIE*>::const_iterator
2802         GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2803    const char *Name = GI->getKeyData();
2804    DIE * Entity = GI->second;
2805
2806    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2807    Asm->EmitInt32(Entity->getOffset());
2808
2809    if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("External Name");
2810    Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2811  }
2812
2813  Asm->EmitInt32(0); EOL("End Mark");
2814  Asm->OutStreamer.EmitLabel(getDWLabel("pubtypes_end", ModuleCU->getID()));
2815}
2816
2817/// emitDebugStr - Emit visible names into a debug str section.
2818///
2819void DwarfDebug::emitDebugStr() {
2820  // Check to see if it is worth the effort.
2821  if (!StringPool.empty()) {
2822    // Start the dwarf str section.
2823    Asm->OutStreamer.SwitchSection(
2824                                Asm->getObjFileLowering().getDwarfStrSection());
2825
2826    // For each of strings in the string pool.
2827    for (unsigned StringID = 1, N = StringPool.size();
2828         StringID <= N; ++StringID) {
2829      // Emit a label for reference from debug information entries.
2830      Asm->OutStreamer.EmitLabel(getDWLabel("string", StringID));
2831
2832      // Emit the string itself.
2833      const std::string &String = StringPool[StringID];
2834      Asm->OutStreamer.EmitBytes(StringRef(String.c_str(), String.size()+1), 0);
2835    }
2836
2837    Asm->O << '\n';
2838  }
2839}
2840
2841/// emitDebugLoc - Emit visible names into a debug loc section.
2842///
2843void DwarfDebug::emitDebugLoc() {
2844  // Start the dwarf loc section.
2845  Asm->OutStreamer.SwitchSection(
2846                              Asm->getObjFileLowering().getDwarfLocSection());
2847}
2848
2849/// EmitDebugARanges - Emit visible names into a debug aranges section.
2850///
2851void DwarfDebug::EmitDebugARanges() {
2852  // Start the dwarf aranges section.
2853  Asm->OutStreamer.SwitchSection(
2854                          Asm->getObjFileLowering().getDwarfARangesSection());
2855
2856  // FIXME - Mock up
2857#if 0
2858  CompileUnit *Unit = GetBaseCompileUnit();
2859
2860  // Don't include size of length
2861  Asm->EmitInt32(0x1c); EOL("Length of Address Ranges Info");
2862
2863  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2864
2865  EmitReference("info_begin", Unit->getID());
2866  EOL("Offset of Compilation Unit Info");
2867
2868  Asm->EmitInt8(TD->getPointerSize()); EOL("Size of Address");
2869
2870  Asm->EmitInt8(0); EOL("Size of Segment Descriptor");
2871
2872  Asm->EmitInt16(0);  EOL("Pad (1)");
2873  Asm->EmitInt16(0);  EOL("Pad (2)");
2874
2875  // Range 1
2876  EmitReference("text_begin", 0); EOL("Address");
2877  EmitDifference(getTempLabel("text_end"), getTempLabel("text_begin"),
2878                 true); EOL("Length");
2879
2880  Asm->EmitInt32(0); EOL("EOM (1)");
2881  Asm->EmitInt32(0); EOL("EOM (2)");
2882#endif
2883}
2884
2885/// emitDebugRanges - Emit visible names into a debug ranges section.
2886///
2887void DwarfDebug::emitDebugRanges() {
2888  // Start the dwarf ranges section.
2889  Asm->OutStreamer.SwitchSection(
2890                            Asm->getObjFileLowering().getDwarfRangesSection());
2891}
2892
2893/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2894///
2895void DwarfDebug::emitDebugMacInfo() {
2896  if (const MCSection *LineInfo =
2897      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2898    // Start the dwarf macinfo section.
2899    Asm->OutStreamer.SwitchSection(LineInfo);
2900  }
2901}
2902
2903/// emitDebugInlineInfo - Emit inline info using following format.
2904/// Section Header:
2905/// 1. length of section
2906/// 2. Dwarf version number
2907/// 3. address size.
2908///
2909/// Entries (one "entry" for each function that was inlined):
2910///
2911/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2912///   otherwise offset into __debug_str for regular function name.
2913/// 2. offset into __debug_str section for regular function name.
2914/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2915/// instances for the function.
2916///
2917/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2918/// inlined instance; the die_offset points to the inlined_subroutine die in the
2919/// __debug_info section, and the low_pc is the starting address for the
2920/// inlining instance.
2921void DwarfDebug::emitDebugInlineInfo() {
2922  if (!MAI->doesDwarfUsesInlineInfoSection())
2923    return;
2924
2925  if (!ModuleCU)
2926    return;
2927
2928  Asm->OutStreamer.SwitchSection(
2929                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
2930
2931  EmitDifference(getDWLabel("debug_inlined_end", 1),
2932                 getDWLabel("debug_inlined_begin", 1), true);
2933  EOL("Length of Debug Inlined Information Entry");
2934
2935  Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_begin", 1));
2936
2937  Asm->EmitInt16(dwarf::DWARF_VERSION); EOL("Dwarf Version");
2938  Asm->EmitInt8(TD->getPointerSize()); EOL("Address Size (in bytes)");
2939
2940  for (SmallVector<MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2941         E = InlinedSPNodes.end(); I != E; ++I) {
2942
2943    MDNode *Node = *I;
2944    DenseMap<MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2945      = InlineInfo.find(Node);
2946    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2947    DISubprogram SP(Node);
2948    StringRef LName = SP.getLinkageName();
2949    StringRef Name = SP.getName();
2950
2951    if (LName.empty()) {
2952      Asm->OutStreamer.EmitBytes(Name, 0);
2953      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2954    } else
2955      EmitSectionOffset(getDWLabel("string",
2956                                   StringPool.idFor(getRealLinkageName(LName))),
2957                        getTempLabel("section_str"), true);
2958
2959    EOL("MIPS linkage name");
2960    EmitSectionOffset(getDWLabel("string", StringPool.idFor(Name)),
2961                      getTempLabel("section_str"), false, true);
2962    EOL("Function name");
2963    EmitULEB128(Labels.size(), "Inline count");
2964
2965    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2966           LE = Labels.end(); LI != LE; ++LI) {
2967      if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("DIE offset");
2968      Asm->EmitInt32(LI->second->getOffset());
2969
2970      if (Asm->VerboseAsm) Asm->OutStreamer.AddComment("low_pc");
2971      Asm->OutStreamer.EmitSymbolValue(LI->first, TD->getPointerSize(), 0);
2972    }
2973  }
2974
2975  Asm->OutStreamer.EmitLabel(getDWLabel("debug_inlined_end", 1));
2976}
2977