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