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