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