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