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