Revert "Don't use a debug location for frame setup instructions in the"
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfDebug.cpp
1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains support for writing dwarf debug info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
16 #include "DIE.h"
17 #include "DwarfAccelTable.h"
18 #include "DwarfCompileUnit.h"
19 #include "llvm/Constants.h"
20 #include "llvm/DebugInfo.h"
21 #include "llvm/DIBuilder.h"
22 #include "llvm/Module.h"
23 #include "llvm/Instructions.h"
24 #include "llvm/CodeGen/MachineFunction.h"
25 #include "llvm/CodeGen/MachineModuleInfo.h"
26 #include "llvm/MC/MCAsmInfo.h"
27 #include "llvm/MC/MCSection.h"
28 #include "llvm/MC/MCStreamer.h"
29 #include "llvm/MC/MCSymbol.h"
30 #include "llvm/Target/TargetData.h"
31 #include "llvm/Target/TargetFrameLowering.h"
32 #include "llvm/Target/TargetLoweringObjectFile.h"
33 #include "llvm/Target/TargetMachine.h"
34 #include "llvm/Target/TargetRegisterInfo.h"
35 #include "llvm/Target/TargetOptions.h"
36 #include "llvm/ADT/Statistic.h"
37 #include "llvm/ADT/STLExtras.h"
38 #include "llvm/ADT/StringExtras.h"
39 #include "llvm/ADT/Triple.h"
40 #include "llvm/Support/CommandLine.h"
41 #include "llvm/Support/Debug.h"
42 #include "llvm/Support/ErrorHandling.h"
43 #include "llvm/Support/ValueHandle.h"
44 #include "llvm/Support/FormattedStream.h"
45 #include "llvm/Support/Timer.h"
46 #include "llvm/Support/Path.h"
47 using namespace llvm;
48
49 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
50                                               cl::Hidden,
51      cl::desc("Disable debug info printing"));
52
53 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
54      cl::desc("Make an absence of debug location information explicit."),
55      cl::init(false));
56
57 namespace {
58   enum DefaultOnOff {
59     Default, Enable, Disable
60   };
61 }
62
63 static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
64      cl::desc("Output prototype dwarf accelerator tables."),
65      cl::values(
66                 clEnumVal(Default, "Default for platform"),
67                 clEnumVal(Enable, "Enabled"),
68                 clEnumVal(Disable, "Disabled"),
69                 clEnumValEnd),
70      cl::init(Default));
71
72 static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
73      cl::desc("Compatibility with Darwin gdb."),
74      cl::values(
75                 clEnumVal(Default, "Default for platform"),
76                 clEnumVal(Enable, "Enabled"),
77                 clEnumVal(Disable, "Disabled"),
78                 clEnumValEnd),
79      cl::init(Default));
80
81 namespace {
82   const char *DWARFGroupName = "DWARF Emission";
83   const char *DbgTimerName = "DWARF Debug Writer";
84 } // end anonymous namespace
85
86 //===----------------------------------------------------------------------===//
87
88 /// Configuration values for initial hash set sizes (log2).
89 ///
90 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
91
92 namespace llvm {
93
94 DIType DbgVariable::getType() const {
95   DIType Ty = Var.getType();
96   // FIXME: isBlockByrefVariable should be reformulated in terms of complex
97   // addresses instead.
98   if (Var.isBlockByrefVariable()) {
99     /* Byref variables, in Blocks, are declared by the programmer as
100        "SomeType VarName;", but the compiler creates a
101        __Block_byref_x_VarName struct, and gives the variable VarName
102        either the struct, or a pointer to the struct, as its type.  This
103        is necessary for various behind-the-scenes things the compiler
104        needs to do with by-reference variables in blocks.
105        
106        However, as far as the original *programmer* is concerned, the
107        variable should still have type 'SomeType', as originally declared.
108        
109        The following function dives into the __Block_byref_x_VarName
110        struct to find the original type of the variable.  This will be
111        passed back to the code generating the type for the Debug
112        Information Entry for the variable 'VarName'.  'VarName' will then
113        have the original type 'SomeType' in its debug information.
114        
115        The original type 'SomeType' will be the type of the field named
116        'VarName' inside the __Block_byref_x_VarName struct.
117        
118        NOTE: In order for this to not completely fail on the debugger
119        side, the Debug Information Entry for the variable VarName needs to
120        have a DW_AT_location that tells the debugger how to unwind through
121        the pointers and __Block_byref_x_VarName struct to find the actual
122        value of the variable.  The function addBlockByrefType does this.  */
123     DIType subType = Ty;
124     unsigned tag = Ty.getTag();
125     
126     if (tag == dwarf::DW_TAG_pointer_type) {
127       DIDerivedType DTy = DIDerivedType(Ty);
128       subType = DTy.getTypeDerivedFrom();
129     }
130     
131     DICompositeType blockStruct = DICompositeType(subType);
132     DIArray Elements = blockStruct.getTypeArray();
133     
134     for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
135       DIDescriptor Element = Elements.getElement(i);
136       DIDerivedType DT = DIDerivedType(Element);
137       if (getName() == DT.getName())
138         return (DT.getTypeDerivedFrom());
139     }
140   }
141   return Ty;
142 }
143
144 } // end llvm namespace
145
146 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
147   : Asm(A), MMI(Asm->MMI), FirstCU(0),
148     AbbreviationsSet(InitAbbreviationsSetSize),
149     SourceIdMap(DIEValueAllocator), StringPool(DIEValueAllocator),
150     PrevLabel(NULL) {
151   NextStringPoolNumber = 0;
152
153   DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
154   DwarfStrSectionSym = TextSectionSym = 0;
155   DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
156   FunctionBeginSym = FunctionEndSym = 0;
157
158   // Turn on accelerator tables and older gdb compatibility
159   // for Darwin.
160   bool isDarwin = Triple(M->getTargetTriple()).isOSDarwin();
161   if (DarwinGDBCompat == Default) {
162     if (isDarwin)
163       isDarwinGDBCompat = true;
164     else
165       isDarwinGDBCompat = false;
166   } else
167     isDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
168
169   if (DwarfAccelTables == Default) {
170     if (isDarwin)
171       hasDwarfAccelTables = true;
172     else
173       hasDwarfAccelTables = false;
174   } else
175     hasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
176
177   {
178     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
179     beginModule(M);
180   }
181 }
182 DwarfDebug::~DwarfDebug() {
183 }
184
185 /// EmitSectionSym - Switch to the specified MCSection and emit an assembler
186 /// temporary label to it if SymbolStem is specified.
187 static MCSymbol *EmitSectionSym(AsmPrinter *Asm, const MCSection *Section,
188                                 const char *SymbolStem = 0) {
189   Asm->OutStreamer.SwitchSection(Section);
190   if (!SymbolStem) return 0;
191
192   MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
193   Asm->OutStreamer.EmitLabel(TmpSym);
194   return TmpSym;
195 }
196
197 MCSymbol *DwarfDebug::getStringPool() {
198   return Asm->GetTempSymbol("section_str");
199 }
200
201 MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {
202   std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];
203   if (Entry.first) return Entry.first;
204
205   Entry.second = NextStringPoolNumber++;
206   return Entry.first = Asm->GetTempSymbol("string", Entry.second);
207 }
208
209 /// assignAbbrevNumber - Define a unique number for the abbreviation.
210 ///
211 void DwarfDebug::assignAbbrevNumber(DIEAbbrev &Abbrev) {
212   // Profile the node so that we can make it unique.
213   FoldingSetNodeID ID;
214   Abbrev.Profile(ID);
215
216   // Check the set for priors.
217   DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
218
219   // If it's newly added.
220   if (InSet == &Abbrev) {
221     // Add to abbreviation list.
222     Abbreviations.push_back(&Abbrev);
223
224     // Assign the vector position + 1 as its number.
225     Abbrev.setNumber(Abbreviations.size());
226   } else {
227     // Assign existing abbreviation number.
228     Abbrev.setNumber(InSet->getNumber());
229   }
230 }
231
232 /// getRealLinkageName - If special LLVM prefix that is used to inform the asm
233 /// printer to not emit usual symbol prefix before the symbol name is used then
234 /// return linkage name after skipping this special LLVM prefix.
235 static StringRef getRealLinkageName(StringRef LinkageName) {
236   char One = '\1';
237   if (LinkageName.startswith(StringRef(&One, 1)))
238     return LinkageName.substr(1);
239   return LinkageName;
240 }
241
242 static bool isObjCClass(StringRef Name) {
243   return Name.startswith("+") || Name.startswith("-");
244 }
245
246 static bool hasObjCCategory(StringRef Name) {
247   if (!isObjCClass(Name)) return false;
248
249   size_t pos = Name.find(')');
250   if (pos != std::string::npos) {
251     if (Name[pos+1] != ' ') return false;
252     return true;
253   }
254   return false;
255 }
256
257 static void getObjCClassCategory(StringRef In, StringRef &Class,
258                                  StringRef &Category) {
259   if (!hasObjCCategory(In)) {
260     Class = In.slice(In.find('[') + 1, In.find(' '));
261     Category = "";
262     return;
263   }
264
265   Class = In.slice(In.find('[') + 1, In.find('('));
266   Category = In.slice(In.find('[') + 1, In.find(' '));
267   return;
268 }
269
270 static StringRef getObjCMethodName(StringRef In) {
271   return In.slice(In.find(' ') + 1, In.find(']'));
272 }
273
274 // Add the various names to the Dwarf accelerator table names.
275 static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
276                                DIE* Die) {
277   if (!SP.isDefinition()) return;
278   
279   TheCU->addAccelName(SP.getName(), Die);
280
281   // If the linkage name is different than the name, go ahead and output
282   // that as well into the name table.
283   if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
284     TheCU->addAccelName(SP.getLinkageName(), Die);
285
286   // If this is an Objective-C selector name add it to the ObjC accelerator
287   // too.
288   if (isObjCClass(SP.getName())) {
289     StringRef Class, Category;
290     getObjCClassCategory(SP.getName(), Class, Category);
291     TheCU->addAccelObjC(Class, Die);
292     if (Category != "")
293       TheCU->addAccelObjC(Category, Die);
294     // Also add the base method name to the name table.
295     TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
296   }
297 }
298
299 /// updateSubprogramScopeDIE - Find DIE for the given subprogram and
300 /// attach appropriate DW_AT_low_pc and DW_AT_high_pc attributes.
301 /// If there are global variables in this scope then create and insert
302 /// DIEs for these variables.
303 DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
304                                           const MDNode *SPNode) {
305   DIE *SPDie = SPCU->getDIE(SPNode);
306
307   assert(SPDie && "Unable to find subprogram DIE!");
308   DISubprogram SP(SPNode);
309
310   DISubprogram SPDecl = SP.getFunctionDeclaration();
311   if (!SPDecl.isSubprogram()) {
312     // There is not any need to generate specification DIE for a function
313     // defined at compile unit level. If a function is defined inside another
314     // function then gdb prefers the definition at top level and but does not
315     // expect specification DIE in parent function. So avoid creating
316     // specification DIE for a function defined inside a function.
317     if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
318         !SP.getContext().isFile() &&
319         !isSubprogramContext(SP.getContext())) {
320       SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
321       
322       // Add arguments.
323       DICompositeType SPTy = SP.getType();
324       DIArray Args = SPTy.getTypeArray();
325       unsigned SPTag = SPTy.getTag();
326       if (SPTag == dwarf::DW_TAG_subroutine_type)
327         for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
328           DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
329           DIType ATy = DIType(Args.getElement(i));
330           SPCU->addType(Arg, ATy);
331           if (ATy.isArtificial())
332             SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
333           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->getTargetData().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->getTargetData().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     // Simple 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() << "Coalesce 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() << "Drop 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 location marks beginning of function
1359         // body.
1360         if (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown())
1361           PrologEndLoc = MI->getDebugLoc();
1362
1363         // Check if the instruction clobbers any registers with debug vars.
1364         for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1365                MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1366           if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1367             continue;
1368           for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1369                AI.isValid(); ++AI) {
1370             unsigned Reg = *AI;
1371             const MDNode *Var = LiveUserVar[Reg];
1372             if (!Var)
1373               continue;
1374             // Reg is now clobbered.
1375             LiveUserVar[Reg] = 0;
1376
1377             // Was MD last defined by a DBG_VALUE referring to Reg?
1378             DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1379             if (HistI == DbgValues.end())
1380               continue;
1381             SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1382             if (History.empty())
1383               continue;
1384             const MachineInstr *Prev = History.back();
1385             // Sanity-check: Register assignments are terminated at the end of
1386             // their block.
1387             if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1388               continue;
1389             // Is the variable still in Reg?
1390             if (!isDbgValueInDefinedReg(Prev) ||
1391                 Prev->getOperand(0).getReg() != Reg)
1392               continue;
1393             // Var is clobbered. Make sure the next instruction gets a label.
1394             History.push_back(MI);
1395           }
1396         }
1397       }
1398     }
1399   }
1400
1401   for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1402        I != E; ++I) {
1403     SmallVectorImpl<const MachineInstr*> &History = I->second;
1404     if (History.empty())
1405       continue;
1406
1407     // Make sure the final register assignments are terminated.
1408     const MachineInstr *Prev = History.back();
1409     if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1410       const MachineBasicBlock *PrevMBB = Prev->getParent();
1411       MachineBasicBlock::const_iterator LastMI = 
1412         PrevMBB->getLastNonDebugInstr();
1413       if (LastMI == PrevMBB->end())
1414         // Drop DBG_VALUE for empty range.
1415         History.pop_back();
1416       else {
1417         // Terminate after LastMI.
1418         History.push_back(LastMI);
1419       }
1420     }
1421     // Request labels for the full history.
1422     for (unsigned i = 0, e = History.size(); i != e; ++i) {
1423       const MachineInstr *MI = History[i];
1424       if (MI->isDebugValue())
1425         requestLabelBeforeInsn(MI);
1426       else
1427         requestLabelAfterInsn(MI);
1428     }
1429   }
1430
1431   PrevInstLoc = DebugLoc();
1432   PrevLabel = FunctionBeginSym;
1433
1434   // Record beginning of function.
1435   if (!PrologEndLoc.isUnknown()) {
1436     DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1437                                        MF->getFunction()->getContext());
1438     recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1439                      FnStartDL.getScope(MF->getFunction()->getContext()),
1440                      0);
1441   }
1442 }
1443
1444 void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1445 //  SmallVector<DbgVariable *, 8> &Vars = ScopeVariables.lookup(LS);
1446   ScopeVariables[LS].push_back(Var);
1447 //  Vars.push_back(Var);
1448 }
1449
1450 /// endFunction - Gather and emit post-function debug information.
1451 ///
1452 void DwarfDebug::endFunction(const MachineFunction *MF) {
1453   if (!MMI->hasDebugInfo() || LScopes.empty()) return;
1454
1455   // Define end label for subprogram.
1456   FunctionEndSym = Asm->GetTempSymbol("func_end",
1457                                       Asm->getFunctionNumber());
1458   // Assumes in correct section after the entry point.
1459   Asm->OutStreamer.EmitLabel(FunctionEndSym);
1460   
1461   SmallPtrSet<const MDNode *, 16> ProcessedVars;
1462   collectVariableInfo(MF, ProcessedVars);
1463   
1464   LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1465   CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1466   assert(TheCU && "Unable to find compile unit!");
1467
1468   // Construct abstract scopes.
1469   ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1470   for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1471     LexicalScope *AScope = AList[i];
1472     DISubprogram SP(AScope->getScopeNode());
1473     if (SP.Verify()) {
1474       // Collect info for variables that were optimized out.
1475       DIArray Variables = SP.getVariables();
1476       for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1477         DIVariable DV(Variables.getElement(i));
1478         if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1479           continue;
1480         // Check that DbgVariable for DV wasn't created earlier, when
1481         // findAbstractVariable() was called for inlined instance of DV.
1482         LLVMContext &Ctx = DV->getContext();
1483         DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1484         if (AbstractVariables.lookup(CleanDV))
1485           continue;
1486         if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1487           addScopeVariable(Scope, new DbgVariable(DV, NULL));
1488       }
1489     }
1490     if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
1491       constructScopeDIE(TheCU, AScope);
1492   }
1493   
1494   DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
1495   
1496   if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
1497     TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
1498
1499   DebugFrames.push_back(FunctionDebugFrameInfo(Asm->getFunctionNumber(),
1500                                                MMI->getFrameMoves()));
1501
1502   // Clear debug info
1503   for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1504          I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1505     DeleteContainerPointers(I->second);
1506   ScopeVariables.clear();
1507   DeleteContainerPointers(CurrentFnArguments);
1508   UserVariables.clear();
1509   DbgValues.clear();
1510   AbstractVariables.clear();
1511   LabelsBeforeInsn.clear();
1512   LabelsAfterInsn.clear();
1513   PrevLabel = NULL;
1514 }
1515
1516 /// recordSourceLine - Register a source line with debug info. Returns the
1517 /// unique label that was emitted and which provides correspondence to
1518 /// the source line list.
1519 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1520                                   unsigned Flags) {
1521   StringRef Fn;
1522   StringRef Dir;
1523   unsigned Src = 1;
1524   if (S) {
1525     DIDescriptor Scope(S);
1526
1527     if (Scope.isCompileUnit()) {
1528       DICompileUnit CU(S);
1529       Fn = CU.getFilename();
1530       Dir = CU.getDirectory();
1531     } else if (Scope.isFile()) {
1532       DIFile F(S);
1533       Fn = F.getFilename();
1534       Dir = F.getDirectory();
1535     } else if (Scope.isSubprogram()) {
1536       DISubprogram SP(S);
1537       Fn = SP.getFilename();
1538       Dir = SP.getDirectory();
1539     } else if (Scope.isLexicalBlockFile()) {
1540       DILexicalBlockFile DBF(S);
1541       Fn = DBF.getFilename();
1542       Dir = DBF.getDirectory();
1543     } else if (Scope.isLexicalBlock()) {
1544       DILexicalBlock DB(S);
1545       Fn = DB.getFilename();
1546       Dir = DB.getDirectory();
1547     } else
1548       llvm_unreachable("Unexpected scope info");
1549
1550     Src = GetOrCreateSourceID(Fn, Dir);
1551   }
1552   Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
1553 }
1554
1555 //===----------------------------------------------------------------------===//
1556 // Emit Methods
1557 //===----------------------------------------------------------------------===//
1558
1559 /// computeSizeAndOffset - Compute the size and offset of a DIE.
1560 ///
1561 unsigned
1562 DwarfDebug::computeSizeAndOffset(DIE *Die, unsigned Offset, bool Last) {
1563   // Get the children.
1564   const std::vector<DIE *> &Children = Die->getChildren();
1565
1566   // Record the abbreviation.
1567   assignAbbrevNumber(Die->getAbbrev());
1568
1569   // Get the abbreviation for this DIE.
1570   unsigned AbbrevNumber = Die->getAbbrevNumber();
1571   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1572
1573   // Set DIE offset
1574   Die->setOffset(Offset);
1575
1576   // Start the size with the size of abbreviation code.
1577   Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
1578
1579   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1580   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1581
1582   // Size the DIE attribute values.
1583   for (unsigned i = 0, N = Values.size(); i < N; ++i)
1584     // Size attribute value.
1585     Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
1586
1587   // Size the DIE children if any.
1588   if (!Children.empty()) {
1589     assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1590            "Children flag not set");
1591
1592     for (unsigned j = 0, M = Children.size(); j < M; ++j)
1593       Offset = computeSizeAndOffset(Children[j], Offset, (j + 1) == M);
1594
1595     // End of children marker.
1596     Offset += sizeof(int8_t);
1597   }
1598
1599   Die->setSize(Offset - Die->getOffset());
1600   return Offset;
1601 }
1602
1603 /// computeSizeAndOffsets - Compute the size and offset of all the DIEs.
1604 ///
1605 void DwarfDebug::computeSizeAndOffsets() {
1606   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1607          E = CUMap.end(); I != E; ++I) {
1608     // Compute size of compile unit header.
1609     unsigned Offset = 
1610       sizeof(int32_t) + // Length of Compilation Unit Info
1611       sizeof(int16_t) + // DWARF version number
1612       sizeof(int32_t) + // Offset Into Abbrev. Section
1613       sizeof(int8_t);   // Pointer Size (in bytes)
1614     computeSizeAndOffset(I->second->getCUDie(), Offset, true);
1615   }
1616 }
1617
1618 /// EmitSectionLabels - Emit initial Dwarf sections with a label at
1619 /// the start of each one.
1620 void DwarfDebug::EmitSectionLabels() {
1621   const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1622
1623   // Dwarf sections base addresses.
1624   DwarfInfoSectionSym =
1625     EmitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
1626   DwarfAbbrevSectionSym =
1627     EmitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1628   EmitSectionSym(Asm, TLOF.getDwarfARangesSection());
1629
1630   if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
1631     EmitSectionSym(Asm, MacroInfo);
1632
1633   EmitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1634   EmitSectionSym(Asm, TLOF.getDwarfLocSection());
1635   EmitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
1636   DwarfStrSectionSym =
1637     EmitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str");
1638   DwarfDebugRangeSectionSym = EmitSectionSym(Asm, TLOF.getDwarfRangesSection(),
1639                                              "debug_range");
1640
1641   DwarfDebugLocSectionSym = EmitSectionSym(Asm, TLOF.getDwarfLocSection(),
1642                                            "section_debug_loc");
1643
1644   TextSectionSym = EmitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1645   EmitSectionSym(Asm, TLOF.getDataSection());
1646 }
1647
1648 /// emitDIE - Recursively emits a debug information entry.
1649 ///
1650 void DwarfDebug::emitDIE(DIE *Die) {
1651   // Get the abbreviation for this DIE.
1652   unsigned AbbrevNumber = Die->getAbbrevNumber();
1653   const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
1654
1655   // Emit the code (index) for the abbreviation.
1656   if (Asm->isVerbose())
1657     Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1658                                 Twine::utohexstr(Die->getOffset()) + ":0x" +
1659                                 Twine::utohexstr(Die->getSize()) + " " +
1660                                 dwarf::TagString(Abbrev->getTag()));
1661   Asm->EmitULEB128(AbbrevNumber);
1662
1663   const SmallVector<DIEValue*, 32> &Values = Die->getValues();
1664   const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
1665
1666   // Emit the DIE attribute values.
1667   for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1668     unsigned Attr = AbbrevData[i].getAttribute();
1669     unsigned Form = AbbrevData[i].getForm();
1670     assert(Form && "Too many attributes for DIE (check abbreviation)");
1671
1672     if (Asm->isVerbose())
1673       Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
1674
1675     switch (Attr) {
1676     case dwarf::DW_AT_abstract_origin: {
1677       DIEEntry *E = cast<DIEEntry>(Values[i]);
1678       DIE *Origin = E->getEntry();
1679       unsigned Addr = Origin->getOffset();
1680       Asm->EmitInt32(Addr);
1681       break;
1682     }
1683     case dwarf::DW_AT_ranges: {
1684       // DW_AT_range Value encodes offset in debug_range section.
1685       DIEInteger *V = cast<DIEInteger>(Values[i]);
1686
1687       if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
1688         Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1689                                  V->getValue(),
1690                                  4);
1691       } else {
1692         Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1693                                        V->getValue(),
1694                                        DwarfDebugRangeSectionSym,
1695                                        4);
1696       }
1697       break;
1698     }
1699     case dwarf::DW_AT_location: {
1700       if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1701         if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1702           Asm->EmitLabelReference(L->getValue(), 4);
1703         else
1704           Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1705       } else {
1706         Values[i]->EmitValue(Asm, Form);
1707       }
1708       break;
1709     }
1710     case dwarf::DW_AT_accessibility: {
1711       if (Asm->isVerbose()) {
1712         DIEInteger *V = cast<DIEInteger>(Values[i]);
1713         Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1714       }
1715       Values[i]->EmitValue(Asm, Form);
1716       break;
1717     }
1718     default:
1719       // Emit an attribute using the defined form.
1720       Values[i]->EmitValue(Asm, Form);
1721       break;
1722     }
1723   }
1724
1725   // Emit the DIE children if any.
1726   if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1727     const std::vector<DIE *> &Children = Die->getChildren();
1728
1729     for (unsigned j = 0, M = Children.size(); j < M; ++j)
1730       emitDIE(Children[j]);
1731
1732     if (Asm->isVerbose())
1733       Asm->OutStreamer.AddComment("End Of Children Mark");
1734     Asm->EmitInt8(0);
1735   }
1736 }
1737
1738 /// emitDebugInfo - Emit the debug info section.
1739 ///
1740 void DwarfDebug::emitDebugInfo() {
1741   // Start debug info section.
1742   Asm->OutStreamer.SwitchSection(
1743                             Asm->getObjFileLowering().getDwarfInfoSection());
1744   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1745          E = CUMap.end(); I != E; ++I) {
1746     CompileUnit *TheCU = I->second;
1747     DIE *Die = TheCU->getCUDie();
1748
1749     // Emit the compile units header.
1750     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_begin",
1751                                                   TheCU->getID()));
1752
1753     // Emit size of content not including length itself
1754     unsigned ContentSize = Die->getSize() +
1755       sizeof(int16_t) + // DWARF version number
1756       sizeof(int32_t) + // Offset Into Abbrev. Section
1757       sizeof(int8_t);   // Pointer Size (in bytes)
1758
1759     Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
1760     Asm->EmitInt32(ContentSize);
1761     Asm->OutStreamer.AddComment("DWARF version number");
1762     Asm->EmitInt16(dwarf::DWARF_VERSION);
1763     Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
1764     Asm->EmitSectionOffset(Asm->GetTempSymbol("abbrev_begin"),
1765                            DwarfAbbrevSectionSym);
1766     Asm->OutStreamer.AddComment("Address Size (in bytes)");
1767     Asm->EmitInt8(Asm->getTargetData().getPointerSize());
1768
1769     emitDIE(Die);
1770     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("info_end", TheCU->getID()));
1771   }
1772 }
1773
1774 /// emitAbbreviations - Emit the abbreviation section.
1775 ///
1776 void DwarfDebug::emitAbbreviations() const {
1777   // Check to see if it is worth the effort.
1778   if (!Abbreviations.empty()) {
1779     // Start the debug abbrev section.
1780     Asm->OutStreamer.SwitchSection(
1781                             Asm->getObjFileLowering().getDwarfAbbrevSection());
1782
1783     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_begin"));
1784
1785     // For each abbrevation.
1786     for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
1787       // Get abbreviation data
1788       const DIEAbbrev *Abbrev = Abbreviations[i];
1789
1790       // Emit the abbrevations code (base 1 index.)
1791       Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
1792
1793       // Emit the abbreviations data.
1794       Abbrev->Emit(Asm);
1795     }
1796
1797     // Mark end of abbreviations.
1798     Asm->EmitULEB128(0, "EOM(3)");
1799
1800     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("abbrev_end"));
1801   }
1802 }
1803
1804 /// emitEndOfLineMatrix - Emit the last address of the section and the end of
1805 /// the line matrix.
1806 ///
1807 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
1808   // Define last address of section.
1809   Asm->OutStreamer.AddComment("Extended Op");
1810   Asm->EmitInt8(0);
1811
1812   Asm->OutStreamer.AddComment("Op size");
1813   Asm->EmitInt8(Asm->getTargetData().getPointerSize() + 1);
1814   Asm->OutStreamer.AddComment("DW_LNE_set_address");
1815   Asm->EmitInt8(dwarf::DW_LNE_set_address);
1816
1817   Asm->OutStreamer.AddComment("Section end label");
1818
1819   Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
1820                                    Asm->getTargetData().getPointerSize(),
1821                                    0/*AddrSpace*/);
1822
1823   // Mark end of matrix.
1824   Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
1825   Asm->EmitInt8(0);
1826   Asm->EmitInt8(1);
1827   Asm->EmitInt8(1);
1828 }
1829
1830 /// emitAccelNames - Emit visible names into a hashed accelerator table
1831 /// section.
1832 void DwarfDebug::emitAccelNames() {
1833   DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1834                                            dwarf::DW_FORM_data4));
1835   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1836          E = CUMap.end(); I != E; ++I) {
1837     CompileUnit *TheCU = I->second;
1838     const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
1839     for (StringMap<std::vector<DIE*> >::const_iterator
1840            GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1841       const char *Name = GI->getKeyData();
1842       const std::vector<DIE *> &Entities = GI->second;
1843       for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1844              DE = Entities.end(); DI != DE; ++DI)
1845         AT.AddName(Name, (*DI));
1846     }
1847   }
1848
1849   AT.FinalizeTable(Asm, "Names");
1850   Asm->OutStreamer.SwitchSection(
1851     Asm->getObjFileLowering().getDwarfAccelNamesSection());
1852   MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
1853   Asm->OutStreamer.EmitLabel(SectionBegin);
1854
1855   // Emit the full data.
1856   AT.Emit(Asm, SectionBegin, this);
1857 }
1858
1859 /// emitAccelObjC - Emit objective C classes and categories into a hashed
1860 /// accelerator table section.
1861 void DwarfDebug::emitAccelObjC() {
1862   DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1863                                            dwarf::DW_FORM_data4));
1864   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1865          E = CUMap.end(); I != E; ++I) {
1866     CompileUnit *TheCU = I->second;
1867     const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
1868     for (StringMap<std::vector<DIE*> >::const_iterator
1869            GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1870       const char *Name = GI->getKeyData();
1871       const std::vector<DIE *> &Entities = GI->second;
1872       for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1873              DE = Entities.end(); DI != DE; ++DI)
1874         AT.AddName(Name, (*DI));
1875     }
1876   }
1877
1878   AT.FinalizeTable(Asm, "ObjC");
1879   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1880                                  .getDwarfAccelObjCSection());
1881   MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
1882   Asm->OutStreamer.EmitLabel(SectionBegin);
1883
1884   // Emit the full data.
1885   AT.Emit(Asm, SectionBegin, this);
1886 }
1887
1888 /// emitAccelNamespace - Emit namespace dies into a hashed accelerator
1889 /// table.
1890 void DwarfDebug::emitAccelNamespaces() {
1891   DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1892                                            dwarf::DW_FORM_data4));
1893   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1894          E = CUMap.end(); I != E; ++I) {
1895     CompileUnit *TheCU = I->second;
1896     const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
1897     for (StringMap<std::vector<DIE*> >::const_iterator
1898            GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1899       const char *Name = GI->getKeyData();
1900       const std::vector<DIE *> &Entities = GI->second;
1901       for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
1902              DE = Entities.end(); DI != DE; ++DI)
1903         AT.AddName(Name, (*DI));
1904     }
1905   }
1906
1907   AT.FinalizeTable(Asm, "namespac");
1908   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1909                                  .getDwarfAccelNamespaceSection());
1910   MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
1911   Asm->OutStreamer.EmitLabel(SectionBegin);
1912
1913   // Emit the full data.
1914   AT.Emit(Asm, SectionBegin, this);
1915 }
1916
1917 /// emitAccelTypes() - Emit type dies into a hashed accelerator table.
1918 void DwarfDebug::emitAccelTypes() {
1919   std::vector<DwarfAccelTable::Atom> Atoms;
1920   Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
1921                                         dwarf::DW_FORM_data4));
1922   Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
1923                                         dwarf::DW_FORM_data2));
1924   Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
1925                                         dwarf::DW_FORM_data1));
1926   DwarfAccelTable AT(Atoms);
1927   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1928          E = CUMap.end(); I != E; ++I) {
1929     CompileUnit *TheCU = I->second;
1930     const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
1931       = TheCU->getAccelTypes();
1932     for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
1933            GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
1934       const char *Name = GI->getKeyData();
1935       const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
1936       for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
1937              = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
1938         AT.AddName(Name, (*DI).first, (*DI).second);
1939     }
1940   }
1941
1942   AT.FinalizeTable(Asm, "types");
1943   Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
1944                                  .getDwarfAccelTypesSection());
1945   MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
1946   Asm->OutStreamer.EmitLabel(SectionBegin);
1947
1948   // Emit the full data.
1949   AT.Emit(Asm, SectionBegin, this);
1950 }
1951
1952 void DwarfDebug::emitDebugPubTypes() {
1953   for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1954          E = CUMap.end(); I != E; ++I) {
1955     CompileUnit *TheCU = I->second;
1956     // Start the dwarf pubtypes section.
1957     Asm->OutStreamer.SwitchSection(
1958       Asm->getObjFileLowering().getDwarfPubTypesSection());
1959     Asm->OutStreamer.AddComment("Length of Public Types Info");
1960     Asm->EmitLabelDifference(
1961       Asm->GetTempSymbol("pubtypes_end", TheCU->getID()),
1962       Asm->GetTempSymbol("pubtypes_begin", TheCU->getID()), 4);
1963
1964     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
1965                                                   TheCU->getID()));
1966
1967     if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
1968     Asm->EmitInt16(dwarf::DWARF_VERSION);
1969
1970     Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
1971     Asm->EmitSectionOffset(Asm->GetTempSymbol("info_begin", TheCU->getID()),
1972                            DwarfInfoSectionSym);
1973
1974     Asm->OutStreamer.AddComment("Compilation Unit Length");
1975     Asm->EmitLabelDifference(Asm->GetTempSymbol("info_end", TheCU->getID()),
1976                              Asm->GetTempSymbol("info_begin", TheCU->getID()),
1977                              4);
1978
1979     const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
1980     for (StringMap<DIE*>::const_iterator
1981            GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
1982       const char *Name = GI->getKeyData();
1983       DIE *Entity = GI->second;
1984
1985       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
1986       Asm->EmitInt32(Entity->getOffset());
1987
1988       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
1989       // Emit the name with a terminating null byte.
1990       Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1), 0);
1991     }
1992
1993     Asm->OutStreamer.AddComment("End Mark");
1994     Asm->EmitInt32(0);
1995     Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
1996                                                   TheCU->getID()));
1997   }
1998 }
1999
2000 /// emitDebugStr - Emit visible names into a debug str section.
2001 ///
2002 void DwarfDebug::emitDebugStr() {
2003   // Check to see if it is worth the effort.
2004   if (StringPool.empty()) return;
2005
2006   // Start the dwarf str section.
2007   Asm->OutStreamer.SwitchSection(
2008                                 Asm->getObjFileLowering().getDwarfStrSection());
2009
2010   // Get all of the string pool entries and put them in an array by their ID so
2011   // we can sort them.
2012   SmallVector<std::pair<unsigned,
2013       StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2014
2015   for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2016        I = StringPool.begin(), E = StringPool.end(); I != E; ++I)
2017     Entries.push_back(std::make_pair(I->second.second, &*I));
2018
2019   array_pod_sort(Entries.begin(), Entries.end());
2020
2021   for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2022     // Emit a label for reference from debug information entries.
2023     Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2024
2025     // Emit the string itself with a terminating null byte.
2026     Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
2027                                          Entries[i].second->getKeyLength()+1),
2028                                0/*addrspace*/);
2029   }
2030 }
2031
2032 /// emitDebugLoc - Emit visible names into a debug loc section.
2033 ///
2034 void DwarfDebug::emitDebugLoc() {
2035   if (DotDebugLocEntries.empty())
2036     return;
2037
2038   for (SmallVector<DotDebugLocEntry, 4>::iterator
2039          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2040        I != E; ++I) {
2041     DotDebugLocEntry &Entry = *I;
2042     if (I + 1 != DotDebugLocEntries.end())
2043       Entry.Merge(I+1);
2044   }
2045
2046   // Start the dwarf loc section.
2047   Asm->OutStreamer.SwitchSection(
2048     Asm->getObjFileLowering().getDwarfLocSection());
2049   unsigned char Size = Asm->getTargetData().getPointerSize();
2050   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2051   unsigned index = 1;
2052   for (SmallVector<DotDebugLocEntry, 4>::iterator
2053          I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2054        I != E; ++I, ++index) {
2055     DotDebugLocEntry &Entry = *I;
2056     if (Entry.isMerged()) continue;
2057     if (Entry.isEmpty()) {
2058       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2059       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2060       Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2061     } else {
2062       Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size, 0);
2063       Asm->OutStreamer.EmitSymbolValue(Entry.End, Size, 0);
2064       DIVariable DV(Entry.Variable);
2065       Asm->OutStreamer.AddComment("Loc expr size");
2066       MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2067       MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2068       Asm->EmitLabelDifference(end, begin, 2);
2069       Asm->OutStreamer.EmitLabel(begin);
2070       if (Entry.isInt()) {
2071         DIBasicType BTy(DV.getType());
2072         if (BTy.Verify() &&
2073             (BTy.getEncoding()  == dwarf::DW_ATE_signed 
2074              || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2075           Asm->OutStreamer.AddComment("DW_OP_consts");
2076           Asm->EmitInt8(dwarf::DW_OP_consts);
2077           Asm->EmitSLEB128(Entry.getInt());
2078         } else {
2079           Asm->OutStreamer.AddComment("DW_OP_constu");
2080           Asm->EmitInt8(dwarf::DW_OP_constu);
2081           Asm->EmitULEB128(Entry.getInt());
2082         }
2083       } else if (Entry.isLocation()) {
2084         if (!DV.hasComplexAddress()) 
2085           // Regular entry.
2086           Asm->EmitDwarfRegOp(Entry.Loc);
2087         else {
2088           // Complex address entry.
2089           unsigned N = DV.getNumAddrElements();
2090           unsigned i = 0;
2091           if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2092             if (Entry.Loc.getOffset()) {
2093               i = 2;
2094               Asm->EmitDwarfRegOp(Entry.Loc);
2095               Asm->OutStreamer.AddComment("DW_OP_deref");
2096               Asm->EmitInt8(dwarf::DW_OP_deref);
2097               Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2098               Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2099               Asm->EmitSLEB128(DV.getAddrElement(1));
2100             } else {
2101               // If first address element is OpPlus then emit
2102               // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2103               MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2104               Asm->EmitDwarfRegOp(Loc);
2105               i = 2;
2106             }
2107           } else {
2108             Asm->EmitDwarfRegOp(Entry.Loc);
2109           }
2110           
2111           // Emit remaining complex address elements.
2112           for (; i < N; ++i) {
2113             uint64_t Element = DV.getAddrElement(i);
2114             if (Element == DIBuilder::OpPlus) {
2115               Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2116               Asm->EmitULEB128(DV.getAddrElement(++i));
2117             } else if (Element == DIBuilder::OpDeref) {
2118               if (!Entry.Loc.isReg())
2119                 Asm->EmitInt8(dwarf::DW_OP_deref);
2120             } else
2121               llvm_unreachable("unknown Opcode found in complex address");
2122           }
2123         }
2124       }
2125       // else ... ignore constant fp. There is not any good way to
2126       // to represent them here in dwarf.
2127       Asm->OutStreamer.EmitLabel(end);
2128     }
2129   }
2130 }
2131
2132 /// EmitDebugARanges - Emit visible names into a debug aranges section.
2133 ///
2134 void DwarfDebug::EmitDebugARanges() {
2135   // Start the dwarf aranges section.
2136   Asm->OutStreamer.SwitchSection(
2137                           Asm->getObjFileLowering().getDwarfARangesSection());
2138 }
2139
2140 /// emitDebugRanges - Emit visible names into a debug ranges section.
2141 ///
2142 void DwarfDebug::emitDebugRanges() {
2143   // Start the dwarf ranges section.
2144   Asm->OutStreamer.SwitchSection(
2145     Asm->getObjFileLowering().getDwarfRangesSection());
2146   unsigned char Size = Asm->getTargetData().getPointerSize();
2147   for (SmallVector<const MCSymbol *, 8>::iterator
2148          I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2149        I != E; ++I) {
2150     if (*I)
2151       Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size, 0);
2152     else
2153       Asm->OutStreamer.EmitIntValue(0, Size, /*addrspace*/0);
2154   }
2155 }
2156
2157 /// emitDebugMacInfo - Emit visible names into a debug macinfo section.
2158 ///
2159 void DwarfDebug::emitDebugMacInfo() {
2160   if (const MCSection *LineInfo =
2161       Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2162     // Start the dwarf macinfo section.
2163     Asm->OutStreamer.SwitchSection(LineInfo);
2164   }
2165 }
2166
2167 /// emitDebugInlineInfo - Emit inline info using following format.
2168 /// Section Header:
2169 /// 1. length of section
2170 /// 2. Dwarf version number
2171 /// 3. address size.
2172 ///
2173 /// Entries (one "entry" for each function that was inlined):
2174 ///
2175 /// 1. offset into __debug_str section for MIPS linkage name, if exists;
2176 ///   otherwise offset into __debug_str for regular function name.
2177 /// 2. offset into __debug_str section for regular function name.
2178 /// 3. an unsigned LEB128 number indicating the number of distinct inlining
2179 /// instances for the function.
2180 ///
2181 /// The rest of the entry consists of a {die_offset, low_pc} pair for each
2182 /// inlined instance; the die_offset points to the inlined_subroutine die in the
2183 /// __debug_info section, and the low_pc is the starting address for the
2184 /// inlining instance.
2185 void DwarfDebug::emitDebugInlineInfo() {
2186   if (!Asm->MAI->doesDwarfUseInlineInfoSection())
2187     return;
2188
2189   if (!FirstCU)
2190     return;
2191
2192   Asm->OutStreamer.SwitchSection(
2193                         Asm->getObjFileLowering().getDwarfDebugInlineSection());
2194
2195   Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2196   Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2197                            Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2198
2199   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2200
2201   Asm->OutStreamer.AddComment("Dwarf Version");
2202   Asm->EmitInt16(dwarf::DWARF_VERSION);
2203   Asm->OutStreamer.AddComment("Address Size (in bytes)");
2204   Asm->EmitInt8(Asm->getTargetData().getPointerSize());
2205
2206   for (SmallVector<const MDNode *, 4>::iterator I = InlinedSPNodes.begin(),
2207          E = InlinedSPNodes.end(); I != E; ++I) {
2208
2209     const MDNode *Node = *I;
2210     DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2211       = InlineInfo.find(Node);
2212     SmallVector<InlineInfoLabels, 4> &Labels = II->second;
2213     DISubprogram SP(Node);
2214     StringRef LName = SP.getLinkageName();
2215     StringRef Name = SP.getName();
2216
2217     Asm->OutStreamer.AddComment("MIPS linkage name");
2218     if (LName.empty())
2219       Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2220     else
2221       Asm->EmitSectionOffset(getStringPoolEntry(getRealLinkageName(LName)),
2222                              DwarfStrSectionSym);
2223
2224     Asm->OutStreamer.AddComment("Function name");
2225     Asm->EmitSectionOffset(getStringPoolEntry(Name), DwarfStrSectionSym);
2226     Asm->EmitULEB128(Labels.size(), "Inline count");
2227
2228     for (SmallVector<InlineInfoLabels, 4>::iterator LI = Labels.begin(),
2229            LE = Labels.end(); LI != LE; ++LI) {
2230       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2231       Asm->EmitInt32(LI->second->getOffset());
2232
2233       if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2234       Asm->OutStreamer.EmitSymbolValue(LI->first,
2235                                        Asm->getTargetData().getPointerSize(),0);
2236     }
2237   }
2238
2239   Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
2240 }