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