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