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