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