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