DwarfDebug.cpp revision 408c5673bbf5f504e2ef411738127d83d5e71de0
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 "DwarfAccelTable.h"
18#include "DwarfCompileUnit.h"
19#include "llvm/Constants.h"
20#include "llvm/Module.h"
21#include "llvm/Instructions.h"
22#include "llvm/CodeGen/MachineFunction.h"
23#include "llvm/CodeGen/MachineModuleInfo.h"
24#include "llvm/MC/MCAsmInfo.h"
25#include "llvm/MC/MCSection.h"
26#include "llvm/MC/MCStreamer.h"
27#include "llvm/MC/MCSymbol.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> DisableDebugInfoPrinting("disable-debug-info-print",
49                                              cl::Hidden,
50     cl::desc("Disable debug info printing"));
51
52static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
53     cl::desc("Make an absence of debug location information explicit."),
54     cl::init(false));
55
56static cl::opt<bool> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
57     cl::desc("Output prototype dwarf accelerator tables."),
58     cl::init(false));
59
60namespace {
61  const char *DWARFGroupName = "DWARF Emission";
62  const char *DbgTimerName = "DWARF Debug Writer";
63} // end anonymous namespace
64
65//===----------------------------------------------------------------------===//
66
67/// Configuration values for initial hash set sizes (log2).
68///
69static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
70
71namespace llvm {
72
73DIType DbgVariable::getType() const {
74  DIType Ty = Var.getType();
75  // FIXME: isBlockByrefVariable should be reformulated in terms of complex
76  // addresses instead.
77  if (Var.isBlockByrefVariable()) {
78    /* Byref variables, in Blocks, are declared by the programmer as
79       "SomeType VarName;", but the compiler creates a
80       __Block_byref_x_VarName struct, and gives the variable VarName
81       either the struct, or a pointer to the struct, as its type.  This
82       is necessary for various behind-the-scenes things the compiler
83       needs to do with by-reference variables in blocks.
84
85       However, as far as the original *programmer* is concerned, the
86       variable should still have type 'SomeType', as originally declared.
87
88       The following function dives into the __Block_byref_x_VarName
89       struct to find the original type of the variable.  This will be
90       passed back to the code generating the type for the Debug
91       Information Entry for the variable 'VarName'.  'VarName' will then
92       have the original type 'SomeType' in its debug information.
93
94       The original type 'SomeType' will be the type of the field named
95       'VarName' inside the __Block_byref_x_VarName struct.
96
97       NOTE: In order for this to not completely fail on the debugger
98       side, the Debug Information Entry for the variable VarName needs to
99       have a DW_AT_location that tells the debugger how to unwind through
100       the pointers and __Block_byref_x_VarName struct to find the actual
101       value of the variable.  The function addBlockByrefType does this.  */
102    DIType subType = Ty;
103    unsigned tag = Ty.getTag();
104
105    if (tag == dwarf::DW_TAG_pointer_type) {
106      DIDerivedType DTy = DIDerivedType(Ty);
107      subType = DTy.getTypeDerivedFrom();
108    }
109
110    DICompositeType blockStruct = DICompositeType(subType);
111    DIArray Elements = blockStruct.getTypeArray();
112
113    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
114      DIDescriptor Element = Elements.getElement(i);
115      DIDerivedType DT = DIDerivedType(Element);
116      if (getName() == DT.getName())
117        return (DT.getTypeDerivedFrom());
118    }
119    return Ty;
120  }
121  return Ty;
122}
123
124} // end llvm namespace
125
126DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
127  : Asm(A), MMI(Asm->MMI), FirstCU(0),
128    AbbreviationsSet(InitAbbreviationsSetSize),
129    PrevLabel(NULL) {
130  NextStringPoolNumber = 0;
131
132  DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
133  DwarfStrSectionSym = TextSectionSym = 0;
134  DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
135  FunctionBeginSym = FunctionEndSym = 0;
136  {
137    NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
138    beginModule(M);
139  }
140}
141DwarfDebug::~DwarfDebug() {
142}
143
144/// EmitSectionSym - Switch to the specified MCSection and emit an assembler
145/// temporary label to it if SymbolStem is specified.
146static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
147                                const char *SymbolStem = 0) {
148  Asm->OutStreamer.SwitchSection(Section);
149  if (!SymbolStem) return 0;
150
151  MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
152  Asm->OutStreamer.EmitLabel(TmpSym);
153  return TmpSym;
154}
155
156MCSymbol *DwarfDebug::getStringPool() {
157  return Asm->GetTempSymbol("section_str");
158}
159
160MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
161  std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
162  if (Entry.first) return Entry.first;
163
164  Entry.second = NextStringPoolNumber++;
165  return Entry.first = Asm->GetTempSymbol("string", Entry.second);
166}
167
168/// assignAbbrevNumber - Define a unique number for the abbreviation.
169///
170void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
171  // Profile the node so that we can make it unique.
172  FoldingSetNodeID ID;
173  Abbrev.Profile(ID);
174
175  // Check the set for priors.
176  DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
177
178  // If it's newly added.
179  if (InSet == &Abbrev) {
180    // Add to abbreviation list.
181    Abbreviations.push_back(&Abbrev);
182
183    // Assign the vector position + 1 as its number.
184    Abbrev.setNumber(Abbreviations.size());
185  } else {
186    // Assign existing abbreviation number.
187    Abbrev.setNumber(InSet->getNumber());
188  }
189}
190
191/// getRealLinkageName - If special LLVM prefix that is used to inform the asm
192/// printer to not emit usual symbol prefix before the symbol name is used then
193/// return linkage name after skipping this special LLVM prefix.
194static StringRef getRealLinkageName(StringRef LinkageName) {
195  char One = '\1';
196  if (LinkageName.startswith(StringRef(&One, 1)))
197    return LinkageName.substr(1);
198  return LinkageName;
199}
200
201/// updateSubprogramScopeDIE - Find DIE for the given subprogram and
202/// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
203/// If there are global variables in this scope then create and insert
204/// DIEs for these variables.
205DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
206                                          const MDNode *SPNode) {
207  DIE *SPDie = SPCU->getDIE(SPNode);
208
209  assert(SPDie && "Unable to find subprogram DIE!");
210  DISubprogram SP(SPNode);
211
212  DISubprogram SPDecl = SP.getFunctionDeclaration();
213  if (!SPDecl.isSubprogram()) {
214    // There is not any need to generate specification DIE for a function
215    // defined at compile unit level. If a function is defined inside another
216    // function then gdb prefers the definition at top level and but does not
217    // expect specification DIE in parent function. So avoid creating
218    // specification DIE for a function defined inside a function.
219    if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
220        !SP.getContext().isFile() &&
221        !isSubprogramContext(SP.getContext())) {
222      SPCU->addUInt(SPDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
223
224      // Add arguments.
225      DICompositeType SPTy = SP.getType();
226      DIArray Args = SPTy.getTypeArray();
227      unsigned SPTag = SPTy.getTag();
228      if (SPTag == dwarf::DW_TAG_subroutine_type)
229        for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
230          DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
231          DIType ATy = DIType(DIType(Args.getElement(i)));
232          SPCU->addType(Arg, ATy);
233          if (ATy.isArtificial())
234            SPCU->addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
235          SPDie->addChild(Arg);
236        }
237      DIE *SPDeclDie = SPDie;
238      SPDie = new DIE(dwarf::DW_TAG_subprogram);
239      SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
240                        SPDeclDie);
241      SPCU->addDie(SPDie);
242    }
243  }
244  // Pick up abstract subprogram DIE.
245  if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
246    SPDie = new DIE(dwarf::DW_TAG_subprogram);
247    SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
248                      dwarf::DW_FORM_ref4, AbsSPDIE);
249    SPCU->addDie(SPDie);
250  }
251
252  SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
253                 Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
254  SPCU->addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
255                 Asm->GetTempSymbol("func_end", Asm->getFunctionNumber()));
256  const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
257  MachineLocation Location(RI->getFrameRegister(*Asm->MF));
258  SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
259
260  return SPDie;
261}
262
263/// constructLexicalScope - Construct new DW_TAG_lexical_block
264/// for this scope and attach DW_AT_low_pc/DW_AT_high_pc labels.
265DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
266                                          LexicalScope *Scope) {
267  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
268  if (Scope->isAbstractScope())
269    return ScopeDIE;
270
271  const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
272  if (Ranges.empty())
273    return 0;
274
275  SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
276  if (Ranges.size() > 1) {
277    // .debug_range section has not been laid out yet. Emit offset in
278    // .debug_range as a uint, size 4, for now. emitDIE will handle
279    // DW_AT_ranges appropriately.
280    TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
281                   DebugRangeSymbols.size()
282                   * Asm->getTargetData().getPointerSize());
283    for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
284         RE = Ranges.end(); RI != RE; ++RI) {
285      DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
286      DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
287    }
288    DebugRangeSymbols.push_back(NULL);
289    DebugRangeSymbols.push_back(NULL);
290    return ScopeDIE;
291  }
292
293  const MCSymbol *Start = getLabelBeforeInsn(RI->first);
294  const MCSymbol *End = getLabelAfterInsn(RI->second);
295
296  if (End == 0) return 0;
297
298  assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
299  assert(End->isDefined() && "Invalid end label for an inlined scope!");
300
301  TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, Start);
302  TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr, End);
303
304  return ScopeDIE;
305}
306
307/// constructInlinedScopeDIE - This scope represents inlined body of
308/// a function. Construct DIE to represent this concrete inlined copy
309/// of the function.
310DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
311                                          LexicalScope *Scope) {
312  const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
313  assert(Ranges.empty() == false &&
314         "LexicalScope does not have instruction markers!");
315
316  if (!Scope->getScopeNode())
317    return NULL;
318  DIScope DS(Scope->getScopeNode());
319  DISubprogram InlinedSP = getDISubprogram(DS);
320  DIE *OriginDIE = TheCU->getDIE(InlinedSP);
321  if (!OriginDIE) {
322    DEBUG(dbgs() << "Unable to find original DIE for inlined subprogram.");
323    return NULL;
324  }
325
326  SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
327  const MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
328  const MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
329
330  if (StartLabel == 0 || EndLabel == 0) {
331    assert(0 && "Unexpected Start and End labels for a inlined scope!");
332    return 0;
333  }
334  assert(StartLabel->isDefined() &&
335         "Invalid starting label for an inlined scope!");
336  assert(EndLabel->isDefined() &&
337         "Invalid end label for an inlined scope!");
338
339  DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
340  TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
341                     dwarf::DW_FORM_ref4, OriginDIE);
342
343  if (Ranges.size() > 1) {
344    // .debug_range section has not been laid out yet. Emit offset in
345    // .debug_range as a uint, size 4, for now. emitDIE will handle
346    // DW_AT_ranges appropriately.
347    TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
348                   DebugRangeSymbols.size()
349                   * Asm->getTargetData().getPointerSize());
350    for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
351         RE = Ranges.end(); RI != RE; ++RI) {
352      DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
353      DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
354    }
355    DebugRangeSymbols.push_back(NULL);
356    DebugRangeSymbols.push_back(NULL);
357  } else {
358    TheCU->addLabel(ScopeDIE, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
359                    StartLabel);
360    TheCU->addLabel(ScopeDIE, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
361                    EndLabel);
362  }
363
364  InlinedSubprogramDIEs.insert(OriginDIE);
365
366  // Track the start label for this inlined function.
367  //.debug_inlined section specification does not clearly state how
368  // to emit inlined scope that is split into multiple instruction ranges.
369  // For now, use first instruction range and emit low_pc/high_pc pair and
370  // corresponding .debug_inlined section entry for this pair.
371  DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
372    I = InlineInfo.find(InlinedSP);
373
374  if (I == InlineInfo.end()) {
375    InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
376    InlinedSPNodes.push_back(InlinedSP);
377  } else
378    I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
379
380  DILocation DL(Scope->getInlinedAt());
381  TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0, TheCU->getID());
382  TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
383
384  return ScopeDIE;
385}
386
387/// constructScopeDIE - Construct a DIE for this scope.
388DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
389  if (!Scope || !Scope->getScopeNode())
390    return NULL;
391
392  SmallVector<DIE *, 8> Children;
393
394  // Collect arguments for current function.
395  if (LScopes.isCurrentFunctionScope(Scope))
396    for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
397      if (DbgVariable *ArgDV = CurrentFnArguments[i])
398        if (DIE *Arg =
399            TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope()))
400          Children.push_back(Arg);
401
402  // Collect lexical scope children first.
403  const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
404  for (unsigned i = 0, N = Variables.size(); i < N; ++i)
405    if (DIE *Variable =
406        TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope()))
407      Children.push_back(Variable);
408  const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
409  for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
410    if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
411      Children.push_back(Nested);
412  DIScope DS(Scope->getScopeNode());
413  DIE *ScopeDIE = NULL;
414  if (Scope->getInlinedAt())
415    ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
416  else if (DS.isSubprogram()) {
417    ProcessedSPNodes.insert(DS);
418    if (Scope->isAbstractScope()) {
419      ScopeDIE = TheCU->getDIE(DS);
420      // Note down abstract DIE.
421      if (ScopeDIE)
422        AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
423    }
424    else
425      ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
426  }
427  else {
428    // There is no need to emit empty lexical block DIE.
429    if (Children.empty())
430      return NULL;
431    ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
432  }
433
434  if (!ScopeDIE) return NULL;
435
436  // Add children
437  for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
438         E = Children.end(); I != E; ++I)
439    ScopeDIE->addChild(*I);
440
441  if (DS.isSubprogram())
442   TheCU->addPubTypes(DISubprogram(DS));
443
444  if (DS.isSubprogram() && !Scope->isAbstractScope())
445    TheCU->addAccelName(DISubprogram(DS).getName(), ScopeDIE);
446
447 return ScopeDIE;
448}
449
450/// GetOrCreateSourceID - Look up the source id with the given directory and
451/// source file names. If none currently exists, create a new id and insert it
452/// in the SourceIds map. This can update DirectoryNames and SourceFileNames
453/// maps as well.
454unsigned DwarfDebug::GetOrCreateSourceID(StringRef FileName,
455                                         StringRef DirName) {
456  // If FE did not provide a file name, then assume stdin.
457  if (FileName.empty())
458    return GetOrCreateSourceID("<stdin>", StringRef());
459
460  // TODO: this might not belong here. See if we can factor this better.
461  if (DirName == CompilationDir)
462    DirName = "";
463
464  unsigned SrcId = SourceIdMap.size()+1;
465  std::pair<std::string, std::string> SourceName =
466      std::make_pair(FileName, DirName);
467  std::pair<std::pair<std::string, std::string>, unsigned> Entry =
468      make_pair(SourceName, SrcId);
469
470  std::map<std::pair<std::string, std::string>, unsigned>::iterator I;
471  bool NewlyInserted;
472  tie(I, NewlyInserted) = SourceIdMap.insert(Entry);
473  if (!NewlyInserted)
474    return I->second;
475
476  // Print out a .file directive to specify files for .loc directives.
477  Asm->OutStreamer.EmitDwarfFileDirective(SrcId, Entry.first.second,
478                                          Entry.first.first);
479
480  return SrcId;
481}
482
483/// constructCompileUnit - Create new CompileUnit for the given
484/// metadata node with tag DW_TAG_compile_unit.
485CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
486  DICompileUnit DIUnit(N);
487  StringRef FN = DIUnit.getFilename();
488  CompilationDir = DIUnit.getDirectory();
489  unsigned ID = GetOrCreateSourceID(FN, CompilationDir);
490
491  DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
492  CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);
493  NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
494  NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
495                 DIUnit.getLanguage());
496  NewCU->addString(Die, dwarf::DW_AT_name, FN);
497  // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This
498  // simplifies debug range entries.
499  NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);
500  // DW_AT_stmt_list is a offset of line number information for this
501  // compile unit in debug_line section.
502  if (Asm->MAI->doesDwarfRequireRelocationForSectionOffset())
503    NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
504                    Asm->GetTempSymbol("section_line"));
505  else
506    NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
507
508  if (!CompilationDir.empty())
509    NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
510  if (DIUnit.isOptimized())
511    NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);
512
513  StringRef Flags = DIUnit.getFlags();
514  if (!Flags.empty())
515    NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
516
517  if (unsigned RVer = DIUnit.getRunTimeVersion())
518    NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
519            dwarf::DW_FORM_data1, RVer);
520
521  if (!FirstCU)
522    FirstCU = NewCU;
523  CUMap.insert(std::make_pair(N, NewCU));
524  return NewCU;
525}
526
527static bool isObjCClass(StringRef Name) {
528  if (Name == "") return false;
529  return Name[0] == '+' || Name[0] == '-';
530}
531
532static bool hasObjCCategory(StringRef Name) {
533  if (Name[0] != '+' && Name[0] != '-')
534    return false;
535
536  size_t pos = Name.find(')');
537  if (pos != std::string::npos) {
538    if (Name[pos+1] != ' ') return false;
539    return true;
540  }
541
542  return false;
543}
544
545static void getObjCClassCategory(StringRef In, StringRef &Class,
546                                 StringRef &Category) {
547  if (!hasObjCCategory(In)) {
548    Class = In.slice(In.find('[') + 1, In.find(' '));
549    Category = "";
550    return;
551  }
552
553  Class = In.slice(In.find('[') + 1, In.find('('));
554  Category = In.slice(In.find('[') + 1, In.find(' '));
555  return;
556}
557
558/// construct SubprogramDIE - Construct subprogram DIE.
559void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
560                                        const MDNode *N) {
561  CompileUnit *&CURef = SPMap[N];
562  if (CURef)
563    return;
564  CURef = TheCU;
565
566  DISubprogram SP(N);
567  if (!SP.isDefinition())
568    // This is a method declaration which will be handled while constructing
569    // class type.
570    return;
571
572  DISubprogram SPDecl = SP.getFunctionDeclaration();
573  DIE *DeclDie = NULL;
574  if (SPDecl.isSubprogram()) {
575    DeclDie = TheCU->getOrCreateSubprogramDIE(SPDecl);
576  }
577
578  DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
579
580  if (DeclDie) {
581    // Refer function declaration directly.
582    TheCU->addDIEEntry(SubprogramDie, dwarf::DW_AT_specification,
583                       dwarf::DW_FORM_ref4, DeclDie);
584  }
585
586  // Add to map.
587  TheCU->insertDIE(N, SubprogramDie);
588
589  // Add to context owner.
590  TheCU->addToContextOwner(SubprogramDie, SP.getContext());
591
592  // Expose as global.
593  TheCU->addGlobal(SP.getName(), SubprogramDie);
594
595  // Add to Accel Names
596  TheCU->addAccelName(SP.getName(), SubprogramDie);
597
598  // If this is an Objective-C selector name add it to the ObjC accelerator too.
599  if (isObjCClass(SP.getName())) {
600    StringRef Class, Category;
601    getObjCClassCategory(SP.getName(), Class, Category);
602    TheCU->addAccelObjC(Class, SubprogramDie);
603    if (Category != "")
604      TheCU->addAccelObjC(Category, SubprogramDie);
605  }
606
607  return;
608}
609
610/// collectInfoFromNamedMDNodes - Collect debug info from named mdnodes such
611/// as llvm.dbg.enum and llvm.dbg.ty
612void DwarfDebug::collectInfoFromNamedMDNodes(Module *M) {
613  if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp"))
614    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
615      const MDNode *N = NMD->getOperand(i);
616      if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
617        constructSubprogramDIE(CU, N);
618    }
619
620  if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"))
621    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
622      const MDNode *N = NMD->getOperand(i);
623      if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
624        CU->createGlobalVariableDIE(N);
625    }
626
627  if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.enum"))
628    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
629      DIType Ty(NMD->getOperand(i));
630      if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
631        CU->getOrCreateTypeDIE(Ty);
632    }
633
634  if (NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.ty"))
635    for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
636      DIType Ty(NMD->getOperand(i));
637      if (CompileUnit *CU = CUMap.lookup(Ty.getCompileUnit()))
638        CU->getOrCreateTypeDIE(Ty);
639    }
640}
641
642/// collectLegacyDebugInfo - Collect debug info using DebugInfoFinder.
643/// FIXME - Remove this when dragon-egg and llvm-gcc switch to DIBuilder.
644bool DwarfDebug::collectLegacyDebugInfo(Module *M) {
645  DebugInfoFinder DbgFinder;
646  DbgFinder.processModule(*M);
647
648  bool HasDebugInfo = false;
649  // Scan all the compile-units to see if there are any marked as the main
650  // unit. If not, we do not generate debug info.
651  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
652         E = DbgFinder.compile_unit_end(); I != E; ++I) {
653    if (DICompileUnit(*I).isMain()) {
654      HasDebugInfo = true;
655      break;
656    }
657  }
658  if (!HasDebugInfo) return false;
659
660  // Create all the compile unit DIEs.
661  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(),
662         E = DbgFinder.compile_unit_end(); I != E; ++I)
663    constructCompileUnit(*I);
664
665  // Create DIEs for each global variable.
666  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),
667         E = DbgFinder.global_variable_end(); I != E; ++I) {
668    const MDNode *N = *I;
669    if (CompileUnit *CU = CUMap.lookup(DIGlobalVariable(N).getCompileUnit()))
670      CU->createGlobalVariableDIE(N);
671  }
672
673  // Create DIEs for each subprogram.
674  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
675         E = DbgFinder.subprogram_end(); I != E; ++I) {
676    const MDNode *N = *I;
677    if (CompileUnit *CU = CUMap.lookup(DISubprogram(N).getCompileUnit()))
678      constructSubprogramDIE(CU, N);
679  }
680
681  return HasDebugInfo;
682}
683
684/// beginModule - Emit all Dwarf sections that should come prior to the
685/// content. Create global DIEs and emit initial debug info sections.
686/// This is invoked by the target AsmPrinter.
687void DwarfDebug::beginModule(Module *M) {
688  if (DisableDebugInfoPrinting)
689    return;
690
691  // If module has named metadata anchors then use them, otherwise scan the
692  // module using debug info finder to collect debug info.
693  NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
694  if (CU_Nodes) {
695    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
696      DICompileUnit CUNode(CU_Nodes->getOperand(i));
697      CompileUnit *CU = constructCompileUnit(CUNode);
698      DIArray GVs = CUNode.getGlobalVariables();
699      for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
700        CU->createGlobalVariableDIE(GVs.getElement(i));
701      DIArray SPs = CUNode.getSubprograms();
702      for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
703        constructSubprogramDIE(CU, SPs.getElement(i));
704      DIArray EnumTypes = CUNode.getEnumTypes();
705      for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
706        CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
707      DIArray RetainedTypes = CUNode.getRetainedTypes();
708      for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
709        CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
710    }
711  } else if (!collectLegacyDebugInfo(M))
712    return;
713
714  collectInfoFromNamedMDNodes(M);
715
716  // Tell MMI that we have debug info.
717  MMI->setDebugInfoAvailability(true);
718
719  // Emit initial sections.
720  EmitSectionLabels();
721
722  // Prime section data.
723  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
724}
725
726/// endModule - Emit all Dwarf sections that should come after the content.
727///
728void DwarfDebug::endModule() {
729  if (!FirstCU) return;
730  const Module *M = MMI->getModule();
731  DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
732
733  // Collect info for variables that were optimized out.
734  if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
735    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
736      DICompileUnit TheCU(CU_Nodes->getOperand(i));
737      DIArray Subprograms = TheCU.getSubprograms();
738      for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
739        DISubprogram SP(Subprograms.getElement(i));
740        if (ProcessedSPNodes.count(SP) != 0) continue;
741        if (!SP.Verify()) continue;
742        if (!SP.isDefinition()) continue;
743        DIArray Variables = SP.getVariables();
744        if (Variables.getNumElements() == 0) continue;
745
746        LexicalScope *Scope =
747          new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
748        DeadFnScopeMap[SP] = Scope;
749
750        // Construct subprogram DIE and add variables DIEs.
751        CompileUnit *SPCU = CUMap.lookup(TheCU);
752        assert(SPCU && "Unable to find Compile Unit!");
753        constructSubprogramDIE(SPCU, SP);
754        DIE *ScopeDIE = SPCU->getDIE(SP);
755        for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
756          DIVariable DV(Variables.getElement(vi));
757          if (!DV.Verify()) continue;
758          DbgVariable *NewVar = new DbgVariable(DV, NULL);
759          if (DIE *VariableDIE =
760              SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
761            ScopeDIE->addChild(VariableDIE);
762        }
763      }
764    }
765  }
766
767  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
768  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
769         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
770    DIE *ISP = *AI;
771    FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
772  }
773
774  // Emit DW_AT_containing_type attribute to connect types with their
775  // vtable holding type.
776  for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
777         CUE = CUMap.end(); CUI != CUE; ++CUI) {
778    CompileUnit *TheCU = CUI->second;
779    TheCU->constructContainingTypeDIEs();
780  }
781
782  // Standard sections final addresses.
783  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
784  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
785  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
786  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
787
788  // End text sections.
789  for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
790    Asm->OutStreamer.SwitchSection(SectionMap[i]);
791    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", i));
792  }
793
794  // Compute DIE offsets and sizes.
795  computeSizeAndOffsets();
796
797  // Emit all the DIEs into a debug info section
798  emitDebugInfo();
799
800  // Corresponding abbreviations into a abbrev section.
801  emitAbbreviations();
802
803  // Emit info into a dwarf accelerator table sections.
804  if (DwarfAccelTables) {
805    emitAccelNames();
806    emitAccelObjC();
807    emitAccelNamespaces();
808    emitAccelTypes();
809  }
810
811  // Emit info into a debug pubnames section.
812  emitDebugPubNames();
813
814  // Emit info into a debug pubtypes section.
815  emitDebugPubTypes();
816
817  // Emit info into a debug loc section.
818  emitDebugLoc();
819
820  // Emit info into a debug aranges section.
821  EmitDebugARanges();
822
823  // Emit info into a debug ranges section.
824  emitDebugRanges();
825
826  // Emit info into a debug macinfo section.
827  emitDebugMacInfo();
828
829  // Emit inline info.
830  emitDebugInlineInfo();
831
832  // Emit info into a debug str section.
833  emitDebugStr();
834
835  // clean up.
836  DeleteContainerSeconds(DeadFnScopeMap);
837  SPMap.clear();
838  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
839         E = CUMap.end(); I != E; ++I)
840    delete I->second;
841  FirstCU = NULL;  // Reset for the next Module, if any.
842}
843
844/// findAbstractVariable - Find abstract variable, if any, associated with Var.
845DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
846                                              DebugLoc ScopeLoc) {
847  LLVMContext &Ctx = DV->getContext();
848  // More then one inlined variable corresponds to one abstract variable.
849  DIVariable Var = cleanseInlinedVariable(DV, Ctx);
850  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
851  if (AbsDbgVariable)
852    return AbsDbgVariable;
853
854  LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
855  if (!Scope)
856    return NULL;
857
858  AbsDbgVariable = new DbgVariable(Var, NULL);
859  addScopeVariable(Scope, AbsDbgVariable);
860  AbstractVariables[Var] = AbsDbgVariable;
861  return AbsDbgVariable;
862}
863
864/// addCurrentFnArgument - If Var is a current function argument then add
865/// it to CurrentFnArguments list.
866bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
867                                      DbgVariable *Var, LexicalScope *Scope) {
868  if (!LScopes.isCurrentFunctionScope(Scope))
869    return false;
870  DIVariable DV = Var->getVariable();
871  if (DV.getTag() != dwarf::DW_TAG_arg_variable)
872    return false;
873  unsigned ArgNo = DV.getArgNumber();
874  if (ArgNo == 0)
875    return false;
876
877  size_t Size = CurrentFnArguments.size();
878  if (Size == 0)
879    CurrentFnArguments.resize(MF->getFunction()->arg_size());
880  // llvm::Function argument size is not good indicator of how many
881  // arguments does the function have at source level.
882  if (ArgNo > Size)
883    CurrentFnArguments.resize(ArgNo * 2);
884  CurrentFnArguments[ArgNo - 1] = Var;
885  return true;
886}
887
888/// collectVariableInfoFromMMITable - Collect variable information from
889/// side table maintained by MMI.
890void
891DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
892                                   SmallPtrSet<const MDNode *, 16> &Processed) {
893  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
894  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
895         VE = VMap.end(); VI != VE; ++VI) {
896    const MDNode *Var = VI->first;
897    if (!Var) continue;
898    Processed.insert(Var);
899    DIVariable DV(Var);
900    const std::pair<unsigned, DebugLoc> &VP = VI->second;
901
902    LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
903
904    // If variable scope is not found then skip this variable.
905    if (Scope == 0)
906      continue;
907
908    DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
909    DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
910    RegVar->setFrameIndex(VP.first);
911    if (!addCurrentFnArgument(MF, RegVar, Scope))
912      addScopeVariable(Scope, RegVar);
913    if (AbsDbgVariable)
914      AbsDbgVariable->setFrameIndex(VP.first);
915  }
916}
917
918/// isDbgValueInDefinedReg - Return true if debug value, encoded by
919/// DBG_VALUE instruction, is in a defined reg.
920static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
921  assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
922  return MI->getNumOperands() == 3 &&
923         MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
924         MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
925}
926
927/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting
928/// at MI.
929static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
930                                         const MCSymbol *FLabel,
931                                         const MCSymbol *SLabel,
932                                         const MachineInstr *MI) {
933  const MDNode *Var =  MI->getOperand(MI->getNumOperands() - 1).getMetadata();
934
935  if (MI->getNumOperands() != 3) {
936    MachineLocation MLoc = Asm->getDebugValueLocation(MI);
937    return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
938  }
939  if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
940    MachineLocation MLoc;
941    MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
942    return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
943  }
944  if (MI->getOperand(0).isImm())
945    return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
946  if (MI->getOperand(0).isFPImm())
947    return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
948  if (MI->getOperand(0).isCImm())
949    return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
950
951  assert(0 && "Unexpected 3 operand DBG_VALUE instruction!");
952  return DotDebugLocEntry();
953}
954
955/// collectVariableInfo - Find variables for each lexical scope.
956void
957DwarfDebug::collectVariableInfo(const MachineFunction *MF,
958                                SmallPtrSet<const MDNode *, 16> &Processed) {
959
960  /// collection info from MMI table.
961  collectVariableInfoFromMMITable(MF, Processed);
962
963  for (SmallVectorImpl<const MDNode*>::const_iterator
964         UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
965         ++UVI) {
966    const MDNode *Var = *UVI;
967    if (Processed.count(Var))
968      continue;
969
970    // History contains relevant DBG_VALUE instructions for Var and instructions
971    // clobbering it.
972    SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
973    if (History.empty())
974      continue;
975    const MachineInstr *MInsn = History.front();
976
977    DIVariable DV(Var);
978    LexicalScope *Scope = NULL;
979    if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
980        DISubprogram(DV.getContext()).describes(MF->getFunction()))
981      Scope = LScopes.getCurrentFunctionScope();
982    else {
983      if (DV.getVersion() <= LLVMDebugVersion9)
984        Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
985      else {
986        if (MDNode *IA = DV.getInlinedAt())
987          Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
988        else
989          Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
990      }
991    }
992    // If variable scope is not found then skip this variable.
993    if (!Scope)
994      continue;
995
996    Processed.insert(DV);
997    assert(MInsn->isDebugValue() && "History must begin with debug value");
998    DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
999    DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
1000    if (!addCurrentFnArgument(MF, RegVar, Scope))
1001      addScopeVariable(Scope, RegVar);
1002    if (AbsVar)
1003      AbsVar->setMInsn(MInsn);
1004
1005    // Simple ranges that are fully coalesced.
1006    if (History.size() <= 1 || (History.size() == 2 &&
1007                                MInsn->isIdenticalTo(History.back()))) {
1008      RegVar->setMInsn(MInsn);
1009      continue;
1010    }
1011
1012    // handle multiple DBG_VALUE instructions describing one variable.
1013    RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1014
1015    for (SmallVectorImpl<const MachineInstr*>::const_iterator
1016           HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1017      const MachineInstr *Begin = *HI;
1018      assert(Begin->isDebugValue() && "Invalid History entry");
1019
1020      // Check if DBG_VALUE is truncating a range.
1021      if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1022          && !Begin->getOperand(0).getReg())
1023        continue;
1024
1025      // Compute the range for a register location.
1026      const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1027      const MCSymbol *SLabel = 0;
1028
1029      if (HI + 1 == HE)
1030        // If Begin is the last instruction in History then its value is valid
1031        // until the end of the function.
1032        SLabel = FunctionEndSym;
1033      else {
1034        const MachineInstr *End = HI[1];
1035        DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1036              << "\t" << *Begin << "\t" << *End << "\n");
1037        if (End->isDebugValue())
1038          SLabel = getLabelBeforeInsn(End);
1039        else {
1040          // End is a normal instruction clobbering the range.
1041          SLabel = getLabelAfterInsn(End);
1042          assert(SLabel && "Forgot label after clobber instruction");
1043          ++HI;
1044        }
1045      }
1046
1047      // The value is valid until the next DBG_VALUE or clobber.
1048      DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel, Begin));
1049    }
1050    DotDebugLocEntries.push_back(DotDebugLocEntry());
1051  }
1052
1053  // Collect info for variables that were optimized out.
1054  LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1055  DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1056  for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1057    DIVariable DV(Variables.getElement(i));
1058    if (!DV || !DV.Verify() || !Processed.insert(DV))
1059      continue;
1060    if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1061      addScopeVariable(Scope, new DbgVariable(DV, NULL));
1062  }
1063}
1064
1065/// getLabelBeforeInsn - Return Label preceding the instruction.
1066const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1067  MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1068  assert(Label && "Didn't insert label before instruction");
1069  return Label;
1070}
1071
1072/// getLabelAfterInsn - Return Label immediately following the instruction.
1073const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1074  return LabelsAfterInsn.lookup(MI);
1075}
1076
1077/// beginInstruction - Process beginning of an instruction.
1078void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1079  // Check if source location changes, but ignore DBG_VALUE locations.
1080  if (!MI->isDebugValue()) {
1081    DebugLoc DL = MI->getDebugLoc();
1082    if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1083      unsigned Flags = DWARF2_FLAG_IS_STMT;
1084      PrevInstLoc = DL;
1085      if (DL == PrologEndLoc) {
1086        Flags |= DWARF2_FLAG_PROLOGUE_END;
1087        PrologEndLoc = DebugLoc();
1088      }
1089      if (!DL.isUnknown()) {
1090        const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1091        recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1092      } else
1093        recordSourceLine(0, 0, 0, 0);
1094    }
1095  }
1096
1097  // Insert labels where requested.
1098  DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1099    LabelsBeforeInsn.find(MI);
1100
1101  // No label needed.
1102  if (I == LabelsBeforeInsn.end())
1103    return;
1104
1105  // Label already assigned.
1106  if (I->second)
1107    return;
1108
1109  if (!PrevLabel) {
1110    PrevLabel = MMI->getContext().CreateTempSymbol();
1111    Asm->OutStreamer.EmitLabel(PrevLabel);
1112  }
1113  I->second = PrevLabel;
1114}
1115
1116/// endInstruction - Process end of an instruction.
1117void DwarfDebug::endInstruction(const MachineInstr *MI) {
1118  // Don't create a new label after DBG_VALUE instructions.
1119  // They don't generate code.
1120  if (!MI->isDebugValue())
1121    PrevLabel = 0;
1122
1123  DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1124    LabelsAfterInsn.find(MI);
1125
1126  // No label needed.
1127  if (I == LabelsAfterInsn.end())
1128    return;
1129
1130  // Label already assigned.
1131  if (I->second)
1132    return;
1133
1134  // We need a label after this instruction.
1135  if (!PrevLabel) {
1136    PrevLabel = MMI->getContext().CreateTempSymbol();
1137    Asm->OutStreamer.EmitLabel(PrevLabel);
1138  }
1139  I->second = PrevLabel;
1140}
1141
1142/// identifyScopeMarkers() -
1143/// Each LexicalScope has first instruction and last instruction to mark
1144/// beginning and end of a scope respectively. Create an inverse map that list
1145/// scopes starts (and ends) with an instruction. One instruction may start (or
1146/// end) multiple scopes. Ignore scopes that are not reachable.
1147void DwarfDebug::identifyScopeMarkers() {
1148  SmallVector<LexicalScope *, 4> WorkList;
1149  WorkList.push_back(LScopes.getCurrentFunctionScope());
1150  while (!WorkList.empty()) {
1151    LexicalScope *S = WorkList.pop_back_val();
1152
1153    const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
1154    if (!Children.empty())
1155      for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
1156             SE = Children.end(); SI != SE; ++SI)
1157        WorkList.push_back(*SI);
1158
1159    if (S->isAbstractScope())
1160      continue;
1161
1162    const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
1163    if (Ranges.empty())
1164      continue;
1165    for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
1166           RE = Ranges.end(); RI != RE; ++RI) {
1167      assert(RI->first && "InsnRange does not have first instruction!");
1168      assert(RI->second && "InsnRange does not have second instruction!");
1169      requestLabelBeforeInsn(RI->first);
1170      requestLabelAfterInsn(RI->second);
1171    }
1172  }
1173}
1174
1175/// getScopeNode - Get MDNode for DebugLoc's scope.
1176static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1177  if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1178    return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1179  return DL.getScope(Ctx);
1180}
1181
1182/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1183/// line number  info for the function.
1184static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1185  const MDNode *Scope = getScopeNode(DL, Ctx);
1186  DISubprogram SP = getDISubprogram(Scope);
1187  if (SP.Verify())
1188    return DebugLoc::get(SP.getLineNumber(), 0, SP);
1189  return DebugLoc();
1190}
1191
1192/// beginFunction - Gather pre-function debug information.  Assumes being
1193/// emitted immediately after the function entry point.
1194void DwarfDebug::beginFunction(const MachineFunction *MF) {
1195  if (!MMI->hasDebugInfo()) return;
1196  LScopes.initialize(*MF);
1197  if (LScopes.empty()) return;
1198  identifyScopeMarkers();
1199
1200  FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1201                                        Asm->getFunctionNumber());
1202  // Assumes in correct section after the entry point.
1203  Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1204
1205  assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1206
1207  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1208  /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1209  std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1210
1211  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1212       I != E; ++I) {
1213    bool AtBlockEntry = true;
1214    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1215         II != IE; ++II) {
1216      const MachineInstr *MI = II;
1217
1218      if (MI->isDebugValue()) {
1219        assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
1220
1221        // Keep track of user variables.
1222        const MDNode *Var =
1223          MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1224
1225        // Variable is in a register, we need to check for clobbers.
1226        if (isDbgValueInDefinedReg(MI))
1227          LiveUserVar[MI->getOperand(0).getReg()] = Var;
1228
1229        // Check the history of this variable.
1230        SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1231        if (History.empty()) {
1232          UserVariables.push_back(Var);
1233          // The first mention of a function argument gets the FunctionBeginSym
1234          // label, so arguments are visible when breaking at function entry.
1235          DIVariable DV(Var);
1236          if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1237              DISubprogram(getDISubprogram(DV.getContext()))
1238                .describes(MF->getFunction()))
1239            LabelsBeforeInsn[MI] = FunctionBeginSym;
1240        } else {
1241          // We have seen this variable before. Try to coalesce DBG_VALUEs.
1242          const MachineInstr *Prev = History.back();
1243          if (Prev->isDebugValue()) {
1244            // Coalesce identical entries at the end of History.
1245            if (History.size() >= 2 &&
1246                Prev->isIdenticalTo(History[History.size() - 2])) {
1247              DEBUG(dbgs() << "Coalesce identical DBG_VALUE entries:\n"
1248                    << "\t" << *Prev
1249                    << "\t" << *History[History.size() - 2] << "\n");
1250              History.pop_back();
1251            }
1252
1253            // Terminate old register assignments that don't reach MI;
1254            MachineFunction::const_iterator PrevMBB = Prev->getParent();
1255            if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1256                isDbgValueInDefinedReg(Prev)) {
1257              // Previous register assignment needs to terminate at the end of
1258              // its basic block.
1259              MachineBasicBlock::const_iterator LastMI =
1260                PrevMBB->getLastNonDebugInstr();
1261              if (LastMI == PrevMBB->end()) {
1262                // Drop DBG_VALUE for empty range.
1263                DEBUG(dbgs() << "Drop DBG_VALUE for empty range:\n"
1264                      << "\t" << *Prev << "\n");
1265                History.pop_back();
1266              }
1267              else {
1268                // Terminate after LastMI.
1269                History.push_back(LastMI);
1270              }
1271            }
1272          }
1273        }
1274        History.push_back(MI);
1275      } else {
1276        // Not a DBG_VALUE instruction.
1277        if (!MI->isLabel())
1278          AtBlockEntry = false;
1279
1280        // First known non DBG_VALUE location marks beginning of function
1281        // body.
1282        if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1283          PrologEndLoc = MI->getDebugLoc();
1284
1285        // Check if the instruction clobbers any registers with debug vars.
1286        for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1287               MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1288          if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1289            continue;
1290          for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
1291               unsigned Reg = *AI; ++AI) {
1292            const MDNode *Var = LiveUserVar[Reg];
1293            if (!Var)
1294              continue;
1295            // Reg is now clobbered.
1296            LiveUserVar[Reg] = 0;
1297
1298            // Was MD last defined by a DBG_VALUE referring to Reg?
1299            DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1300            if (HistI == DbgValues.end())
1301              continue;
1302            SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1303            if (History.empty())
1304              continue;
1305            const MachineInstr *Prev = History.back();
1306            // Sanity-check: Register assignments are terminated at the end of
1307            // their block.
1308            if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1309              continue;
1310            // Is the variable still in Reg?
1311            if (!isDbgValueInDefinedReg(Prev) ||
1312                Prev->getOperand(0).getReg() != Reg)
1313              continue;
1314            // Var is clobbered. Make sure the next instruction gets a label.
1315            History.push_back(MI);
1316          }
1317        }
1318      }
1319    }
1320  }
1321
1322  for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1323       I != E; ++I) {
1324    SmallVectorImpl<const MachineInstr*> &History = I->second;
1325    if (History.empty())
1326      continue;
1327
1328    // Make sure the final register assignments are terminated.
1329    const MachineInstr *Prev = History.back();
1330    if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1331      const MachineBasicBlock *PrevMBB = Prev->getParent();
1332      MachineBasicBlock::const_iterator LastMI =
1333        PrevMBB->getLastNonDebugInstr();
1334      if (LastMI == PrevMBB->end())
1335        // Drop DBG_VALUE for empty range.
1336        History.pop_back();
1337      else {
1338        // Terminate after LastMI.
1339        History.push_back(LastMI);
1340      }
1341    }
1342    // Request labels for the full history.
1343    for (unsigned i = 0, e = History.size(); i != e; ++i) {
1344      const MachineInstr *MI = History[i];
1345      if (MI->isDebugValue())
1346        requestLabelBeforeInsn(MI);
1347      else
1348        requestLabelAfterInsn(MI);
1349    }
1350  }
1351
1352  PrevInstLoc = DebugLoc();
1353  PrevLabel = FunctionBeginSym;
1354
1355  // Record beginning of function.
1356  if (!PrologEndLoc.isUnknown()) {
1357    DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1358                                       MF->getFunction()->getContext());
1359    recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1360                     FnStartDL.getScope(MF->getFunction()->getContext()),
1361                     DWARF2_FLAG_IS_STMT);
1362  }
1363}
1364
1365void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1366//  SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1367  ScopeVariables[LS].push_back(Var);
1368//  Vars.push_back(Var);
1369}
1370
1371/// endFunction - Gather and emit post-function debug information.
1372///
1373void DwarfDebug::endFunction(const MachineFunction *MF) {
1374  if (!MMI->hasDebugInfo() || LScopes.empty()) return;
1375
1376  // Define end label for subprogram.
1377  FunctionEndSym = Asm->GetTempSymbol("func_end",
1378                                      Asm->getFunctionNumber());
1379  // Assumes in correct section after the entry point.
1380  Asm->OutStreamer.EmitLabel(FunctionEndSym);
1381
1382  SmallPtrSet<const MDNode *, 16> ProcessedVars;
1383  collectVariableInfo(MF, ProcessedVars);
1384
1385  LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1386  CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1387  assert(TheCU && "Unable to find compile unit!");
1388
1389  // Construct abstract scopes.
1390  ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1391  for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1392    LexicalScope *AScope = AList[i];
1393    DISubprogram SP(AScope->getScopeNode());
1394    if (SP.Verify()) {
1395      // Collect info for variables that were optimized out.
1396      DIArray Variables = SP.getVariables();
1397      for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1398        DIVariable DV(Variables.getElement(i));
1399        if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1400          continue;
1401        if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1402          addScopeVariable(Scope, new DbgVariable(DV, NULL));
1403      }
1404    }
1405    if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
1406      constructScopeDIE(TheCU, AScope);
1407  }
1408
1409  DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
1410
1411  if (!DisableFramePointerElim(*MF))
1412    TheCU->addUInt(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr,
1413                   dwarf::DW_FORM_flag, 1);
1414
1415  DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1416                                               MMI->getFrameMoves()));
1417
1418  // Clear debug info
1419  for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1420         I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1421    DeleteContainerPointers(I->second);
1422  ScopeVariables.clear();
1423  DeleteContainerPointers(CurrentFnArguments);
1424  UserVariables.clear();
1425  DbgValues.clear();
1426  AbstractVariables.clear();
1427  LabelsBeforeInsn.clear();
1428  LabelsAfterInsn.clear();
1429  PrevLabel = NULL;
1430}
1431
1432/// recordSourceLine - Register a source line with debug info. Returns the
1433/// unique label that was emitted and which provides correspondence to
1434/// the source line list.
1435void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1436                                  unsigned Flags) {
1437  StringRef Fn;
1438  StringRef Dir;
1439  unsigned Src = 1;
1440  if (S) {
1441    DIDescriptor Scope(S);
1442
1443    if (Scope.isCompileUnit()) {
1444      DICompileUnit CU(S);
1445      Fn = CU.getFilename();
1446      Dir = CU.getDirectory();
1447    } else if (Scope.isFile()) {
1448      DIFile F(S);
1449      Fn = F.getFilename();
1450      Dir = F.getDirectory();
1451    } else if (Scope.isSubprogram()) {
1452      DISubprogram SP(S);
1453      Fn = SP.getFilename();
1454      Dir = SP.getDirectory();
1455    } else if (Scope.isLexicalBlockFile()) {
1456      DILexicalBlockFile DBF(S);
1457      Fn = DBF.getFilename();
1458      Dir = DBF.getDirectory();
1459    } else if (Scope.isLexicalBlock()) {
1460      DILexicalBlock DB(S);
1461      Fn = DB.getFilename();
1462      Dir = DB.getDirectory();
1463    } else
1464      assert(0 && "Unexpected scope info");
1465
1466    Src = GetOrCreateSourceID(Fn, Dir);
1467  }
1468  Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
1469}
1470
1471//===----------------------------------------------------------------------===//
1472// Emit Methods
1473//===----------------------------------------------------------------------===//
1474
1475/// computeSizeAndOffset - Compute the size and offset of a DIE.
1476///
1477unsigned
1478DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
1479  // Get the children.
1480  const std::vector<DIE *> &Children = Die->getChildren();
1481
1482  // If not last sibling and has children then add sibling offset attribute.
1483  if (!Last && !Children.empty())
1484    Die->addSiblingOffset(DIEValueAllocator);
1485
1486  // Record the abbreviation.
1487  assignAbbrevNumber(Die->getAbbrev());
1488
1489  // Get the abbreviation for this DIE.
1490  unsigned AbbrevNumber = Die->getAbbrevNumber();
1491  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1492
1493  // Set DIE offset
1494  Die->setOffset(Offset);
1495
1496  // Start the size with the size of abbreviation code.
1497  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
1498
1499  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1500  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1501
1502  // Size the DIE attribute values.
1503  for (unsigned i = 0, N = Values.size(); i < N; ++i)
1504    // Size attribute value.
1505    Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
1506
1507  // Size the DIE children if any.
1508  if (!Children.empty()) {
1509    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1510           "Children flag not set");
1511
1512    for (unsigned j = 0, M = Children.size(); j < M; ++j)
1513      Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
1514
1515    // End of children marker.
1516    Offset += sizeof(int8_t);
1517  }
1518
1519  Die->setSize(Offset - Die->getOffset());
1520  return Offset;
1521}
1522
1523/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
1524///
1525void DwarfDebug::computeSizeAndOffsets() {
1526  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1527         E = CUMap.end(); I != E; ++I) {
1528    // Compute size of compile unit header.
1529    unsigned Offset =
1530      sizeof(int32_t) + // Length of Compilation Unit Info
1531      sizeof(int16_t) + // DWARF version number
1532      sizeof(int32_t) + // Offset Into Abbrev. Section
1533      sizeof(int8_t);   // Pointer Size (in bytes)
1534    computeSizeAndOffset(I->second->getCUDie(), Offset, true);
1535  }
1536}
1537
1538/// EmitSectionLabels - Emit initial Dwarf sections with a label at
1539/// the start of each one.
1540void DwarfDebug::EmitSectionLabels() {
1541  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1542
1543  // Dwarf sections base addresses.
1544  DwarfInfoSectionSym =
1545    EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
1546  DwarfAbbrevSectionSym =
1547    EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1548  EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
1549
1550  if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
1551    EmitSectionSym(Asm, MacroInfo);
1552
1553  EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1554  EmitSectionSym(Asm, TLOF.getDwarfLocSection());
1555  EmitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1556  EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
1557  DwarfStrSectionSym =
1558    EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
1559  DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
1560                                             "debug_range");
1561
1562  DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
1563                                           "section_debug_loc");
1564
1565  TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1566  EmitSectionSym(Asm, TLOF.getDataSection());
1567}
1568
1569/// emitDIE - Recursively emits a debug information entry.
1570///
1571void DwarfDebug::emitDIE(DIE *Die) {
1572  // Get the abbreviation for this DIE.
1573  unsigned AbbrevNumber = Die->getAbbrevNumber();
1574  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1575
1576  // Emit the code (index) for the abbreviation.
1577  if (Asm->isVerbose())
1578    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1579                                Twine::utohexstr(Die->getOffset()) + ":0x" +
1580                                Twine::utohexstr(Die->getSize()) + " " +
1581                                dwarf::TagString(Abbrev->getTag()));
1582  Asm->EmitULEB128(AbbrevNumber);
1583
1584  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1585  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1586
1587  // Emit the DIE attribute values.
1588  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1589    unsigned Attr = AbbrevData[i].getAttribute();
1590    unsigned Form = AbbrevData[i].getForm();
1591    assert(Form && "Too many attributes for DIE (check abbreviation)");
1592
1593    if (Asm->isVerbose())
1594      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
1595
1596    switch (Attr) {
1597    case dwarf::DW_AT_sibling:
1598      Asm->EmitInt32(Die->getSiblingOffset());
1599      break;
1600    case dwarf::DW_AT_abstract_origin: {
1601      DIEEntry *E = cast<DIEEntry>(Values[i]);
1602      DIE *Origin = E->getEntry();
1603      unsigned Addr = Origin->getOffset();
1604      Asm->EmitInt32(Addr);
1605      break;
1606    }
1607    case dwarf::DW_AT_ranges: {
1608      // DW_AT_range Value encodes offset in debug_range section.
1609      DIEInteger *V = cast<DIEInteger>(Values[i]);
1610
1611      if (Asm->MAI->doesDwarfUsesLabelOffsetForRanges()) {
1612        Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1613                                 V->getValue(),
1614                                 4);
1615      } else {
1616        Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1617                                       V->getValue(),
1618                                       DwarfDebugRangeSectionSym,
1619                                       4);
1620      }
1621      break;
1622    }
1623    case dwarf::DW_AT_location: {
1624      if (DIELabel *L = dyn_cast<DIELabel>(Values[i]))
1625        Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1626      else
1627        Values[i]->EmitValue(Asm, Form);
1628      break;
1629    }
1630    case dwarf::DW_AT_accessibility: {
1631      if (Asm->isVerbose()) {
1632        DIEInteger *V = cast<DIEInteger>(Values[i]);
1633        Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1634      }
1635      Values[i]->EmitValue(Asm, Form);
1636      break;
1637    }
1638    default:
1639      // Emit an attribute using the defined form.
1640      Values[i]->EmitValue(Asm, Form);
1641      break;
1642    }
1643  }
1644
1645  // Emit the DIE children if any.
1646  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1647    const std::vector<DIE *> &Children = Die->getChildren();
1648
1649    for (unsigned j = 0, M = Children.size(); j < M; ++j)
1650      emitDIE(Children[j]);
1651
1652    if (Asm->isVerbose())
1653      Asm->OutStreamer.AddComment("End Of Children Mark");
1654    Asm->EmitInt8(0);
1655  }
1656}
1657
1658/// emitDebugInfo - Emit the debug info section.
1659///
1660void DwarfDebug::emitDebugInfo() {
1661  // Start debug info section.
1662  Asm->OutStreamer.SwitchSection(
1663                            Asm->getObjFileLowering().getDwarfInfoSection());
1664  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1665         E = CUMap.end(); I != E; ++I) {
1666    CompileUnit *TheCU = I->second;
1667    DIE *Die = TheCU->getCUDie();
1668
1669    // Emit the compile units header.
1670    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
1671                                                  TheCU->getID()));
1672
1673    // Emit size of content not including length itself
1674    unsigned ContentSize = Die->getSize() +
1675      sizeof(int16_t) + // DWARF version number
1676      sizeof(int32_t) + // Offset Into Abbrev. Section
1677      sizeof(int8_t);   // Pointer Size (in bytes)
1678
1679    Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1680    Asm->EmitInt32(ContentSize);
1681    Asm->OutStreamer.AddComment("DWARF version number");
1682    Asm->EmitInt16(dwarf::DWARF_VERSION);
1683    Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1684    Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
1685                           DwarfAbbrevSectionSym);
1686    Asm->OutStreamer.AddComment("Address Size (in bytes)");
1687    Asm->EmitInt8(Asm->getTargetData().getPointerSize());
1688
1689    emitDIE(Die);
1690    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
1691  }
1692}
1693
1694/// emitAbbreviations - Emit the abbreviation section.
1695///
1696void DwarfDebug::emitAbbreviations() const {
1697  // Check to see if it is worth the effort.
1698  if (!Abbreviations.empty()) {
1699    // Start the debug abbrev section.
1700    Asm->OutStreamer.SwitchSection(
1701                            Asm->getObjFileLowering().getDwarfAbbrevSection());
1702
1703    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
1704
1705    // For each abbrevation.
1706    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
1707      // Get abbreviation data
1708      const DIEAbbrev *Abbrev = Abbreviations[i];
1709
1710      // Emit the abbrevations code (base 1 index.)
1711      Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
1712
1713      // Emit the abbreviations data.
1714      Abbrev->Emit(Asm);
1715    }
1716
1717    // Mark end of abbreviations.
1718    Asm->EmitULEB128(0, "EOM(3)");
1719
1720    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
1721  }
1722}
1723
1724/// emitEndOfLineMatrix - Emit the last address of the section and the end of
1725/// the line matrix.
1726///
1727void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
1728  // Define last address of section.
1729  Asm->OutStreamer.AddComment("Extended Op");
1730  Asm->EmitInt8(0);
1731
1732  Asm->OutStreamer.AddComment("Op size");
1733  Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
1734  Asm->OutStreamer.AddComment("DW_LNE_set_address");
1735  Asm->EmitInt8(dwarf::DW_LNE_set_address);
1736
1737  Asm->OutStreamer.AddComment("Section end label");
1738
1739  Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
1740                                   Asm->getTargetData().getPointerSize(),
1741                                   0/*AddrSpace*/);
1742
1743  // Mark end of matrix.
1744  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1745  Asm->EmitInt8(0);
1746  Asm->EmitInt8(1);
1747  Asm->EmitInt8(1);
1748}
1749
1750/// emitAccelNames - Emit visible names into a hashed accelerator table
1751/// section.
1752void DwarfDebug::emitAccelNames() {
1753  DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1754                                           dwarf::DW_FORM_data4));
1755  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1756         E = CUMap.end(); I != E; ++I) {
1757    CompileUnit *TheCU = I->second;
1758    const StringMap<DIE*> &Names = TheCU->getAccelNames();
1759    for (StringMap<DIE*>::const_iterator
1760           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1761      const char *Name = GI->getKeyData();
1762      DIE *Entity = GI->second;
1763      AT.AddName(Name, Entity);
1764    }
1765  }
1766
1767  AT.FinalizeTable(Asm, "Names");
1768  Asm->OutStreamer.SwitchSection(
1769    Asm->getObjFileLowering().getDwarfAccelNamesSection());
1770  MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1771  Asm->OutStreamer.EmitLabel(SectionBegin);
1772
1773  // Emit the full data.
1774  AT.Emit(Asm, SectionBegin, this);
1775}
1776
1777/// emitAccelObjC - Emit objective C classes and categories into a hashed
1778/// accelerator table section.
1779void DwarfDebug::emitAccelObjC() {
1780  DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1781                                           dwarf::DW_FORM_data4));
1782  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1783         E = CUMap.end(); I != E; ++I) {
1784    CompileUnit *TheCU = I->second;
1785    const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
1786    for (StringMap<std::vector<DIE*> >::const_iterator
1787           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1788      const char *Name = GI->getKeyData();
1789      std::vector<DIE *> Entities = GI->second;
1790      for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1791             DE = Entities.end(); DI != DE; ++DI)
1792        AT.AddName(Name, (*DI));
1793    }
1794  }
1795
1796  AT.FinalizeTable(Asm, "ObjC");
1797  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1798                                 .getDwarfAccelObjCSection());
1799  MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1800  Asm->OutStreamer.EmitLabel(SectionBegin);
1801
1802  // Emit the full data.
1803  AT.Emit(Asm, SectionBegin, this);
1804}
1805
1806/// emitAccelNamespace - Emit namespace dies into a hashed accelerator
1807/// table.
1808void DwarfDebug::emitAccelNamespaces() {
1809  DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1810                                           dwarf::DW_FORM_data4));
1811  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1812         E = CUMap.end(); I != E; ++I) {
1813    CompileUnit *TheCU = I->second;
1814    const StringMap<DIE*> &Names = TheCU->getAccelNamespace();
1815    for (StringMap<DIE*>::const_iterator
1816           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1817      const char *Name = GI->getKeyData();
1818      DIE *Entity = GI->second;
1819      AT.AddName(Name, Entity);
1820    }
1821  }
1822
1823  AT.FinalizeTable(Asm, "namespac");
1824  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1825                                 .getDwarfAccelNamespaceSection());
1826  MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1827  Asm->OutStreamer.EmitLabel(SectionBegin);
1828
1829  // Emit the full data.
1830  AT.Emit(Asm, SectionBegin, this);
1831}
1832
1833/// emitAccelTypes() - Emit type dies into a hashed accelerator table.
1834void DwarfDebug::emitAccelTypes() {
1835  DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1836                                           dwarf::DW_FORM_data4));
1837  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1838         E = CUMap.end(); I != E; ++I) {
1839    CompileUnit *TheCU = I->second;
1840    const StringMap<DIE*> &Names = TheCU->getGlobalTypes();
1841    //TODO: TheCU->getAccelTypes();
1842    for (StringMap<DIE*>::const_iterator
1843           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1844      const char *Name = GI->getKeyData();
1845      DIE *Entity = GI->second;
1846      AT.AddName(Name, Entity);
1847    }
1848  }
1849
1850  AT.FinalizeTable(Asm, "types");
1851  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1852                                 .getDwarfAccelTypesSection());
1853  MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1854  Asm->OutStreamer.EmitLabel(SectionBegin);
1855
1856  // Emit the full data.
1857  AT.Emit(Asm, SectionBegin, this);
1858}
1859
1860/// emitDebugPubNames - Emit visible names into a debug pubnames section.
1861///
1862void DwarfDebug::emitDebugPubNames() {
1863  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1864         E = CUMap.end(); I != E; ++I) {
1865    CompileUnit *TheCU = I->second;
1866    // Start the dwarf pubnames section.
1867    Asm->OutStreamer.SwitchSection(
1868      Asm->getObjFileLowering().getDwarfPubNamesSection());
1869
1870    Asm->OutStreamer.AddComment("Length of Public Names Info");
1871    Asm->EmitLabelDifference(
1872      Asm->GetTempSymbol("pubnames_end", TheCU->getID()),
1873      Asm->GetTempSymbol("pubnames_begin", TheCU->getID()), 4);
1874
1875    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin",
1876                                                  TheCU->getID()));
1877
1878    Asm->OutStreamer.AddComment("DWARF Version");
1879    Asm->EmitInt16(dwarf::DWARF_VERSION);
1880
1881    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
1882    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
1883                           DwarfInfoSectionSym);
1884
1885    Asm->OutStreamer.AddComment("Compilation Unit Length");
1886    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
1887                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
1888                             4);
1889
1890    const StringMap<DIE*> &Globals = TheCU->getGlobals();
1891    for (StringMap<DIE*>::const_iterator
1892           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
1893      const char *Name = GI->getKeyData();
1894      DIE *Entity = GI->second;
1895
1896      Asm->OutStreamer.AddComment("DIE offset");
1897      Asm->EmitInt32(Entity->getOffset());
1898
1899      if (Asm->isVerbose())
1900        Asm->OutStreamer.AddComment("External Name");
1901      Asm->OutStreamer.EmitBytes(StringRef(Name, strlen(Name)+1), 0);
1902    }
1903
1904    Asm->OutStreamer.AddComment("End Mark");
1905    Asm->EmitInt32(0);
1906    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end",
1907                                                  TheCU->getID()));
1908  }
1909}
1910
1911void DwarfDebug::emitDebugPubTypes() {
1912  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1913         E = CUMap.end(); I != E; ++I) {
1914    CompileUnit *TheCU = I->second;
1915    // Start the dwarf pubtypes section.
1916    Asm->OutStreamer.SwitchSection(
1917      Asm->getObjFileLowering().getDwarfPubTypesSection());
1918    Asm->OutStreamer.AddComment("Length of Public Types Info");
1919    Asm->EmitLabelDifference(
1920      Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
1921      Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
1922
1923    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
1924                                                  TheCU->getID()));
1925
1926    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
1927    Asm->EmitInt16(dwarf::DWARF_VERSION);
1928
1929    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
1930    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
1931                           DwarfInfoSectionSym);
1932
1933    Asm->OutStreamer.AddComment("Compilation Unit Length");
1934    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
1935                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
1936                             4);
1937
1938    const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
1939    for (StringMap<DIE*>::const_iterator
1940           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
1941      const char *Name = GI->getKeyData();
1942      DIE *Entity = GI->second;
1943
1944      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
1945      Asm->EmitInt32(Entity->getOffset());
1946
1947      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
1948      Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
1949    }
1950
1951    Asm->OutStreamer.AddComment("End Mark");
1952    Asm->EmitInt32(0);
1953    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
1954                                                  TheCU->getID()));
1955  }
1956}
1957
1958/// emitDebugStr - Emit visible names into a debug str section.
1959///
1960void DwarfDebug::emitDebugStr() {
1961  // Check to see if it is worth the effort.
1962  if (StringPool.empty()) return;
1963
1964  // Start the dwarf str section.
1965  Asm->OutStreamer.SwitchSection(
1966                                Asm->getObjFileLowering().getDwarfStrSection());
1967
1968  // Get all of the string pool entries and put them in an array by their ID so
1969  // we can sort them.
1970  SmallVector<std::pair<unsigned,
1971      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
1972
1973  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
1974       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
1975    Entries.push_back(std::make_pair(I->second.second, &*I));
1976
1977  array_pod_sort(Entries.begin(), Entries.end());
1978
1979  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
1980    // Emit a label for reference from debug information entries.
1981    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
1982
1983    // Emit the string itself.
1984    Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);
1985    Asm->OutStreamer.EmitZeros(1, 0);
1986  }
1987}
1988
1989/// emitDebugLoc - Emit visible names into a debug loc section.
1990///
1991void DwarfDebug::emitDebugLoc() {
1992  if (DotDebugLocEntries.empty())
1993    return;
1994
1995  for (SmallVector<DotDebugLocEntry, 4>::iterator
1996         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
1997       I != E; ++I) {
1998    DotDebugLocEntry &Entry = *I;
1999    if (I + 1 != DotDebugLocEntries.end())
2000      Entry.Merge(I+1);
2001  }
2002
2003  // Start the dwarf loc section.
2004  Asm->OutStreamer.SwitchSection(
2005    Asm->getObjFileLowering().getDwarfLocSection());
2006  unsigned char Size = Asm->getTargetData().getPointerSize();
2007  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2008  unsigned index = 1;
2009  for (SmallVector<DotDebugLocEntry, 4>::iterator
2010         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2011       I != E; ++I, ++index) {
2012    DotDebugLocEntry &Entry = *I;
2013    if (Entry.isMerged()) continue;
2014    if (Entry.isEmpty()) {
2015      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2016      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2017      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2018    } else {
2019      Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2020      Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
2021      DIVariable DV(Entry.Variable);
2022      Asm->OutStreamer.AddComment("Loc expr size");
2023      MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2024      MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2025      Asm->EmitLabelDifference(end, begin, 2);
2026      Asm->OutStreamer.EmitLabel(begin);
2027      if (Entry.isInt()) {
2028        DIBasicType BTy(DV.getType());
2029        if (BTy.Verify() &&
2030            (BTy.getEncoding()  == dwarf::DW_ATE_signed
2031             || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2032          Asm->OutStreamer.AddComment("DW_OP_consts");
2033          Asm->EmitInt8(dwarf::DW_OP_consts);
2034          Asm->EmitSLEB128(Entry.getInt());
2035        } else {
2036          Asm->OutStreamer.AddComment("DW_OP_constu");
2037          Asm->EmitInt8(dwarf::DW_OP_constu);
2038          Asm->EmitULEB128(Entry.getInt());
2039        }
2040      } else if (Entry.isLocation()) {
2041        if (!DV.hasComplexAddress())
2042          // Regular entry.
2043          Asm->EmitDwarfRegOp(Entry.Loc);
2044        else {
2045          // Complex address entry.
2046          unsigned N = DV.getNumAddrElements();
2047          unsigned i = 0;
2048          if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2049            if (Entry.Loc.getOffset()) {
2050              i = 2;
2051              Asm->EmitDwarfRegOp(Entry.Loc);
2052              Asm->OutStreamer.AddComment("DW_OP_deref");
2053              Asm->EmitInt8(dwarf::DW_OP_deref);
2054              Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2055              Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2056              Asm->EmitSLEB128(DV.getAddrElement(1));
2057            } else {
2058              // If first address element is OpPlus then emit
2059              // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2060              MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2061              Asm->EmitDwarfRegOp(Loc);
2062              i = 2;
2063            }
2064          } else {
2065            Asm->EmitDwarfRegOp(Entry.Loc);
2066          }
2067
2068          // Emit remaining complex address elements.
2069          for (; i < N; ++i) {
2070            uint64_t Element = DV.getAddrElement(i);
2071            if (Element == DIBuilder::OpPlus) {
2072              Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2073              Asm->EmitULEB128(DV.getAddrElement(++i));
2074            } else if (Element == DIBuilder::OpDeref)
2075              Asm->EmitInt8(dwarf::DW_OP_deref);
2076            else llvm_unreachable("unknown Opcode found in complex address");
2077          }
2078        }
2079      }
2080      // else ... ignore constant fp. There is not any good way to
2081      // to represent them here in dwarf.
2082      Asm->OutStreamer.EmitLabel(end);
2083    }
2084  }
2085}
2086
2087/// EmitDebugARanges - Emit visible names into a debug aranges section.
2088///
2089void DwarfDebug::EmitDebugARanges() {
2090  // Start the dwarf aranges section.
2091  Asm->OutStreamer.SwitchSection(
2092                          Asm->getObjFileLowering().getDwarfARangesSection());
2093}
2094
2095/// emitDebugRanges - Emit visible names into a debug ranges section.
2096///
2097void DwarfDebug::emitDebugRanges() {
2098  // Start the dwarf ranges section.
2099  Asm->OutStreamer.SwitchSection(
2100    Asm->getObjFileLowering().getDwarfRangesSection());
2101  unsigned char Size = Asm->getTargetData().getPointerSize();
2102  for (SmallVector<const MCSymbol *, 8>::iterator
2103         I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2104       I != E; ++I) {
2105    if (*I)
2106      Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
2107    else
2108      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2109  }
2110}
2111
2112/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2113///
2114void DwarfDebug::emitDebugMacInfo() {
2115  if (const MCSection *LineInfo =
2116      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2117    // Start the dwarf macinfo section.
2118    Asm->OutStreamer.SwitchSection(LineInfo);
2119  }
2120}
2121
2122/// emitDebugInlineInfo - Emit inline info using following format.
2123/// Section Header:
2124/// 1. length of section
2125/// 2. Dwarf version number
2126/// 3. address size.
2127///
2128/// Entries (one "entry" for each function that was inlined):
2129///
2130/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2131///   otherwise offset into __debug_str for regular function name.
2132/// 2. offset into __debug_str section for regular function name.
2133/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2134/// instances for the function.
2135///
2136/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2137/// inlined instance; the die_offset points to the inlined_subroutine die in the
2138/// __debug_info section, and the low_pc is the starting address for the
2139/// inlining instance.
2140void DwarfDebug::emitDebugInlineInfo() {
2141  if (!Asm->MAI->doesDwarfUsesInlineInfoSection())
2142    return;
2143
2144  if (!FirstCU)
2145    return;
2146
2147  Asm->OutStreamer.SwitchSection(
2148                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
2149
2150  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2151  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2152                           Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2153
2154  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2155
2156  Asm->OutStreamer.AddComment("Dwarf Version");
2157  Asm->EmitInt16(dwarf::DWARF_VERSION);
2158  Asm->OutStreamer.AddComment("Address Size (in bytes)");
2159  Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2160
2161  for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2162         E = InlinedSPNodes.end(); I != E; ++I) {
2163
2164    const MDNode *Node = *I;
2165    DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2166      = InlineInfo.find(Node);
2167    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2168    DISubprogram SP(Node);
2169    StringRef LName = SP.getLinkageName();
2170    StringRef Name = SP.getName();
2171
2172    Asm->OutStreamer.AddComment("MIPS linkage name");
2173    if (LName.empty()) {
2174      Asm->OutStreamer.EmitBytes(Name, 0);
2175      Asm->OutStreamer.EmitIntValue(0, 1, 0); // nul terminator.
2176    } else
2177      Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2178                             DwarfStrSectionSym);
2179
2180    Asm->OutStreamer.AddComment("Function name");
2181    Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2182    Asm->EmitULEB128(Labels.size(), "Inline count");
2183
2184    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2185           LE = Labels.end(); LI != LE; ++LI) {
2186      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2187      Asm->EmitInt32(LI->second->getOffset());
2188
2189      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2190      Asm->OutStreamer.EmitSymbolValue(LI->first,
2191                                       Asm->getTargetData().getPointerSize(),0);
2192    }
2193  }
2194
2195  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
2196}
2197