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