DwarfDebug.cpp revision fbd19750383cf6a74ac8bfbca09956a0d7945143
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();
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(const 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(const 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() {
763  if (DisableDebugInfoPrinting)
764    return;
765
766  const Module *M = MMI->getModule();
767
768  // If module has named metadata anchors then use them, otherwise scan the
769  // module using debug info finder to collect debug info.
770  NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
771  if (CU_Nodes) {
772    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
773      DICompileUnit CUNode(CU_Nodes->getOperand(i));
774      CompileUnit *CU = constructCompileUnit(CUNode);
775      DIArray GVs = CUNode.getGlobalVariables();
776      for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
777        CU->createGlobalVariableDIE(GVs.getElement(i));
778      DIArray SPs = CUNode.getSubprograms();
779      for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
780        constructSubprogramDIE(CU, SPs.getElement(i));
781      DIArray EnumTypes = CUNode.getEnumTypes();
782      for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
783        CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
784      DIArray RetainedTypes = CUNode.getRetainedTypes();
785      for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
786        CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
787    }
788  } else if (!collectLegacyDebugInfo(M))
789    return;
790
791  collectInfoFromNamedMDNodes(M);
792
793  // Tell MMI that we have debug info.
794  MMI->setDebugInfoAvailability(true);
795
796  // Prime section data.
797  SectionMap.insert(Asm->getObjFileLowering().getTextSection());
798}
799
800/// endModule - Emit all Dwarf sections that should come after the content.
801///
802void DwarfDebug::endModule() {
803
804  if (!FirstCU) return;
805
806  const Module *M = MMI->getModule();
807  DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
808
809  // Collect info for variables that were optimized out.
810  if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
811    for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
812      DICompileUnit TheCU(CU_Nodes->getOperand(i));
813      DIArray Subprograms = TheCU.getSubprograms();
814      for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
815        DISubprogram SP(Subprograms.getElement(i));
816        if (ProcessedSPNodes.count(SP) != 0) continue;
817        if (!SP.Verify()) continue;
818        if (!SP.isDefinition()) continue;
819        DIArray Variables = SP.getVariables();
820        if (Variables.getNumElements() == 0) continue;
821
822        LexicalScope *Scope =
823          new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
824        DeadFnScopeMap[SP] = Scope;
825
826        // Construct subprogram DIE and add variables DIEs.
827        CompileUnit *SPCU = CUMap.lookup(TheCU);
828        assert(SPCU && "Unable to find Compile Unit!");
829        constructSubprogramDIE(SPCU, SP);
830        DIE *ScopeDIE = SPCU->getDIE(SP);
831        for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
832          DIVariable DV(Variables.getElement(vi));
833          if (!DV.Verify()) continue;
834          DbgVariable *NewVar = new DbgVariable(DV, NULL);
835          if (DIE *VariableDIE =
836              SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
837            ScopeDIE->addChild(VariableDIE);
838        }
839      }
840    }
841  }
842
843  // Attach DW_AT_inline attribute with inlined subprogram DIEs.
844  for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
845         AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
846    DIE *ISP = *AI;
847    FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
848  }
849  for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
850         AE = AbstractSPDies.end(); AI != AE; ++AI) {
851    DIE *ISP = AI->second;
852    if (InlinedSubprogramDIEs.count(ISP))
853      continue;
854    FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
855  }
856
857  // Emit DW_AT_containing_type attribute to connect types with their
858  // vtable holding type.
859  for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
860         CUE = CUMap.end(); CUI != CUE; ++CUI) {
861    CompileUnit *TheCU = CUI->second;
862    TheCU->constructContainingTypeDIEs();
863  }
864
865  // Standard sections final addresses.
866  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
867  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
868  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
869  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
870
871  // End text sections.
872  for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
873    Asm->OutStreamer.SwitchSection(SectionMap[I]);
874    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
875  }
876
877  // Compute DIE offsets and sizes.
878  computeSizeAndOffsets();
879
880  // Emit initial sections.
881  EmitSectionLabels();
882
883  // Emit all the DIEs into a debug info section
884  emitDebugInfo();
885
886  // Corresponding abbreviations into a abbrev section.
887  emitAbbreviations();
888
889  // Emit info into the dwarf accelerator table sections.
890  if (useDwarfAccelTables()) {
891    emitAccelNames();
892    emitAccelObjC();
893    emitAccelNamespaces();
894    emitAccelTypes();
895  }
896
897  // Emit info into a debug pubtypes section.
898  // TODO: When we don't need the option anymore we can
899  // remove all of the code that adds to the table.
900  if (useDarwinGDBCompat())
901    emitDebugPubTypes();
902
903  // Emit info into a debug loc section.
904  emitDebugLoc();
905
906  // Emit info into a debug aranges section.
907  EmitDebugARanges();
908
909  // Emit info into a debug ranges section.
910  emitDebugRanges();
911
912  // Emit info into a debug macinfo section.
913  emitDebugMacInfo();
914
915  // Emit inline info.
916  // TODO: When we don't need the option anymore we
917  // can remove all of the code that this section
918  // depends upon.
919  if (useDarwinGDBCompat())
920    emitDebugInlineInfo();
921
922  // Emit info into a debug str section.
923  emitDebugStr();
924
925  // clean up.
926  DeleteContainerSeconds(DeadFnScopeMap);
927  SPMap.clear();
928  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
929         E = CUMap.end(); I != E; ++I)
930    delete I->second;
931  FirstCU = NULL;  // Reset for the next Module, if any.
932}
933
934/// findAbstractVariable - Find abstract variable, if any, associated with Var.
935DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
936                                              DebugLoc ScopeLoc) {
937  LLVMContext &Ctx = DV->getContext();
938  // More then one inlined variable corresponds to one abstract variable.
939  DIVariable Var = cleanseInlinedVariable(DV, Ctx);
940  DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
941  if (AbsDbgVariable)
942    return AbsDbgVariable;
943
944  LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
945  if (!Scope)
946    return NULL;
947
948  AbsDbgVariable = new DbgVariable(Var, NULL);
949  addScopeVariable(Scope, AbsDbgVariable);
950  AbstractVariables[Var] = AbsDbgVariable;
951  return AbsDbgVariable;
952}
953
954/// addCurrentFnArgument - If Var is a current function argument then add
955/// it to CurrentFnArguments list.
956bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
957                                      DbgVariable *Var, LexicalScope *Scope) {
958  if (!LScopes.isCurrentFunctionScope(Scope))
959    return false;
960  DIVariable DV = Var->getVariable();
961  if (DV.getTag() != dwarf::DW_TAG_arg_variable)
962    return false;
963  unsigned ArgNo = DV.getArgNumber();
964  if (ArgNo == 0)
965    return false;
966
967  size_t Size = CurrentFnArguments.size();
968  if (Size == 0)
969    CurrentFnArguments.resize(MF->getFunction()->arg_size());
970  // llvm::Function argument size is not good indicator of how many
971  // arguments does the function have at source level.
972  if (ArgNo > Size)
973    CurrentFnArguments.resize(ArgNo * 2);
974  CurrentFnArguments[ArgNo - 1] = Var;
975  return true;
976}
977
978/// collectVariableInfoFromMMITable - Collect variable information from
979/// side table maintained by MMI.
980void
981DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
982                                   SmallPtrSet<const MDNode *, 16> &Processed) {
983  MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
984  for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
985         VE = VMap.end(); VI != VE; ++VI) {
986    const MDNode *Var = VI->first;
987    if (!Var) continue;
988    Processed.insert(Var);
989    DIVariable DV(Var);
990    const std::pair<unsigned, DebugLoc> &VP = VI->second;
991
992    LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
993
994    // If variable scope is not found then skip this variable.
995    if (Scope == 0)
996      continue;
997
998    DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
999    DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
1000    RegVar->setFrameIndex(VP.first);
1001    if (!addCurrentFnArgument(MF, RegVar, Scope))
1002      addScopeVariable(Scope, RegVar);
1003    if (AbsDbgVariable)
1004      AbsDbgVariable->setFrameIndex(VP.first);
1005  }
1006}
1007
1008/// isDbgValueInDefinedReg - Return true if debug value, encoded by
1009/// DBG_VALUE instruction, is in a defined reg.
1010static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1011  assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
1012  return MI->getNumOperands() == 3 &&
1013         MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1014         MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
1015}
1016
1017/// getDebugLocEntry - Get .debug_loc entry for the instruction range starting
1018/// at MI.
1019static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1020                                         const MCSymbol *FLabel,
1021                                         const MCSymbol *SLabel,
1022                                         const MachineInstr *MI) {
1023  const MDNode *Var =  MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1024
1025  if (MI->getNumOperands() != 3) {
1026    MachineLocation MLoc = Asm->getDebugValueLocation(MI);
1027    return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1028  }
1029  if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1030    MachineLocation MLoc;
1031    MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1032    return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1033  }
1034  if (MI->getOperand(0).isImm())
1035    return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1036  if (MI->getOperand(0).isFPImm())
1037    return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1038  if (MI->getOperand(0).isCImm())
1039    return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1040
1041  llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
1042}
1043
1044/// collectVariableInfo - Find variables for each lexical scope.
1045void
1046DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1047                                SmallPtrSet<const MDNode *, 16> &Processed) {
1048
1049  /// collection info from MMI table.
1050  collectVariableInfoFromMMITable(MF, Processed);
1051
1052  for (SmallVectorImpl<const MDNode*>::const_iterator
1053         UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1054         ++UVI) {
1055    const MDNode *Var = *UVI;
1056    if (Processed.count(Var))
1057      continue;
1058
1059    // History contains relevant DBG_VALUE instructions for Var and instructions
1060    // clobbering it.
1061    SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1062    if (History.empty())
1063      continue;
1064    const MachineInstr *MInsn = History.front();
1065
1066    DIVariable DV(Var);
1067    LexicalScope *Scope = NULL;
1068    if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1069        DISubprogram(DV.getContext()).describes(MF->getFunction()))
1070      Scope = LScopes.getCurrentFunctionScope();
1071    else {
1072      if (DV.getVersion() <= LLVMDebugVersion9)
1073        Scope = LScopes.findLexicalScope(MInsn->getDebugLoc());
1074      else {
1075        if (MDNode *IA = DV.getInlinedAt())
1076          Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1077        else
1078          Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
1079      }
1080    }
1081    // If variable scope is not found then skip this variable.
1082    if (!Scope)
1083      continue;
1084
1085    Processed.insert(DV);
1086    assert(MInsn->isDebugValue() && "History must begin with debug value");
1087    DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1088    DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
1089    if (!addCurrentFnArgument(MF, RegVar, Scope))
1090      addScopeVariable(Scope, RegVar);
1091    if (AbsVar)
1092      AbsVar->setMInsn(MInsn);
1093
1094    // Simplify ranges that are fully coalesced.
1095    if (History.size() <= 1 || (History.size() == 2 &&
1096                                MInsn->isIdenticalTo(History.back()))) {
1097      RegVar->setMInsn(MInsn);
1098      continue;
1099    }
1100
1101    // handle multiple DBG_VALUE instructions describing one variable.
1102    RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1103
1104    for (SmallVectorImpl<const MachineInstr*>::const_iterator
1105           HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1106      const MachineInstr *Begin = *HI;
1107      assert(Begin->isDebugValue() && "Invalid History entry");
1108
1109      // Check if DBG_VALUE is truncating a range.
1110      if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1111          && !Begin->getOperand(0).getReg())
1112        continue;
1113
1114      // Compute the range for a register location.
1115      const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1116      const MCSymbol *SLabel = 0;
1117
1118      if (HI + 1 == HE)
1119        // If Begin is the last instruction in History then its value is valid
1120        // until the end of the function.
1121        SLabel = FunctionEndSym;
1122      else {
1123        const MachineInstr *End = HI[1];
1124        DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1125              << "\t" << *Begin << "\t" << *End << "\n");
1126        if (End->isDebugValue())
1127          SLabel = getLabelBeforeInsn(End);
1128        else {
1129          // End is a normal instruction clobbering the range.
1130          SLabel = getLabelAfterInsn(End);
1131          assert(SLabel && "Forgot label after clobber instruction");
1132          ++HI;
1133        }
1134      }
1135
1136      // The value is valid until the next DBG_VALUE or clobber.
1137      DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1138                                                    Begin));
1139    }
1140    DotDebugLocEntries.push_back(DotDebugLocEntry());
1141  }
1142
1143  // Collect info for variables that were optimized out.
1144  LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1145  DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1146  for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1147    DIVariable DV(Variables.getElement(i));
1148    if (!DV || !DV.Verify() || !Processed.insert(DV))
1149      continue;
1150    if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1151      addScopeVariable(Scope, new DbgVariable(DV, NULL));
1152  }
1153}
1154
1155/// getLabelBeforeInsn - Return Label preceding the instruction.
1156const MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1157  MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1158  assert(Label && "Didn't insert label before instruction");
1159  return Label;
1160}
1161
1162/// getLabelAfterInsn - Return Label immediately following the instruction.
1163const MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1164  return LabelsAfterInsn.lookup(MI);
1165}
1166
1167/// beginInstruction - Process beginning of an instruction.
1168void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1169  // Check if source location changes, but ignore DBG_VALUE locations.
1170  if (!MI->isDebugValue()) {
1171    DebugLoc DL = MI->getDebugLoc();
1172    if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1173      unsigned Flags = 0;
1174      PrevInstLoc = DL;
1175      if (DL == PrologEndLoc) {
1176        Flags |= DWARF2_FLAG_PROLOGUE_END;
1177        PrologEndLoc = DebugLoc();
1178      }
1179      if (PrologEndLoc.isUnknown())
1180        Flags |= DWARF2_FLAG_IS_STMT;
1181
1182      if (!DL.isUnknown()) {
1183        const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1184        recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1185      } else
1186        recordSourceLine(0, 0, 0, 0);
1187    }
1188  }
1189
1190  // Insert labels where requested.
1191  DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1192    LabelsBeforeInsn.find(MI);
1193
1194  // No label needed.
1195  if (I == LabelsBeforeInsn.end())
1196    return;
1197
1198  // Label already assigned.
1199  if (I->second)
1200    return;
1201
1202  if (!PrevLabel) {
1203    PrevLabel = MMI->getContext().CreateTempSymbol();
1204    Asm->OutStreamer.EmitLabel(PrevLabel);
1205  }
1206  I->second = PrevLabel;
1207}
1208
1209/// endInstruction - Process end of an instruction.
1210void DwarfDebug::endInstruction(const MachineInstr *MI) {
1211  // Don't create a new label after DBG_VALUE instructions.
1212  // They don't generate code.
1213  if (!MI->isDebugValue())
1214    PrevLabel = 0;
1215
1216  DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1217    LabelsAfterInsn.find(MI);
1218
1219  // No label needed.
1220  if (I == LabelsAfterInsn.end())
1221    return;
1222
1223  // Label already assigned.
1224  if (I->second)
1225    return;
1226
1227  // We need a label after this instruction.
1228  if (!PrevLabel) {
1229    PrevLabel = MMI->getContext().CreateTempSymbol();
1230    Asm->OutStreamer.EmitLabel(PrevLabel);
1231  }
1232  I->second = PrevLabel;
1233}
1234
1235/// identifyScopeMarkers() -
1236/// Each LexicalScope has first instruction and last instruction to mark
1237/// beginning and end of a scope respectively. Create an inverse map that list
1238/// scopes starts (and ends) with an instruction. One instruction may start (or
1239/// end) multiple scopes. Ignore scopes that are not reachable.
1240void DwarfDebug::identifyScopeMarkers() {
1241  SmallVector<LexicalScope *, 4> WorkList;
1242  WorkList.push_back(LScopes.getCurrentFunctionScope());
1243  while (!WorkList.empty()) {
1244    LexicalScope *S = WorkList.pop_back_val();
1245
1246    const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
1247    if (!Children.empty())
1248      for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
1249             SE = Children.end(); SI != SE; ++SI)
1250        WorkList.push_back(*SI);
1251
1252    if (S->isAbstractScope())
1253      continue;
1254
1255    const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
1256    if (Ranges.empty())
1257      continue;
1258    for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
1259           RE = Ranges.end(); RI != RE; ++RI) {
1260      assert(RI->first && "InsnRange does not have first instruction!");
1261      assert(RI->second && "InsnRange does not have second instruction!");
1262      requestLabelBeforeInsn(RI->first);
1263      requestLabelAfterInsn(RI->second);
1264    }
1265  }
1266}
1267
1268/// getScopeNode - Get MDNode for DebugLoc's scope.
1269static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1270  if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1271    return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1272  return DL.getScope(Ctx);
1273}
1274
1275/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
1276/// line number info for the function.
1277static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1278  const MDNode *Scope = getScopeNode(DL, Ctx);
1279  DISubprogram SP = getDISubprogram(Scope);
1280  if (SP.Verify()) {
1281    // Check for number of operands since the compatibility is
1282    // cheap here.
1283    if (SP->getNumOperands() > 19)
1284      return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1285    else
1286      return DebugLoc::get(SP.getLineNumber(), 0, SP);
1287  }
1288
1289  return DebugLoc();
1290}
1291
1292/// beginFunction - Gather pre-function debug information.  Assumes being
1293/// emitted immediately after the function entry point.
1294void DwarfDebug::beginFunction(const MachineFunction *MF) {
1295  if (!MMI->hasDebugInfo()) return;
1296  LScopes.initialize(*MF);
1297  if (LScopes.empty()) return;
1298  identifyScopeMarkers();
1299
1300  FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1301                                        Asm->getFunctionNumber());
1302  // Assumes in correct section after the entry point.
1303  Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1304
1305  assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1306
1307  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1308  /// LiveUserVar - Map physreg numbers to the MDNode they contain.
1309  std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1310
1311  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1312       I != E; ++I) {
1313    bool AtBlockEntry = true;
1314    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1315         II != IE; ++II) {
1316      const MachineInstr *MI = II;
1317
1318      if (MI->isDebugValue()) {
1319        assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
1320
1321        // Keep track of user variables.
1322        const MDNode *Var =
1323          MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1324
1325        // Variable is in a register, we need to check for clobbers.
1326        if (isDbgValueInDefinedReg(MI))
1327          LiveUserVar[MI->getOperand(0).getReg()] = Var;
1328
1329        // Check the history of this variable.
1330        SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1331        if (History.empty()) {
1332          UserVariables.push_back(Var);
1333          // The first mention of a function argument gets the FunctionBeginSym
1334          // label, so arguments are visible when breaking at function entry.
1335          DIVariable DV(Var);
1336          if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1337              DISubprogram(getDISubprogram(DV.getContext()))
1338                .describes(MF->getFunction()))
1339            LabelsBeforeInsn[MI] = FunctionBeginSym;
1340        } else {
1341          // We have seen this variable before. Try to coalesce DBG_VALUEs.
1342          const MachineInstr *Prev = History.back();
1343          if (Prev->isDebugValue()) {
1344            // Coalesce identical entries at the end of History.
1345            if (History.size() >= 2 &&
1346                Prev->isIdenticalTo(History[History.size() - 2])) {
1347              DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
1348                    << "\t" << *Prev
1349                    << "\t" << *History[History.size() - 2] << "\n");
1350              History.pop_back();
1351            }
1352
1353            // Terminate old register assignments that don't reach MI;
1354            MachineFunction::const_iterator PrevMBB = Prev->getParent();
1355            if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1356                isDbgValueInDefinedReg(Prev)) {
1357              // Previous register assignment needs to terminate at the end of
1358              // its basic block.
1359              MachineBasicBlock::const_iterator LastMI =
1360                PrevMBB->getLastNonDebugInstr();
1361              if (LastMI == PrevMBB->end()) {
1362                // Drop DBG_VALUE for empty range.
1363                DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
1364                      << "\t" << *Prev << "\n");
1365                History.pop_back();
1366              }
1367              else {
1368                // Terminate after LastMI.
1369                History.push_back(LastMI);
1370              }
1371            }
1372          }
1373        }
1374        History.push_back(MI);
1375      } else {
1376        // Not a DBG_VALUE instruction.
1377        if (!MI->isLabel())
1378          AtBlockEntry = false;
1379
1380        // First known non-DBG_VALUE and non-frame setup location marks
1381        // the beginning of the function body.
1382        if (!MI->getFlag(MachineInstr::FrameSetup) &&
1383            (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
1384          PrologEndLoc = MI->getDebugLoc();
1385
1386        // Check if the instruction clobbers any registers with debug vars.
1387        for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1388               MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1389          if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1390            continue;
1391          for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1392               AI.isValid(); ++AI) {
1393            unsigned Reg = *AI;
1394            const MDNode *Var = LiveUserVar[Reg];
1395            if (!Var)
1396              continue;
1397            // Reg is now clobbered.
1398            LiveUserVar[Reg] = 0;
1399
1400            // Was MD last defined by a DBG_VALUE referring to Reg?
1401            DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1402            if (HistI == DbgValues.end())
1403              continue;
1404            SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1405            if (History.empty())
1406              continue;
1407            const MachineInstr *Prev = History.back();
1408            // Sanity-check: Register assignments are terminated at the end of
1409            // their block.
1410            if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1411              continue;
1412            // Is the variable still in Reg?
1413            if (!isDbgValueInDefinedReg(Prev) ||
1414                Prev->getOperand(0).getReg() != Reg)
1415              continue;
1416            // Var is clobbered. Make sure the next instruction gets a label.
1417            History.push_back(MI);
1418          }
1419        }
1420      }
1421    }
1422  }
1423
1424  for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1425       I != E; ++I) {
1426    SmallVectorImpl<const MachineInstr*> &History = I->second;
1427    if (History.empty())
1428      continue;
1429
1430    // Make sure the final register assignments are terminated.
1431    const MachineInstr *Prev = History.back();
1432    if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1433      const MachineBasicBlock *PrevMBB = Prev->getParent();
1434      MachineBasicBlock::const_iterator LastMI =
1435        PrevMBB->getLastNonDebugInstr();
1436      if (LastMI == PrevMBB->end())
1437        // Drop DBG_VALUE for empty range.
1438        History.pop_back();
1439      else {
1440        // Terminate after LastMI.
1441        History.push_back(LastMI);
1442      }
1443    }
1444    // Request labels for the full history.
1445    for (unsigned i = 0, e = History.size(); i != e; ++i) {
1446      const MachineInstr *MI = History[i];
1447      if (MI->isDebugValue())
1448        requestLabelBeforeInsn(MI);
1449      else
1450        requestLabelAfterInsn(MI);
1451    }
1452  }
1453
1454  PrevInstLoc = DebugLoc();
1455  PrevLabel = FunctionBeginSym;
1456
1457  // Record beginning of function.
1458  if (!PrologEndLoc.isUnknown()) {
1459    DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1460                                       MF->getFunction()->getContext());
1461    recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1462                     FnStartDL.getScope(MF->getFunction()->getContext()),
1463                     0);
1464  }
1465}
1466
1467void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1468//  SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1469  ScopeVariables[LS].push_back(Var);
1470//  Vars.push_back(Var);
1471}
1472
1473/// endFunction - Gather and emit post-function debug information.
1474///
1475void DwarfDebug::endFunction(const MachineFunction *MF) {
1476  if (!MMI->hasDebugInfo() || LScopes.empty()) return;
1477
1478  // Define end label for subprogram.
1479  FunctionEndSym = Asm->GetTempSymbol("func_end",
1480                                      Asm->getFunctionNumber());
1481  // Assumes in correct section after the entry point.
1482  Asm->OutStreamer.EmitLabel(FunctionEndSym);
1483
1484  SmallPtrSet<const MDNode *, 16> ProcessedVars;
1485  collectVariableInfo(MF, ProcessedVars);
1486
1487  LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1488  CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1489  assert(TheCU && "Unable to find compile unit!");
1490
1491  // Construct abstract scopes.
1492  ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1493  for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1494    LexicalScope *AScope = AList[i];
1495    DISubprogram SP(AScope->getScopeNode());
1496    if (SP.Verify()) {
1497      // Collect info for variables that were optimized out.
1498      DIArray Variables = SP.getVariables();
1499      for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1500        DIVariable DV(Variables.getElement(i));
1501        if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1502          continue;
1503        // Check that DbgVariable for DV wasn't created earlier, when
1504        // findAbstractVariable() was called for inlined instance of DV.
1505        LLVMContext &Ctx = DV->getContext();
1506        DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1507        if (AbstractVariables.lookup(CleanDV))
1508          continue;
1509        if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1510          addScopeVariable(Scope, new DbgVariable(DV, NULL));
1511      }
1512    }
1513    if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
1514      constructScopeDIE(TheCU, AScope);
1515  }
1516
1517  DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
1518
1519  if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
1520    TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
1521
1522  DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1523                                               MMI->getFrameMoves()));
1524
1525  // Clear debug info
1526  for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1527         I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1528    DeleteContainerPointers(I->second);
1529  ScopeVariables.clear();
1530  DeleteContainerPointers(CurrentFnArguments);
1531  UserVariables.clear();
1532  DbgValues.clear();
1533  AbstractVariables.clear();
1534  LabelsBeforeInsn.clear();
1535  LabelsAfterInsn.clear();
1536  PrevLabel = NULL;
1537}
1538
1539/// recordSourceLine - Register a source line with debug info. Returns the
1540/// unique label that was emitted and which provides correspondence to
1541/// the source line list.
1542void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1543                                  unsigned Flags) {
1544  StringRef Fn;
1545  StringRef Dir;
1546  unsigned Src = 1;
1547  if (S) {
1548    DIDescriptor Scope(S);
1549
1550    if (Scope.isCompileUnit()) {
1551      DICompileUnit CU(S);
1552      Fn = CU.getFilename();
1553      Dir = CU.getDirectory();
1554    } else if (Scope.isFile()) {
1555      DIFile F(S);
1556      Fn = F.getFilename();
1557      Dir = F.getDirectory();
1558    } else if (Scope.isSubprogram()) {
1559      DISubprogram SP(S);
1560      Fn = SP.getFilename();
1561      Dir = SP.getDirectory();
1562    } else if (Scope.isLexicalBlockFile()) {
1563      DILexicalBlockFile DBF(S);
1564      Fn = DBF.getFilename();
1565      Dir = DBF.getDirectory();
1566    } else if (Scope.isLexicalBlock()) {
1567      DILexicalBlock DB(S);
1568      Fn = DB.getFilename();
1569      Dir = DB.getDirectory();
1570    } else
1571      llvm_unreachable("Unexpected scope info");
1572
1573    Src = GetOrCreateSourceID(Fn, Dir);
1574  }
1575  Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
1576}
1577
1578//===----------------------------------------------------------------------===//
1579// Emit Methods
1580//===----------------------------------------------------------------------===//
1581
1582/// computeSizeAndOffset - Compute the size and offset of a DIE.
1583///
1584unsigned
1585DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset) {
1586  // Get the children.
1587  const std::vector<DIE *> &Children = Die->getChildren();
1588
1589  // Record the abbreviation.
1590  assignAbbrevNumber(Die->getAbbrev());
1591
1592  // Get the abbreviation for this DIE.
1593  unsigned AbbrevNumber = Die->getAbbrevNumber();
1594  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1595
1596  // Set DIE offset
1597  Die->setOffset(Offset);
1598
1599  // Start the size with the size of abbreviation code.
1600  Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
1601
1602  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1603  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1604
1605  // Size the DIE attribute values.
1606  for (unsigned i = 0, N = Values.size(); i < N; ++i)
1607    // Size attribute value.
1608    Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
1609
1610  // Size the DIE children if any.
1611  if (!Children.empty()) {
1612    assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1613           "Children flag not set");
1614
1615    for (unsigned j = 0, M = Children.size(); j < M; ++j)
1616      Offset = computeSizeAndOffset(Children[j], Offset);
1617
1618    // End of children marker.
1619    Offset += sizeof(int8_t);
1620  }
1621
1622  Die->setSize(Offset - Die->getOffset());
1623  return Offset;
1624}
1625
1626/// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
1627///
1628void DwarfDebug::computeSizeAndOffsets() {
1629  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1630         E = CUMap.end(); I != E; ++I) {
1631    // Compute size of compile unit header.
1632    unsigned Offset =
1633      sizeof(int32_t) + // Length of Compilation Unit Info
1634      sizeof(int16_t) + // DWARF version number
1635      sizeof(int32_t) + // Offset Into Abbrev. Section
1636      sizeof(int8_t);   // Pointer Size (in bytes)
1637    computeSizeAndOffset(I->second->getCUDie(), Offset);
1638  }
1639}
1640
1641/// EmitSectionLabels - Emit initial Dwarf sections with a label at
1642/// the start of each one.
1643void DwarfDebug::EmitSectionLabels() {
1644  const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1645
1646  // Dwarf sections base addresses.
1647  DwarfInfoSectionSym =
1648    EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
1649  DwarfAbbrevSectionSym =
1650    EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1651  EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
1652
1653  if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
1654    EmitSectionSym(Asm, MacroInfo);
1655
1656  EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1657  EmitSectionSym(Asm, TLOF.getDwarfLocSection());
1658  EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
1659  DwarfStrSectionSym =
1660    EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
1661  DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
1662                                             "debug_range");
1663
1664  DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
1665                                           "section_debug_loc");
1666
1667  TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1668  EmitSectionSym(Asm, TLOF.getDataSection());
1669}
1670
1671/// emitDIE - Recursively emits a debug information entry.
1672///
1673void DwarfDebug::emitDIE(DIE *Die) {
1674  // Get the abbreviation for this DIE.
1675  unsigned AbbrevNumber = Die->getAbbrevNumber();
1676  const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1677
1678  // Emit the code (index) for the abbreviation.
1679  if (Asm->isVerbose())
1680    Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1681                                Twine::utohexstr(Die->getOffset()) + ":0x" +
1682                                Twine::utohexstr(Die->getSize()) + " " +
1683                                dwarf::TagString(Abbrev->getTag()));
1684  Asm->EmitULEB128(AbbrevNumber);
1685
1686  const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1687  const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1688
1689  // Emit the DIE attribute values.
1690  for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1691    unsigned Attr = AbbrevData[i].getAttribute();
1692    unsigned Form = AbbrevData[i].getForm();
1693    assert(Form && "Too many attributes for DIE (check abbreviation)");
1694
1695    if (Asm->isVerbose())
1696      Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
1697
1698    switch (Attr) {
1699    case dwarf::DW_AT_abstract_origin: {
1700      DIEEntry *E = cast<DIEEntry>(Values[i]);
1701      DIE *Origin = E->getEntry();
1702      unsigned Addr = Origin->getOffset();
1703      Asm->EmitInt32(Addr);
1704      break;
1705    }
1706    case dwarf::DW_AT_ranges: {
1707      // DW_AT_range Value encodes offset in debug_range section.
1708      DIEInteger *V = cast<DIEInteger>(Values[i]);
1709
1710      if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
1711        Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1712                                 V->getValue(),
1713                                 4);
1714      } else {
1715        Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1716                                       V->getValue(),
1717                                       DwarfDebugRangeSectionSym,
1718                                       4);
1719      }
1720      break;
1721    }
1722    case dwarf::DW_AT_location: {
1723      if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1724        if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1725          Asm->EmitLabelReference(L->getValue(), 4);
1726        else
1727          Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1728      } else {
1729        Values[i]->EmitValue(Asm, Form);
1730      }
1731      break;
1732    }
1733    case dwarf::DW_AT_accessibility: {
1734      if (Asm->isVerbose()) {
1735        DIEInteger *V = cast<DIEInteger>(Values[i]);
1736        Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1737      }
1738      Values[i]->EmitValue(Asm, Form);
1739      break;
1740    }
1741    default:
1742      // Emit an attribute using the defined form.
1743      Values[i]->EmitValue(Asm, Form);
1744      break;
1745    }
1746  }
1747
1748  // Emit the DIE children if any.
1749  if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1750    const std::vector<DIE *> &Children = Die->getChildren();
1751
1752    for (unsigned j = 0, M = Children.size(); j < M; ++j)
1753      emitDIE(Children[j]);
1754
1755    if (Asm->isVerbose())
1756      Asm->OutStreamer.AddComment("End Of Children Mark");
1757    Asm->EmitInt8(0);
1758  }
1759}
1760
1761/// emitDebugInfo - Emit the debug info section.
1762///
1763void DwarfDebug::emitDebugInfo() {
1764  // Start debug info section.
1765  Asm->OutStreamer.SwitchSection(
1766                            Asm->getObjFileLowering().getDwarfInfoSection());
1767  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1768         E = CUMap.end(); I != E; ++I) {
1769    CompileUnit *TheCU = I->second;
1770    DIE *Die = TheCU->getCUDie();
1771
1772    // Emit the compile units header.
1773    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
1774                                                  TheCU->getID()));
1775
1776    // Emit size of content not including length itself
1777    unsigned ContentSize = Die->getSize() +
1778      sizeof(int16_t) + // DWARF version number
1779      sizeof(int32_t) + // Offset Into Abbrev. Section
1780      sizeof(int8_t);   // Pointer Size (in bytes)
1781
1782    Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1783    Asm->EmitInt32(ContentSize);
1784    Asm->OutStreamer.AddComment("DWARF version number");
1785    Asm->EmitInt16(dwarf::DWARF_VERSION);
1786    Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1787    Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
1788                           DwarfAbbrevSectionSym);
1789    Asm->OutStreamer.AddComment("Address Size (in bytes)");
1790    Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
1791
1792    emitDIE(Die);
1793    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
1794  }
1795}
1796
1797/// emitAbbreviations - Emit the abbreviation section.
1798///
1799void DwarfDebug::emitAbbreviations() const {
1800  // Check to see if it is worth the effort.
1801  if (!Abbreviations.empty()) {
1802    // Start the debug abbrev section.
1803    Asm->OutStreamer.SwitchSection(
1804                            Asm->getObjFileLowering().getDwarfAbbrevSection());
1805
1806    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
1807
1808    // For each abbrevation.
1809    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
1810      // Get abbreviation data
1811      const DIEAbbrev *Abbrev = Abbreviations[i];
1812
1813      // Emit the abbrevations code (base 1 index.)
1814      Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
1815
1816      // Emit the abbreviations data.
1817      Abbrev->Emit(Asm);
1818    }
1819
1820    // Mark end of abbreviations.
1821    Asm->EmitULEB128(0, "EOM(3)");
1822
1823    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
1824  }
1825}
1826
1827/// emitEndOfLineMatrix - Emit the last address of the section and the end of
1828/// the line matrix.
1829///
1830void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
1831  // Define last address of section.
1832  Asm->OutStreamer.AddComment("Extended Op");
1833  Asm->EmitInt8(0);
1834
1835  Asm->OutStreamer.AddComment("Op size");
1836  Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
1837  Asm->OutStreamer.AddComment("DW_LNE_set_address");
1838  Asm->EmitInt8(dwarf::DW_LNE_set_address);
1839
1840  Asm->OutStreamer.AddComment("Section end label");
1841
1842  Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
1843                                   Asm->getDataLayout().getPointerSize(),
1844                                   0/*AddrSpace*/);
1845
1846  // Mark end of matrix.
1847  Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1848  Asm->EmitInt8(0);
1849  Asm->EmitInt8(1);
1850  Asm->EmitInt8(1);
1851}
1852
1853/// emitAccelNames - Emit visible names into a hashed accelerator table
1854/// section.
1855void DwarfDebug::emitAccelNames() {
1856  DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1857                                           dwarf::DW_FORM_data4));
1858  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1859         E = CUMap.end(); I != E; ++I) {
1860    CompileUnit *TheCU = I->second;
1861    const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
1862    for (StringMap<std::vector<DIE*> >::const_iterator
1863           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1864      const char *Name = GI->getKeyData();
1865      const std::vector<DIE *> &Entities = GI->second;
1866      for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1867             DE = Entities.end(); DI != DE; ++DI)
1868        AT.AddName(Name, (*DI));
1869    }
1870  }
1871
1872  AT.FinalizeTable(Asm, "Names");
1873  Asm->OutStreamer.SwitchSection(
1874    Asm->getObjFileLowering().getDwarfAccelNamesSection());
1875  MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1876  Asm->OutStreamer.EmitLabel(SectionBegin);
1877
1878  // Emit the full data.
1879  AT.Emit(Asm, SectionBegin, this);
1880}
1881
1882/// emitAccelObjC - Emit objective C classes and categories into a hashed
1883/// accelerator table section.
1884void DwarfDebug::emitAccelObjC() {
1885  DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1886                                           dwarf::DW_FORM_data4));
1887  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1888         E = CUMap.end(); I != E; ++I) {
1889    CompileUnit *TheCU = I->second;
1890    const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
1891    for (StringMap<std::vector<DIE*> >::const_iterator
1892           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1893      const char *Name = GI->getKeyData();
1894      const std::vector<DIE *> &Entities = GI->second;
1895      for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1896             DE = Entities.end(); DI != DE; ++DI)
1897        AT.AddName(Name, (*DI));
1898    }
1899  }
1900
1901  AT.FinalizeTable(Asm, "ObjC");
1902  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1903                                 .getDwarfAccelObjCSection());
1904  MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1905  Asm->OutStreamer.EmitLabel(SectionBegin);
1906
1907  // Emit the full data.
1908  AT.Emit(Asm, SectionBegin, this);
1909}
1910
1911/// emitAccelNamespace - Emit namespace dies into a hashed accelerator
1912/// table.
1913void DwarfDebug::emitAccelNamespaces() {
1914  DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1915                                           dwarf::DW_FORM_data4));
1916  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1917         E = CUMap.end(); I != E; ++I) {
1918    CompileUnit *TheCU = I->second;
1919    const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
1920    for (StringMap<std::vector<DIE*> >::const_iterator
1921           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1922      const char *Name = GI->getKeyData();
1923      const std::vector<DIE *> &Entities = GI->second;
1924      for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1925             DE = Entities.end(); DI != DE; ++DI)
1926        AT.AddName(Name, (*DI));
1927    }
1928  }
1929
1930  AT.FinalizeTable(Asm, "namespac");
1931  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1932                                 .getDwarfAccelNamespaceSection());
1933  MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1934  Asm->OutStreamer.EmitLabel(SectionBegin);
1935
1936  // Emit the full data.
1937  AT.Emit(Asm, SectionBegin, this);
1938}
1939
1940/// emitAccelTypes() - Emit type dies into a hashed accelerator table.
1941void DwarfDebug::emitAccelTypes() {
1942  std::vector<DwarfAccelTable::Atom> Atoms;
1943  Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1944                                        dwarf::DW_FORM_data4));
1945  Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
1946                                        dwarf::DW_FORM_data2));
1947  Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
1948                                        dwarf::DW_FORM_data1));
1949  DwarfAccelTable AT(Atoms);
1950  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1951         E = CUMap.end(); I != E; ++I) {
1952    CompileUnit *TheCU = I->second;
1953    const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
1954      = TheCU->getAccelTypes();
1955    for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
1956           GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1957      const char *Name = GI->getKeyData();
1958      const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
1959      for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
1960             = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
1961        AT.AddName(Name, (*DI).first, (*DI).second);
1962    }
1963  }
1964
1965  AT.FinalizeTable(Asm, "types");
1966  Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1967                                 .getDwarfAccelTypesSection());
1968  MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1969  Asm->OutStreamer.EmitLabel(SectionBegin);
1970
1971  // Emit the full data.
1972  AT.Emit(Asm, SectionBegin, this);
1973}
1974
1975void DwarfDebug::emitDebugPubTypes() {
1976  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1977         E = CUMap.end(); I != E; ++I) {
1978    CompileUnit *TheCU = I->second;
1979    // Start the dwarf pubtypes section.
1980    Asm->OutStreamer.SwitchSection(
1981      Asm->getObjFileLowering().getDwarfPubTypesSection());
1982    Asm->OutStreamer.AddComment("Length of Public Types Info");
1983    Asm->EmitLabelDifference(
1984      Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
1985      Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
1986
1987    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
1988                                                  TheCU->getID()));
1989
1990    if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
1991    Asm->EmitInt16(dwarf::DWARF_VERSION);
1992
1993    Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
1994    Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
1995                           DwarfInfoSectionSym);
1996
1997    Asm->OutStreamer.AddComment("Compilation Unit Length");
1998    Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
1999                             Asm->GetTempSymbol("info_begin", TheCU->getID()),
2000                             4);
2001
2002    const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2003    for (StringMap<DIE*>::const_iterator
2004           GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2005      const char *Name = GI->getKeyData();
2006      DIE *Entity = GI->second;
2007
2008      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2009      Asm->EmitInt32(Entity->getOffset());
2010
2011      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2012      // Emit the name with a terminating null byte.
2013      Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
2014    }
2015
2016    Asm->OutStreamer.AddComment("End Mark");
2017    Asm->EmitInt32(0);
2018    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2019                                                  TheCU->getID()));
2020  }
2021}
2022
2023/// emitDebugStr - Emit visible names into a debug str section.
2024///
2025void DwarfDebug::emitDebugStr() {
2026  // Check to see if it is worth the effort.
2027  if (StringPool.empty()) return;
2028
2029  // Start the dwarf str section.
2030  Asm->OutStreamer.SwitchSection(
2031                                Asm->getObjFileLowering().getDwarfStrSection());
2032
2033  // Get all of the string pool entries and put them in an array by their ID so
2034  // we can sort them.
2035  SmallVector<std::pair<unsigned,
2036      StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2037
2038  for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2039       I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2040    Entries.push_back(std::make_pair(I->second.second, &*I));
2041
2042  array_pod_sort(Entries.begin(), Entries.end());
2043
2044  for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2045    // Emit a label for reference from debug information entries.
2046    Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2047
2048    // Emit the string itself with a terminating null byte.
2049    Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
2050                                         Entries[i].second->getKeyLength()+1),
2051                               0/*addrspace*/);
2052  }
2053}
2054
2055/// emitDebugLoc - Emit visible names into a debug loc section.
2056///
2057void DwarfDebug::emitDebugLoc() {
2058  if (DotDebugLocEntries.empty())
2059    return;
2060
2061  for (SmallVector<DotDebugLocEntry, 4>::iterator
2062         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2063       I != E; ++I) {
2064    DotDebugLocEntry &Entry = *I;
2065    if (I + 1 != DotDebugLocEntries.end())
2066      Entry.Merge(I+1);
2067  }
2068
2069  // Start the dwarf loc section.
2070  Asm->OutStreamer.SwitchSection(
2071    Asm->getObjFileLowering().getDwarfLocSection());
2072  unsigned char Size = Asm->getDataLayout().getPointerSize();
2073  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2074  unsigned index = 1;
2075  for (SmallVector<DotDebugLocEntry, 4>::iterator
2076         I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2077       I != E; ++I, ++index) {
2078    DotDebugLocEntry &Entry = *I;
2079    if (Entry.isMerged()) continue;
2080    if (Entry.isEmpty()) {
2081      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2082      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2083      Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2084    } else {
2085      Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2086      Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
2087      DIVariable DV(Entry.Variable);
2088      Asm->OutStreamer.AddComment("Loc expr size");
2089      MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2090      MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2091      Asm->EmitLabelDifference(end, begin, 2);
2092      Asm->OutStreamer.EmitLabel(begin);
2093      if (Entry.isInt()) {
2094        DIBasicType BTy(DV.getType());
2095        if (BTy.Verify() &&
2096            (BTy.getEncoding()  == dwarf::DW_ATE_signed
2097             || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2098          Asm->OutStreamer.AddComment("DW_OP_consts");
2099          Asm->EmitInt8(dwarf::DW_OP_consts);
2100          Asm->EmitSLEB128(Entry.getInt());
2101        } else {
2102          Asm->OutStreamer.AddComment("DW_OP_constu");
2103          Asm->EmitInt8(dwarf::DW_OP_constu);
2104          Asm->EmitULEB128(Entry.getInt());
2105        }
2106      } else if (Entry.isLocation()) {
2107        if (!DV.hasComplexAddress())
2108          // Regular entry.
2109          Asm->EmitDwarfRegOp(Entry.Loc);
2110        else {
2111          // Complex address entry.
2112          unsigned N = DV.getNumAddrElements();
2113          unsigned i = 0;
2114          if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2115            if (Entry.Loc.getOffset()) {
2116              i = 2;
2117              Asm->EmitDwarfRegOp(Entry.Loc);
2118              Asm->OutStreamer.AddComment("DW_OP_deref");
2119              Asm->EmitInt8(dwarf::DW_OP_deref);
2120              Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2121              Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2122              Asm->EmitSLEB128(DV.getAddrElement(1));
2123            } else {
2124              // If first address element is OpPlus then emit
2125              // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2126              MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2127              Asm->EmitDwarfRegOp(Loc);
2128              i = 2;
2129            }
2130          } else {
2131            Asm->EmitDwarfRegOp(Entry.Loc);
2132          }
2133
2134          // Emit remaining complex address elements.
2135          for (; i < N; ++i) {
2136            uint64_t Element = DV.getAddrElement(i);
2137            if (Element == DIBuilder::OpPlus) {
2138              Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2139              Asm->EmitULEB128(DV.getAddrElement(++i));
2140            } else if (Element == DIBuilder::OpDeref) {
2141              if (!Entry.Loc.isReg())
2142                Asm->EmitInt8(dwarf::DW_OP_deref);
2143            } else
2144              llvm_unreachable("unknown Opcode found in complex address");
2145          }
2146        }
2147      }
2148      // else ... ignore constant fp. There is not any good way to
2149      // to represent them here in dwarf.
2150      Asm->OutStreamer.EmitLabel(end);
2151    }
2152  }
2153}
2154
2155/// EmitDebugARanges - Emit visible names into a debug aranges section.
2156///
2157void DwarfDebug::EmitDebugARanges() {
2158  // Start the dwarf aranges section.
2159  Asm->OutStreamer.SwitchSection(
2160                          Asm->getObjFileLowering().getDwarfARangesSection());
2161}
2162
2163/// emitDebugRanges - Emit visible names into a debug ranges section.
2164///
2165void DwarfDebug::emitDebugRanges() {
2166  // Start the dwarf ranges section.
2167  Asm->OutStreamer.SwitchSection(
2168    Asm->getObjFileLowering().getDwarfRangesSection());
2169  unsigned char Size = Asm->getDataLayout().getPointerSize();
2170  for (SmallVector<const MCSymbol *, 8>::iterator
2171         I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2172       I != E; ++I) {
2173    if (*I)
2174      Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
2175    else
2176      Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2177  }
2178}
2179
2180/// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2181///
2182void DwarfDebug::emitDebugMacInfo() {
2183  if (const MCSection *LineInfo =
2184      Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2185    // Start the dwarf macinfo section.
2186    Asm->OutStreamer.SwitchSection(LineInfo);
2187  }
2188}
2189
2190/// emitDebugInlineInfo - Emit inline info using following format.
2191/// Section Header:
2192/// 1. length of section
2193/// 2. Dwarf version number
2194/// 3. address size.
2195///
2196/// Entries (one "entry" for each function that was inlined):
2197///
2198/// 1. offset into __debug_str section for MIPS linkage name, if exists;
2199///   otherwise offset into __debug_str for regular function name.
2200/// 2. offset into __debug_str section for regular function name.
2201/// 3. an unsigned LEB128 number indicating the number of distinct inlining
2202/// instances for the function.
2203///
2204/// The rest of the entry consists of a {die_offset, low_pc} pair for each
2205/// inlined instance; the die_offset points to the inlined_subroutine die in the
2206/// __debug_info section, and the low_pc is the starting address for the
2207/// inlining instance.
2208void DwarfDebug::emitDebugInlineInfo() {
2209  if (!Asm->MAI->doesDwarfUseInlineInfoSection())
2210    return;
2211
2212  if (!FirstCU)
2213    return;
2214
2215  Asm->OutStreamer.SwitchSection(
2216                        Asm->getObjFileLowering().getDwarfDebugInlineSection());
2217
2218  Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2219  Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2220                           Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2221
2222  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2223
2224  Asm->OutStreamer.AddComment("Dwarf Version");
2225  Asm->EmitInt16(dwarf::DWARF_VERSION);
2226  Asm->OutStreamer.AddComment("Address Size (in bytes)");
2227  Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2228
2229  for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2230         E = InlinedSPNodes.end(); I != E; ++I) {
2231
2232    const MDNode *Node = *I;
2233    DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2234      = InlineInfo.find(Node);
2235    SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2236    DISubprogram SP(Node);
2237    StringRef LName = SP.getLinkageName();
2238    StringRef Name = SP.getName();
2239
2240    Asm->OutStreamer.AddComment("MIPS linkage name");
2241    if (LName.empty())
2242      Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2243    else
2244      Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2245                             DwarfStrSectionSym);
2246
2247    Asm->OutStreamer.AddComment("Function name");
2248    Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2249    Asm->EmitULEB128(Labels.size(), "Inline count");
2250
2251    for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2252           LE = Labels.end(); LI != LE; ++LI) {
2253      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2254      Asm->EmitInt32(LI->second->getOffset());
2255
2256      if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2257      Asm->OutStreamer.EmitSymbolValue(LI->first,
2258                                       Asm->getDataLayout().getPointerSize(),0);
2259    }
2260  }
2261
2262  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
2263}
2264