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