DwarfDebug.cpp revision a938dd0dc9737779dfd476e3099e0bad617aad4a
1//===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for writing dwarf debug info into asm files.
11//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "dwarfdebug"
15#include "DwarfDebug.h"
16#include "DIE.h"
17#include "DwarfCompileUnit.h"
18#include "llvm/Constants.h"
19#include "llvm/Module.h"
20#include "llvm/Instructions.h"
21#include "llvm/CodeGen/MachineFunction.h"
22#include "llvm/CodeGen/MachineModuleInfo.h"
23#include "llvm/MC/MCAsmInfo.h"
24#include "llvm/MC/MCSection.h"
25#include "llvm/MC/MCStreamer.h"
26#include "llvm/MC/MCSymbol.h"
27#include "llvm/Target/Mangler.h"
28#include "llvm/Target/TargetData.h"
29#include "llvm/Target/TargetFrameLowering.h"
30#include "llvm/Target/TargetLoweringObjectFile.h"
31#include "llvm/Target/TargetMachine.h"
32#include "llvm/Target/TargetRegisterInfo.h"
33#include "llvm/Target/TargetOptions.h"
34#include "llvm/Analysis/DebugInfo.h"
35#include "llvm/Analysis/DIBuilder.h"
36#include "llvm/ADT/Statistic.h"
37#include "llvm/ADT/STLExtras.h"
38#include "llvm/ADT/StringExtras.h"
39#include "llvm/Support/CommandLine.h"
40#include "llvm/Support/Debug.h"
41#include "llvm/Support/ErrorHandling.h"
42#include "llvm/Support/ValueHandle.h"
43#include "llvm/Support/FormattedStream.h"
44#include "llvm/Support/Timer.h"
45#include "llvm/Support/Path.h"
46using namespace llvm;
47
48static cl::opt<bool> PrintDbgScope("print-dbgscope", cl::Hidden,
49     cl::desc("Print DbgScope information for each machine instruction"));
50
51static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
52                                              cl::Hidden,
53     cl::desc("Disable debug info printing"));
54
55static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
56     cl::desc("Make an absence of debug location information explicit."),
57     cl::init(false));
58
59#ifndef NDEBUG
60STATISTIC(BlocksWithoutLineNo, "Number of blocks without any line number");
61#endif
62
63namespace {
64  const char *DWARFGroupName = "DWARF Emission";
65  const char *DbgTimerName = "DWARF Debug Writer";
66} // end anonymous namespace
67
68//===----------------------------------------------------------------------===//
69
70/// Configuration values for initial hash set sizes (log2).
71///
72static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
73
74namespace llvm {
75
76DIType DbgVariable::getType()               const {
77  DIType Ty = Var.getType();
78  // FIXME: isBlockByrefVariable should be reformulated in terms of complex
79  // addresses instead.
80  if (Var.isBlockByrefVariable()) {
81    /* Byref variables, in Blocks, are declared by the programmer as
82       "SomeType VarName;", but the compiler creates a
83       __Block_byref_x_VarName struct, and gives the variable VarName
84       either the struct, or a pointer to the struct, as its type.  This
85       is necessary for various behind-the-scenes things the compiler
86       needs to do with by-reference variables in blocks.
87
88       However, as far as the original *programmer* is concerned, the
89       variable should still have type 'SomeType', as originally declared.
90
91       The following function dives into the __Block_byref_x_VarName
92       struct to find the original type of the variable.  This will be
93       passed back to the code generating the type for the Debug
94       Information Entry for the variable 'VarName'.  'VarName' will then
95       have the original type 'SomeType' in its debug information.
96
97       The original type 'SomeType' will be the type of the field named
98       'VarName' inside the __Block_byref_x_VarName struct.
99
100       NOTE: In order for this to not completely fail on the debugger
101       side, the Debug Information Entry for the variable VarName needs to
102       have a DW_AT_location that tells the debugger how to unwind through
103       the pointers and __Block_byref_x_VarName struct to find the actual
104       value of the variable.  The function addBlockByrefType does this.  */
105    DIType subType = Ty;
106    unsigned tag = Ty.getTag();
107
108    if (tag == dwarf::DW_TAG_pointer_type) {
109      DIDerivedType DTy = DIDerivedType(Ty);
110      subType = DTy.getTypeDerivedFrom();
111    }
112
113    DICompositeType blockStruct = DICompositeType(subType);
114    DIArray Elements = blockStruct.getTypeArray();
115
116    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
117      DIDescriptor Element = Elements.getElement(i);
118      DIDerivedType DT = DIDerivedType(Element);
119      if (getName() == DT.getName())
120        return (DT.getTypeDerivedFrom());
121    }
122    return Ty;
123  }
124  return Ty;
125}
126
127//===----------------------------------------------------------------------===//
128/// DbgRange - This is used to track range of instructions with identical
129/// debug info scope.
130///
131typedef std::pair<const MachineInstr *, const MachineInstr *> DbgRange;
132
133//===----------------------------------------------------------------------===//
134/// DbgScope - This class is used to track scope information.
135///
136class DbgScope {
137  DbgScope *Parent;                   // Parent to this scope.
138  DIDescriptor Desc;                  // Debug info descriptor for scope.
139  // Location at which this scope is inlined.
140  AssertingVH<const MDNode> InlinedAtLocation;
141  bool AbstractScope;                 // Abstract Scope
142  const MachineInstr *LastInsn;       // Last instruction of this scope.
143  const MachineInstr *FirstInsn;      // First instruction of this scope.
144  unsigned DFSIn, DFSOut;
145  // Scopes defined in scope.  Contents not owned.
146  SmallVector<DbgScope *, 4> Scopes;
147  // Variables declared in scope.  Contents owned.
148  SmallVector<DbgVariable *, 8> Variables;
149  SmallVector<DbgRange, 4> Ranges;
150  // Private state for dump()
151  mutable unsigned IndentLevel;
152public:
153  DbgScope(DbgScope *P, DIDescriptor D, const MDNode *I = 0)
154    : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(false),
155      LastInsn(0), FirstInsn(0),
156      DFSIn(0), DFSOut(0), IndentLevel(0) {}
157  virtual ~DbgScope();
158
159  // Accessors.
160  DbgScope *getParent()          const { return Parent; }
161  void setParent(DbgScope *P)          { Parent = P; }
162  DIDescriptor getDesc()         const { return Desc; }
163  const MDNode *getInlinedAt()         const { return InlinedAtLocation; }
164  const MDNode *getScopeNode()         const { return Desc; }
165  const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
166  const SmallVector<DbgVariable *, 8> &getDbgVariables() { return Variables; }
167  const SmallVector<DbgRange, 4> &getRanges() { return Ranges; }
168
169  /// openInsnRange - This scope covers instruction range starting from MI.
170  void openInsnRange(const MachineInstr *MI) {
171    if (!FirstInsn)
172      FirstInsn = MI;
173
174    if (Parent)
175      Parent->openInsnRange(MI);
176  }
177
178  /// extendInsnRange - Extend the current instruction range covered by
179  /// this scope.
180  void extendInsnRange(const MachineInstr *MI) {
181    assert (FirstInsn && "MI Range is not open!");
182    LastInsn = MI;
183    if (Parent)
184      Parent->extendInsnRange(MI);
185  }
186
187  /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected
188  /// until now. This is used when a new scope is encountered while walking
189  /// machine instructions.
190  void closeInsnRange(DbgScope *NewScope = NULL) {
191    assert (LastInsn && "Last insn missing!");
192    Ranges.push_back(DbgRange(FirstInsn, LastInsn));
193    FirstInsn = NULL;
194    LastInsn = NULL;
195    // If Parent dominates NewScope then do not close Parent's instruction
196    // range.
197    if (Parent && (!NewScope || !Parent->dominates(NewScope)))
198      Parent->closeInsnRange(NewScope);
199  }
200
201  void setAbstractScope() { AbstractScope = true; }
202  bool isAbstractScope() const { return AbstractScope; }
203
204  // Depth First Search support to walk and mainpluate DbgScope hierarchy.
205  unsigned getDFSOut() const { return DFSOut; }
206  void setDFSOut(unsigned O) { DFSOut = O; }
207  unsigned getDFSIn() const  { return DFSIn; }
208  void setDFSIn(unsigned I)  { DFSIn = I; }
209  bool dominates(const DbgScope *S) {
210    if (S == this)
211      return true;
212    if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut())
213      return true;
214    return false;
215  }
216
217  /// addScope - Add a scope to the scope.
218  ///
219  void addScope(DbgScope *S) { Scopes.push_back(S); }
220
221  /// addVariable - Add a variable to the scope.
222  ///
223  void addVariable(DbgVariable *V) { Variables.push_back(V); }
224
225#ifndef NDEBUG
226  void dump() const;
227#endif
228};
229
230} // end llvm namespace
231
232#ifndef NDEBUG
233void DbgScope::dump() const {
234  raw_ostream &err = dbgs();
235  err.indent(IndentLevel);
236  const MDNode *N = Desc;
237  N->dump();
238  if (AbstractScope)
239    err << "Abstract Scope\n";
240
241  IndentLevel += 2;
242  if (!Scopes.empty())
243    err << "Children ...\n";
244  for (unsigned i = 0, e = Scopes.size(); i != e; ++i)
245    if (Scopes[i] != this)
246      Scopes[i]->dump();
247
248  IndentLevel -= 2;
249}
250#endif
251
252DbgScope::~DbgScope() {
253  for (unsigned j = 0, M = Variables.size(); j < M; ++j)
254    delete Variables[j];
255}
256
257DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
258  : Asm(A), MMI(Asm->MMI), FirstCU(0),
259    AbbreviationsSet(InitAbbreviationsSetSize),
260    CurrentFnDbgScope(0), PrevLabel(NULL) {
261  NextStringPoolNumber = 0;
262
263  DwarfFrameSectionSym = DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
264  DwarfStrSectionSym = TextSectionSym = 0;
265  DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
266  FunctionBeginSym = FunctionEndSym = 0;
267  {
268    NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
269    beginModule(M);
270  }
271}
272DwarfDebug::~DwarfDebug() {
273}
274
275MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
276  std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
277  if (Entry.first) return Entry.first;
278
279  Entry.second = NextStringPoolNumber++;
280  return Entry.first = Asm->GetTempSymbol("string", Entry.second);
281}
282
283
284/// assignAbbrevNumber - Define a unique number for the abbreviation.
285///
286void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
287  // Profile the node so that we can make it unique.
288  FoldingSetNodeID ID;
289  Abbrev.Profile(ID);
290
291  // Check the set for priors.
292  DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
293
294  // If it's newly added.
295  if (InSet == &Abbrev) {
296    // Add to abbreviation list.
297    Abbreviations.push_back(&Abbrev);
298
299    // Assign the vector position + 1 as its number.
300    Abbrev.setNumber(Abbreviations.size());
301  } else {
302    // Assign existing abbreviation number.
303    Abbrev.setNumber(InSet->getNumber());
304  }
305}
306
307/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
308/// printer to not emit usual symbol prefix before the symbol name is used then
309/// return linkage name after skipping this special LLVM prefix.
310static StringRef getRealLinkageName(StringRef LinkageName) {
311  char One = '\1';
312  if (LinkageName.startswith(StringRef(&One, 1)))
313    return LinkageName.substr(1);
314  return LinkageName;
315}
316
317/// createSubprogramDIE - Create new DIE using SP.
318DIE *DwarfDebug::createSubprogramDIE(DISubprogram SP) {
319  CompileUnit *SPCU = getCompileUnit(SP);
320  DIE *SPDie = SPCU->getDIE(SP);
321  if (SPDie)
322    return SPDie;
323
324  SPDie = new DIE(dwarf::DW_TAG_subprogram);
325
326  // DW_TAG_inlined_subroutine may refer to this DIE.
327  SPCU->insertDIE(SP, SPDie);
328
329  // Add to context owner.
330  SPCU->addToContextOwner(SPDie, SP.getContext());
331
332  // Add function template parameters.
333  SPCU->addTemplateParams(*SPDie, SP.getTemplateParams());
334
335  StringRef LinkageName = SP.getLinkageName();
336  if (!LinkageName.empty())
337    SPCU->addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,
338                    getRealLinkageName(LinkageName));
339
340  // If this DIE is going to refer declaration info using AT_specification
341  // then there is no need to add other attributes.
342  if (SP.getFunctionDeclaration().isSubprogram())
343    return SPDie;
344
345  // Constructors and operators for anonymous aggregates do not have names.
346  if (!SP.getName().empty())
347    SPCU->addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
348                    SP.getName());
349
350  SPCU->addSourceLine(SPDie, SP);
351
352  if (SP.isPrototyped())
353    SPCU->addUInt(SPDie, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1);
354
355  // Add Return Type.
356  DICompositeType SPTy = SP.getType();
357  DIArray Args = SPTy.getTypeArray();
358  unsigned SPTag = SPTy.getTag();
359
360  if (Args.getNumElements() == 0 || SPTag != dwarf::DW_TAG_subroutine_type)
361    SPCU->addType(SPDie, SPTy);
362  else
363    SPCU->addType(SPDie, DIType(Args.getElement(0)));
364
365  unsigned VK = SP.getVirtuality();
366  if (VK) {
367    SPCU->addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_flag, VK);
368    DIEBlock *Block = SPCU->getDIEBlock();
369    SPCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
370    SPCU->addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex());
371    SPCU->addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block);
372    ContainingTypeMap.insert(std::make_pair(SPDie,
373                                            SP.getContainingType()));
374  }
375
376  if (!SP.isDefinition()) {
377    SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
378
379    // Add arguments. Do not add arguments for subprogram definition. They will
380    // be handled while processing variables.
381    DICompositeType SPTy = SP.getType();
382    DIArray Args = SPTy.getTypeArray();
383    unsigned SPTag = SPTy.getTag();
384
385    if (SPTag == dwarf::DW_TAG_subroutine_type)
386      for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {
387        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
388        DIType ATy = DIType(DIType(Args.getElement(i)));
389        SPCU->addType(Arg, ATy);
390        if (ATy.isArtificial())
391          SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
392        SPDie->addChild(Arg);
393      }
394  }
395
396  if (SP.isArtificial())
397    SPCU->addUInt(SPDie, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
398
399  if (!SP.isLocalToUnit())
400    SPCU->addUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
401
402  if (SP.isOptimized())
403    SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
404
405  if (unsigned isa = Asm->getISAEncoding()) {
406    SPCU->addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa);
407  }
408
409  return SPDie;
410}
411
412DbgScope *DwarfDebug::getOrCreateAbstractScope(const MDNode *N) {
413  assert(N && "Invalid Scope encoding!");
414
415  DbgScope *AScope = AbstractScopes.lookup(N);
416  if (AScope)
417    return AScope;
418
419  DbgScope *Parent = NULL;
420
421  DIDescriptor Scope(N);
422  if (Scope.isLexicalBlock()) {
423    DILexicalBlock DB(N);
424    DIDescriptor ParentDesc = DB.getContext();
425    Parent = getOrCreateAbstractScope(ParentDesc);
426  }
427
428  AScope = new DbgScope(Parent, DIDescriptor(N), NULL);
429
430  if (Parent)
431    Parent->addScope(AScope);
432  AScope->setAbstractScope();
433  AbstractScopes[N] = AScope;
434  if (DIDescriptor(N).isSubprogram())
435    AbstractScopesList.push_back(AScope);
436  return AScope;
437}
438
439/// isSubprogramContext - Return true if Context is either a subprogram
440/// or another context nested inside a subprogram.
441static bool isSubprogramContext(const MDNode *Context) {
442  if (!Context)
443    return false;
444  DIDescriptor D(Context);
445  if (D.isSubprogram())
446    return true;
447  if (D.isType())
448    return isSubprogramContext(DIType(Context).getContext());
449  return false;
450}
451
452/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
453/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
454/// If there are global variables in this scope then create and insert
455/// DIEs for these variables.
456DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
457  CompileUnit *SPCU = getCompileUnit(SPNode);
458  DIE *SPDie = SPCU->getDIE(SPNode);
459
460  assert(SPDie && "Unable to find subprogram DIE!");
461  DISubprogram SP(SPNode);
462
463  DISubprogram SPDecl = SP.getFunctionDeclaration();
464  if (SPDecl.isSubprogram())
465    // Refer function declaration directly.
466    SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
467                      createSubprogramDIE(SPDecl));
468  else {
469    // There is not any need to generate specification DIE for a function
470    // defined at compile unit level. If a function is defined inside another
471    // function then gdb prefers the definition at top level and but does not
472    // expect specification DIE in parent function. So avoid creating
473    // specification DIE for a function defined inside a function.
474    if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
475        !SP.getContext().isFile() &&
476        !isSubprogramContext(SP.getContext())) {
477      SPCU-> addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
478
479      // Add arguments.
480      DICompositeType SPTy = SP.getType();
481      DIArray Args = SPTy.getTypeArray();
482      unsigned SPTag = SPTy.getTag();
483      if (SPTag == dwarf::DW_TAG_subroutine_type)
484        for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
485          DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
486          DIType ATy = DIType(DIType(Args.getElement(i)));
487          SPCU->addType(Arg, ATy);
488          if (ATy.isArtificial())
489            SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
490          SPDie->addChild(Arg);
491        }
492      DIE *SPDeclDie = SPDie;
493      SPDie = new DIE(dwarf::DW_TAG_subprogram);
494      SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
495                        SPDeclDie);
496      SPCU->addDie(SPDie);
497    }
498  }
499  // Pick up abstract subprogram DIE.
500  if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
501    SPDie = new DIE(dwarf::DW_TAG_subprogram);
502    SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
503                      dwarf::DW_FORM_ref4, AbsSPDIE);
504    SPCU->addDie(SPDie);
505  }
506
507  SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
508                 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
509  SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
510                 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
511  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
512  MachineLocation Location(RI->getFrameRegister(*Asm->MF));
513  SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
514
515  return SPDie;
516}
517
518/// constructLexicalScope - Construct new DW_TAG_lexical_block
519/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
520DIE *DwarfDebug::constructLexicalScopeDIE(DbgScope *Scope) {
521
522  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
523  if (Scope->isAbstractScope())
524    return ScopeDIE;
525
526  const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
527  if (Ranges.empty())
528    return 0;
529
530  CompileUnit *TheCU = getCompileUnit(Scope->getScopeNode());
531  SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
532  if (Ranges.size() > 1) {
533    // .debug_range section has not been laid out yet. Emit offset in
534    // .debug_range as a uint, size 4, for now. emitDIE will handle
535    // DW_AT_ranges appropriately.
536    TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
537                   DebugRangeSymbols.size() * Asm->getTargetData().getPointerSize());
538    for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
539         RE = Ranges.end(); RI != RE; ++RI) {
540      DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
541      DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
542    }
543    DebugRangeSymbols.push_back(NULL);
544    DebugRangeSymbols.push_back(NULL);
545    return ScopeDIE;
546  }
547
548  const MCSymbol *Start = getLabelBeforeInsn(RI->first);
549  const MCSymbol *End = getLabelAfterInsn(RI->second);
550
551  if (End == 0) return 0;
552
553  assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
554  assert(End->isDefined() && "Invalid end label for an inlined scope!");
555
556  TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
557  TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
558
559  return ScopeDIE;
560}
561
562/// constructInlinedScopeDIE - This scope represents inlined body of
563/// a function. Construct DIE to represent this concrete inlined copy
564/// of the function.
565DIE *DwarfDebug::constructInlinedScopeDIE(DbgScope *Scope) {
566
567  const SmallVector<DbgRange, 4> &Ranges = Scope->getRanges();
568  assert (Ranges.empty() == false
569          && "DbgScope does not have instruction markers!");
570
571  // FIXME : .debug_inlined section specification does not clearly state how
572  // to emit inlined scope that is split into multiple instruction ranges.
573  // For now, use first instruction range and emit low_pc/high_pc pair and
574  // corresponding .debug_inlined section entry for this pair.
575  SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin();
576  const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
577  const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
578
579  if (StartLabel == 0 || EndLabel == 0) {
580    assert (0 && "Unexpected Start and End  labels for a inlined scope!");
581    return 0;
582  }
583  assert(StartLabel->isDefined() &&
584         "Invalid starting label for an inlined scope!");
585  assert(EndLabel->isDefined() &&
586         "Invalid end label for an inlined scope!");
587
588  if (!Scope->getScopeNode())
589    return NULL;
590  DIScope DS(Scope->getScopeNode());
591  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
592
593  DISubprogram InlinedSP = getDISubprogram(DS);
594  CompileUnit *TheCU = getCompileUnit(InlinedSP);
595  DIE *OriginDIE = TheCU->getDIE(InlinedSP);
596  assert(OriginDIE && "Unable to find Origin DIE!");
597  TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
598                     dwarf::DW_FORM_ref4, OriginDIE);
599
600  TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, StartLabel);
601  TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, EndLabel);
602
603  InlinedSubprogramDIEs.insert(OriginDIE);
604
605  // Track the start label for this inlined function.
606  DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
607    I = InlineInfo.find(InlinedSP);
608
609  if (I == InlineInfo.end()) {
610    InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel,
611                                                             ScopeDIE));
612    InlinedSPNodes.push_back(InlinedSP);
613  } else
614    I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
615
616  DILocation DL(Scope->getInlinedAt());
617  TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
618  TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
619
620  return ScopeDIE;
621}
622
623
624/// constructVariableDIE - Construct a DIE for the given DbgVariable.
625DIE *DwarfDebug::constructVariableDIE(DbgVariable *DV, DbgScope *Scope) {
626  StringRef Name = DV->getName();
627  if (Name.empty())
628    return NULL;
629
630  // Translate tag to proper Dwarf tag.  The result variable is dropped for
631  // now.
632  unsigned Tag;
633  switch (DV->getTag()) {
634  case dwarf::DW_TAG_return_variable:
635    return NULL;
636  case dwarf::DW_TAG_arg_variable:
637    Tag = dwarf::DW_TAG_formal_parameter;
638    break;
639  case dwarf::DW_TAG_auto_variable:    // fall thru
640  default:
641    Tag = dwarf::DW_TAG_variable;
642    break;
643  }
644
645  // Define variable debug information entry.
646  DIE *VariableDie = new DIE(Tag);
647  CompileUnit *VariableCU = getCompileUnit(DV->getVariable());
648  DIE *AbsDIE = NULL;
649  DenseMap<const DbgVariable *, const DbgVariable *>::iterator
650    V2AVI = VarToAbstractVarMap.find(DV);
651  if (V2AVI != VarToAbstractVarMap.end())
652    AbsDIE = V2AVI->second->getDIE();
653
654  if (AbsDIE)
655    VariableCU->addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,
656                       dwarf::DW_FORM_ref4, AbsDIE);
657  else {
658    VariableCU->addString(VariableDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,
659                          Name);
660    VariableCU->addSourceLine(VariableDie, DV->getVariable());
661
662    // Add variable type.
663    VariableCU->addType(VariableDie, DV->getType());
664  }
665
666  if (Tag == dwarf::DW_TAG_formal_parameter && DV->getType().isArtificial())
667    VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
668                        dwarf::DW_FORM_flag, 1);
669  else if (DIVariable(DV->getVariable()).isArtificial())
670    VariableCU->addUInt(VariableDie, dwarf::DW_AT_artificial,
671                        dwarf::DW_FORM_flag, 1);
672
673  if (Scope->isAbstractScope()) {
674    DV->setDIE(VariableDie);
675    return VariableDie;
676  }
677
678  // Add variable address.
679
680  unsigned Offset = DV->getDotDebugLocOffset();
681  if (Offset != ~0U) {
682    VariableCU->addLabel(VariableDie, dwarf::DW_AT_location, dwarf::DW_FORM_data4,
683             Asm->GetTempSymbol("debug_loc", Offset));
684    DV->setDIE(VariableDie);
685    UseDotDebugLocEntry.insert(VariableDie);
686    return VariableDie;
687  }
688
689  // Check if variable is described by a  DBG_VALUE instruction.
690  DenseMap<const DbgVariable *, const MachineInstr *>::iterator DVI =
691    DbgVariableToDbgInstMap.find(DV);
692  if (DVI != DbgVariableToDbgInstMap.end()) {
693    const MachineInstr *DVInsn = DVI->second;
694    bool updated = false;
695    // FIXME : Handle getNumOperands != 3
696    if (DVInsn->getNumOperands() == 3) {
697      if (DVInsn->getOperand(0).isReg()) {
698        const MachineOperand RegOp = DVInsn->getOperand(0);
699        const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
700        if (DVInsn->getOperand(1).isImm() &&
701            TRI->getFrameRegister(*Asm->MF) == RegOp.getReg()) {
702          unsigned FrameReg = 0;
703          const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
704          int Offset =
705            TFI->getFrameIndexReference(*Asm->MF,
706                                        DVInsn->getOperand(1).getImm(),
707                                        FrameReg);
708          MachineLocation Location(FrameReg, Offset);
709          VariableCU->addVariableAddress(DV, VariableDie, Location);
710
711        } else if (RegOp.getReg())
712          VariableCU->addVariableAddress(DV, VariableDie,
713                                         MachineLocation(RegOp.getReg()));
714        updated = true;
715      }
716      else if (DVInsn->getOperand(0).isImm())
717        updated = VariableCU->addConstantValue(VariableDie,
718                                               DVInsn->getOperand(0));
719      else if (DVInsn->getOperand(0).isFPImm())
720        updated =
721          VariableCU->addConstantFPValue(VariableDie, DVInsn->getOperand(0));
722    } else {
723      VariableCU->addVariableAddress(DV, VariableDie,
724                                     Asm->getDebugValueLocation(DVInsn));
725      updated = true;
726    }
727    if (!updated) {
728      // If variableDie is not updated then DBG_VALUE instruction does not
729      // have valid variable info.
730      delete VariableDie;
731      return NULL;
732    }
733    DV->setDIE(VariableDie);
734    return VariableDie;
735  }
736
737  // .. else use frame index, if available.
738  int FI = 0;
739  if (findVariableFrameIndex(DV, &FI)) {
740    unsigned FrameReg = 0;
741    const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
742    int Offset =
743      TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg);
744    MachineLocation Location(FrameReg, Offset);
745    VariableCU->addVariableAddress(DV, VariableDie, Location);
746  }
747
748  DV->setDIE(VariableDie);
749  return VariableDie;
750
751}
752
753void CompileUnit::addPubTypes(DISubprogram SP) {
754  DICompositeType SPTy = SP.getType();
755  unsigned SPTag = SPTy.getTag();
756  if (SPTag != dwarf::DW_TAG_subroutine_type)
757    return;
758
759  DIArray Args = SPTy.getTypeArray();
760  for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) {
761    DIType ATy(Args.getElement(i));
762    if (!ATy.Verify())
763      continue;
764    DICompositeType CATy = getDICompositeType(ATy);
765    if (DIDescriptor(CATy).Verify() && !CATy.getName().empty()
766        && !CATy.isForwardDecl()) {
767      if (DIEEntry *Entry = getDIEEntry(CATy))
768        addGlobalType(CATy.getName(), Entry->getEntry());
769    }
770  }
771}
772
773/// constructScopeDIE - Construct a DIE for this scope.
774DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
775  if (!Scope || !Scope->getScopeNode())
776    return NULL;
777
778  SmallVector <DIE *, 8> Children;
779
780  // Collect arguments for current function.
781  if (Scope == CurrentFnDbgScope)
782    for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
783      if (DbgVariable *ArgDV = CurrentFnArguments[i])
784        if (DIE *Arg = constructVariableDIE(ArgDV, Scope))
785          Children.push_back(Arg);
786
787  // Collect lexical scope childrens first.
788  const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
789  for (unsigned i = 0, N = Variables.size(); i < N; ++i)
790    if (DIE *Variable = constructVariableDIE(Variables[i], Scope))
791      Children.push_back(Variable);
792  const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
793  for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
794    if (DIE *Nested = constructScopeDIE(Scopes[j]))
795      Children.push_back(Nested);
796  DIScope DS(Scope->getScopeNode());
797  DIE *ScopeDIE = NULL;
798  if (Scope->getInlinedAt())
799    ScopeDIE = constructInlinedScopeDIE(Scope);
800  else if (DS.isSubprogram()) {
801    ProcessedSPNodes.insert(DS);
802    if (Scope->isAbstractScope()) {
803      ScopeDIE = getCompileUnit(DS)->getDIE(DS);
804      // Note down abstract DIE.
805      if (ScopeDIE)
806        AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
807    }
808    else
809      ScopeDIE = updateSubprogramScopeDIE(DS);
810  }
811  else {
812    // There is no need to emit empty lexical block DIE.
813    if (Children.empty())
814      return NULL;
815    ScopeDIE = constructLexicalScopeDIE(Scope);
816  }
817
818  if (!ScopeDIE) return NULL;
819
820  // Add children
821  for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
822         E = Children.end(); I != E; ++I)
823    ScopeDIE->addChild(*I);
824
825  if (DS.isSubprogram())
826    getCompileUnit(DS)->addPubTypes(DISubprogram(DS));
827
828 return ScopeDIE;
829}
830
831/// GetOrCreateSourceID - Look up the source id with the given directory and
832/// source file names. If none currently exists, create a new id and insert it
833/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
834/// maps as well.
835
836unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
837                                         StringRef DirName) {
838  // If FE did not provide a file name, then assume stdin.
839  if (FileName.empty())
840    return GetOrCreateSourceID("<stdin>", StringRef());
841
842  // MCStream expects full path name as filename.
843  if (!DirName.empty() && !FileName.startswith("/")) {
844    std::string FullPathName(DirName.data());
845    if (!DirName.endswith("/"))
846      FullPathName += "/";
847    FullPathName += FileName.data();
848    // Here FullPathName will be copied into StringMap by GetOrCreateSourceID.
849    return GetOrCreateSourceID(StringRef(FullPathName), StringRef());
850  }
851
852  StringMapEntry<unsigned> &Entry = SourceIdMap.GetOrCreateValue(FileName);
853  if (Entry.getValue())
854    return Entry.getValue();
855
856  unsigned SrcId = SourceIdMap.size();
857  Entry.setValue(SrcId);
858
859  // Print out a .file directive to specify files for .loc directives.
860  Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.getKey());
861
862  return SrcId;
863}
864
865/// getOrCreateNameSpace - Create a DIE for DINameSpace.
866DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) {
867  DIE *NDie = getDIE(NS);
868  if (NDie)
869    return NDie;
870  NDie = new DIE(dwarf::DW_TAG_namespace);
871  insertDIE(NS, NDie);
872  if (!NS.getName().empty())
873    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());
874  addSourceLine(NDie, NS);
875  addToContextOwner(NDie, NS.getContext());
876  return NDie;
877}
878
879/// constructCompileUnit - Create new CompileUnit for the given
880/// metadata node with tag DW_TAG_compile_unit.
881void DwarfDebug::constructCompileUnit(const MDNode *N) {
882  DICompileUnit DIUnit(N);
883  StringRef FN = DIUnit.getFilename();
884  StringRef Dir = DIUnit.getDirectory();
885  unsigned ID = GetOrCreateSourceID(FN, Dir);
886
887  DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
888  CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
889  NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,
890                   DIUnit.getProducer());
891  NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
892                 DIUnit.getLanguage());
893  NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);
894  // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
895  // simplifies debug range entries.
896  NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
897  // DW_AT_stmt_list is a offset of line number information for this
898  // compile unit in debug_line section.
899  if (Asm->MAI->doesDwarfUsesAbsoluteLabelForStmtList())
900    NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_addr,
901                    Asm->GetTempSymbol("section_line"));
902  else
903    NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
904
905  if (!Dir.empty())
906    NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);
907  if (DIUnit.isOptimized())
908    NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
909
910  StringRef Flags = DIUnit.getFlags();
911  if (!Flags.empty())
912    NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, Flags);
913
914  unsigned RVer = DIUnit.getRunTimeVersion();
915  if (RVer)
916    NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
917            dwarf::DW_FORM_data1, RVer);
918
919  if (!FirstCU)
920    FirstCU = NewCU;
921  CUMap.insert(std::make_pair(N, NewCU));
922}
923
924/// getCompielUnit - Get CompileUnit DIE.
925CompileUnit *DwarfDebug::getCompileUnit(const MDNode *N) const {
926  assert (N && "Invalid DwarfDebug::getCompileUnit argument!");
927  DIDescriptor D(N);
928  const MDNode *CUNode = NULL;
929  if (D.isCompileUnit())
930    CUNode = N;
931  else if (D.isSubprogram())
932    CUNode = DISubprogram(N).getCompileUnit();
933  else if (D.isType())
934    CUNode = DIType(N).getCompileUnit();
935  else if (D.isGlobalVariable())
936    CUNode = DIGlobalVariable(N).getCompileUnit();
937  else if (D.isVariable())
938    CUNode = DIVariable(N).getCompileUnit();
939  else if (D.isNameSpace())
940    CUNode = DINameSpace(N).getCompileUnit();
941  else if (D.isFile())
942    CUNode = DIFile(N).getCompileUnit();
943  else
944    return FirstCU;
945
946  DenseMap<const MDNode *, CompileUnit *>::const_iterator I
947    = CUMap.find(CUNode);
948  if (I == CUMap.end())
949    return FirstCU;
950  return I->second;
951}
952
953/// isUnsignedDIType - Return true if type encoding is unsigned.
954static bool isUnsignedDIType(DIType Ty) {
955  DIDerivedType DTy(Ty);
956  if (DTy.Verify())
957    return isUnsignedDIType(DTy.getTypeDerivedFrom());
958
959  DIBasicType BTy(Ty);
960  if (BTy.Verify()) {
961    unsigned Encoding = BTy.getEncoding();
962    if (Encoding == dwarf::DW_ATE_unsigned ||
963        Encoding == dwarf::DW_ATE_unsigned_char)
964      return true;
965  }
966  return false;
967}
968
969// Return const exprssion if value is a GEP to access merged global
970// constant. e.g.
971// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
972static const ConstantExpr *getMergedGlobalExpr(const Value *V) {
973  const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V);
974  if (!CE || CE->getNumOperands() != 3 ||
975      CE->getOpcode() != Instruction::GetElementPtr)
976    return NULL;
977
978  // First operand points to a global value.
979  if (!isa<GlobalValue>(CE->getOperand(0)))
980    return NULL;
981
982  // Second operand is zero.
983  const ConstantInt *CI =
984    dyn_cast_or_null<ConstantInt>(CE->getOperand(1));
985  if (!CI || !CI->isZero())
986    return NULL;
987
988  // Third operand is offset.
989  if (!isa<ConstantInt>(CE->getOperand(2)))
990    return NULL;
991
992  return CE;
993}
994
995/// constructGlobalVariableDIE - Construct global variable DIE.
996void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
997  DIGlobalVariable GV(N);
998
999  // If debug information is malformed then ignore it.
1000  if (GV.Verify() == false)
1001    return;
1002
1003  // Check for pre-existence.
1004  CompileUnit *TheCU = getCompileUnit(N);
1005  if (TheCU->getDIE(GV))
1006    return;
1007
1008  DIType GTy = GV.getType();
1009  DIE *VariableDIE = new DIE(GV.getTag());
1010
1011  bool isGlobalVariable = GV.getGlobal() != NULL;
1012
1013  // Add name.
1014  TheCU->addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,
1015                   GV.getDisplayName());
1016  StringRef LinkageName = GV.getLinkageName();
1017  if (!LinkageName.empty() && isGlobalVariable)
1018    TheCU->addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,
1019                     dwarf::DW_FORM_string,
1020                     getRealLinkageName(LinkageName));
1021  // Add type.
1022  TheCU->addType(VariableDIE, GTy);
1023  if (GTy.isCompositeType() && !GTy.getName().empty()
1024      && !GTy.isForwardDecl()) {
1025    DIEEntry *Entry = TheCU->getDIEEntry(GTy);
1026    assert(Entry && "Missing global type!");
1027    TheCU->addGlobalType(GTy.getName(), Entry->getEntry());
1028  }
1029  // Add scoping info.
1030  if (!GV.isLocalToUnit()) {
1031    TheCU->addUInt(VariableDIE, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);
1032    // Expose as global.
1033    TheCU->addGlobal(GV.getName(), VariableDIE);
1034  }
1035  // Add line number info.
1036  TheCU->addSourceLine(VariableDIE, GV);
1037  // Add to map.
1038  TheCU->insertDIE(N, VariableDIE);
1039  // Add to context owner.
1040  DIDescriptor GVContext = GV.getContext();
1041  TheCU->addToContextOwner(VariableDIE, GVContext);
1042  // Add location.
1043  if (isGlobalVariable) {
1044    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1045    TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1046    TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1047             Asm->Mang->getSymbol(GV.getGlobal()));
1048    // Do not create specification DIE if context is either compile unit
1049    // or a subprogram.
1050    if (GV.isDefinition() && !GVContext.isCompileUnit() &&
1051        !GVContext.isFile() && !isSubprogramContext(GVContext)) {
1052      // Create specification DIE.
1053      DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
1054      TheCU->addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
1055                  dwarf::DW_FORM_ref4, VariableDIE);
1056      TheCU->addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
1057      TheCU->addUInt(VariableDIE, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
1058      TheCU->addDie(VariableSpecDIE);
1059    } else {
1060      TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1061    }
1062  } else if (ConstantInt *CI =
1063             dyn_cast_or_null<ConstantInt>(GV.getConstant()))
1064    TheCU->addConstantValue(VariableDIE, CI, isUnsignedDIType(GTy));
1065  else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) {
1066    // GV is a merged global.
1067    DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
1068    TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
1069    TheCU->addLabel(Block, 0, dwarf::DW_FORM_udata,
1070                    Asm->Mang->getSymbol(cast<GlobalValue>(CE->getOperand(0))));
1071    ConstantInt *CII = cast<ConstantInt>(CE->getOperand(2));
1072    TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu);
1073    TheCU->addUInt(Block, 0, dwarf::DW_FORM_udata, CII->getZExtValue());
1074    TheCU->addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus);
1075    TheCU->addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block);
1076  }
1077
1078  return;
1079}
1080
1081/// construct SubprogramDIE - Construct subprogram DIE.
1082void DwarfDebug::constructSubprogramDIE(const MDNode *N) {
1083  DISubprogram SP(N);
1084
1085  // Check for pre-existence.
1086  CompileUnit *TheCU = getCompileUnit(N);
1087  if (TheCU->getDIE(N))
1088    return;
1089
1090  if (!SP.isDefinition())
1091    // This is a method declaration which will be handled while constructing
1092    // class type.
1093    return;
1094
1095  DIE *SubprogramDie = createSubprogramDIE(SP);
1096
1097  // Add to map.
1098  TheCU->insertDIE(N, SubprogramDie);
1099
1100  // Add to context owner.
1101  TheCU->addToContextOwner(SubprogramDie, SP.getContext());
1102
1103  // Expose as global.
1104  TheCU->addGlobal(SP.getName(), SubprogramDie);
1105
1106  return;
1107}
1108
1109/// beginModule - Emit all Dwarf sections that should come prior to the
1110/// content. Create global DIEs and emit initial debug info sections.
1111/// This is inovked by the target AsmPrinter.
1112void DwarfDebug::beginModule(Module *M) {
1113  if (DisableDebugInfoPrinting)
1114    return;
1115
1116  // If module has named metadata anchors then use them, otherwise scan the module
1117  // using debug info finder to collect debug info.
1118  NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
1119  if (CU_Nodes) {
1120
1121    NamedMDNode *GV_Nodes = M->getNamedMetadata("llvm.dbg.gv");
1122    NamedMDNode *SP_Nodes = M->getNamedMetadata("llvm.dbg.sp");
1123    if (!GV_Nodes && !SP_Nodes)
1124      // If there are not any global variables or any functions then
1125      // there is not any debug info in this module.
1126      return;
1127
1128    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i)
1129      constructCompileUnit(CU_Nodes->getOperand(i));
1130
1131    if (GV_Nodes)
1132      for (unsigned i = 0, e = GV_Nodes->getNumOperands(); i != e; ++i)
1133        constructGlobalVariableDIE(GV_Nodes->getOperand(i));
1134
1135    if (SP_Nodes)
1136      for (unsigned i = 0, e = SP_Nodes->getNumOperands(); i != e; ++i)
1137        constructSubprogramDIE(SP_Nodes->getOperand(i));
1138
1139  } else {
1140
1141    DebugInfoFinder DbgFinder;
1142    DbgFinder.processModule(*M);
1143
1144    bool HasDebugInfo = false;
1145    // Scan all the compile-units to see if there are any marked as the main unit.
1146    // if not, we do not generate debug info.
1147    for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1148           E = DbgFinder.compile_unit_end(); I != E; ++I) {
1149      if (DICompileUnit(*I).isMain()) {
1150        HasDebugInfo = true;
1151        break;
1152      }
1153    }
1154    if (!HasDebugInfo) return;
1155
1156    // Create all the compile unit DIEs.
1157    for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
1158           E = DbgFinder.compile_unit_end(); I != E; ++I)
1159      constructCompileUnit(*I);
1160
1161    // Create DIEs for each global variable.
1162    for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
1163           E = DbgFinder.global_variable_end(); I != E; ++I)
1164      constructGlobalVariableDIE(*I);
1165
1166    // Create DIEs for each subprogram.
1167    for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
1168           E = DbgFinder.subprogram_end(); I != E; ++I)
1169      constructSubprogramDIE(*I);
1170  }
1171
1172  // Tell MMI that we have debug info.
1173  MMI->setDebugInfoAvailability(true);
1174
1175  // Emit initial sections.
1176  EmitSectionLabels();
1177
1178  //getOrCreateTypeDIE
1179  if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
1180    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1181      DIType Ty(NMD->getOperand(i));
1182      getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1183    }
1184
1185  if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
1186    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1187      DIType Ty(NMD->getOperand(i));
1188      getCompileUnit(Ty)->getOrCreateTypeDIE(Ty);
1189    }
1190
1191  // Prime section data.
1192  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
1193}
1194
1195/// endModule - Emit all Dwarf sections that should come after the content.
1196///
1197void DwarfDebug::endModule() {
1198  if (!FirstCU) return;
1199  const Module *M = MMI->getModule();
1200  DenseMap<const MDNode *, DbgScope *> DeadFnScopeMap;
1201  if (NamedMDNode *AllSPs = M->getNamedMetadata("llvm.dbg.sp")) {
1202    for (unsigned SI = 0, SE = AllSPs->getNumOperands(); SI != SE; ++SI) {
1203      if (ProcessedSPNodes.count(AllSPs->getOperand(SI)) != 0) continue;
1204      DISubprogram SP(AllSPs->getOperand(SI));
1205      if (!SP.Verify()) continue;
1206
1207      // Collect info for variables that were optimized out.
1208      if (!SP.isDefinition()) continue;
1209      StringRef FName = SP.getLinkageName();
1210      if (FName.empty())
1211        FName = SP.getName();
1212      NamedMDNode *NMD = getFnSpecificMDNode(*(MMI->getModule()), FName);
1213      if (!NMD) continue;
1214      unsigned E = NMD->getNumOperands();
1215      if (!E) continue;
1216      DbgScope *Scope = new DbgScope(NULL, DIDescriptor(SP), NULL);
1217      DeadFnScopeMap[SP] = Scope;
1218      for (unsigned I = 0; I != E; ++I) {
1219        DIVariable DV(NMD->getOperand(I));
1220        if (!DV.Verify()) continue;
1221        Scope->addVariable(new DbgVariable(DV));
1222      }
1223
1224      // Construct subprogram DIE and add variables DIEs.
1225      constructSubprogramDIE(SP);
1226      DIE *ScopeDIE = getCompileUnit(SP)->getDIE(SP);
1227      const SmallVector<DbgVariable *, 8> &Variables = Scope->getDbgVariables();
1228      for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
1229        DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
1230        if (VariableDIE)
1231          ScopeDIE->addChild(VariableDIE);
1232      }
1233    }
1234  }
1235
1236  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1237  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
1238         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
1239    DIE *ISP = *AI;
1240    FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
1241  }
1242
1243  for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(),
1244         CE = ContainingTypeMap.end(); CI != CE; ++CI) {
1245    DIE *SPDie = CI->first;
1246    const MDNode *N = dyn_cast_or_null<MDNode>(CI->second);
1247    if (!N) continue;
1248    DIE *NDie = getCompileUnit(N)->getDIE(N);
1249    if (!NDie) continue;
1250    getCompileUnit(N)->addDIEEntry(SPDie, dwarf::DW_AT_containing_type,
1251                                   dwarf::DW_FORM_ref4, NDie);
1252  }
1253
1254  // Standard sections final addresses.
1255  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1256  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1257  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1258  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1259
1260  // End text sections.
1261  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
1262    Asm->OutStreamer.SwitchSection(SectionMap[i]);
1263    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
1264  }
1265
1266  // Emit common frame information.
1267  emitCommonDebugFrame();
1268
1269  // Emit function debug frame information
1270  for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(),
1271         E = DebugFrames.end(); I != E; ++I)
1272    emitFunctionDebugFrame(*I);
1273
1274  // Compute DIE offsets and sizes.
1275  computeSizeAndOffsets();
1276
1277  // Emit all the DIEs into a debug info section
1278  emitDebugInfo();
1279
1280  // Corresponding abbreviations into a abbrev section.
1281  emitAbbreviations();
1282
1283  // Emit info into a debug pubnames section.
1284  emitDebugPubNames();
1285
1286  // Emit info into a debug pubtypes section.
1287  emitDebugPubTypes();
1288
1289  // Emit info into a debug loc section.
1290  emitDebugLoc();
1291
1292  // Emit info into a debug aranges section.
1293  EmitDebugARanges();
1294
1295  // Emit info into a debug ranges section.
1296  emitDebugRanges();
1297
1298  // Emit info into a debug macinfo section.
1299  emitDebugMacInfo();
1300
1301  // Emit inline info.
1302  emitDebugInlineInfo();
1303
1304  // Emit info into a debug str section.
1305  emitDebugStr();
1306
1307  // clean up.
1308  DeleteContainerSeconds(DeadFnScopeMap);
1309  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1310         E = CUMap.end(); I != E; ++I)
1311    delete I->second;
1312  FirstCU = NULL;  // Reset for the next Module, if any.
1313}
1314
1315/// findAbstractVariable - Find abstract variable, if any, associated with Var.
1316DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &Var,
1317                                              DebugLoc ScopeLoc) {
1318
1319  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
1320  if (AbsDbgVariable)
1321    return AbsDbgVariable;
1322
1323  LLVMContext &Ctx = Var->getContext();
1324  DbgScope *Scope = AbstractScopes.lookup(ScopeLoc.getScope(Ctx));
1325  if (!Scope)
1326    return NULL;
1327
1328  AbsDbgVariable = new DbgVariable(Var);
1329  Scope->addVariable(AbsDbgVariable);
1330  AbstractVariables[Var] = AbsDbgVariable;
1331  return AbsDbgVariable;
1332}
1333
1334/// addCurrentFnArgument - If Var is an current function argument that add
1335/// it in CurrentFnArguments list.
1336bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1337                                      DbgVariable *Var, DbgScope *Scope) {
1338  if (Scope != CurrentFnDbgScope)
1339    return false;
1340  DIVariable DV = Var->getVariable();
1341  if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1342    return false;
1343  unsigned ArgNo = DV.getArgNumber();
1344  if (ArgNo == 0)
1345    return false;
1346
1347  size_t Size = CurrentFnArguments.size();
1348  if (Size == 0)
1349    CurrentFnArguments.resize(MF->getFunction()->arg_size());
1350  // llvm::Function argument size is not good indicator of how many
1351  // arguments does the function have at source level.
1352  if (ArgNo > Size)
1353    CurrentFnArguments.resize(ArgNo * 2);
1354  CurrentFnArguments[ArgNo - 1] = Var;
1355  return true;
1356}
1357
1358/// collectVariableInfoFromMMITable - Collect variable information from
1359/// side table maintained by MMI.
1360void
1361DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction * MF,
1362                                   SmallPtrSet<const MDNode *, 16> &Processed) {
1363  const LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
1364  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1365  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1366         VE = VMap.end(); VI != VE; ++VI) {
1367    const MDNode *Var = VI->first;
1368    if (!Var) continue;
1369    Processed.insert(Var);
1370    DIVariable DV(Var);
1371    const std::pair<unsigned, DebugLoc> &VP = VI->second;
1372
1373    DbgScope *Scope = 0;
1374    if (const MDNode *IA = VP.second.getInlinedAt(Ctx))
1375      Scope = ConcreteScopes.lookup(IA);
1376    if (Scope == 0)
1377      Scope = DbgScopeMap.lookup(VP.second.getScope(Ctx));
1378
1379    // If variable scope is not found then skip this variable.
1380    if (Scope == 0)
1381      continue;
1382
1383    DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1384    DbgVariable *RegVar = new DbgVariable(DV);
1385    recordVariableFrameIndex(RegVar, VP.first);
1386    if (!addCurrentFnArgument(MF, RegVar, Scope))
1387      Scope->addVariable(RegVar);
1388    if (AbsDbgVariable) {
1389      recordVariableFrameIndex(AbsDbgVariable, VP.first);
1390      VarToAbstractVarMap[RegVar] = AbsDbgVariable;
1391    }
1392  }
1393}
1394
1395/// isDbgValueInDefinedReg - Return true if debug value, encoded by
1396/// DBG_VALUE instruction, is in a defined reg.
1397static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1398  assert (MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
1399  return MI->getNumOperands() == 3 &&
1400         MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1401         MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
1402}
1403
1404/// collectVariableInfo - Populate DbgScope entries with variables' info.
1405void
1406DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1407                                SmallPtrSet<const MDNode *, 16> &Processed) {
1408
1409  /// collection info from MMI table.
1410  collectVariableInfoFromMMITable(MF, Processed);
1411
1412  for (SmallVectorImpl<const MDNode*>::const_iterator
1413         UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1414         ++UVI) {
1415    const MDNode *Var = *UVI;
1416    if (Processed.count(Var))
1417      continue;
1418
1419    // History contains relevant DBG_VALUE instructions for Var and instructions
1420    // clobbering it.
1421    SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1422    if (History.empty())
1423      continue;
1424    const MachineInstr *MInsn = History.front();
1425
1426    DIVariable DV(Var);
1427    DbgScope *Scope = NULL;
1428    if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1429        DISubprogram(DV.getContext()).describes(MF->getFunction()))
1430      Scope = CurrentFnDbgScope;
1431    else
1432      Scope = findDbgScope(MInsn);
1433    // If variable scope is not found then skip this variable.
1434    if (!Scope)
1435      continue;
1436
1437    Processed.insert(DV);
1438    assert(MInsn->isDebugValue() && "History must begin with debug value");
1439    DbgVariable *RegVar = new DbgVariable(DV);
1440    if (!addCurrentFnArgument(MF, RegVar, Scope))
1441      Scope->addVariable(RegVar);
1442    if (DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc())) {
1443      DbgVariableToDbgInstMap[AbsVar] = MInsn;
1444      VarToAbstractVarMap[RegVar] = AbsVar;
1445    }
1446
1447    // Simple ranges that are fully coalesced.
1448    if (History.size() <= 1 || (History.size() == 2 &&
1449                                MInsn->isIdenticalTo(History.back()))) {
1450      DbgVariableToDbgInstMap[RegVar] = MInsn;
1451      continue;
1452    }
1453
1454    // handle multiple DBG_VALUE instructions describing one variable.
1455    RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1456
1457    for (SmallVectorImpl<const MachineInstr*>::const_iterator
1458           HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1459      const MachineInstr *Begin = *HI;
1460      assert(Begin->isDebugValue() && "Invalid History entry");
1461      MachineLocation MLoc;
1462      if (Begin->getNumOperands() == 3) {
1463        if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
1464          MLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
1465      } else
1466        MLoc = Asm->getDebugValueLocation(Begin);
1467
1468      // FIXME: emitDebugLoc only understands registers.
1469      if (!MLoc.getReg())
1470        continue;
1471
1472      // Compute the range for a register location.
1473      const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1474      const MCSymbol *SLabel = 0;
1475
1476      if (HI + 1 == HE)
1477        // If Begin is the last instruction in History then its value is valid
1478        // until the end of the function.
1479        SLabel = FunctionEndSym;
1480      else {
1481        const MachineInstr *End = HI[1];
1482        if (End->isDebugValue())
1483          SLabel = getLabelBeforeInsn(End);
1484        else {
1485          // End is a normal instruction clobbering the range.
1486          SLabel = getLabelAfterInsn(End);
1487          assert(SLabel && "Forgot label after clobber instruction");
1488          ++HI;
1489        }
1490      }
1491
1492      // The value is valid until the next DBG_VALUE or clobber.
1493      DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc, Var));
1494    }
1495    DotDebugLocEntries.push_back(DotDebugLocEntry());
1496  }
1497
1498  // Collect info for variables that were optimized out.
1499  const Function *F = MF->getFunction();
1500  if (NamedMDNode *NMD = getFnSpecificMDNode(*(F->getParent()), F->getName())) {
1501    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
1502      DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
1503      if (!DV || !Processed.insert(DV))
1504        continue;
1505      DbgScope *Scope = DbgScopeMap.lookup(DV.getContext());
1506      if (Scope)
1507        Scope->addVariable(new DbgVariable(DV));
1508    }
1509  }
1510}
1511
1512/// getLabelBeforeInsn - Return Label preceding the instruction.
1513const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1514  MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1515  assert(Label && "Didn't insert label before instruction");
1516  return Label;
1517}
1518
1519/// getLabelAfterInsn - Return Label immediately following the instruction.
1520const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1521  return LabelsAfterInsn.lookup(MI);
1522}
1523
1524/// beginInstruction - Process beginning of an instruction.
1525void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1526  // Check if source location changes, but ignore DBG_VALUE locations.
1527  if (!MI->isDebugValue()) {
1528    DebugLoc DL = MI->getDebugLoc();
1529    if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1530      PrevInstLoc = DL;
1531      if (!DL.isUnknown()) {
1532        const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1533        recordSourceLine(DL.getLine(), DL.getCol(), Scope);
1534      } else
1535        recordSourceLine(0, 0, 0);
1536    }
1537  }
1538
1539  // Insert labels where requested.
1540  DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1541    LabelsBeforeInsn.find(MI);
1542
1543  // No label needed.
1544  if (I == LabelsBeforeInsn.end())
1545    return;
1546
1547  // Label already assigned.
1548  if (I->second)
1549    return;
1550
1551  if (!PrevLabel) {
1552    PrevLabel = MMI->getContext().CreateTempSymbol();
1553    Asm->OutStreamer.EmitLabel(PrevLabel);
1554  }
1555  I->second = PrevLabel;
1556}
1557
1558/// endInstruction - Process end of an instruction.
1559void DwarfDebug::endInstruction(const MachineInstr *MI) {
1560  // Don't create a new label after DBG_VALUE instructions.
1561  // They don't generate code.
1562  if (!MI->isDebugValue())
1563    PrevLabel = 0;
1564
1565  DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1566    LabelsAfterInsn.find(MI);
1567
1568  // No label needed.
1569  if (I == LabelsAfterInsn.end())
1570    return;
1571
1572  // Label already assigned.
1573  if (I->second)
1574    return;
1575
1576  // We need a label after this instruction.
1577  if (!PrevLabel) {
1578    PrevLabel = MMI->getContext().CreateTempSymbol();
1579    Asm->OutStreamer.EmitLabel(PrevLabel);
1580  }
1581  I->second = PrevLabel;
1582}
1583
1584/// getOrCreateDbgScope - Create DbgScope for the scope.
1585DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope,
1586                                          const MDNode *InlinedAt) {
1587  if (!InlinedAt) {
1588    DbgScope *WScope = DbgScopeMap.lookup(Scope);
1589    if (WScope)
1590      return WScope;
1591    WScope = new DbgScope(NULL, DIDescriptor(Scope), NULL);
1592    DbgScopeMap.insert(std::make_pair(Scope, WScope));
1593    if (DIDescriptor(Scope).isLexicalBlock()) {
1594      DbgScope *Parent =
1595        getOrCreateDbgScope(DILexicalBlock(Scope).getContext(), NULL);
1596      WScope->setParent(Parent);
1597      Parent->addScope(WScope);
1598    }
1599
1600    if (!WScope->getParent()) {
1601      StringRef SPName = DISubprogram(Scope).getLinkageName();
1602      // We used to check only for a linkage name, but that fails
1603      // since we began omitting the linkage name for private
1604      // functions.  The new way is to check for the name in metadata,
1605      // but that's not supported in old .ll test cases.  Ergo, we
1606      // check both.
1607      if (SPName == Asm->MF->getFunction()->getName() ||
1608          DISubprogram(Scope).getFunction() == Asm->MF->getFunction())
1609        CurrentFnDbgScope = WScope;
1610    }
1611
1612    return WScope;
1613  }
1614
1615  getOrCreateAbstractScope(Scope);
1616  DbgScope *WScope = DbgScopeMap.lookup(InlinedAt);
1617  if (WScope)
1618    return WScope;
1619
1620  WScope = new DbgScope(NULL, DIDescriptor(Scope), InlinedAt);
1621  DbgScopeMap.insert(std::make_pair(InlinedAt, WScope));
1622  DILocation DL(InlinedAt);
1623  DbgScope *Parent =
1624    getOrCreateDbgScope(DL.getScope(), DL.getOrigLocation());
1625  WScope->setParent(Parent);
1626  Parent->addScope(WScope);
1627
1628  ConcreteScopes[InlinedAt] = WScope;
1629
1630  return WScope;
1631}
1632
1633/// hasValidLocation - Return true if debug location entry attached with
1634/// machine instruction encodes valid location info.
1635static bool hasValidLocation(LLVMContext &Ctx,
1636                             const MachineInstr *MInsn,
1637                             const MDNode *&Scope, const MDNode *&InlinedAt) {
1638  DebugLoc DL = MInsn->getDebugLoc();
1639  if (DL.isUnknown()) return false;
1640
1641  const MDNode *S = DL.getScope(Ctx);
1642
1643  // There is no need to create another DIE for compile unit. For all
1644  // other scopes, create one DbgScope now. This will be translated
1645  // into a scope DIE at the end.
1646  if (DIScope(S).isCompileUnit()) return false;
1647
1648  Scope = S;
1649  InlinedAt = DL.getInlinedAt(Ctx);
1650  return true;
1651}
1652
1653/// calculateDominanceGraph - Calculate dominance graph for DbgScope
1654/// hierarchy.
1655static void calculateDominanceGraph(DbgScope *Scope) {
1656  assert (Scope && "Unable to calculate scop edominance graph!");
1657  SmallVector<DbgScope *, 4> WorkStack;
1658  WorkStack.push_back(Scope);
1659  unsigned Counter = 0;
1660  while (!WorkStack.empty()) {
1661    DbgScope *WS = WorkStack.back();
1662    const SmallVector<DbgScope *, 4> &Children = WS->getScopes();
1663    bool visitedChildren = false;
1664    for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1665           SE = Children.end(); SI != SE; ++SI) {
1666      DbgScope *ChildScope = *SI;
1667      if (!ChildScope->getDFSOut()) {
1668        WorkStack.push_back(ChildScope);
1669        visitedChildren = true;
1670        ChildScope->setDFSIn(++Counter);
1671        break;
1672      }
1673    }
1674    if (!visitedChildren) {
1675      WorkStack.pop_back();
1676      WS->setDFSOut(++Counter);
1677    }
1678  }
1679}
1680
1681/// printDbgScopeInfo - Print DbgScope info for each machine instruction.
1682static
1683void printDbgScopeInfo(LLVMContext &Ctx, const MachineFunction *MF,
1684                       DenseMap<const MachineInstr *, DbgScope *> &MI2ScopeMap)
1685{
1686#ifndef NDEBUG
1687  unsigned PrevDFSIn = 0;
1688  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1689       I != E; ++I) {
1690    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1691         II != IE; ++II) {
1692      const MachineInstr *MInsn = II;
1693      const MDNode *Scope = NULL;
1694      const MDNode *InlinedAt = NULL;
1695
1696      // Check if instruction has valid location information.
1697      if (hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
1698        dbgs() << " [ ";
1699        if (InlinedAt)
1700          dbgs() << "*";
1701        DenseMap<const MachineInstr *, DbgScope *>::iterator DI =
1702          MI2ScopeMap.find(MInsn);
1703        if (DI != MI2ScopeMap.end()) {
1704          DbgScope *S = DI->second;
1705          dbgs() << S->getDFSIn();
1706          PrevDFSIn = S->getDFSIn();
1707        } else
1708          dbgs() << PrevDFSIn;
1709      } else
1710        dbgs() << " [ x" << PrevDFSIn;
1711      dbgs() << " ]";
1712      MInsn->dump();
1713    }
1714    dbgs() << "\n";
1715  }
1716#endif
1717}
1718/// extractScopeInformation - Scan machine instructions in this function
1719/// and collect DbgScopes. Return true, if at least one scope was found.
1720bool DwarfDebug::extractScopeInformation() {
1721  // If scope information was extracted using .dbg intrinsics then there is not
1722  // any need to extract these information by scanning each instruction.
1723  if (!DbgScopeMap.empty())
1724    return false;
1725
1726  // Scan each instruction and create scopes. First build working set of scopes.
1727  LLVMContext &Ctx = Asm->MF->getFunction()->getContext();
1728  SmallVector<DbgRange, 4> MIRanges;
1729  DenseMap<const MachineInstr *, DbgScope *> MI2ScopeMap;
1730  const MDNode *PrevScope = NULL;
1731  const MDNode *PrevInlinedAt = NULL;
1732  const MachineInstr *RangeBeginMI = NULL;
1733  const MachineInstr *PrevMI = NULL;
1734  for (MachineFunction::const_iterator I = Asm->MF->begin(), E = Asm->MF->end();
1735       I != E; ++I) {
1736    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1737         II != IE; ++II) {
1738      const MachineInstr *MInsn = II;
1739      const MDNode *Scope = NULL;
1740      const MDNode *InlinedAt = NULL;
1741
1742      // Check if instruction has valid location information.
1743      if (!hasValidLocation(Ctx, MInsn, Scope, InlinedAt)) {
1744        PrevMI = MInsn;
1745        continue;
1746      }
1747
1748      // If scope has not changed then skip this instruction.
1749      if (Scope == PrevScope && PrevInlinedAt == InlinedAt) {
1750        PrevMI = MInsn;
1751        continue;
1752      }
1753
1754      // Ignore DBG_VALUE. It does not contribute any instruction in output.
1755      if (MInsn->isDebugValue())
1756        continue;
1757
1758      if (RangeBeginMI) {
1759        // If we have alread seen a beginning of a instruction range and
1760        // current instruction scope does not match scope of first instruction
1761        // in this range then create a new instruction range.
1762        DbgRange R(RangeBeginMI, PrevMI);
1763        MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope,
1764                                                        PrevInlinedAt);
1765        MIRanges.push_back(R);
1766      }
1767
1768      // This is a beginning of a new instruction range.
1769      RangeBeginMI = MInsn;
1770
1771      // Reset previous markers.
1772      PrevMI = MInsn;
1773      PrevScope = Scope;
1774      PrevInlinedAt = InlinedAt;
1775    }
1776  }
1777
1778  // Create last instruction range.
1779  if (RangeBeginMI && PrevMI && PrevScope) {
1780    DbgRange R(RangeBeginMI, PrevMI);
1781    MIRanges.push_back(R);
1782    MI2ScopeMap[RangeBeginMI] = getOrCreateDbgScope(PrevScope, PrevInlinedAt);
1783  }
1784
1785  if (!CurrentFnDbgScope)
1786    return false;
1787
1788  calculateDominanceGraph(CurrentFnDbgScope);
1789  if (PrintDbgScope)
1790    printDbgScopeInfo(Ctx, Asm->MF, MI2ScopeMap);
1791
1792  // Find ranges of instructions covered by each DbgScope;
1793  DbgScope *PrevDbgScope = NULL;
1794  for (SmallVector<DbgRange, 4>::const_iterator RI = MIRanges.begin(),
1795         RE = MIRanges.end(); RI != RE; ++RI) {
1796    const DbgRange &R = *RI;
1797    DbgScope *S = MI2ScopeMap.lookup(R.first);
1798    assert (S && "Lost DbgScope for a machine instruction!");
1799    if (PrevDbgScope && !PrevDbgScope->dominates(S))
1800      PrevDbgScope->closeInsnRange(S);
1801    S->openInsnRange(R.first);
1802    S->extendInsnRange(R.second);
1803    PrevDbgScope = S;
1804  }
1805
1806  if (PrevDbgScope)
1807    PrevDbgScope->closeInsnRange();
1808
1809  identifyScopeMarkers();
1810
1811  return !DbgScopeMap.empty();
1812}
1813
1814/// identifyScopeMarkers() -
1815/// Each DbgScope has first instruction and last instruction to mark beginning
1816/// and end of a scope respectively. Create an inverse map that list scopes
1817/// starts (and ends) with an instruction. One instruction may start (or end)
1818/// multiple scopes. Ignore scopes that are not reachable.
1819void DwarfDebug::identifyScopeMarkers() {
1820  SmallVector<DbgScope *, 4> WorkList;
1821  WorkList.push_back(CurrentFnDbgScope);
1822  while (!WorkList.empty()) {
1823    DbgScope *S = WorkList.pop_back_val();
1824
1825    const SmallVector<DbgScope *, 4> &Children = S->getScopes();
1826    if (!Children.empty())
1827      for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
1828             SE = Children.end(); SI != SE; ++SI)
1829        WorkList.push_back(*SI);
1830
1831    if (S->isAbstractScope())
1832      continue;
1833
1834    const SmallVector<DbgRange, 4> &Ranges = S->getRanges();
1835    if (Ranges.empty())
1836      continue;
1837    for (SmallVector<DbgRange, 4>::const_iterator RI = Ranges.begin(),
1838           RE = Ranges.end(); RI != RE; ++RI) {
1839      assert(RI->first && "DbgRange does not have first instruction!");
1840      assert(RI->second && "DbgRange does not have second instruction!");
1841      requestLabelBeforeInsn(RI->first);
1842      requestLabelAfterInsn(RI->second);
1843    }
1844  }
1845}
1846
1847/// FindFirstDebugLoc - Find the first debug location in the function. This
1848/// is intended to be an approximation for the source position of the
1849/// beginning of the function.
1850static DebugLoc FindFirstDebugLoc(const MachineFunction *MF) {
1851  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1852       I != E; ++I)
1853    for (MachineBasicBlock::const_iterator MBBI = I->begin(), MBBE = I->end();
1854         MBBI != MBBE; ++MBBI) {
1855      DebugLoc DL = MBBI->getDebugLoc();
1856      if (!DL.isUnknown())
1857        return DL;
1858    }
1859  return DebugLoc();
1860}
1861
1862#ifndef NDEBUG
1863/// CheckLineNumbers - Count basicblocks whose instructions do not have any
1864/// line number information.
1865static void CheckLineNumbers(const MachineFunction *MF) {
1866  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1867       I != E; ++I) {
1868    bool FoundLineNo = false;
1869    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1870         II != IE; ++II) {
1871      const MachineInstr *MI = II;
1872      if (!MI->getDebugLoc().isUnknown()) {
1873        FoundLineNo = true;
1874        break;
1875      }
1876    }
1877    if (!FoundLineNo && I->size())
1878      ++BlocksWithoutLineNo;
1879  }
1880}
1881#endif
1882
1883/// beginFunction - Gather pre-function debug information.  Assumes being
1884/// emitted immediately after the function entry point.
1885void DwarfDebug::beginFunction(const MachineFunction *MF) {
1886  if (!MMI->hasDebugInfo()) return;
1887  if (!extractScopeInformation()) return;
1888
1889#ifndef NDEBUG
1890  CheckLineNumbers(MF);
1891#endif
1892
1893  FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1894                                        Asm->getFunctionNumber());
1895  // Assumes in correct section after the entry point.
1896  Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1897
1898  // Emit label for the implicitly defined dbg.stoppoint at the start of the
1899  // function.
1900  DebugLoc FDL = FindFirstDebugLoc(MF);
1901  if (FDL.isUnknown()) return;
1902
1903  const MDNode *Scope = FDL.getScope(MF->getFunction()->getContext());
1904  const MDNode *TheScope = 0;
1905
1906  DISubprogram SP = getDISubprogram(Scope);
1907  unsigned Line, Col;
1908  if (SP.Verify()) {
1909    Line = SP.getLineNumber();
1910    Col = 0;
1911    TheScope = SP;
1912  } else {
1913    Line = FDL.getLine();
1914    Col = FDL.getCol();
1915    TheScope = Scope;
1916  }
1917
1918  recordSourceLine(Line, Col, TheScope);
1919
1920  assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1921
1922  /// ProcessedArgs - Collection of arguments already processed.
1923  SmallPtrSet<const MDNode *, 8> ProcessedArgs;
1924
1925  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1926
1927  /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1928  std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1929
1930  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1931       I != E; ++I) {
1932    bool AtBlockEntry = true;
1933    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1934         II != IE; ++II) {
1935      const MachineInstr *MI = II;
1936
1937      if (MI->isDebugValue()) {
1938        assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
1939
1940        // Keep track of user variables.
1941        const MDNode *Var =
1942          MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1943
1944        // Variable is in a register, we need to check for clobbers.
1945        if (isDbgValueInDefinedReg(MI))
1946          LiveUserVar[MI->getOperand(0).getReg()] = Var;
1947
1948        // Check the history of this variable.
1949        SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1950        if (History.empty()) {
1951          UserVariables.push_back(Var);
1952          // The first mention of a function argument gets the FunctionBeginSym
1953          // label, so arguments are visible when breaking at function entry.
1954          DIVariable DV(Var);
1955          if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1956              DISubprogram(getDISubprogram(DV.getContext()))
1957                .describes(MF->getFunction()))
1958            LabelsBeforeInsn[MI] = FunctionBeginSym;
1959        } else {
1960          // We have seen this variable before. Try to coalesce DBG_VALUEs.
1961          const MachineInstr *Prev = History.back();
1962          if (Prev->isDebugValue()) {
1963            // Coalesce identical entries at the end of History.
1964            if (History.size() >= 2 &&
1965                Prev->isIdenticalTo(History[History.size() - 2]))
1966              History.pop_back();
1967
1968            // Terminate old register assignments that don't reach MI;
1969            MachineFunction::const_iterator PrevMBB = Prev->getParent();
1970            if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1971                isDbgValueInDefinedReg(Prev)) {
1972              // Previous register assignment needs to terminate at the end of
1973              // its basic block.
1974              MachineBasicBlock::const_iterator LastMI =
1975                PrevMBB->getLastNonDebugInstr();
1976              if (LastMI == PrevMBB->end())
1977                // Drop DBG_VALUE for empty range.
1978                History.pop_back();
1979              else {
1980                // Terminate after LastMI.
1981                History.push_back(LastMI);
1982              }
1983            }
1984          }
1985        }
1986        History.push_back(MI);
1987      } else {
1988        // Not a DBG_VALUE instruction.
1989        if (!MI->isLabel())
1990          AtBlockEntry = false;
1991
1992        // Check if the instruction clobbers any registers with debug vars.
1993        for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1994               MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1995          if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1996            continue;
1997          for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1998               unsigned Reg = *AI; ++AI) {
1999            const MDNode *Var = LiveUserVar[Reg];
2000            if (!Var)
2001              continue;
2002            // Reg is now clobbered.
2003            LiveUserVar[Reg] = 0;
2004
2005            // Was MD last defined by a DBG_VALUE referring to Reg?
2006            DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
2007            if (HistI == DbgValues.end())
2008              continue;
2009            SmallVectorImpl<const MachineInstr*> &History = HistI->second;
2010            if (History.empty())
2011              continue;
2012            const MachineInstr *Prev = History.back();
2013            // Sanity-check: Register assignments are terminated at the end of
2014            // their block.
2015            if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
2016              continue;
2017            // Is the variable still in Reg?
2018            if (!isDbgValueInDefinedReg(Prev) ||
2019                Prev->getOperand(0).getReg() != Reg)
2020              continue;
2021            // Var is clobbered. Make sure the next instruction gets a label.
2022            History.push_back(MI);
2023          }
2024        }
2025      }
2026    }
2027  }
2028
2029  for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
2030       I != E; ++I) {
2031    SmallVectorImpl<const MachineInstr*> &History = I->second;
2032    if (History.empty())
2033      continue;
2034
2035    // Make sure the final register assignments are terminated.
2036    const MachineInstr *Prev = History.back();
2037    if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
2038      const MachineBasicBlock *PrevMBB = Prev->getParent();
2039      MachineBasicBlock::const_iterator LastMI = PrevMBB->getLastNonDebugInstr();
2040      if (LastMI == PrevMBB->end())
2041        // Drop DBG_VALUE for empty range.
2042        History.pop_back();
2043      else {
2044        // Terminate after LastMI.
2045        History.push_back(LastMI);
2046      }
2047    }
2048    // Request labels for the full history.
2049    for (unsigned i = 0, e = History.size(); i != e; ++i) {
2050      const MachineInstr *MI = History[i];
2051      if (MI->isDebugValue())
2052        requestLabelBeforeInsn(MI);
2053      else
2054        requestLabelAfterInsn(MI);
2055    }
2056  }
2057
2058  PrevInstLoc = DebugLoc();
2059  PrevLabel = FunctionBeginSym;
2060}
2061
2062/// endFunction - Gather and emit post-function debug information.
2063///
2064void DwarfDebug::endFunction(const MachineFunction *MF) {
2065  if (!MMI->hasDebugInfo() || DbgScopeMap.empty()) return;
2066
2067  if (CurrentFnDbgScope) {
2068
2069    // Define end label for subprogram.
2070    FunctionEndSym = Asm->GetTempSymbol("func_end",
2071                                        Asm->getFunctionNumber());
2072    // Assumes in correct section after the entry point.
2073    Asm->OutStreamer.EmitLabel(FunctionEndSym);
2074
2075    SmallPtrSet<const MDNode *, 16> ProcessedVars;
2076    collectVariableInfo(MF, ProcessedVars);
2077
2078    // Construct abstract scopes.
2079    for (SmallVector<DbgScope *, 4>::iterator AI = AbstractScopesList.begin(),
2080           AE = AbstractScopesList.end(); AI != AE; ++AI) {
2081      DISubprogram SP((*AI)->getScopeNode());
2082      if (SP.Verify()) {
2083        // Collect info for variables that were optimized out.
2084        StringRef FName = SP.getLinkageName();
2085        if (FName.empty())
2086          FName = SP.getName();
2087        if (NamedMDNode *NMD =
2088            getFnSpecificMDNode(*(MF->getFunction()->getParent()), FName)) {
2089          for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
2090          DIVariable DV(cast<MDNode>(NMD->getOperand(i)));
2091          if (!DV || !ProcessedVars.insert(DV))
2092            continue;
2093          DbgScope *Scope = AbstractScopes.lookup(DV.getContext());
2094          if (Scope)
2095            Scope->addVariable(new DbgVariable(DV));
2096          }
2097        }
2098      }
2099      if (ProcessedSPNodes.count((*AI)->getScopeNode()) == 0)
2100        constructScopeDIE(*AI);
2101    }
2102
2103    DIE *CurFnDIE = constructScopeDIE(CurrentFnDbgScope);
2104
2105    if (!DisableFramePointerElim(*MF))
2106      getCompileUnit(CurrentFnDbgScope->getScopeNode())->addUInt(CurFnDIE,
2107                                                                 dwarf::DW_AT_APPLE_omit_frame_ptr,
2108                                                                 dwarf::DW_FORM_flag, 1);
2109
2110
2111    DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
2112                                                 MMI->getFrameMoves()));
2113  }
2114
2115  // Clear debug info
2116  CurrentFnDbgScope = NULL;
2117  DeleteContainerPointers(CurrentFnArguments);
2118  DbgVariableToFrameIndexMap.clear();
2119  VarToAbstractVarMap.clear();
2120  DbgVariableToDbgInstMap.clear();
2121  DeleteContainerSeconds(DbgScopeMap);
2122  UserVariables.clear();
2123  DbgValues.clear();
2124  ConcreteScopes.clear();
2125  DeleteContainerSeconds(AbstractScopes);
2126  AbstractScopesList.clear();
2127  AbstractVariables.clear();
2128  LabelsBeforeInsn.clear();
2129  LabelsAfterInsn.clear();
2130  PrevLabel = NULL;
2131}
2132
2133/// recordVariableFrameIndex - Record a variable's index.
2134void DwarfDebug::recordVariableFrameIndex(const DbgVariable *V, int Index) {
2135  assert (V && "Invalid DbgVariable!");
2136  DbgVariableToFrameIndexMap[V] = Index;
2137}
2138
2139/// findVariableFrameIndex - Return true if frame index for the variable
2140/// is found. Update FI to hold value of the index.
2141bool DwarfDebug::findVariableFrameIndex(const DbgVariable *V, int *FI) {
2142  assert (V && "Invalid DbgVariable!");
2143  DenseMap<const DbgVariable *, int>::iterator I =
2144    DbgVariableToFrameIndexMap.find(V);
2145  if (I == DbgVariableToFrameIndexMap.end())
2146    return false;
2147  *FI = I->second;
2148  return true;
2149}
2150
2151/// findDbgScope - Find DbgScope for the debug loc attached with an
2152/// instruction.
2153DbgScope *DwarfDebug::findDbgScope(const MachineInstr *MInsn) {
2154  DbgScope *Scope = NULL;
2155  LLVMContext &Ctx =
2156    MInsn->getParent()->getParent()->getFunction()->getContext();
2157  DebugLoc DL = MInsn->getDebugLoc();
2158
2159  if (DL.isUnknown())
2160    return Scope;
2161
2162  if (const MDNode *IA = DL.getInlinedAt(Ctx))
2163    Scope = ConcreteScopes.lookup(IA);
2164  if (Scope == 0)
2165    Scope = DbgScopeMap.lookup(DL.getScope(Ctx));
2166
2167  return Scope;
2168}
2169
2170
2171/// recordSourceLine - Register a source line with debug info. Returns the
2172/// unique label that was emitted and which provides correspondence to
2173/// the source line list.
2174void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S){
2175  StringRef Fn;
2176  StringRef Dir;
2177  unsigned Src = 1;
2178  if (S) {
2179    DIDescriptor Scope(S);
2180
2181    if (Scope.isCompileUnit()) {
2182      DICompileUnit CU(S);
2183      Fn = CU.getFilename();
2184      Dir = CU.getDirectory();
2185    } else if (Scope.isFile()) {
2186      DIFile F(S);
2187      Fn = F.getFilename();
2188      Dir = F.getDirectory();
2189    } else if (Scope.isSubprogram()) {
2190      DISubprogram SP(S);
2191      Fn = SP.getFilename();
2192      Dir = SP.getDirectory();
2193    } else if (Scope.isLexicalBlock()) {
2194      DILexicalBlock DB(S);
2195      Fn = DB.getFilename();
2196      Dir = DB.getDirectory();
2197    } else
2198      assert(0 && "Unexpected scope info");
2199
2200    Src = GetOrCreateSourceID(Fn, Dir);
2201  }
2202  Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, DWARF2_FLAG_IS_STMT,
2203                                         0, 0, Fn);
2204}
2205
2206//===----------------------------------------------------------------------===//
2207// Emit Methods
2208//===----------------------------------------------------------------------===//
2209
2210/// computeSizeAndOffset - Compute the size and offset of a DIE.
2211///
2212unsigned
2213DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
2214  // Get the children.
2215  const std::vector<DIE *> &Children = Die->getChildren();
2216
2217  // If not last sibling and has children then add sibling offset attribute.
2218  if (!Last && !Children.empty())
2219    Die->addSiblingOffset(DIEValueAllocator);
2220
2221  // Record the abbreviation.
2222  assignAbbrevNumber(Die->getAbbrev());
2223
2224  // Get the abbreviation for this DIE.
2225  unsigned AbbrevNumber = Die->getAbbrevNumber();
2226  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2227
2228  // Set DIE offset
2229  Die->setOffset(Offset);
2230
2231  // Start the size with the size of abbreviation code.
2232  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
2233
2234  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2235  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2236
2237  // Size the DIE attribute values.
2238  for (unsigned i = 0, N = Values.size(); i < N; ++i)
2239    // Size attribute value.
2240    Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
2241
2242  // Size the DIE children if any.
2243  if (!Children.empty()) {
2244    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
2245           "Children flag not set");
2246
2247    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2248      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
2249
2250    // End of children marker.
2251    Offset += sizeof(int8_t);
2252  }
2253
2254  Die->setSize(Offset - Die->getOffset());
2255  return Offset;
2256}
2257
2258/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
2259///
2260void DwarfDebug::computeSizeAndOffsets() {
2261  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2262         E = CUMap.end(); I != E; ++I) {
2263    // Compute size of compile unit header.
2264    unsigned Offset =
2265      sizeof(int32_t) + // Length of Compilation Unit Info
2266      sizeof(int16_t) + // DWARF version number
2267      sizeof(int32_t) + // Offset Into Abbrev. Section
2268      sizeof(int8_t);   // Pointer Size (in bytes)
2269    computeSizeAndOffset(I->second->getCUDie(), Offset, true);
2270  }
2271}
2272
2273/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
2274/// temporary label to it if SymbolStem is specified.
2275static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
2276                                const char *SymbolStem = 0) {
2277  Asm->OutStreamer.SwitchSection(Section);
2278  if (!SymbolStem) return 0;
2279
2280  MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
2281  Asm->OutStreamer.EmitLabel(TmpSym);
2282  return TmpSym;
2283}
2284
2285/// EmitSectionLabels - Emit initial Dwarf sections with a label at
2286/// the start of each one.
2287void DwarfDebug::EmitSectionLabels() {
2288  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
2289
2290  // Dwarf sections base addresses.
2291  if (Asm->MAI->doesDwarfRequireFrameSection()) {
2292    DwarfFrameSectionSym =
2293      EmitSectionSym(Asm, TLOF.getDwarfFrameSection(), "section_debug_frame");
2294   }
2295
2296  DwarfInfoSectionSym =
2297    EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
2298  DwarfAbbrevSectionSym =
2299    EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
2300  EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
2301
2302  if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
2303    EmitSectionSym(Asm, MacroInfo);
2304
2305  EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
2306  EmitSectionSym(Asm, TLOF.getDwarfLocSection());
2307  EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
2308  EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
2309  DwarfStrSectionSym =
2310    EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
2311  DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
2312                                             "debug_range");
2313
2314  DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
2315                                           "section_debug_loc");
2316
2317  TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
2318  EmitSectionSym(Asm, TLOF.getDataSection());
2319}
2320
2321/// emitDIE - Recusively Emits a debug information entry.
2322///
2323void DwarfDebug::emitDIE(DIE *Die) {
2324  // Get the abbreviation for this DIE.
2325  unsigned AbbrevNumber = Die->getAbbrevNumber();
2326  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
2327
2328  // Emit the code (index) for the abbreviation.
2329  if (Asm->isVerbose())
2330    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
2331                                Twine::utohexstr(Die->getOffset()) + ":0x" +
2332                                Twine::utohexstr(Die->getSize()) + " " +
2333                                dwarf::TagString(Abbrev->getTag()));
2334  Asm->EmitULEB128(AbbrevNumber);
2335
2336  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
2337  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
2338
2339  // Emit the DIE attribute values.
2340  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
2341    unsigned Attr = AbbrevData[i].getAttribute();
2342    unsigned Form = AbbrevData[i].getForm();
2343    assert(Form && "Too many attributes for DIE (check abbreviation)");
2344
2345    if (Asm->isVerbose())
2346      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
2347
2348    switch (Attr) {
2349    case dwarf::DW_AT_sibling:
2350      Asm->EmitInt32(Die->getSiblingOffset());
2351      break;
2352    case dwarf::DW_AT_abstract_origin: {
2353      DIEEntry *E = cast<DIEEntry>(Values[i]);
2354      DIE *Origin = E->getEntry();
2355      unsigned Addr = Origin->getOffset();
2356      Asm->EmitInt32(Addr);
2357      break;
2358    }
2359    case dwarf::DW_AT_ranges: {
2360      // DW_AT_range Value encodes offset in debug_range section.
2361      DIEInteger *V = cast<DIEInteger>(Values[i]);
2362
2363      if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
2364        Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
2365                                 V->getValue(),
2366                                 4);
2367      } else {
2368        Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
2369                                       V->getValue(),
2370                                       DwarfDebugRangeSectionSym,
2371                                       4);
2372      }
2373      break;
2374    }
2375    case dwarf::DW_AT_location: {
2376      if (UseDotDebugLocEntry.count(Die) != 0) {
2377        DIELabel *L = cast<DIELabel>(Values[i]);
2378        Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
2379      } else
2380        Values[i]->EmitValue(Asm, Form);
2381      break;
2382    }
2383    case dwarf::DW_AT_accessibility: {
2384      if (Asm->isVerbose()) {
2385        DIEInteger *V = cast<DIEInteger>(Values[i]);
2386        Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2387      }
2388      Values[i]->EmitValue(Asm, Form);
2389      break;
2390    }
2391    default:
2392      // Emit an attribute using the defined form.
2393      Values[i]->EmitValue(Asm, Form);
2394      break;
2395    }
2396  }
2397
2398  // Emit the DIE children if any.
2399  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2400    const std::vector<DIE *> &Children = Die->getChildren();
2401
2402    for (unsigned j = 0, M = Children.size(); j < M; ++j)
2403      emitDIE(Children[j]);
2404
2405    if (Asm->isVerbose())
2406      Asm->OutStreamer.AddComment("End Of Children Mark");
2407    Asm->EmitInt8(0);
2408  }
2409}
2410
2411/// emitDebugInfo - Emit the debug info section.
2412///
2413void DwarfDebug::emitDebugInfo() {
2414  // Start debug info section.
2415  Asm->OutStreamer.SwitchSection(
2416                            Asm->getObjFileLowering().getDwarfInfoSection());
2417  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2418         E = CUMap.end(); I != E; ++I) {
2419    CompileUnit *TheCU = I->second;
2420    DIE *Die = TheCU->getCUDie();
2421
2422    // Emit the compile units header.
2423    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
2424                                                  TheCU->getID()));
2425
2426    // Emit size of content not including length itself
2427    unsigned ContentSize = Die->getSize() +
2428      sizeof(int16_t) + // DWARF version number
2429      sizeof(int32_t) + // Offset Into Abbrev. Section
2430      sizeof(int8_t);   // Pointer Size (in bytes)
2431
2432    Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2433    Asm->EmitInt32(ContentSize);
2434    Asm->OutStreamer.AddComment("DWARF version number");
2435    Asm->EmitInt16(dwarf::DWARF_VERSION);
2436    Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2437    Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
2438                           DwarfAbbrevSectionSym);
2439    Asm->OutStreamer.AddComment("Address Size (in bytes)");
2440    Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2441
2442    emitDIE(Die);
2443    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
2444  }
2445}
2446
2447/// emitAbbreviations - Emit the abbreviation section.
2448///
2449void DwarfDebug::emitAbbreviations() const {
2450  // Check to see if it is worth the effort.
2451  if (!Abbreviations.empty()) {
2452    // Start the debug abbrev section.
2453    Asm->OutStreamer.SwitchSection(
2454                            Asm->getObjFileLowering().getDwarfAbbrevSection());
2455
2456    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
2457
2458    // For each abbrevation.
2459    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
2460      // Get abbreviation data
2461      const DIEAbbrev *Abbrev = Abbreviations[i];
2462
2463      // Emit the abbrevations code (base 1 index.)
2464      Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2465
2466      // Emit the abbreviations data.
2467      Abbrev->Emit(Asm);
2468    }
2469
2470    // Mark end of abbreviations.
2471    Asm->EmitULEB128(0, "EOM(3)");
2472
2473    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
2474  }
2475}
2476
2477/// emitEndOfLineMatrix - Emit the last address of the section and the end of
2478/// the line matrix.
2479///
2480void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2481  // Define last address of section.
2482  Asm->OutStreamer.AddComment("Extended Op");
2483  Asm->EmitInt8(0);
2484
2485  Asm->OutStreamer.AddComment("Op size");
2486  Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
2487  Asm->OutStreamer.AddComment("DW_LNE_set_address");
2488  Asm->EmitInt8(dwarf::DW_LNE_set_address);
2489
2490  Asm->OutStreamer.AddComment("Section end label");
2491
2492  Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2493                                   Asm->getTargetData().getPointerSize(),
2494                                   0/*AddrSpace*/);
2495
2496  // Mark end of matrix.
2497  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2498  Asm->EmitInt8(0);
2499  Asm->EmitInt8(1);
2500  Asm->EmitInt8(1);
2501}
2502
2503/// emitCommonDebugFrame - Emit common frame info into a debug frame section.
2504///
2505void DwarfDebug::emitCommonDebugFrame() {
2506  if (!Asm->MAI->doesDwarfRequireFrameSection())
2507    return;
2508
2509  int stackGrowth = Asm->getTargetData().getPointerSize();
2510  if (Asm->TM.getFrameLowering()->getStackGrowthDirection() ==
2511      TargetFrameLowering::StackGrowsDown)
2512    stackGrowth *= -1;
2513
2514  // Start the dwarf frame section.
2515  Asm->OutStreamer.SwitchSection(
2516                              Asm->getObjFileLowering().getDwarfFrameSection());
2517
2518  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common"));
2519  Asm->OutStreamer.AddComment("Length of Common Information Entry");
2520  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_frame_common_end"),
2521                           Asm->GetTempSymbol("debug_frame_common_begin"), 4);
2522
2523  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_begin"));
2524  Asm->OutStreamer.AddComment("CIE Identifier Tag");
2525  Asm->EmitInt32((int)dwarf::DW_CIE_ID);
2526  Asm->OutStreamer.AddComment("CIE Version");
2527  Asm->EmitInt8(dwarf::DW_CIE_VERSION);
2528  Asm->OutStreamer.AddComment("CIE Augmentation");
2529  Asm->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0); // nul terminator.
2530  Asm->EmitULEB128(1, "CIE Code Alignment Factor");
2531  Asm->EmitSLEB128(stackGrowth, "CIE Data Alignment Factor");
2532  Asm->OutStreamer.AddComment("CIE RA Column");
2533  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
2534  const TargetFrameLowering *TFI = Asm->TM.getFrameLowering();
2535  Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
2536
2537  std::vector<MachineMove> Moves;
2538  TFI->getInitialFrameState(Moves);
2539
2540  Asm->EmitFrameMoves(Moves, 0, false);
2541
2542  Asm->EmitAlignment(2);
2543  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_frame_common_end"));
2544}
2545
2546/// emitFunctionDebugFrame - Emit per function frame info into a debug frame
2547/// section.
2548void DwarfDebug::
2549emitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) {
2550  if (!Asm->MAI->doesDwarfRequireFrameSection())
2551    return;
2552
2553  // Start the dwarf frame section.
2554  Asm->OutStreamer.SwitchSection(
2555                              Asm->getObjFileLowering().getDwarfFrameSection());
2556
2557  Asm->OutStreamer.AddComment("Length of Frame Information Entry");
2558  MCSymbol *DebugFrameBegin =
2559    Asm->GetTempSymbol("debug_frame_begin", DebugFrameInfo.Number);
2560  MCSymbol *DebugFrameEnd =
2561    Asm->GetTempSymbol("debug_frame_end", DebugFrameInfo.Number);
2562  Asm->EmitLabelDifference(DebugFrameEnd, DebugFrameBegin, 4);
2563
2564  Asm->OutStreamer.EmitLabel(DebugFrameBegin);
2565
2566  Asm->OutStreamer.AddComment("FDE CIE offset");
2567  Asm->EmitSectionOffset(Asm->GetTempSymbol("debug_frame_common"),
2568                         DwarfFrameSectionSym);
2569
2570  Asm->OutStreamer.AddComment("FDE initial location");
2571  MCSymbol *FuncBeginSym =
2572    Asm->GetTempSymbol("func_begin", DebugFrameInfo.Number);
2573  Asm->OutStreamer.EmitSymbolValue(FuncBeginSym,
2574                                   Asm->getTargetData().getPointerSize(),
2575                                   0/*AddrSpace*/);
2576
2577
2578  Asm->OutStreamer.AddComment("FDE address range");
2579  Asm->EmitLabelDifference(Asm->GetTempSymbol("func_end",DebugFrameInfo.Number),
2580                           FuncBeginSym, Asm->getTargetData().getPointerSize());
2581
2582  Asm->EmitFrameMoves(DebugFrameInfo.Moves, FuncBeginSym, false);
2583
2584  Asm->EmitAlignment(2);
2585  Asm->OutStreamer.EmitLabel(DebugFrameEnd);
2586}
2587
2588/// emitDebugPubNames - Emit visible names into a debug pubnames section.
2589///
2590void DwarfDebug::emitDebugPubNames() {
2591  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2592         E = CUMap.end(); I != E; ++I) {
2593    CompileUnit *TheCU = I->second;
2594    // Start the dwarf pubnames section.
2595    Asm->OutStreamer.SwitchSection(
2596      Asm->getObjFileLowering().getDwarfPubNamesSection());
2597
2598    Asm->OutStreamer.AddComment("Length of Public Names Info");
2599    Asm->EmitLabelDifference(
2600      Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
2601      Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
2602
2603    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
2604                                                  TheCU->getID()));
2605
2606    Asm->OutStreamer.AddComment("DWARF Version");
2607    Asm->EmitInt16(dwarf::DWARF_VERSION);
2608
2609    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2610    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2611                           DwarfInfoSectionSym);
2612
2613    Asm->OutStreamer.AddComment("Compilation Unit Length");
2614    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2615                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
2616                             4);
2617
2618    const StringMap<DIE*> &Globals = TheCU->getGlobals();
2619    for (StringMap<DIE*>::const_iterator
2620           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2621      const char *Name = GI->getKeyData();
2622      DIE *Entity = GI->second;
2623
2624      Asm->OutStreamer.AddComment("DIE offset");
2625      Asm->EmitInt32(Entity->getOffset());
2626
2627      if (Asm->isVerbose())
2628        Asm->OutStreamer.AddComment("External Name");
2629      Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
2630    }
2631
2632    Asm->OutStreamer.AddComment("End Mark");
2633    Asm->EmitInt32(0);
2634    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
2635                                                TheCU->getID()));
2636  }
2637}
2638
2639void DwarfDebug::emitDebugPubTypes() {
2640  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2641         E = CUMap.end(); I != E; ++I) {
2642    CompileUnit *TheCU = I->second;
2643    // Start the dwarf pubnames section.
2644    Asm->OutStreamer.SwitchSection(
2645      Asm->getObjFileLowering().getDwarfPubTypesSection());
2646    Asm->OutStreamer.AddComment("Length of Public Types Info");
2647    Asm->EmitLabelDifference(
2648      Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
2649      Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
2650
2651    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2652                                                  TheCU->getID()));
2653
2654    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2655    Asm->EmitInt16(dwarf::DWARF_VERSION);
2656
2657    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2658    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
2659                           DwarfInfoSectionSym);
2660
2661    Asm->OutStreamer.AddComment("Compilation Unit Length");
2662    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
2663                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
2664                             4);
2665
2666    const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2667    for (StringMap<DIE*>::const_iterator
2668           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2669      const char *Name = GI->getKeyData();
2670      DIE * Entity = GI->second;
2671
2672      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2673      Asm->EmitInt32(Entity->getOffset());
2674
2675      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2676      Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2677    }
2678
2679    Asm->OutStreamer.AddComment("End Mark");
2680    Asm->EmitInt32(0);
2681    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2682                                                  TheCU->getID()));
2683  }
2684}
2685
2686/// emitDebugStr - Emit visible names into a debug str section.
2687///
2688void DwarfDebug::emitDebugStr() {
2689  // Check to see if it is worth the effort.
2690  if (StringPool.empty()) return;
2691
2692  // Start the dwarf str section.
2693  Asm->OutStreamer.SwitchSection(
2694                                Asm->getObjFileLowering().getDwarfStrSection());
2695
2696  // Get all of the string pool entries and put them in an array by their ID so
2697  // we can sort them.
2698  SmallVector<std::pair<unsigned,
2699      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2700
2701  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2702       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2703    Entries.push_back(std::make_pair(I->second.second, &*I));
2704
2705  array_pod_sort(Entries.begin(), Entries.end());
2706
2707  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2708    // Emit a label for reference from debug information entries.
2709    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2710
2711    // Emit the string itself.
2712    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
2713  }
2714}
2715
2716/// emitDebugLoc - Emit visible names into a debug loc section.
2717///
2718void DwarfDebug::emitDebugLoc() {
2719  if (DotDebugLocEntries.empty())
2720    return;
2721
2722  for (SmallVector<DotDebugLocEntry, 4>::iterator
2723         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2724       I != E; ++I) {
2725    DotDebugLocEntry &Entry = *I;
2726    if (I + 1 != DotDebugLocEntries.end())
2727      Entry.Merge(I+1);
2728  }
2729
2730  // Start the dwarf loc section.
2731  Asm->OutStreamer.SwitchSection(
2732    Asm->getObjFileLowering().getDwarfLocSection());
2733  unsigned char Size = Asm->getTargetData().getPointerSize();
2734  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2735  unsigned index = 1;
2736  for (SmallVector<DotDebugLocEntry, 4>::iterator
2737         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2738       I != E; ++I, ++index) {
2739    DotDebugLocEntry &Entry = *I;
2740    if (Entry.isMerged()) continue;
2741    if (Entry.isEmpty()) {
2742      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2743      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2744      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2745    } else {
2746      Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2747      Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
2748      DIVariable DV(Entry.Variable);
2749      if (DV.hasComplexAddress()) {
2750        unsigned N = DV.getNumAddrElements();
2751        unsigned i = 0;
2752        Asm->OutStreamer.AddComment("Loc expr size");
2753        if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2754          // If first address element is OpPlus then emit
2755          // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2756          MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2757          Asm->EmitInt16(Asm->getDwarfRegOpSize(Loc) + N - 2);
2758          Asm->EmitDwarfRegOp(Loc);
2759//          Asm->EmitULEB128(DV.getAddrElement(1));
2760          i = 2;
2761        } else {
2762          Asm->EmitInt16(Asm->getDwarfRegOpSize(Entry.Loc) + N);
2763          Asm->EmitDwarfRegOp(Entry.Loc);
2764        }
2765
2766        // Emit remaining complex address elements.
2767        for (; i < N; ++i) {
2768          uint64_t Element = DV.getAddrElement(i);
2769          if (Element == DIBuilder::OpPlus) {
2770            Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2771            Asm->EmitULEB128(DV.getAddrElement(++i));
2772          } else if (Element == DIBuilder::OpDeref)
2773            Asm->EmitInt8(dwarf::DW_OP_deref);
2774          else llvm_unreachable("unknown Opcode found in complex address");
2775        }
2776      } else {
2777        Asm->OutStreamer.AddComment("Loc expr size");
2778        Asm->EmitInt16(Asm->getDwarfRegOpSize(Entry.Loc));
2779        Asm->EmitDwarfRegOp(Entry.Loc);
2780      }
2781    }
2782  }
2783}
2784
2785/// EmitDebugARanges - Emit visible names into a debug aranges section.
2786///
2787void DwarfDebug::EmitDebugARanges() {
2788  // Start the dwarf aranges section.
2789  Asm->OutStreamer.SwitchSection(
2790                          Asm->getObjFileLowering().getDwarfARangesSection());
2791}
2792
2793/// emitDebugRanges - Emit visible names into a debug ranges section.
2794///
2795void DwarfDebug::emitDebugRanges() {
2796  // Start the dwarf ranges section.
2797  Asm->OutStreamer.SwitchSection(
2798    Asm->getObjFileLowering().getDwarfRangesSection());
2799  unsigned char Size = Asm->getTargetData().getPointerSize();
2800  for (SmallVector<const MCSymbol *, 8>::iterator
2801         I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2802       I != E; ++I) {
2803    if (*I)
2804      Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
2805    else
2806      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2807  }
2808}
2809
2810/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2811///
2812void DwarfDebug::emitDebugMacInfo() {
2813  if (const MCSection *LineInfo =
2814      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2815    // Start the dwarf macinfo section.
2816    Asm->OutStreamer.SwitchSection(LineInfo);
2817  }
2818}
2819
2820/// emitDebugInlineInfo - Emit inline info using following format.
2821/// Section Header:
2822/// 1. length of section
2823/// 2. Dwarf version number
2824/// 3. address size.
2825///
2826/// Entries (one "entry" for each function that was inlined):
2827///
2828/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2829///   otherwise offset into __debug_str for regular function name.
2830/// 2. offset into __debug_str section for regular function name.
2831/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2832/// instances for the function.
2833///
2834/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2835/// inlined instance; the die_offset points to the inlined_subroutine die in the
2836/// __debug_info section, and the low_pc is the starting address for the
2837/// inlining instance.
2838void DwarfDebug::emitDebugInlineInfo() {
2839  if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
2840    return;
2841
2842  if (!FirstCU)
2843    return;
2844
2845  Asm->OutStreamer.SwitchSection(
2846                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
2847
2848  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2849  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2850                           Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2851
2852  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2853
2854  Asm->OutStreamer.AddComment("Dwarf Version");
2855  Asm->EmitInt16(dwarf::DWARF_VERSION);
2856  Asm->OutStreamer.AddComment("Address Size (in bytes)");
2857  Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2858
2859  for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2860         E = InlinedSPNodes.end(); I != E; ++I) {
2861
2862    const MDNode *Node = *I;
2863    DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2864      = InlineInfo.find(Node);
2865    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2866    DISubprogram SP(Node);
2867    StringRef LName = SP.getLinkageName();
2868    StringRef Name = SP.getName();
2869
2870    Asm->OutStreamer.AddComment("MIPS linkage name");
2871    if (LName.empty()) {
2872      Asm->OutStreamer.EmitBytes(Name, 0);
2873      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2874    } else
2875      Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2876                             DwarfStrSectionSym);
2877
2878    Asm->OutStreamer.AddComment("Function name");
2879    Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2880    Asm->EmitULEB128(Labels.size(), "Inline count");
2881
2882    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2883           LE = Labels.end(); LI != LE; ++LI) {
2884      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2885      Asm->EmitInt32(LI->second->getOffset());
2886
2887      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2888      Asm->OutStreamer.EmitSymbolValue(LI->first,
2889                                       Asm->getTargetData().getPointerSize(),0);
2890    }
2891  }
2892
2893  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
2894}
2895