1 //===-- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ---------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains support for writing dwarf debug info into asm files.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "dwarfdebug"
15 #include "DwarfDebug.h"
17 #include "DwarfAccelTable.h"
18 #include "DwarfCompileUnit.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/Statistic.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/ADT/Triple.h"
23 #include "llvm/CodeGen/MachineFunction.h"
24 #include "llvm/CodeGen/MachineModuleInfo.h"
25 #include "llvm/DIBuilder.h"
26 #include "llvm/DebugInfo.h"
27 #include "llvm/IR/Constants.h"
28 #include "llvm/IR/DataLayout.h"
29 #include "llvm/IR/Instructions.h"
30 #include "llvm/IR/Module.h"
31 #include "llvm/MC/MCAsmInfo.h"
32 #include "llvm/MC/MCSection.h"
33 #include "llvm/MC/MCStreamer.h"
34 #include "llvm/MC/MCSymbol.h"
35 #include "llvm/Support/CommandLine.h"
36 #include "llvm/Support/Debug.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include "llvm/Support/FormattedStream.h"
39 #include "llvm/Support/Path.h"
40 #include "llvm/Support/Timer.h"
41 #include "llvm/Support/ValueHandle.h"
42 #include "llvm/Target/TargetFrameLowering.h"
43 #include "llvm/Target/TargetLoweringObjectFile.h"
44 #include "llvm/Target/TargetMachine.h"
45 #include "llvm/Target/TargetOptions.h"
46 #include "llvm/Target/TargetRegisterInfo.h"
49 static cl::opt<bool> DisableDebugInfoPrinting("disable-debug-info-print",
51 cl::desc("Disable debug info printing"));
53 static cl::opt<bool> UnknownLocations("use-unknown-locations", cl::Hidden,
54 cl::desc("Make an absence of debug location information explicit."),
57 static cl::opt<bool> GenerateDwarfPubNamesSection("generate-dwarf-pubnames",
58 cl::Hidden, cl::init(false),
59 cl::desc("Generate DWARF pubnames section"));
63 Default, Enable, Disable
67 static cl::opt<DefaultOnOff> DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
68 cl::desc("Output prototype dwarf accelerator tables."),
70 clEnumVal(Default, "Default for platform"),
71 clEnumVal(Enable, "Enabled"),
72 clEnumVal(Disable, "Disabled"),
76 static cl::opt<DefaultOnOff> DarwinGDBCompat("darwin-gdb-compat", cl::Hidden,
77 cl::desc("Compatibility with Darwin gdb."),
79 clEnumVal(Default, "Default for platform"),
80 clEnumVal(Enable, "Enabled"),
81 clEnumVal(Disable, "Disabled"),
85 static cl::opt<DefaultOnOff> SplitDwarf("split-dwarf", cl::Hidden,
86 cl::desc("Output prototype dwarf split debug info."),
88 clEnumVal(Default, "Default for platform"),
89 clEnumVal(Enable, "Enabled"),
90 clEnumVal(Disable, "Disabled"),
95 const char *DWARFGroupName = "DWARF Emission";
96 const char *DbgTimerName = "DWARF Debug Writer";
99 template <typename T> bool operator()(const T &lhs, const T &rhs) const {
100 return lhs.first < rhs.first;
103 } // end anonymous namespace
105 //===----------------------------------------------------------------------===//
107 // Configuration values for initial hash set sizes (log2).
109 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
113 DIType DbgVariable::getType() const {
114 DIType Ty = Var.getType();
115 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
116 // addresses instead.
117 if (Var.isBlockByrefVariable()) {
118 /* Byref variables, in Blocks, are declared by the programmer as
119 "SomeType VarName;", but the compiler creates a
120 __Block_byref_x_VarName struct, and gives the variable VarName
121 either the struct, or a pointer to the struct, as its type. This
122 is necessary for various behind-the-scenes things the compiler
123 needs to do with by-reference variables in blocks.
125 However, as far as the original *programmer* is concerned, the
126 variable should still have type 'SomeType', as originally declared.
128 The following function dives into the __Block_byref_x_VarName
129 struct to find the original type of the variable. This will be
130 passed back to the code generating the type for the Debug
131 Information Entry for the variable 'VarName'. 'VarName' will then
132 have the original type 'SomeType' in its debug information.
134 The original type 'SomeType' will be the type of the field named
135 'VarName' inside the __Block_byref_x_VarName struct.
137 NOTE: In order for this to not completely fail on the debugger
138 side, the Debug Information Entry for the variable VarName needs to
139 have a DW_AT_location that tells the debugger how to unwind through
140 the pointers and __Block_byref_x_VarName struct to find the actual
141 value of the variable. The function addBlockByrefType does this. */
143 unsigned tag = Ty.getTag();
145 if (tag == dwarf::DW_TAG_pointer_type) {
146 DIDerivedType DTy = DIDerivedType(Ty);
147 subType = DTy.getTypeDerivedFrom();
150 DICompositeType blockStruct = DICompositeType(subType);
151 DIArray Elements = blockStruct.getTypeArray();
153 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
154 DIDescriptor Element = Elements.getElement(i);
155 DIDerivedType DT = DIDerivedType(Element);
156 if (getName() == DT.getName())
157 return (DT.getTypeDerivedFrom());
163 } // end llvm namespace
165 /// Return Dwarf Version by checking module flags.
166 static unsigned getDwarfVersionFromModule(const Module *M) {
167 SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags;
168 M->getModuleFlagsMetadata(ModuleFlags);
169 for (unsigned I = 0, E = ModuleFlags.size(); I < E; ++I) {
170 const Module::ModuleFlagEntry &MFE = ModuleFlags[I];
171 StringRef Key = MFE.Key->getString();
172 Value *Val = MFE.Val;
174 if (Key == "Dwarf Version")
175 return cast<ConstantInt>(Val)->getZExtValue();
177 return dwarf::DWARF_VERSION;
180 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
181 : Asm(A), MMI(Asm->MMI), FirstCU(0),
182 AbbreviationsSet(InitAbbreviationsSetSize),
183 SourceIdMap(DIEValueAllocator),
184 PrevLabel(NULL), GlobalCUIndexCount(0),
185 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
187 SkeletonAbbrevSet(InitAbbreviationsSetSize),
188 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
191 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
192 DwarfStrSectionSym = TextSectionSym = 0;
193 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
194 DwarfAddrSectionSym = 0;
195 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
196 FunctionBeginSym = FunctionEndSym = 0;
198 // Turn on accelerator tables and older gdb compatibility
200 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
201 if (DarwinGDBCompat == Default) {
203 IsDarwinGDBCompat = true;
205 IsDarwinGDBCompat = false;
207 IsDarwinGDBCompat = DarwinGDBCompat == Enable ? true : false;
209 if (DwarfAccelTables == Default) {
211 HasDwarfAccelTables = true;
213 HasDwarfAccelTables = false;
215 HasDwarfAccelTables = DwarfAccelTables == Enable ? true : false;
217 if (SplitDwarf == Default)
218 HasSplitDwarf = false;
220 HasSplitDwarf = SplitDwarf == Enable ? true : false;
222 DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
225 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
229 DwarfDebug::~DwarfDebug() {
232 // Switch to the specified MCSection and emit an assembler
233 // temporary label to it if SymbolStem is specified.
234 static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
235 const char *SymbolStem = 0) {
236 Asm->OutStreamer.SwitchSection(Section);
237 if (!SymbolStem) return 0;
239 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
240 Asm->OutStreamer.EmitLabel(TmpSym);
244 MCSymbol *DwarfUnits::getStringPoolSym() {
245 return Asm->GetTempSymbol(StringPref);
248 MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
249 std::pair<MCSymbol*, unsigned> &Entry =
250 StringPool.GetOrCreateValue(Str).getValue();
251 if (Entry.first) return Entry.first;
253 Entry.second = NextStringPoolNumber++;
254 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
257 unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
258 std::pair<MCSymbol*, unsigned> &Entry =
259 StringPool.GetOrCreateValue(Str).getValue();
260 if (Entry.first) return Entry.second;
262 Entry.second = NextStringPoolNumber++;
263 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
267 unsigned DwarfUnits::getAddrPoolIndex(const MCSymbol *Sym) {
268 return getAddrPoolIndex(MCSymbolRefExpr::Create(Sym, Asm->OutContext));
271 unsigned DwarfUnits::getAddrPoolIndex(const MCExpr *Sym) {
272 std::pair<DenseMap<const MCExpr *, unsigned>::iterator, bool> P =
273 AddressPool.insert(std::make_pair(Sym, NextAddrPoolNumber));
275 ++NextAddrPoolNumber;
276 return P.first->second;
279 // Define a unique number for the abbreviation.
281 void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
282 // Check the set for priors.
283 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
285 // If it's newly added.
286 if (InSet == &Abbrev) {
287 // Add to abbreviation list.
288 Abbreviations->push_back(&Abbrev);
290 // Assign the vector position + 1 as its number.
291 Abbrev.setNumber(Abbreviations->size());
293 // Assign existing abbreviation number.
294 Abbrev.setNumber(InSet->getNumber());
298 static bool isObjCClass(StringRef Name) {
299 return Name.startswith("+") || Name.startswith("-");
302 static bool hasObjCCategory(StringRef Name) {
303 if (!isObjCClass(Name)) return false;
305 size_t pos = Name.find(')');
306 if (pos != std::string::npos) {
307 if (Name[pos+1] != ' ') return false;
313 static void getObjCClassCategory(StringRef In, StringRef &Class,
314 StringRef &Category) {
315 if (!hasObjCCategory(In)) {
316 Class = In.slice(In.find('[') + 1, In.find(' '));
321 Class = In.slice(In.find('[') + 1, In.find('('));
322 Category = In.slice(In.find('[') + 1, In.find(' '));
326 static StringRef getObjCMethodName(StringRef In) {
327 return In.slice(In.find(' ') + 1, In.find(']'));
330 // Add the various names to the Dwarf accelerator table names.
331 static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
333 if (!SP.isDefinition()) return;
335 TheCU->addAccelName(SP.getName(), Die);
337 // If the linkage name is different than the name, go ahead and output
338 // that as well into the name table.
339 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
340 TheCU->addAccelName(SP.getLinkageName(), Die);
342 // If this is an Objective-C selector name add it to the ObjC accelerator
344 if (isObjCClass(SP.getName())) {
345 StringRef Class, Category;
346 getObjCClassCategory(SP.getName(), Class, Category);
347 TheCU->addAccelObjC(Class, Die);
349 TheCU->addAccelObjC(Category, Die);
350 // Also add the base method name to the name table.
351 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
355 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
356 // and DW_AT_high_pc attributes. If there are global variables in this
357 // scope then create and insert DIEs for these variables.
358 DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
359 const MDNode *SPNode) {
360 DIE *SPDie = SPCU->getDIE(SPNode);
362 assert(SPDie && "Unable to find subprogram DIE!");
363 DISubprogram SP(SPNode);
365 // If we're updating an abstract DIE, then we will be adding the children and
366 // object pointer later on. But what we don't want to do is process the
367 // concrete DIE twice.
368 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
370 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
371 // Pick up abstract subprogram DIE.
372 SPDie = new DIE(dwarf::DW_TAG_subprogram);
373 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
375 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
376 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
380 DISubprogram SPDecl = SP.getFunctionDeclaration();
381 if (!SPDecl.isSubprogram()) {
382 // There is not any need to generate specification DIE for a function
383 // defined at compile unit level. If a function is defined inside another
384 // function then gdb prefers the definition at top level and but does not
385 // expect specification DIE in parent function. So avoid creating
386 // specification DIE for a function defined inside a function.
387 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
388 !SP.getContext().isFile() &&
389 !isSubprogramContext(SP.getContext())) {
390 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
393 DICompositeType SPTy = SP.getType();
394 DIArray Args = SPTy.getTypeArray();
395 unsigned SPTag = SPTy.getTag();
396 if (SPTag == dwarf::DW_TAG_subroutine_type)
397 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
398 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
399 DIType ATy = DIType(Args.getElement(i));
400 SPCU->addType(Arg, ATy);
401 if (ATy.isArtificial())
402 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
403 if (ATy.isObjectPointer())
404 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
405 dwarf::DW_FORM_ref4, Arg);
406 SPDie->addChild(Arg);
408 DIE *SPDeclDie = SPDie;
409 SPDie = new DIE(dwarf::DW_TAG_subprogram);
410 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
411 dwarf::DW_FORM_ref4, SPDeclDie);
417 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
418 Asm->GetTempSymbol("func_begin",
419 Asm->getFunctionNumber()));
420 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
421 Asm->GetTempSymbol("func_end",
422 Asm->getFunctionNumber()));
423 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
424 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
425 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
427 // Add name to the name table, we do this here because we're guaranteed
428 // to have concrete versions of our DW_TAG_subprogram nodes.
429 addSubprogramNames(SPCU, SP, SPDie);
434 // Construct new DW_TAG_lexical_block for this scope and attach
435 // DW_AT_low_pc/DW_AT_high_pc labels.
436 DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
437 LexicalScope *Scope) {
438 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
439 if (Scope->isAbstractScope())
442 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
446 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
447 if (Ranges.size() > 1) {
448 // .debug_range section has not been laid out yet. Emit offset in
449 // .debug_range as a uint, size 4, for now. emitDIE will handle
450 // DW_AT_ranges appropriately.
451 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
452 DebugRangeSymbols.size()
453 * Asm->getDataLayout().getPointerSize());
454 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
455 RE = Ranges.end(); RI != RE; ++RI) {
456 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
457 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
460 // Terminate the range list.
461 DebugRangeSymbols.push_back(NULL);
462 DebugRangeSymbols.push_back(NULL);
466 MCSymbol *Start = getLabelBeforeInsn(RI->first);
467 MCSymbol *End = getLabelAfterInsn(RI->second);
469 if (End == 0) return 0;
471 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
472 assert(End->isDefined() && "Invalid end label for an inlined scope!");
474 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
475 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
480 // This scope represents inlined body of a function. Construct DIE to
481 // represent this concrete inlined copy of the function.
482 DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
483 LexicalScope *Scope) {
484 const SmallVector<InsnRange, 4> &Ranges = Scope->getRanges();
485 assert(Ranges.empty() == false &&
486 "LexicalScope does not have instruction markers!");
488 if (!Scope->getScopeNode())
490 DIScope DS(Scope->getScopeNode());
491 DISubprogram InlinedSP = getDISubprogram(DS);
492 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
494 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
498 SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin();
499 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
500 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
502 if (StartLabel == 0 || EndLabel == 0) {
503 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
505 assert(StartLabel->isDefined() &&
506 "Invalid starting label for an inlined scope!");
507 assert(EndLabel->isDefined() &&
508 "Invalid end label for an inlined scope!");
510 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
511 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
512 dwarf::DW_FORM_ref4, OriginDIE);
514 if (Ranges.size() > 1) {
515 // .debug_range section has not been laid out yet. Emit offset in
516 // .debug_range as a uint, size 4, for now. emitDIE will handle
517 // DW_AT_ranges appropriately.
518 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
519 DebugRangeSymbols.size()
520 * Asm->getDataLayout().getPointerSize());
521 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
522 RE = Ranges.end(); RI != RE; ++RI) {
523 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
524 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
526 DebugRangeSymbols.push_back(NULL);
527 DebugRangeSymbols.push_back(NULL);
529 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
530 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
533 InlinedSubprogramDIEs.insert(OriginDIE);
535 // Track the start label for this inlined function.
536 //.debug_inlined section specification does not clearly state how
537 // to emit inlined scope that is split into multiple instruction ranges.
538 // For now, use first instruction range and emit low_pc/high_pc pair and
539 // corresponding .debug_inlined section entry for this pair.
540 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator
541 I = InlineInfo.find(InlinedSP);
543 if (I == InlineInfo.end()) {
544 InlineInfo[InlinedSP].push_back(std::make_pair(StartLabel, ScopeDIE));
545 InlinedSPNodes.push_back(InlinedSP);
547 I->second.push_back(std::make_pair(StartLabel, ScopeDIE));
549 DILocation DL(Scope->getInlinedAt());
550 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
551 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
552 TheCU->getUniqueID()));
553 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
555 // Add name to the name table, we do this here because we're guaranteed
556 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
557 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
562 // Construct a DIE for this scope.
563 DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
564 if (!Scope || !Scope->getScopeNode())
567 DIScope DS(Scope->getScopeNode());
568 // Early return to avoid creating dangling variable|scope DIEs.
569 if (!Scope->getInlinedAt() && DS.isSubprogram() && Scope->isAbstractScope() &&
573 SmallVector<DIE *, 8> Children;
574 DIE *ObjectPointer = NULL;
576 // Collect arguments for current function.
577 if (LScopes.isCurrentFunctionScope(Scope))
578 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
579 if (DbgVariable *ArgDV = CurrentFnArguments[i])
581 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
582 Children.push_back(Arg);
583 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
586 // Collect lexical scope children first.
587 const SmallVector<DbgVariable *, 8> &Variables = ScopeVariables.lookup(Scope);
588 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
590 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
591 Children.push_back(Variable);
592 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
594 const SmallVector<LexicalScope *, 4> &Scopes = Scope->getChildren();
595 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
596 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
597 Children.push_back(Nested);
598 DIE *ScopeDIE = NULL;
599 if (Scope->getInlinedAt())
600 ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
601 else if (DS.isSubprogram()) {
602 ProcessedSPNodes.insert(DS);
603 if (Scope->isAbstractScope()) {
604 ScopeDIE = TheCU->getDIE(DS);
605 // Note down abstract DIE.
607 AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
610 ScopeDIE = updateSubprogramScopeDIE(TheCU, DS);
613 // There is no need to emit empty lexical block DIE.
614 std::pair<ImportedEntityMap::const_iterator,
615 ImportedEntityMap::const_iterator> Range = std::equal_range(
616 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
617 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
619 if (Children.empty() && Range.first == Range.second)
621 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
622 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
624 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
627 if (!ScopeDIE) return NULL;
630 for (SmallVector<DIE *, 8>::iterator I = Children.begin(),
631 E = Children.end(); I != E; ++I)
632 ScopeDIE->addChild(*I);
634 if (DS.isSubprogram() && ObjectPointer != NULL)
635 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
636 dwarf::DW_FORM_ref4, ObjectPointer);
638 if (DS.isSubprogram())
639 TheCU->addPubTypes(DISubprogram(DS));
644 // Look up the source id with the given directory and source file names.
645 // If none currently exists, create a new id and insert it in the
646 // SourceIds map. This can update DirectoryNames and SourceFileNames maps
648 unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
649 StringRef DirName, unsigned CUID) {
650 // If we use .loc in assembly, we can't separate .file entries according to
651 // compile units. Thus all files will belong to the default compile unit.
652 if (Asm->TM.hasMCUseLoc() &&
653 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
656 // If FE did not provide a file name, then assume stdin.
657 if (FileName.empty())
658 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
660 // TODO: this might not belong here. See if we can factor this better.
661 if (DirName == CompilationDir)
664 // FileIDCUMap stores the current ID for the given compile unit.
665 unsigned SrcId = FileIDCUMap[CUID] + 1;
667 // We look up the CUID/file/dir by concatenating them with a zero byte.
668 SmallString<128> NamePair;
669 NamePair += utostr(CUID);
672 NamePair += '\0'; // Zero bytes are not allowed in paths.
673 NamePair += FileName;
675 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
676 if (Ent.getValue() != SrcId)
677 return Ent.getValue();
679 FileIDCUMap[CUID] = SrcId;
680 // Print out a .file directive to specify files for .loc directives.
681 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
686 // Create new CompileUnit for the given metadata node with tag
687 // DW_TAG_compile_unit.
688 CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
689 DICompileUnit DIUnit(N);
690 StringRef FN = DIUnit.getFilename();
691 CompilationDir = DIUnit.getDirectory();
693 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
694 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
695 DIUnit.getLanguage(), Die, N, Asm,
698 FileIDCUMap[NewCU->getUniqueID()] = 0;
699 // Call this to emit a .file directive if it wasn't emitted for the source
700 // file this CU comes from yet.
701 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
703 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
704 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
705 DIUnit.getLanguage());
706 NewCU->addString(Die, dwarf::DW_AT_name, FN);
708 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
709 // into an entity. We're using 0 (or a NULL label) for this. For
710 // split dwarf it's in the skeleton CU so omit it here.
711 if (!useSplitDwarf())
712 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
714 // Define start line table label for each Compile Unit.
715 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
716 NewCU->getUniqueID());
717 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
718 NewCU->getUniqueID());
720 // Use a single line table if we are using .loc and generating assembly.
722 (Asm->TM.hasMCUseLoc() &&
723 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
724 (NewCU->getUniqueID() == 0);
726 // DW_AT_stmt_list is a offset of line number information for this
727 // compile unit in debug_line section. For split dwarf this is
728 // left in the skeleton CU and so not included.
729 // The line table entries are not always emitted in assembly, so it
730 // is not okay to use line_table_start here.
731 if (!useSplitDwarf()) {
732 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
733 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
735 Asm->GetTempSymbol("section_line") : LineTableStartSym);
736 else if (UseTheFirstCU)
737 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
739 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
740 LineTableStartSym, DwarfLineSectionSym);
743 // If we're using split dwarf the compilation dir is going to be in the
744 // skeleton CU and so we don't need to duplicate it here.
745 if (!useSplitDwarf() && !CompilationDir.empty())
746 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
747 if (DIUnit.isOptimized())
748 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
750 StringRef Flags = DIUnit.getFlags();
752 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
754 if (unsigned RVer = DIUnit.getRunTimeVersion())
755 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
756 dwarf::DW_FORM_data1, RVer);
761 InfoHolder.addUnit(NewCU);
763 CUMap.insert(std::make_pair(N, NewCU));
767 // Construct subprogram DIE.
768 void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
770 CompileUnit *&CURef = SPMap[N];
776 if (!SP.isDefinition())
777 // This is a method declaration which will be handled while constructing
781 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
784 TheCU->insertDIE(N, SubprogramDie);
786 // Add to context owner.
787 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
789 // Expose as global, if requested.
790 if (GenerateDwarfPubNamesSection)
791 TheCU->addGlobalName(SP.getName(), SubprogramDie);
794 void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
796 DIImportedEntity Module(N);
797 if (!Module.Verify())
799 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
800 constructImportedEntityDIE(TheCU, Module, D);
803 void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
805 DIImportedEntity Module(N);
806 if (!Module.Verify())
808 return constructImportedEntityDIE(TheCU, Module, Context);
811 void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
812 const DIImportedEntity &Module,
814 assert(Module.Verify() &&
815 "Use one of the MDNode * overloads to handle invalid metadata");
816 assert(Context && "Should always have a context for an imported_module");
817 DIE *IMDie = new DIE(Module.getTag());
818 TheCU->insertDIE(Module, IMDie);
820 DIDescriptor Entity = Module.getEntity();
821 if (Entity.isNameSpace())
822 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
823 else if (Entity.isSubprogram())
824 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
825 else if (Entity.isType())
826 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
828 EntityDie = TheCU->getDIE(Entity);
829 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
830 Module.getContext().getDirectory(),
831 TheCU->getUniqueID());
832 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
833 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
834 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
836 StringRef Name = Module.getName();
838 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
839 Context->addChild(IMDie);
842 // Emit all Dwarf sections that should come prior to the content. Create
843 // global DIEs and emit initial debug info sections. This is invoked by
844 // the target AsmPrinter.
845 void DwarfDebug::beginModule() {
846 if (DisableDebugInfoPrinting)
849 const Module *M = MMI->getModule();
851 // If module has named metadata anchors then use them, otherwise scan the
852 // module using debug info finder to collect debug info.
853 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
857 // Emit initial sections so we can reference labels later.
860 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
861 DICompileUnit CUNode(CU_Nodes->getOperand(i));
862 CompileUnit *CU = constructCompileUnit(CUNode);
863 DIArray ImportedEntities = CUNode.getImportedEntities();
864 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
865 ScopesWithImportedEntities.push_back(std::make_pair(
866 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
867 ImportedEntities.getElement(i)));
868 std::sort(ScopesWithImportedEntities.begin(),
869 ScopesWithImportedEntities.end(), CompareFirst());
870 DIArray GVs = CUNode.getGlobalVariables();
871 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
872 CU->createGlobalVariableDIE(GVs.getElement(i));
873 DIArray SPs = CUNode.getSubprograms();
874 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
875 constructSubprogramDIE(CU, SPs.getElement(i));
876 DIArray EnumTypes = CUNode.getEnumTypes();
877 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
878 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
879 DIArray RetainedTypes = CUNode.getRetainedTypes();
880 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
881 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
882 // Emit imported_modules last so that the relevant context is already
884 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
885 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
886 // If we're splitting the dwarf out now that we've got the entire
887 // CU then construct a skeleton CU based upon it.
888 if (useSplitDwarf()) {
889 // This should be a unique identifier when we want to build .dwp files.
890 CU->addUInt(CU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
891 dwarf::DW_FORM_data8, 0);
892 // Now construct the skeleton CU associated.
893 constructSkeletonCU(CUNode);
897 // Tell MMI that we have debug info.
898 MMI->setDebugInfoAvailability(true);
900 // Prime section data.
901 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
904 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
905 void DwarfDebug::computeInlinedDIEs() {
906 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
907 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
908 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
910 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
912 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
913 AE = AbstractSPDies.end(); AI != AE; ++AI) {
914 DIE *ISP = AI->second;
915 if (InlinedSubprogramDIEs.count(ISP))
917 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
921 // Collect info for variables that were optimized out.
922 void DwarfDebug::collectDeadVariables() {
923 const Module *M = MMI->getModule();
924 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
926 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
927 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
928 DICompileUnit TheCU(CU_Nodes->getOperand(i));
929 DIArray Subprograms = TheCU.getSubprograms();
930 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
931 DISubprogram SP(Subprograms.getElement(i));
932 if (ProcessedSPNodes.count(SP) != 0) continue;
933 if (!SP.Verify()) continue;
934 if (!SP.isDefinition()) continue;
935 DIArray Variables = SP.getVariables();
936 if (Variables.getNumElements() == 0) continue;
938 LexicalScope *Scope =
939 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
940 DeadFnScopeMap[SP] = Scope;
942 // Construct subprogram DIE and add variables DIEs.
943 CompileUnit *SPCU = CUMap.lookup(TheCU);
944 assert(SPCU && "Unable to find Compile Unit!");
945 constructSubprogramDIE(SPCU, SP);
946 DIE *ScopeDIE = SPCU->getDIE(SP);
947 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
948 DIVariable DV(Variables.getElement(vi));
949 if (!DV.Verify()) continue;
950 DbgVariable *NewVar = new DbgVariable(DV, NULL);
951 if (DIE *VariableDIE =
952 SPCU->constructVariableDIE(NewVar, Scope->isAbstractScope()))
953 ScopeDIE->addChild(VariableDIE);
958 DeleteContainerSeconds(DeadFnScopeMap);
961 void DwarfDebug::finalizeModuleInfo() {
962 // Collect info for variables that were optimized out.
963 collectDeadVariables();
965 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
966 computeInlinedDIEs();
968 // Emit DW_AT_containing_type attribute to connect types with their
969 // vtable holding type.
970 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
971 CUE = CUMap.end(); CUI != CUE; ++CUI) {
972 CompileUnit *TheCU = CUI->second;
973 TheCU->constructContainingTypeDIEs();
976 // Compute DIE offsets and sizes.
977 InfoHolder.computeSizeAndOffsets();
979 SkeletonHolder.computeSizeAndOffsets();
982 void DwarfDebug::endSections() {
983 // Standard sections final addresses.
984 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
985 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
986 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
987 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
989 // End text sections.
990 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
991 Asm->OutStreamer.SwitchSection(SectionMap[I]);
992 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
996 // Emit all Dwarf sections that should come after the content.
997 void DwarfDebug::endModule() {
999 if (!FirstCU) return;
1001 // End any existing sections.
1002 // TODO: Does this need to happen?
1005 // Finalize the debug info for the module.
1006 finalizeModuleInfo();
1008 if (!useSplitDwarf()) {
1009 // Emit all the DIEs into a debug info section.
1012 // Corresponding abbreviations into a abbrev section.
1013 emitAbbreviations();
1015 // Emit info into a debug loc section.
1018 // Emit info into a debug aranges section.
1021 // Emit info into a debug ranges section.
1024 // Emit info into a debug macinfo section.
1027 // Emit inline info.
1028 // TODO: When we don't need the option anymore we
1029 // can remove all of the code that this section
1031 if (useDarwinGDBCompat())
1032 emitDebugInlineInfo();
1034 // TODO: Fill this in for separated debug sections and separate
1035 // out information into new sections.
1037 // Emit the debug info section and compile units.
1041 // Corresponding abbreviations into a abbrev section.
1042 emitAbbreviations();
1043 emitDebugAbbrevDWO();
1045 // Emit info into a debug loc section.
1048 // Emit info into a debug aranges section.
1051 // Emit info into a debug ranges section.
1054 // Emit info into a debug macinfo section.
1057 // Emit DWO addresses.
1058 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1060 // Emit inline info.
1061 // TODO: When we don't need the option anymore we
1062 // can remove all of the code that this section
1064 if (useDarwinGDBCompat())
1065 emitDebugInlineInfo();
1068 // Emit info into the dwarf accelerator table sections.
1069 if (useDwarfAccelTables()) {
1072 emitAccelNamespaces();
1076 // Emit info into a debug pubnames section, if requested.
1077 if (GenerateDwarfPubNamesSection)
1078 emitDebugPubnames();
1080 // Emit info into a debug pubtypes section.
1081 // TODO: When we don't need the option anymore we can
1082 // remove all of the code that adds to the table.
1083 if (useDarwinGDBCompat())
1084 emitDebugPubTypes();
1086 // Finally emit string information into a string table.
1088 if (useSplitDwarf())
1093 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1094 E = CUMap.end(); I != E; ++I)
1097 for (SmallVector<CompileUnit *, 1>::iterator I = SkeletonCUs.begin(),
1098 E = SkeletonCUs.end(); I != E; ++I)
1101 // Reset these for the next Module if we have one.
1105 // Find abstract variable, if any, associated with Var.
1106 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
1107 DebugLoc ScopeLoc) {
1108 LLVMContext &Ctx = DV->getContext();
1109 // More then one inlined variable corresponds to one abstract variable.
1110 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
1111 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
1113 return AbsDbgVariable;
1115 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
1119 AbsDbgVariable = new DbgVariable(Var, NULL);
1120 addScopeVariable(Scope, AbsDbgVariable);
1121 AbstractVariables[Var] = AbsDbgVariable;
1122 return AbsDbgVariable;
1125 // If Var is a current function argument then add it to CurrentFnArguments list.
1126 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1127 DbgVariable *Var, LexicalScope *Scope) {
1128 if (!LScopes.isCurrentFunctionScope(Scope))
1130 DIVariable DV = Var->getVariable();
1131 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1133 unsigned ArgNo = DV.getArgNumber();
1137 size_t Size = CurrentFnArguments.size();
1139 CurrentFnArguments.resize(MF->getFunction()->arg_size());
1140 // llvm::Function argument size is not good indicator of how many
1141 // arguments does the function have at source level.
1143 CurrentFnArguments.resize(ArgNo * 2);
1144 CurrentFnArguments[ArgNo - 1] = Var;
1148 // Collect variable information from side table maintained by MMI.
1150 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
1151 SmallPtrSet<const MDNode *, 16> &Processed) {
1152 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1153 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1154 VE = VMap.end(); VI != VE; ++VI) {
1155 const MDNode *Var = VI->first;
1157 Processed.insert(Var);
1159 const std::pair<unsigned, DebugLoc> &VP = VI->second;
1161 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
1163 // If variable scope is not found then skip this variable.
1167 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1168 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
1169 RegVar->setFrameIndex(VP.first);
1170 if (!addCurrentFnArgument(MF, RegVar, Scope))
1171 addScopeVariable(Scope, RegVar);
1173 AbsDbgVariable->setFrameIndex(VP.first);
1177 // Return true if debug value, encoded by DBG_VALUE instruction, is in a
1179 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1180 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
1181 return MI->getNumOperands() == 3 &&
1182 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1183 MI->getOperand(1).isImm() && MI->getOperand(1).getImm() == 0;
1186 // Get .debug_loc entry for the instruction range starting at MI.
1187 static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1188 const MCSymbol *FLabel,
1189 const MCSymbol *SLabel,
1190 const MachineInstr *MI) {
1191 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1193 assert(MI->getNumOperands() == 3);
1194 if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) {
1195 MachineLocation MLoc;
1196 // TODO: Currently an offset of 0 in a DBG_VALUE means
1197 // we need to generate a direct register value.
1198 // There is no way to specify an indirect value with offset 0.
1199 if (MI->getOperand(1).getImm() == 0)
1200 MLoc.set(MI->getOperand(0).getReg());
1202 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1203 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1205 if (MI->getOperand(0).isImm())
1206 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1207 if (MI->getOperand(0).isFPImm())
1208 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1209 if (MI->getOperand(0).isCImm())
1210 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1212 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
1215 // Find variables for each lexical scope.
1217 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1218 SmallPtrSet<const MDNode *, 16> &Processed) {
1220 // collection info from MMI table.
1221 collectVariableInfoFromMMITable(MF, Processed);
1223 for (SmallVectorImpl<const MDNode*>::const_iterator
1224 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1226 const MDNode *Var = *UVI;
1227 if (Processed.count(Var))
1230 // History contains relevant DBG_VALUE instructions for Var and instructions
1232 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1233 if (History.empty())
1235 const MachineInstr *MInsn = History.front();
1238 LexicalScope *Scope = NULL;
1239 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1240 DISubprogram(DV.getContext()).describes(MF->getFunction()))
1241 Scope = LScopes.getCurrentFunctionScope();
1242 else if (MDNode *IA = DV.getInlinedAt())
1243 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1245 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
1246 // If variable scope is not found then skip this variable.
1250 Processed.insert(DV);
1251 assert(MInsn->isDebugValue() && "History must begin with debug value");
1252 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1253 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
1254 if (!addCurrentFnArgument(MF, RegVar, Scope))
1255 addScopeVariable(Scope, RegVar);
1257 AbsVar->setMInsn(MInsn);
1259 // Simplify ranges that are fully coalesced.
1260 if (History.size() <= 1 || (History.size() == 2 &&
1261 MInsn->isIdenticalTo(History.back()))) {
1262 RegVar->setMInsn(MInsn);
1266 // Handle multiple DBG_VALUE instructions describing one variable.
1267 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1269 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1270 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1271 const MachineInstr *Begin = *HI;
1272 assert(Begin->isDebugValue() && "Invalid History entry");
1274 // Check if DBG_VALUE is truncating a range.
1275 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1276 && !Begin->getOperand(0).getReg())
1279 // Compute the range for a register location.
1280 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1281 const MCSymbol *SLabel = 0;
1284 // If Begin is the last instruction in History then its value is valid
1285 // until the end of the function.
1286 SLabel = FunctionEndSym;
1288 const MachineInstr *End = HI[1];
1289 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1290 << "\t" << *Begin << "\t" << *End << "\n");
1291 if (End->isDebugValue())
1292 SLabel = getLabelBeforeInsn(End);
1294 // End is a normal instruction clobbering the range.
1295 SLabel = getLabelAfterInsn(End);
1296 assert(SLabel && "Forgot label after clobber instruction");
1301 // The value is valid until the next DBG_VALUE or clobber.
1302 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1305 DotDebugLocEntries.push_back(DotDebugLocEntry());
1308 // Collect info for variables that were optimized out.
1309 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1310 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1311 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1312 DIVariable DV(Variables.getElement(i));
1313 if (!DV || !DV.Verify() || !Processed.insert(DV))
1315 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1316 addScopeVariable(Scope, new DbgVariable(DV, NULL));
1320 // Return Label preceding the instruction.
1321 MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1322 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1323 assert(Label && "Didn't insert label before instruction");
1327 // Return Label immediately following the instruction.
1328 MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1329 return LabelsAfterInsn.lookup(MI);
1332 // Process beginning of an instruction.
1333 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1334 // Check if source location changes, but ignore DBG_VALUE locations.
1335 if (!MI->isDebugValue()) {
1336 DebugLoc DL = MI->getDebugLoc();
1337 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1340 if (DL == PrologEndLoc) {
1341 Flags |= DWARF2_FLAG_PROLOGUE_END;
1342 PrologEndLoc = DebugLoc();
1344 if (PrologEndLoc.isUnknown())
1345 Flags |= DWARF2_FLAG_IS_STMT;
1347 if (!DL.isUnknown()) {
1348 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1349 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1351 recordSourceLine(0, 0, 0, 0);
1355 // Insert labels where requested.
1356 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1357 LabelsBeforeInsn.find(MI);
1360 if (I == LabelsBeforeInsn.end())
1363 // Label already assigned.
1368 PrevLabel = MMI->getContext().CreateTempSymbol();
1369 Asm->OutStreamer.EmitLabel(PrevLabel);
1371 I->second = PrevLabel;
1374 // Process end of an instruction.
1375 void DwarfDebug::endInstruction(const MachineInstr *MI) {
1376 // Don't create a new label after DBG_VALUE instructions.
1377 // They don't generate code.
1378 if (!MI->isDebugValue())
1381 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1382 LabelsAfterInsn.find(MI);
1385 if (I == LabelsAfterInsn.end())
1388 // Label already assigned.
1392 // We need a label after this instruction.
1394 PrevLabel = MMI->getContext().CreateTempSymbol();
1395 Asm->OutStreamer.EmitLabel(PrevLabel);
1397 I->second = PrevLabel;
1400 // Each LexicalScope has first instruction and last instruction to mark
1401 // beginning and end of a scope respectively. Create an inverse map that list
1402 // scopes starts (and ends) with an instruction. One instruction may start (or
1403 // end) multiple scopes. Ignore scopes that are not reachable.
1404 void DwarfDebug::identifyScopeMarkers() {
1405 SmallVector<LexicalScope *, 4> WorkList;
1406 WorkList.push_back(LScopes.getCurrentFunctionScope());
1407 while (!WorkList.empty()) {
1408 LexicalScope *S = WorkList.pop_back_val();
1410 const SmallVector<LexicalScope *, 4> &Children = S->getChildren();
1411 if (!Children.empty())
1412 for (SmallVector<LexicalScope *, 4>::const_iterator SI = Children.begin(),
1413 SE = Children.end(); SI != SE; ++SI)
1414 WorkList.push_back(*SI);
1416 if (S->isAbstractScope())
1419 const SmallVector<InsnRange, 4> &Ranges = S->getRanges();
1422 for (SmallVector<InsnRange, 4>::const_iterator RI = Ranges.begin(),
1423 RE = Ranges.end(); RI != RE; ++RI) {
1424 assert(RI->first && "InsnRange does not have first instruction!");
1425 assert(RI->second && "InsnRange does not have second instruction!");
1426 requestLabelBeforeInsn(RI->first);
1427 requestLabelAfterInsn(RI->second);
1432 // Get MDNode for DebugLoc's scope.
1433 static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1434 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1435 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1436 return DL.getScope(Ctx);
1439 // Walk up the scope chain of given debug loc and find line number info
1440 // for the function.
1441 static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1442 const MDNode *Scope = getScopeNode(DL, Ctx);
1443 DISubprogram SP = getDISubprogram(Scope);
1445 // Check for number of operands since the compatibility is
1447 if (SP->getNumOperands() > 19)
1448 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1450 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1456 // Gather pre-function debug information. Assumes being called immediately
1457 // after the function entry point has been emitted.
1458 void DwarfDebug::beginFunction(const MachineFunction *MF) {
1459 if (!MMI->hasDebugInfo()) return;
1460 LScopes.initialize(*MF);
1461 if (LScopes.empty()) return;
1462 identifyScopeMarkers();
1464 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1466 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1467 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1468 assert(TheCU && "Unable to find compile unit!");
1469 if (Asm->TM.hasMCUseLoc() &&
1470 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1471 // Use a single line table if we are using .loc and generating assembly.
1472 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1474 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1476 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1477 Asm->getFunctionNumber());
1478 // Assumes in correct section after the entry point.
1479 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1481 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1483 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1484 // LiveUserVar - Map physreg numbers to the MDNode they contain.
1485 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1487 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1489 bool AtBlockEntry = true;
1490 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1492 const MachineInstr *MI = II;
1494 if (MI->isDebugValue()) {
1495 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
1497 // Keep track of user variables.
1499 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1501 // Variable is in a register, we need to check for clobbers.
1502 if (isDbgValueInDefinedReg(MI))
1503 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1505 // Check the history of this variable.
1506 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1507 if (History.empty()) {
1508 UserVariables.push_back(Var);
1509 // The first mention of a function argument gets the FunctionBeginSym
1510 // label, so arguments are visible when breaking at function entry.
1512 if (DV.Verify() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1513 DISubprogram(getDISubprogram(DV.getContext()))
1514 .describes(MF->getFunction()))
1515 LabelsBeforeInsn[MI] = FunctionBeginSym;
1517 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1518 const MachineInstr *Prev = History.back();
1519 if (Prev->isDebugValue()) {
1520 // Coalesce identical entries at the end of History.
1521 if (History.size() >= 2 &&
1522 Prev->isIdenticalTo(History[History.size() - 2])) {
1523 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
1525 << "\t" << *History[History.size() - 2] << "\n");
1529 // Terminate old register assignments that don't reach MI;
1530 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1531 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1532 isDbgValueInDefinedReg(Prev)) {
1533 // Previous register assignment needs to terminate at the end of
1535 MachineBasicBlock::const_iterator LastMI =
1536 PrevMBB->getLastNonDebugInstr();
1537 if (LastMI == PrevMBB->end()) {
1538 // Drop DBG_VALUE for empty range.
1539 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
1540 << "\t" << *Prev << "\n");
1542 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
1543 // Terminate after LastMI.
1544 History.push_back(LastMI);
1548 History.push_back(MI);
1550 // Not a DBG_VALUE instruction.
1552 AtBlockEntry = false;
1554 // First known non-DBG_VALUE and non-frame setup location marks
1555 // the beginning of the function body.
1556 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1557 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
1558 PrologEndLoc = MI->getDebugLoc();
1560 // Check if the instruction clobbers any registers with debug vars.
1561 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1562 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1563 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1565 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1566 AI.isValid(); ++AI) {
1568 const MDNode *Var = LiveUserVar[Reg];
1571 // Reg is now clobbered.
1572 LiveUserVar[Reg] = 0;
1574 // Was MD last defined by a DBG_VALUE referring to Reg?
1575 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1576 if (HistI == DbgValues.end())
1578 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1579 if (History.empty())
1581 const MachineInstr *Prev = History.back();
1582 // Sanity-check: Register assignments are terminated at the end of
1584 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1586 // Is the variable still in Reg?
1587 if (!isDbgValueInDefinedReg(Prev) ||
1588 Prev->getOperand(0).getReg() != Reg)
1590 // Var is clobbered. Make sure the next instruction gets a label.
1591 History.push_back(MI);
1598 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1600 SmallVectorImpl<const MachineInstr*> &History = I->second;
1601 if (History.empty())
1604 // Make sure the final register assignments are terminated.
1605 const MachineInstr *Prev = History.back();
1606 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1607 const MachineBasicBlock *PrevMBB = Prev->getParent();
1608 MachineBasicBlock::const_iterator LastMI =
1609 PrevMBB->getLastNonDebugInstr();
1610 if (LastMI == PrevMBB->end())
1611 // Drop DBG_VALUE for empty range.
1613 else if (PrevMBB != &PrevMBB->getParent()->back()) {
1614 // Terminate after LastMI.
1615 History.push_back(LastMI);
1618 // Request labels for the full history.
1619 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1620 const MachineInstr *MI = History[i];
1621 if (MI->isDebugValue())
1622 requestLabelBeforeInsn(MI);
1624 requestLabelAfterInsn(MI);
1628 PrevInstLoc = DebugLoc();
1629 PrevLabel = FunctionBeginSym;
1631 // Record beginning of function.
1632 if (!PrologEndLoc.isUnknown()) {
1633 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1634 MF->getFunction()->getContext());
1635 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1636 FnStartDL.getScope(MF->getFunction()->getContext()),
1637 // We'd like to list the prologue as "not statements" but GDB behaves
1638 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1639 DWARF2_FLAG_IS_STMT);
1643 void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1644 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1645 DIVariable DV = Var->getVariable();
1646 // Variables with positive arg numbers are parameters.
1647 if (unsigned ArgNum = DV.getArgNumber()) {
1648 // Keep all parameters in order at the start of the variable list to ensure
1649 // function types are correct (no out-of-order parameters)
1651 // This could be improved by only doing it for optimized builds (unoptimized
1652 // builds have the right order to begin with), searching from the back (this
1653 // would catch the unoptimized case quickly), or doing a binary search
1654 // rather than linear search.
1655 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1656 while (I != Vars.end()) {
1657 unsigned CurNum = (*I)->getVariable().getArgNumber();
1658 // A local (non-parameter) variable has been found, insert immediately
1662 // A later indexed parameter has been found, insert immediately before it.
1663 if (CurNum > ArgNum)
1667 Vars.insert(I, Var);
1671 Vars.push_back(Var);
1674 // Gather and emit post-function debug information.
1675 void DwarfDebug::endFunction(const MachineFunction *MF) {
1676 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
1678 // Define end label for subprogram.
1679 FunctionEndSym = Asm->GetTempSymbol("func_end",
1680 Asm->getFunctionNumber());
1681 // Assumes in correct section after the entry point.
1682 Asm->OutStreamer.EmitLabel(FunctionEndSym);
1683 // Set DwarfCompileUnitID in MCContext to default value.
1684 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1686 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1687 collectVariableInfo(MF, ProcessedVars);
1689 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1690 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1691 assert(TheCU && "Unable to find compile unit!");
1693 // Construct abstract scopes.
1694 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1695 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1696 LexicalScope *AScope = AList[i];
1697 DISubprogram SP(AScope->getScopeNode());
1699 // Collect info for variables that were optimized out.
1700 DIArray Variables = SP.getVariables();
1701 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1702 DIVariable DV(Variables.getElement(i));
1703 if (!DV || !DV.Verify() || !ProcessedVars.insert(DV))
1705 // Check that DbgVariable for DV wasn't created earlier, when
1706 // findAbstractVariable() was called for inlined instance of DV.
1707 LLVMContext &Ctx = DV->getContext();
1708 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1709 if (AbstractVariables.lookup(CleanDV))
1711 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1712 addScopeVariable(Scope, new DbgVariable(DV, NULL));
1715 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
1716 constructScopeDIE(TheCU, AScope);
1719 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
1721 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
1722 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
1725 for (DenseMap<LexicalScope *, SmallVector<DbgVariable *, 8> >::iterator
1726 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1727 DeleteContainerPointers(I->second);
1728 ScopeVariables.clear();
1729 DeleteContainerPointers(CurrentFnArguments);
1730 UserVariables.clear();
1732 AbstractVariables.clear();
1733 LabelsBeforeInsn.clear();
1734 LabelsAfterInsn.clear();
1738 // Register a source line with debug info. Returns the unique label that was
1739 // emitted and which provides correspondence to the source line list.
1740 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1746 DIDescriptor Scope(S);
1748 if (Scope.isCompileUnit()) {
1749 DICompileUnit CU(S);
1750 Fn = CU.getFilename();
1751 Dir = CU.getDirectory();
1752 } else if (Scope.isFile()) {
1754 Fn = F.getFilename();
1755 Dir = F.getDirectory();
1756 } else if (Scope.isSubprogram()) {
1758 Fn = SP.getFilename();
1759 Dir = SP.getDirectory();
1760 } else if (Scope.isLexicalBlockFile()) {
1761 DILexicalBlockFile DBF(S);
1762 Fn = DBF.getFilename();
1763 Dir = DBF.getDirectory();
1764 } else if (Scope.isLexicalBlock()) {
1765 DILexicalBlock DB(S);
1766 Fn = DB.getFilename();
1767 Dir = DB.getDirectory();
1769 llvm_unreachable("Unexpected scope info");
1771 Src = getOrCreateSourceID(Fn, Dir,
1772 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
1774 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
1777 //===----------------------------------------------------------------------===//
1779 //===----------------------------------------------------------------------===//
1781 // Compute the size and offset of a DIE.
1783 DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
1784 // Get the children.
1785 const std::vector<DIE *> &Children = Die->getChildren();
1787 // Record the abbreviation.
1788 assignAbbrevNumber(Die->getAbbrev());
1790 // Get the abbreviation for this DIE.
1791 unsigned AbbrevNumber = Die->getAbbrevNumber();
1792 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
1795 Die->setOffset(Offset);
1797 // Start the size with the size of abbreviation code.
1798 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
1800 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1801 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
1803 // Size the DIE attribute values.
1804 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1805 // Size attribute value.
1806 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
1808 // Size the DIE children if any.
1809 if (!Children.empty()) {
1810 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1811 "Children flag not set");
1813 for (unsigned j = 0, M = Children.size(); j < M; ++j)
1814 Offset = computeSizeAndOffset(Children[j], Offset);
1816 // End of children marker.
1817 Offset += sizeof(int8_t);
1820 Die->setSize(Offset - Die->getOffset());
1824 // Compute the size and offset of all the DIEs.
1825 void DwarfUnits::computeSizeAndOffsets() {
1826 // Offset from the beginning of debug info section.
1827 unsigned SecOffset = 0;
1828 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
1829 E = CUs.end(); I != E; ++I) {
1830 (*I)->setDebugInfoOffset(SecOffset);
1832 sizeof(int32_t) + // Length of Compilation Unit Info
1833 sizeof(int16_t) + // DWARF version number
1834 sizeof(int32_t) + // Offset Into Abbrev. Section
1835 sizeof(int8_t); // Pointer Size (in bytes)
1837 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
1838 SecOffset += EndOffset;
1842 // Emit initial Dwarf sections with a label at the start of each one.
1843 void DwarfDebug::emitSectionLabels() {
1844 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1846 // Dwarf sections base addresses.
1847 DwarfInfoSectionSym =
1848 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
1849 DwarfAbbrevSectionSym =
1850 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1851 if (useSplitDwarf())
1852 DwarfAbbrevDWOSectionSym =
1853 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1854 "section_abbrev_dwo");
1855 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
1857 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
1858 emitSectionSym(Asm, MacroInfo);
1860 DwarfLineSectionSym =
1861 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1862 emitSectionSym(Asm, TLOF.getDwarfLocSection());
1863 if (GenerateDwarfPubNamesSection)
1864 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1865 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
1866 DwarfStrSectionSym =
1867 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1868 if (useSplitDwarf()) {
1869 DwarfStrDWOSectionSym =
1870 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
1871 DwarfAddrSectionSym =
1872 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1874 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
1877 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
1878 "section_debug_loc");
1880 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1881 emitSectionSym(Asm, TLOF.getDataSection());
1884 // Recursively emits a debug information entry.
1885 void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
1886 // Get the abbreviation for this DIE.
1887 unsigned AbbrevNumber = Die->getAbbrevNumber();
1888 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
1890 // Emit the code (index) for the abbreviation.
1891 if (Asm->isVerbose())
1892 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1893 Twine::utohexstr(Die->getOffset()) + ":0x" +
1894 Twine::utohexstr(Die->getSize()) + " " +
1895 dwarf::TagString(Abbrev->getTag()));
1896 Asm->EmitULEB128(AbbrevNumber);
1898 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1899 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
1901 // Emit the DIE attribute values.
1902 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1903 unsigned Attr = AbbrevData[i].getAttribute();
1904 unsigned Form = AbbrevData[i].getForm();
1905 assert(Form && "Too many attributes for DIE (check abbreviation)");
1907 if (Asm->isVerbose())
1908 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
1911 case dwarf::DW_AT_abstract_origin: {
1912 DIEEntry *E = cast<DIEEntry>(Values[i]);
1913 DIE *Origin = E->getEntry();
1914 unsigned Addr = Origin->getOffset();
1915 if (Form == dwarf::DW_FORM_ref_addr) {
1916 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1917 // section. Origin->getOffset() returns the offset from start of the
1919 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1920 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1922 Asm->OutStreamer.EmitIntValue(Addr,
1923 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
1926 case dwarf::DW_AT_ranges: {
1927 // DW_AT_range Value encodes offset in debug_range section.
1928 DIEInteger *V = cast<DIEInteger>(Values[i]);
1930 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
1931 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1935 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1937 DwarfDebugRangeSectionSym,
1942 case dwarf::DW_AT_location: {
1943 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
1944 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
1945 Asm->EmitLabelReference(L->getValue(), 4);
1947 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
1949 Values[i]->EmitValue(Asm, Form);
1953 case dwarf::DW_AT_accessibility: {
1954 if (Asm->isVerbose()) {
1955 DIEInteger *V = cast<DIEInteger>(Values[i]);
1956 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
1958 Values[i]->EmitValue(Asm, Form);
1962 // Emit an attribute using the defined form.
1963 Values[i]->EmitValue(Asm, Form);
1968 // Emit the DIE children if any.
1969 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
1970 const std::vector<DIE *> &Children = Die->getChildren();
1972 for (unsigned j = 0, M = Children.size(); j < M; ++j)
1973 emitDIE(Children[j], Abbrevs);
1975 if (Asm->isVerbose())
1976 Asm->OutStreamer.AddComment("End Of Children Mark");
1981 // Emit the various dwarf units to the unit section USection with
1982 // the abbreviations going into ASection.
1983 void DwarfUnits::emitUnits(DwarfDebug *DD,
1984 const MCSection *USection,
1985 const MCSection *ASection,
1986 const MCSymbol *ASectionSym) {
1987 Asm->OutStreamer.SwitchSection(USection);
1988 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
1989 E = CUs.end(); I != E; ++I) {
1990 CompileUnit *TheCU = *I;
1991 DIE *Die = TheCU->getCUDie();
1993 // Emit the compile units header.
1995 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
1996 TheCU->getUniqueID()));
1998 // Emit size of content not including length itself
1999 unsigned ContentSize = Die->getSize() +
2000 sizeof(int16_t) + // DWARF version number
2001 sizeof(int32_t) + // Offset Into Abbrev. Section
2002 sizeof(int8_t); // Pointer Size (in bytes)
2004 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2005 Asm->EmitInt32(ContentSize);
2006 Asm->OutStreamer.AddComment("DWARF version number");
2007 Asm->EmitInt16(DD->getDwarfVersion());
2008 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2009 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2011 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2012 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2014 DD->emitDIE(Die, Abbreviations);
2015 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
2016 TheCU->getUniqueID()));
2020 /// For a given compile unit DIE, returns offset from beginning of debug info.
2021 unsigned DwarfUnits::getCUOffset(DIE *Die) {
2022 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2023 "Input DIE should be compile unit in getCUOffset.");
2024 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
2025 E = CUs.end(); I != E; ++I) {
2026 CompileUnit *TheCU = *I;
2027 if (TheCU->getCUDie() == Die)
2028 return TheCU->getDebugInfoOffset();
2030 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
2033 // Emit the debug info section.
2034 void DwarfDebug::emitDebugInfo() {
2035 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2037 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2038 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2039 DwarfAbbrevSectionSym);
2042 // Emit the abbreviation section.
2043 void DwarfDebug::emitAbbreviations() {
2044 if (!useSplitDwarf())
2045 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2048 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2051 void DwarfDebug::emitAbbrevs(const MCSection *Section,
2052 std::vector<DIEAbbrev *> *Abbrevs) {
2053 // Check to see if it is worth the effort.
2054 if (!Abbrevs->empty()) {
2055 // Start the debug abbrev section.
2056 Asm->OutStreamer.SwitchSection(Section);
2058 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
2059 Asm->OutStreamer.EmitLabel(Begin);
2061 // For each abbrevation.
2062 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
2063 // Get abbreviation data
2064 const DIEAbbrev *Abbrev = Abbrevs->at(i);
2066 // Emit the abbrevations code (base 1 index.)
2067 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2069 // Emit the abbreviations data.
2073 // Mark end of abbreviations.
2074 Asm->EmitULEB128(0, "EOM(3)");
2076 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
2077 Asm->OutStreamer.EmitLabel(End);
2081 // Emit the last address of the section and the end of the line matrix.
2082 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2083 // Define last address of section.
2084 Asm->OutStreamer.AddComment("Extended Op");
2087 Asm->OutStreamer.AddComment("Op size");
2088 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
2089 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2090 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2092 Asm->OutStreamer.AddComment("Section end label");
2094 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2095 Asm->getDataLayout().getPointerSize());
2097 // Mark end of matrix.
2098 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2104 // Emit visible names into a hashed accelerator table section.
2105 void DwarfDebug::emitAccelNames() {
2106 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2107 dwarf::DW_FORM_data4));
2108 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2109 E = CUMap.end(); I != E; ++I) {
2110 CompileUnit *TheCU = I->second;
2111 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2112 for (StringMap<std::vector<DIE*> >::const_iterator
2113 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2114 StringRef Name = GI->getKey();
2115 const std::vector<DIE *> &Entities = GI->second;
2116 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2117 DE = Entities.end(); DI != DE; ++DI)
2118 AT.AddName(Name, (*DI));
2122 AT.FinalizeTable(Asm, "Names");
2123 Asm->OutStreamer.SwitchSection(
2124 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2125 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2126 Asm->OutStreamer.EmitLabel(SectionBegin);
2128 // Emit the full data.
2129 AT.Emit(Asm, SectionBegin, &InfoHolder);
2132 // Emit objective C classes and categories into a hashed accelerator table
2134 void DwarfDebug::emitAccelObjC() {
2135 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2136 dwarf::DW_FORM_data4));
2137 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2138 E = CUMap.end(); I != E; ++I) {
2139 CompileUnit *TheCU = I->second;
2140 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2141 for (StringMap<std::vector<DIE*> >::const_iterator
2142 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2143 StringRef Name = GI->getKey();
2144 const std::vector<DIE *> &Entities = GI->second;
2145 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2146 DE = Entities.end(); DI != DE; ++DI)
2147 AT.AddName(Name, (*DI));
2151 AT.FinalizeTable(Asm, "ObjC");
2152 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2153 .getDwarfAccelObjCSection());
2154 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2155 Asm->OutStreamer.EmitLabel(SectionBegin);
2157 // Emit the full data.
2158 AT.Emit(Asm, SectionBegin, &InfoHolder);
2161 // Emit namespace dies into a hashed accelerator table.
2162 void DwarfDebug::emitAccelNamespaces() {
2163 DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2164 dwarf::DW_FORM_data4));
2165 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2166 E = CUMap.end(); I != E; ++I) {
2167 CompileUnit *TheCU = I->second;
2168 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2169 for (StringMap<std::vector<DIE*> >::const_iterator
2170 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2171 StringRef Name = GI->getKey();
2172 const std::vector<DIE *> &Entities = GI->second;
2173 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2174 DE = Entities.end(); DI != DE; ++DI)
2175 AT.AddName(Name, (*DI));
2179 AT.FinalizeTable(Asm, "namespac");
2180 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2181 .getDwarfAccelNamespaceSection());
2182 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2183 Asm->OutStreamer.EmitLabel(SectionBegin);
2185 // Emit the full data.
2186 AT.Emit(Asm, SectionBegin, &InfoHolder);
2189 // Emit type dies into a hashed accelerator table.
2190 void DwarfDebug::emitAccelTypes() {
2191 std::vector<DwarfAccelTable::Atom> Atoms;
2192 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
2193 dwarf::DW_FORM_data4));
2194 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
2195 dwarf::DW_FORM_data2));
2196 Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
2197 dwarf::DW_FORM_data1));
2198 DwarfAccelTable AT(Atoms);
2199 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2200 E = CUMap.end(); I != E; ++I) {
2201 CompileUnit *TheCU = I->second;
2202 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2203 = TheCU->getAccelTypes();
2204 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
2205 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2206 StringRef Name = GI->getKey();
2207 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
2208 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2209 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2210 AT.AddName(Name, (*DI).first, (*DI).second);
2214 AT.FinalizeTable(Asm, "types");
2215 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2216 .getDwarfAccelTypesSection());
2217 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2218 Asm->OutStreamer.EmitLabel(SectionBegin);
2220 // Emit the full data.
2221 AT.Emit(Asm, SectionBegin, &InfoHolder);
2224 /// emitDebugPubnames - Emit visible names into a debug pubnames section.
2226 void DwarfDebug::emitDebugPubnames() {
2227 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2229 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2230 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2231 CompileUnit *TheCU = I->second;
2232 unsigned ID = TheCU->getUniqueID();
2234 if (TheCU->getGlobalNames().empty())
2237 // Start the dwarf pubnames section.
2238 Asm->OutStreamer.SwitchSection(
2239 Asm->getObjFileLowering().getDwarfPubNamesSection());
2241 Asm->OutStreamer.AddComment("Length of Public Names Info");
2242 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2243 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2245 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2247 Asm->OutStreamer.AddComment("DWARF Version");
2248 Asm->EmitInt16(DwarfVersion);
2250 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2251 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2252 DwarfInfoSectionSym);
2254 Asm->OutStreamer.AddComment("Compilation Unit Length");
2255 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2256 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2259 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2260 for (StringMap<DIE*>::const_iterator
2261 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2262 const char *Name = GI->getKeyData();
2263 const DIE *Entity = GI->second;
2265 Asm->OutStreamer.AddComment("DIE offset");
2266 Asm->EmitInt32(Entity->getOffset());
2268 if (Asm->isVerbose())
2269 Asm->OutStreamer.AddComment("External Name");
2270 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
2273 Asm->OutStreamer.AddComment("End Mark");
2275 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2279 void DwarfDebug::emitDebugPubTypes() {
2280 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2281 E = CUMap.end(); I != E; ++I) {
2282 CompileUnit *TheCU = I->second;
2283 // Start the dwarf pubtypes section.
2284 Asm->OutStreamer.SwitchSection(
2285 Asm->getObjFileLowering().getDwarfPubTypesSection());
2286 Asm->OutStreamer.AddComment("Length of Public Types Info");
2287 Asm->EmitLabelDifference(
2288 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2289 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
2291 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2292 TheCU->getUniqueID()));
2294 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2295 Asm->EmitInt16(DwarfVersion);
2297 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2298 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2299 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
2300 TheCU->getUniqueID()),
2301 DwarfInfoSectionSym);
2303 Asm->OutStreamer.AddComment("Compilation Unit Length");
2304 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
2305 TheCU->getUniqueID()),
2306 Asm->GetTempSymbol(ISec->getLabelBeginName(),
2307 TheCU->getUniqueID()),
2310 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2311 for (StringMap<DIE*>::const_iterator
2312 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2313 const char *Name = GI->getKeyData();
2314 DIE *Entity = GI->second;
2316 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2317 Asm->EmitInt32(Entity->getOffset());
2319 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2320 // Emit the name with a terminating null byte.
2321 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
2324 Asm->OutStreamer.AddComment("End Mark");
2326 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2327 TheCU->getUniqueID()));
2331 // Emit strings into a string section.
2332 void DwarfUnits::emitStrings(const MCSection *StrSection,
2333 const MCSection *OffsetSection = NULL,
2334 const MCSymbol *StrSecSym = NULL) {
2336 if (StringPool.empty()) return;
2338 // Start the dwarf str section.
2339 Asm->OutStreamer.SwitchSection(StrSection);
2341 // Get all of the string pool entries and put them in an array by their ID so
2342 // we can sort them.
2343 SmallVector<std::pair<unsigned,
2344 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2346 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2347 I = StringPool.begin(), E = StringPool.end();
2349 Entries.push_back(std::make_pair(I->second.second, &*I));
2351 array_pod_sort(Entries.begin(), Entries.end());
2353 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2354 // Emit a label for reference from debug information entries.
2355 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2357 // Emit the string itself with a terminating null byte.
2358 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
2359 Entries[i].second->getKeyLength()+1));
2362 // If we've got an offset section go ahead and emit that now as well.
2363 if (OffsetSection) {
2364 Asm->OutStreamer.SwitchSection(OffsetSection);
2365 unsigned offset = 0;
2366 unsigned size = 4; // FIXME: DWARF64 is 8.
2367 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2368 Asm->OutStreamer.EmitIntValue(offset, size);
2369 offset += Entries[i].second->getKeyLength() + 1;
2374 // Emit strings into a string section.
2375 void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2377 if (AddressPool.empty()) return;
2379 // Start the dwarf addr section.
2380 Asm->OutStreamer.SwitchSection(AddrSection);
2382 // Get all of the address pool entries and put them in an array by their ID so
2383 // we can sort them.
2384 SmallVector<std::pair<unsigned, const MCExpr *>, 64> Entries;
2386 for (DenseMap<const MCExpr *, unsigned>::iterator
2387 I = AddressPool.begin(),
2388 E = AddressPool.end();
2390 Entries.push_back(std::make_pair(I->second, I->first));
2392 array_pod_sort(Entries.begin(), Entries.end());
2394 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2395 // Emit an expression for reference from debug information entries.
2396 if (const MCExpr *Expr = Entries[i].second)
2397 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
2399 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2404 // Emit visible names into a debug str section.
2405 void DwarfDebug::emitDebugStr() {
2406 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2407 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2410 // Emit locations into the debug loc section.
2411 void DwarfDebug::emitDebugLoc() {
2412 if (DotDebugLocEntries.empty())
2415 for (SmallVectorImpl<DotDebugLocEntry>::iterator
2416 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2418 DotDebugLocEntry &Entry = *I;
2419 if (I + 1 != DotDebugLocEntries.end())
2423 // Start the dwarf loc section.
2424 Asm->OutStreamer.SwitchSection(
2425 Asm->getObjFileLowering().getDwarfLocSection());
2426 unsigned char Size = Asm->getDataLayout().getPointerSize();
2427 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2429 for (SmallVectorImpl<DotDebugLocEntry>::iterator
2430 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2431 I != E; ++I, ++index) {
2432 DotDebugLocEntry &Entry = *I;
2433 if (Entry.isMerged()) continue;
2434 if (Entry.isEmpty()) {
2435 Asm->OutStreamer.EmitIntValue(0, Size);
2436 Asm->OutStreamer.EmitIntValue(0, Size);
2437 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2439 Asm->OutStreamer.EmitSymbolValue(Entry.Begin, Size);
2440 Asm->OutStreamer.EmitSymbolValue(Entry.End, Size);
2441 DIVariable DV(Entry.Variable);
2442 Asm->OutStreamer.AddComment("Loc expr size");
2443 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2444 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2445 Asm->EmitLabelDifference(end, begin, 2);
2446 Asm->OutStreamer.EmitLabel(begin);
2447 if (Entry.isInt()) {
2448 DIBasicType BTy(DV.getType());
2450 (BTy.getEncoding() == dwarf::DW_ATE_signed
2451 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2452 Asm->OutStreamer.AddComment("DW_OP_consts");
2453 Asm->EmitInt8(dwarf::DW_OP_consts);
2454 Asm->EmitSLEB128(Entry.getInt());
2456 Asm->OutStreamer.AddComment("DW_OP_constu");
2457 Asm->EmitInt8(dwarf::DW_OP_constu);
2458 Asm->EmitULEB128(Entry.getInt());
2460 } else if (Entry.isLocation()) {
2461 if (!DV.hasComplexAddress())
2463 Asm->EmitDwarfRegOp(Entry.Loc, DV.isIndirect());
2465 // Complex address entry.
2466 unsigned N = DV.getNumAddrElements();
2468 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2469 if (Entry.Loc.getOffset()) {
2471 Asm->EmitDwarfRegOp(Entry.Loc, DV.isIndirect());
2472 Asm->OutStreamer.AddComment("DW_OP_deref");
2473 Asm->EmitInt8(dwarf::DW_OP_deref);
2474 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2475 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2476 Asm->EmitSLEB128(DV.getAddrElement(1));
2478 // If first address element is OpPlus then emit
2479 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2480 MachineLocation Loc(Entry.Loc.getReg(), DV.getAddrElement(1));
2481 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
2485 Asm->EmitDwarfRegOp(Entry.Loc, DV.isIndirect());
2488 // Emit remaining complex address elements.
2489 for (; i < N; ++i) {
2490 uint64_t Element = DV.getAddrElement(i);
2491 if (Element == DIBuilder::OpPlus) {
2492 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2493 Asm->EmitULEB128(DV.getAddrElement(++i));
2494 } else if (Element == DIBuilder::OpDeref) {
2495 if (!Entry.Loc.isReg())
2496 Asm->EmitInt8(dwarf::DW_OP_deref);
2498 llvm_unreachable("unknown Opcode found in complex address");
2502 // else ... ignore constant fp. There is not any good way to
2503 // to represent them here in dwarf.
2504 Asm->OutStreamer.EmitLabel(end);
2509 // Emit visible names into a debug aranges section.
2510 void DwarfDebug::emitDebugARanges() {
2511 // Start the dwarf aranges section.
2512 Asm->OutStreamer.SwitchSection(
2513 Asm->getObjFileLowering().getDwarfARangesSection());
2516 // Emit visible names into a debug ranges section.
2517 void DwarfDebug::emitDebugRanges() {
2518 // Start the dwarf ranges section.
2519 Asm->OutStreamer.SwitchSection(
2520 Asm->getObjFileLowering().getDwarfRangesSection());
2521 unsigned char Size = Asm->getDataLayout().getPointerSize();
2522 for (SmallVectorImpl<const MCSymbol *>::iterator
2523 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2526 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
2528 Asm->OutStreamer.EmitIntValue(0, Size);
2532 // Emit visible names into a debug macinfo section.
2533 void DwarfDebug::emitDebugMacInfo() {
2534 if (const MCSection *LineInfo =
2535 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2536 // Start the dwarf macinfo section.
2537 Asm->OutStreamer.SwitchSection(LineInfo);
2541 // Emit inline info using following format.
2543 // 1. length of section
2544 // 2. Dwarf version number
2547 // Entries (one "entry" for each function that was inlined):
2549 // 1. offset into __debug_str section for MIPS linkage name, if exists;
2550 // otherwise offset into __debug_str for regular function name.
2551 // 2. offset into __debug_str section for regular function name.
2552 // 3. an unsigned LEB128 number indicating the number of distinct inlining
2553 // instances for the function.
2555 // The rest of the entry consists of a {die_offset, low_pc} pair for each
2556 // inlined instance; the die_offset points to the inlined_subroutine die in the
2557 // __debug_info section, and the low_pc is the starting address for the
2558 // inlining instance.
2559 void DwarfDebug::emitDebugInlineInfo() {
2560 if (!Asm->MAI->doesDwarfUseInlineInfoSection())
2566 Asm->OutStreamer.SwitchSection(
2567 Asm->getObjFileLowering().getDwarfDebugInlineSection());
2569 Asm->OutStreamer.AddComment("Length of Debug Inlined Information Entry");
2570 Asm->EmitLabelDifference(Asm->GetTempSymbol("debug_inlined_end", 1),
2571 Asm->GetTempSymbol("debug_inlined_begin", 1), 4);
2573 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_begin", 1));
2575 Asm->OutStreamer.AddComment("Dwarf Version");
2576 Asm->EmitInt16(DwarfVersion);
2577 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2578 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2580 for (SmallVectorImpl<const MDNode *>::iterator I = InlinedSPNodes.begin(),
2581 E = InlinedSPNodes.end(); I != E; ++I) {
2583 const MDNode *Node = *I;
2584 DenseMap<const MDNode *, SmallVector<InlineInfoLabels, 4> >::iterator II
2585 = InlineInfo.find(Node);
2586 SmallVectorImpl<InlineInfoLabels> &Labels = II->second;
2587 DISubprogram SP(Node);
2588 StringRef LName = SP.getLinkageName();
2589 StringRef Name = SP.getName();
2591 Asm->OutStreamer.AddComment("MIPS linkage name");
2593 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2594 DwarfStrSectionSym);
2596 Asm->EmitSectionOffset(
2597 InfoHolder.getStringPoolEntry(Function::getRealLinkageName(LName)),
2598 DwarfStrSectionSym);
2600 Asm->OutStreamer.AddComment("Function name");
2601 Asm->EmitSectionOffset(InfoHolder.getStringPoolEntry(Name),
2602 DwarfStrSectionSym);
2603 Asm->EmitULEB128(Labels.size(), "Inline count");
2605 for (SmallVectorImpl<InlineInfoLabels>::iterator LI = Labels.begin(),
2606 LE = Labels.end(); LI != LE; ++LI) {
2607 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2608 Asm->EmitInt32(LI->second->getOffset());
2610 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("low_pc");
2611 Asm->OutStreamer.EmitSymbolValue(LI->first,
2612 Asm->getDataLayout().getPointerSize());
2616 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_inlined_end", 1));
2619 // DWARF5 Experimental Separate Dwarf emitters.
2621 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2622 // DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2623 // DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2624 // DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
2625 CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
2626 DICompileUnit DIUnit(N);
2627 CompilationDir = DIUnit.getDirectory();
2629 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
2630 CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
2631 DIUnit.getLanguage(), Die, N, Asm,
2632 this, &SkeletonHolder);
2634 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2635 DIUnit.getSplitDebugFilename());
2637 // This should be a unique identifier when we want to build .dwp files.
2638 NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0);
2640 // Relocate to the beginning of the addr_base section, else 0 for the
2641 // beginning of the one for this compile unit.
2642 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2643 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2644 DwarfAddrSectionSym);
2646 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2647 dwarf::DW_FORM_sec_offset, 0);
2649 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
2650 // into an entity. We're using 0, or a NULL label for this.
2651 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
2653 // DW_AT_stmt_list is a offset of line number information for this
2654 // compile unit in debug_line section.
2655 // FIXME: Should handle multiple compile units.
2656 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2657 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
2658 DwarfLineSectionSym);
2660 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
2662 if (!CompilationDir.empty())
2663 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2665 SkeletonHolder.addUnit(NewCU);
2666 SkeletonCUs.push_back(NewCU);
2671 void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2672 assert(useSplitDwarf() && "No split dwarf debug info?");
2673 emitAbbrevs(Section, &SkeletonAbbrevs);
2676 // Emit the .debug_info.dwo section for separated dwarf. This contains the
2677 // compile units that would normally be in debug_info.
2678 void DwarfDebug::emitDebugInfoDWO() {
2679 assert(useSplitDwarf() && "No split dwarf debug info?");
2680 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
2681 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2682 DwarfAbbrevDWOSectionSym);
2685 // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2686 // abbreviations for the .debug_info.dwo section.
2687 void DwarfDebug::emitDebugAbbrevDWO() {
2688 assert(useSplitDwarf() && "No split dwarf?");
2689 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2693 // Emit the .debug_str.dwo section for separated dwarf. This contains the
2694 // string section and is identical in format to traditional .debug_str
2696 void DwarfDebug::emitDebugStrDWO() {
2697 assert(useSplitDwarf() && "No split dwarf?");
2698 const MCSection *OffSec = Asm->getObjFileLowering()
2699 .getDwarfStrOffDWOSection();
2700 const MCSymbol *StrSym = DwarfStrSectionSym;
2701 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),