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"
18 #include "DwarfAccelTable.h"
19 #include "DwarfCompileUnit.h"
20 #include "llvm/ADT/STLExtras.h"
21 #include "llvm/ADT/Statistic.h"
22 #include "llvm/ADT/StringExtras.h"
23 #include "llvm/ADT/Triple.h"
24 #include "llvm/CodeGen/MachineFunction.h"
25 #include "llvm/CodeGen/MachineModuleInfo.h"
26 #include "llvm/DIBuilder.h"
27 #include "llvm/DebugInfo.h"
28 #include "llvm/IR/Constants.h"
29 #include "llvm/IR/DataLayout.h"
30 #include "llvm/IR/Instructions.h"
31 #include "llvm/IR/Module.h"
32 #include "llvm/MC/MCAsmInfo.h"
33 #include "llvm/MC/MCSection.h"
34 #include "llvm/MC/MCStreamer.h"
35 #include "llvm/MC/MCSymbol.h"
36 #include "llvm/Support/CommandLine.h"
37 #include "llvm/Support/Debug.h"
38 #include "llvm/Support/Dwarf.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include "llvm/Support/FormattedStream.h"
41 #include "llvm/Support/MD5.h"
42 #include "llvm/Support/Path.h"
43 #include "llvm/Support/Timer.h"
44 #include "llvm/Support/ValueHandle.h"
45 #include "llvm/Target/TargetFrameLowering.h"
46 #include "llvm/Target/TargetLoweringObjectFile.h"
47 #include "llvm/Target/TargetMachine.h"
48 #include "llvm/Target/TargetOptions.h"
49 #include "llvm/Target/TargetRegisterInfo.h"
53 DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
54 cl::desc("Disable debug info printing"));
56 static cl::opt<bool> UnknownLocations(
57 "use-unknown-locations", cl::Hidden,
58 cl::desc("Make an absence of debug location information explicit."),
62 GenerateODRHash("generate-odr-hash", cl::Hidden,
63 cl::desc("Add an ODR hash to external type DIEs."),
67 GenerateCUHash("generate-cu-hash", cl::Hidden,
68 cl::desc("Add the CU hash as the dwo_id."),
79 static cl::opt<DefaultOnOff>
80 DwarfAccelTables("dwarf-accel-tables", cl::Hidden,
81 cl::desc("Output prototype dwarf accelerator tables."),
82 cl::values(clEnumVal(Default, "Default for platform"),
83 clEnumVal(Enable, "Enabled"),
84 clEnumVal(Disable, "Disabled"), clEnumValEnd),
87 static cl::opt<DefaultOnOff>
88 SplitDwarf("split-dwarf", cl::Hidden,
89 cl::desc("Output prototype dwarf split debug info."),
90 cl::values(clEnumVal(Default, "Default for platform"),
91 clEnumVal(Enable, "Enabled"),
92 clEnumVal(Disable, "Disabled"), clEnumValEnd),
95 static cl::opt<DefaultOnOff>
96 DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
97 cl::desc("Generate DWARF pubnames and pubtypes sections"),
98 cl::values(clEnumVal(Default, "Default for platform"),
99 clEnumVal(Enable, "Enabled"),
100 clEnumVal(Disable, "Disabled"), clEnumValEnd),
103 static const char *const DWARFGroupName = "DWARF Emission";
104 static const char *const DbgTimerName = "DWARF Debug Writer";
106 //===----------------------------------------------------------------------===//
108 // Configuration values for initial hash set sizes (log2).
110 static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
114 DIType DbgVariable::getType() const {
115 DIType Ty = Var.getType();
116 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
117 // addresses instead.
118 if (Var.isBlockByrefVariable()) {
119 /* Byref variables, in Blocks, are declared by the programmer as
120 "SomeType VarName;", but the compiler creates a
121 __Block_byref_x_VarName struct, and gives the variable VarName
122 either the struct, or a pointer to the struct, as its type. This
123 is necessary for various behind-the-scenes things the compiler
124 needs to do with by-reference variables in blocks.
126 However, as far as the original *programmer* is concerned, the
127 variable should still have type 'SomeType', as originally declared.
129 The following function dives into the __Block_byref_x_VarName
130 struct to find the original type of the variable. This will be
131 passed back to the code generating the type for the Debug
132 Information Entry for the variable 'VarName'. 'VarName' will then
133 have the original type 'SomeType' in its debug information.
135 The original type 'SomeType' will be the type of the field named
136 'VarName' inside the __Block_byref_x_VarName struct.
138 NOTE: In order for this to not completely fail on the debugger
139 side, the Debug Information Entry for the variable VarName needs to
140 have a DW_AT_location that tells the debugger how to unwind through
141 the pointers and __Block_byref_x_VarName struct to find the actual
142 value of the variable. The function addBlockByrefType does this. */
144 uint16_t tag = Ty.getTag();
146 if (tag == dwarf::DW_TAG_pointer_type)
147 subType = DIDerivedType(Ty).getTypeDerivedFrom();
149 DIArray Elements = DICompositeType(subType).getTypeArray();
150 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
151 DIDerivedType DT = DIDerivedType(Elements.getElement(i));
152 if (getName() == DT.getName())
153 return (DT.getTypeDerivedFrom());
159 } // end llvm namespace
161 /// Return Dwarf Version by checking module flags.
162 static unsigned getDwarfVersionFromModule(const Module *M) {
163 Value *Val = M->getModuleFlag("Dwarf Version");
165 return dwarf::DWARF_VERSION;
166 return cast<ConstantInt>(Val)->getZExtValue();
169 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
170 : Asm(A), MMI(Asm->MMI), FirstCU(0),
171 AbbreviationsSet(InitAbbreviationsSetSize),
172 SourceIdMap(DIEValueAllocator),
173 PrevLabel(NULL), GlobalCUIndexCount(0),
174 InfoHolder(A, &AbbreviationsSet, &Abbreviations, "info_string",
176 SkeletonAbbrevSet(InitAbbreviationsSetSize),
177 SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, "skel_string",
180 DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
181 DwarfStrSectionSym = TextSectionSym = 0;
182 DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = DwarfLineSectionSym = 0;
183 DwarfAddrSectionSym = 0;
184 DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
185 FunctionBeginSym = FunctionEndSym = 0;
187 // Turn on accelerator tables and older gdb compatibility
188 // for Darwin by default, pubnames by default for non-Darwin,
189 // and handle split dwarf.
190 bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
192 if (DwarfAccelTables == Default)
193 HasDwarfAccelTables = IsDarwin;
195 HasDwarfAccelTables = DwarfAccelTables == Enable;
197 if (SplitDwarf == Default)
198 HasSplitDwarf = false;
200 HasSplitDwarf = SplitDwarf == Enable;
202 if (DwarfPubSections == Default)
203 HasDwarfPubSections = !IsDarwin;
205 HasDwarfPubSections = DwarfPubSections == Enable;
207 DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
210 NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
214 DwarfDebug::~DwarfDebug() {
217 // Switch to the specified MCSection and emit an assembler
218 // temporary label to it if SymbolStem is specified.
219 static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
220 const char *SymbolStem = 0) {
221 Asm->OutStreamer.SwitchSection(Section);
222 if (!SymbolStem) return 0;
224 MCSymbol *TmpSym = Asm->GetTempSymbol(SymbolStem);
225 Asm->OutStreamer.EmitLabel(TmpSym);
229 MCSymbol *DwarfUnits::getStringPoolSym() {
230 return Asm->GetTempSymbol(StringPref);
233 MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
234 std::pair<MCSymbol*, unsigned> &Entry =
235 StringPool.GetOrCreateValue(Str).getValue();
236 if (Entry.first) return Entry.first;
238 Entry.second = NextStringPoolNumber++;
239 return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
242 unsigned DwarfUnits::getStringPoolIndex(StringRef Str) {
243 std::pair<MCSymbol*, unsigned> &Entry =
244 StringPool.GetOrCreateValue(Str).getValue();
245 if (Entry.first) return Entry.second;
247 Entry.second = NextStringPoolNumber++;
248 Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
252 unsigned DwarfUnits::getAddrPoolIndex(const MCSymbol *Sym) {
253 return getAddrPoolIndex(MCSymbolRefExpr::Create(Sym, Asm->OutContext));
256 unsigned DwarfUnits::getAddrPoolIndex(const MCExpr *Sym) {
257 std::pair<DenseMap<const MCExpr *, unsigned>::iterator, bool> P =
258 AddressPool.insert(std::make_pair(Sym, NextAddrPoolNumber));
260 ++NextAddrPoolNumber;
261 return P.first->second;
264 // Define a unique number for the abbreviation.
266 void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
267 // Check the set for priors.
268 DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
270 // If it's newly added.
271 if (InSet == &Abbrev) {
272 // Add to abbreviation list.
273 Abbreviations->push_back(&Abbrev);
275 // Assign the vector position + 1 as its number.
276 Abbrev.setNumber(Abbreviations->size());
278 // Assign existing abbreviation number.
279 Abbrev.setNumber(InSet->getNumber());
283 static bool isObjCClass(StringRef Name) {
284 return Name.startswith("+") || Name.startswith("-");
287 static bool hasObjCCategory(StringRef Name) {
288 if (!isObjCClass(Name)) return false;
290 return Name.find(") ") != StringRef::npos;
293 static void getObjCClassCategory(StringRef In, StringRef &Class,
294 StringRef &Category) {
295 if (!hasObjCCategory(In)) {
296 Class = In.slice(In.find('[') + 1, In.find(' '));
301 Class = In.slice(In.find('[') + 1, In.find('('));
302 Category = In.slice(In.find('[') + 1, In.find(' '));
306 static StringRef getObjCMethodName(StringRef In) {
307 return In.slice(In.find(' ') + 1, In.find(']'));
310 // Add the various names to the Dwarf accelerator table names.
311 static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP,
313 if (!SP.isDefinition()) return;
315 TheCU->addAccelName(SP.getName(), Die);
317 // If the linkage name is different than the name, go ahead and output
318 // that as well into the name table.
319 if (SP.getLinkageName() != "" && SP.getName() != SP.getLinkageName())
320 TheCU->addAccelName(SP.getLinkageName(), Die);
322 // If this is an Objective-C selector name add it to the ObjC accelerator
324 if (isObjCClass(SP.getName())) {
325 StringRef Class, Category;
326 getObjCClassCategory(SP.getName(), Class, Category);
327 TheCU->addAccelObjC(Class, Die);
329 TheCU->addAccelObjC(Category, Die);
330 // Also add the base method name to the name table.
331 TheCU->addAccelName(getObjCMethodName(SP.getName()), Die);
335 /// isSubprogramContext - Return true if Context is either a subprogram
336 /// or another context nested inside a subprogram.
337 bool DwarfDebug::isSubprogramContext(const MDNode *Context) {
340 DIDescriptor D(Context);
341 if (D.isSubprogram())
344 return isSubprogramContext(resolve(DIType(Context).getContext()));
348 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
349 // and DW_AT_high_pc attributes. If there are global variables in this
350 // scope then create and insert DIEs for these variables.
351 DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
352 const MDNode *SPNode) {
353 DIE *SPDie = SPCU->getDIE(SPNode);
355 assert(SPDie && "Unable to find subprogram DIE!");
356 DISubprogram SP(SPNode);
358 // If we're updating an abstract DIE, then we will be adding the children and
359 // object pointer later on. But what we don't want to do is process the
360 // concrete DIE twice.
361 DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode);
363 bool InSameCU = (AbsSPDIE->getCompileUnit() == SPCU->getCUDie());
364 // Pick up abstract subprogram DIE.
365 SPDie = new DIE(dwarf::DW_TAG_subprogram);
366 // If AbsSPDIE belongs to a different CU, use DW_FORM_ref_addr instead of
368 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
369 InSameCU ? dwarf::DW_FORM_ref4 : dwarf::DW_FORM_ref_addr,
373 DISubprogram SPDecl = SP.getFunctionDeclaration();
374 if (!SPDecl.isSubprogram()) {
375 // There is not any need to generate specification DIE for a function
376 // defined at compile unit level. If a function is defined inside another
377 // function then gdb prefers the definition at top level and but does not
378 // expect specification DIE in parent function. So avoid creating
379 // specification DIE for a function defined inside a function.
380 if (SP.isDefinition() && !SP.getContext().isCompileUnit() &&
381 !SP.getContext().isFile() &&
382 !isSubprogramContext(SP.getContext())) {
383 SPCU->addFlag(SPDie, dwarf::DW_AT_declaration);
386 DICompositeType SPTy = SP.getType();
387 DIArray Args = SPTy.getTypeArray();
388 uint16_t SPTag = SPTy.getTag();
389 if (SPTag == dwarf::DW_TAG_subroutine_type)
390 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
391 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
392 DIType ATy = DIType(Args.getElement(i));
393 SPCU->addType(Arg, ATy);
394 if (ATy.isArtificial())
395 SPCU->addFlag(Arg, dwarf::DW_AT_artificial);
396 if (ATy.isObjectPointer())
397 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_object_pointer,
398 dwarf::DW_FORM_ref4, Arg);
399 SPDie->addChild(Arg);
401 DIE *SPDeclDie = SPDie;
402 SPDie = new DIE(dwarf::DW_TAG_subprogram);
403 SPCU->addDIEEntry(SPDie, dwarf::DW_AT_specification,
404 dwarf::DW_FORM_ref4, SPDeclDie);
410 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_low_pc,
411 Asm->GetTempSymbol("func_begin",
412 Asm->getFunctionNumber()));
413 SPCU->addLabelAddress(SPDie, dwarf::DW_AT_high_pc,
414 Asm->GetTempSymbol("func_end",
415 Asm->getFunctionNumber()));
416 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo();
417 MachineLocation Location(RI->getFrameRegister(*Asm->MF));
418 SPCU->addAddress(SPDie, dwarf::DW_AT_frame_base, Location);
420 // Add name to the name table, we do this here because we're guaranteed
421 // to have concrete versions of our DW_TAG_subprogram nodes.
422 addSubprogramNames(SPCU, SP, SPDie);
427 bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
428 if (Scope->isAbstractScope())
431 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
435 if (Ranges.size() > 1)
438 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
439 MCSymbol *End = getLabelAfterInsn(RI->second);
443 // Construct new DW_TAG_lexical_block for this scope and attach
444 // DW_AT_low_pc/DW_AT_high_pc labels.
445 DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
446 LexicalScope *Scope) {
447 if (isLexicalScopeDIENull(Scope))
450 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
451 if (Scope->isAbstractScope())
454 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
455 // If we have multiple ranges, emit them into the range section.
456 if (Ranges.size() > 1) {
457 // .debug_range section has not been laid out yet. Emit offset in
458 // .debug_range as a uint, size 4, for now. emitDIE will handle
459 // DW_AT_ranges appropriately.
460 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
461 DebugRangeSymbols.size()
462 * Asm->getDataLayout().getPointerSize());
463 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
464 RE = Ranges.end(); RI != RE; ++RI) {
465 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
466 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
469 // Terminate the range list.
470 DebugRangeSymbols.push_back(NULL);
471 DebugRangeSymbols.push_back(NULL);
475 // Construct the address range for this DIE.
476 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
477 MCSymbol *Start = getLabelBeforeInsn(RI->first);
478 MCSymbol *End = getLabelAfterInsn(RI->second);
479 assert(End && "End label should not be null!");
481 assert(Start->isDefined() && "Invalid starting label for an inlined scope!");
482 assert(End->isDefined() && "Invalid end label for an inlined scope!");
484 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, Start);
485 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, End);
490 // This scope represents inlined body of a function. Construct DIE to
491 // represent this concrete inlined copy of the function.
492 DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
493 LexicalScope *Scope) {
494 const SmallVectorImpl<InsnRange> &Ranges = Scope->getRanges();
495 assert(Ranges.empty() == false &&
496 "LexicalScope does not have instruction markers!");
498 if (!Scope->getScopeNode())
500 DIScope DS(Scope->getScopeNode());
501 DISubprogram InlinedSP = getDISubprogram(DS);
502 DIE *OriginDIE = TheCU->getDIE(InlinedSP);
504 DEBUG(dbgs() << "Unable to find original DIE for an inlined subprogram.");
508 DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
509 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin,
510 dwarf::DW_FORM_ref4, OriginDIE);
512 if (Ranges.size() > 1) {
513 // .debug_range section has not been laid out yet. Emit offset in
514 // .debug_range as a uint, size 4, for now. emitDIE will handle
515 // DW_AT_ranges appropriately.
516 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
517 DebugRangeSymbols.size()
518 * Asm->getDataLayout().getPointerSize());
519 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
520 RE = Ranges.end(); RI != RE; ++RI) {
521 DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
522 DebugRangeSymbols.push_back(getLabelAfterInsn(RI->second));
524 DebugRangeSymbols.push_back(NULL);
525 DebugRangeSymbols.push_back(NULL);
527 SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin();
528 MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
529 MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
531 if (StartLabel == 0 || EndLabel == 0)
532 llvm_unreachable("Unexpected Start and End labels for an inlined scope!");
534 assert(StartLabel->isDefined() &&
535 "Invalid starting label for an inlined scope!");
536 assert(EndLabel->isDefined() && "Invalid end label for an inlined scope!");
538 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_low_pc, StartLabel);
539 TheCU->addLabelAddress(ScopeDIE, dwarf::DW_AT_high_pc, EndLabel);
542 InlinedSubprogramDIEs.insert(OriginDIE);
544 // Add the call site information to the DIE.
545 DILocation DL(Scope->getInlinedAt());
546 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_file, 0,
547 getOrCreateSourceID(DL.getFilename(), DL.getDirectory(),
548 TheCU->getUniqueID()));
549 TheCU->addUInt(ScopeDIE, dwarf::DW_AT_call_line, 0, DL.getLineNumber());
551 // Add name to the name table, we do this here because we're guaranteed
552 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
553 addSubprogramNames(TheCU, InlinedSP, ScopeDIE);
558 DIE *DwarfDebug::createScopeChildrenDIE(CompileUnit *TheCU, LexicalScope *Scope,
559 SmallVectorImpl<DIE*> &Children) {
560 DIE *ObjectPointer = NULL;
562 // Collect arguments for current function.
563 if (LScopes.isCurrentFunctionScope(Scope))
564 for (unsigned i = 0, N = CurrentFnArguments.size(); i < N; ++i)
565 if (DbgVariable *ArgDV = CurrentFnArguments[i])
567 TheCU->constructVariableDIE(ArgDV, Scope->isAbstractScope())) {
568 Children.push_back(Arg);
569 if (ArgDV->isObjectPointer()) ObjectPointer = Arg;
572 // Collect lexical scope children first.
573 const SmallVectorImpl<DbgVariable *> &Variables =ScopeVariables.lookup(Scope);
574 for (unsigned i = 0, N = Variables.size(); i < N; ++i)
576 TheCU->constructVariableDIE(Variables[i], Scope->isAbstractScope())) {
577 Children.push_back(Variable);
578 if (Variables[i]->isObjectPointer()) ObjectPointer = Variable;
580 const SmallVectorImpl<LexicalScope *> &Scopes = Scope->getChildren();
581 for (unsigned j = 0, M = Scopes.size(); j < M; ++j)
582 if (DIE *Nested = constructScopeDIE(TheCU, Scopes[j]))
583 Children.push_back(Nested);
584 return ObjectPointer;
587 // Construct a DIE for this scope.
588 DIE *DwarfDebug::constructScopeDIE(CompileUnit *TheCU, LexicalScope *Scope) {
589 if (!Scope || !Scope->getScopeNode())
592 DIScope DS(Scope->getScopeNode());
594 SmallVector<DIE *, 8> Children;
595 DIE *ObjectPointer = NULL;
596 bool ChildrenCreated = false;
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 if (isLexicalScopeDIENull(Scope))
615 // We create children only when we know the scope DIE is not going to be
617 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
618 ChildrenCreated = true;
619 // There is no need to emit empty lexical block DIE.
620 std::pair<ImportedEntityMap::const_iterator,
621 ImportedEntityMap::const_iterator> Range = std::equal_range(
622 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(),
623 std::pair<const MDNode *, const MDNode *>(DS, (const MDNode*)0),
625 if (Children.empty() && Range.first == Range.second)
627 ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
628 assert(ScopeDIE && "Scope DIE should not be null.");
629 for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
631 constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
635 assert(Children.empty() &&
636 "We create children only when the scope DIE is not null.");
639 if (!ChildrenCreated)
640 ObjectPointer = createScopeChildrenDIE(TheCU, Scope, Children);
643 for (SmallVectorImpl<DIE *>::iterator I = Children.begin(),
644 E = Children.end(); I != E; ++I)
645 ScopeDIE->addChild(*I);
647 if (DS.isSubprogram() && ObjectPointer != NULL)
648 TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
649 dwarf::DW_FORM_ref4, ObjectPointer);
651 if (DS.isSubprogram())
652 TheCU->addPubTypes(DISubprogram(DS));
657 // Look up the source id with the given directory and source file names.
658 // If none currently exists, create a new id and insert it in the
659 // SourceIds map. This can update DirectoryNames and SourceFileNames maps
661 unsigned DwarfDebug::getOrCreateSourceID(StringRef FileName,
662 StringRef DirName, unsigned CUID) {
663 // If we use .loc in assembly, we can't separate .file entries according to
664 // compile units. Thus all files will belong to the default compile unit.
665 if (Asm->TM.hasMCUseLoc() &&
666 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
669 // If FE did not provide a file name, then assume stdin.
670 if (FileName.empty())
671 return getOrCreateSourceID("<stdin>", StringRef(), CUID);
673 // TODO: this might not belong here. See if we can factor this better.
674 if (DirName == CompilationDir)
677 // FileIDCUMap stores the current ID for the given compile unit.
678 unsigned SrcId = FileIDCUMap[CUID] + 1;
680 // We look up the CUID/file/dir by concatenating them with a zero byte.
681 SmallString<128> NamePair;
682 NamePair += utostr(CUID);
685 NamePair += '\0'; // Zero bytes are not allowed in paths.
686 NamePair += FileName;
688 StringMapEntry<unsigned> &Ent = SourceIdMap.GetOrCreateValue(NamePair, SrcId);
689 if (Ent.getValue() != SrcId)
690 return Ent.getValue();
692 FileIDCUMap[CUID] = SrcId;
693 // Print out a .file directive to specify files for .loc directives.
694 Asm->OutStreamer.EmitDwarfFileDirective(SrcId, DirName, FileName, CUID);
699 // Create new CompileUnit for the given metadata node with tag
700 // DW_TAG_compile_unit.
701 CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
702 DICompileUnit DIUnit(N);
703 StringRef FN = DIUnit.getFilename();
704 CompilationDir = DIUnit.getDirectory();
706 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
708 new CompileUnit(GlobalCUIndexCount++, Die, N, Asm, this, &InfoHolder);
710 FileIDCUMap[NewCU->getUniqueID()] = 0;
711 // Call this to emit a .file directive if it wasn't emitted for the source
712 // file this CU comes from yet.
713 getOrCreateSourceID(FN, CompilationDir, NewCU->getUniqueID());
715 NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());
716 NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
717 DIUnit.getLanguage());
718 NewCU->addString(Die, dwarf::DW_AT_name, FN);
720 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
721 // into an entity. We're using 0 (or a NULL label) for this. For
722 // split dwarf it's in the skeleton CU so omit it here.
723 if (!useSplitDwarf())
724 NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL);
726 // Define start line table label for each Compile Unit.
727 MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start",
728 NewCU->getUniqueID());
729 Asm->OutStreamer.getContext().setMCLineTableSymbol(LineTableStartSym,
730 NewCU->getUniqueID());
732 // Use a single line table if we are using .loc and generating assembly.
734 (Asm->TM.hasMCUseLoc() &&
735 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer) ||
736 (NewCU->getUniqueID() == 0);
738 // DW_AT_stmt_list is a offset of line number information for this
739 // compile unit in debug_line section. For split dwarf this is
740 // left in the skeleton CU and so not included.
741 // The line table entries are not always emitted in assembly, so it
742 // is not okay to use line_table_start here.
743 if (!useSplitDwarf()) {
744 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
745 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
747 Asm->GetTempSymbol("section_line") : LineTableStartSym);
748 else if (UseTheFirstCU)
749 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
751 NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
752 LineTableStartSym, DwarfLineSectionSym);
755 // If we're using split dwarf the compilation dir is going to be in the
756 // skeleton CU and so we don't need to duplicate it here.
757 if (!useSplitDwarf() && !CompilationDir.empty())
758 NewCU->addString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
759 if (DIUnit.isOptimized())
760 NewCU->addFlag(Die, dwarf::DW_AT_APPLE_optimized);
762 StringRef Flags = DIUnit.getFlags();
764 NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);
766 if (unsigned RVer = DIUnit.getRunTimeVersion())
767 NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
768 dwarf::DW_FORM_data1, RVer);
773 InfoHolder.addUnit(NewCU);
775 CUMap.insert(std::make_pair(N, NewCU));
779 // Construct subprogram DIE.
780 void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
782 CompileUnit *&CURef = SPMap[N];
788 if (!SP.isDefinition())
789 // This is a method declaration which will be handled while constructing
793 DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
796 TheCU->insertDIE(N, SubprogramDie);
798 // Add to context owner.
799 TheCU->addToContextOwner(SubprogramDie, SP.getContext());
801 // Expose as a global name.
802 TheCU->addGlobalName(SP.getName(), SubprogramDie);
805 void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
807 DIImportedEntity Module(N);
808 if (!Module.Verify())
810 if (DIE *D = TheCU->getOrCreateContextDIE(Module.getContext()))
811 constructImportedEntityDIE(TheCU, Module, D);
814 void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU, const MDNode *N,
816 DIImportedEntity Module(N);
817 if (!Module.Verify())
819 return constructImportedEntityDIE(TheCU, Module, Context);
822 void DwarfDebug::constructImportedEntityDIE(CompileUnit *TheCU,
823 const DIImportedEntity &Module,
825 assert(Module.Verify() &&
826 "Use one of the MDNode * overloads to handle invalid metadata");
827 assert(Context && "Should always have a context for an imported_module");
828 DIE *IMDie = new DIE(Module.getTag());
829 TheCU->insertDIE(Module, IMDie);
831 DIDescriptor Entity = Module.getEntity();
832 if (Entity.isNameSpace())
833 EntityDie = TheCU->getOrCreateNameSpace(DINameSpace(Entity));
834 else if (Entity.isSubprogram())
835 EntityDie = TheCU->getOrCreateSubprogramDIE(DISubprogram(Entity));
836 else if (Entity.isType())
837 EntityDie = TheCU->getOrCreateTypeDIE(DIType(Entity));
839 EntityDie = TheCU->getDIE(Entity);
840 unsigned FileID = getOrCreateSourceID(Module.getContext().getFilename(),
841 Module.getContext().getDirectory(),
842 TheCU->getUniqueID());
843 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_file, 0, FileID);
844 TheCU->addUInt(IMDie, dwarf::DW_AT_decl_line, 0, Module.getLineNumber());
845 TheCU->addDIEEntry(IMDie, dwarf::DW_AT_import, dwarf::DW_FORM_ref4,
847 StringRef Name = Module.getName();
849 TheCU->addString(IMDie, dwarf::DW_AT_name, Name);
850 Context->addChild(IMDie);
853 // Emit all Dwarf sections that should come prior to the content. Create
854 // global DIEs and emit initial debug info sections. This is invoked by
855 // the target AsmPrinter.
856 void DwarfDebug::beginModule() {
857 if (DisableDebugInfoPrinting)
860 const Module *M = MMI->getModule();
862 // If module has named metadata anchors then use them, otherwise scan the
863 // module using debug info finder to collect debug info.
864 NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
867 TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
869 // Emit initial sections so we can reference labels later.
872 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
873 DICompileUnit CUNode(CU_Nodes->getOperand(i));
874 CompileUnit *CU = constructCompileUnit(CUNode);
875 DIArray ImportedEntities = CUNode.getImportedEntities();
876 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
877 ScopesWithImportedEntities.push_back(std::make_pair(
878 DIImportedEntity(ImportedEntities.getElement(i)).getContext(),
879 ImportedEntities.getElement(i)));
880 std::sort(ScopesWithImportedEntities.begin(),
881 ScopesWithImportedEntities.end(), less_first());
882 DIArray GVs = CUNode.getGlobalVariables();
883 for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i)
884 CU->createGlobalVariableDIE(GVs.getElement(i));
885 DIArray SPs = CUNode.getSubprograms();
886 for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i)
887 constructSubprogramDIE(CU, SPs.getElement(i));
888 DIArray EnumTypes = CUNode.getEnumTypes();
889 for (unsigned i = 0, e = EnumTypes.getNumElements(); i != e; ++i)
890 CU->getOrCreateTypeDIE(EnumTypes.getElement(i));
891 DIArray RetainedTypes = CUNode.getRetainedTypes();
892 for (unsigned i = 0, e = RetainedTypes.getNumElements(); i != e; ++i)
893 CU->getOrCreateTypeDIE(RetainedTypes.getElement(i));
894 // Emit imported_modules last so that the relevant context is already
896 for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i)
897 constructImportedEntityDIE(CU, ImportedEntities.getElement(i));
900 // Tell MMI that we have debug info.
901 MMI->setDebugInfoAvailability(true);
903 // Prime section data.
904 SectionMap.insert(Asm->getObjFileLowering().getTextSection());
907 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
908 void DwarfDebug::computeInlinedDIEs() {
909 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
910 for (SmallPtrSet<DIE *, 4>::iterator AI = InlinedSubprogramDIEs.begin(),
911 AE = InlinedSubprogramDIEs.end(); AI != AE; ++AI) {
913 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
915 for (DenseMap<const MDNode *, DIE *>::iterator AI = AbstractSPDies.begin(),
916 AE = AbstractSPDies.end(); AI != AE; ++AI) {
917 DIE *ISP = AI->second;
918 if (InlinedSubprogramDIEs.count(ISP))
920 FirstCU->addUInt(ISP, dwarf::DW_AT_inline, 0, dwarf::DW_INL_inlined);
924 // Collect info for variables that were optimized out.
925 void DwarfDebug::collectDeadVariables() {
926 const Module *M = MMI->getModule();
927 DenseMap<const MDNode *, LexicalScope *> DeadFnScopeMap;
929 if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) {
930 for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
931 DICompileUnit TheCU(CU_Nodes->getOperand(i));
932 DIArray Subprograms = TheCU.getSubprograms();
933 for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
934 DISubprogram SP(Subprograms.getElement(i));
935 if (ProcessedSPNodes.count(SP) != 0) continue;
936 if (!SP.isSubprogram()) continue;
937 if (!SP.isDefinition()) continue;
938 DIArray Variables = SP.getVariables();
939 if (Variables.getNumElements() == 0) continue;
941 LexicalScope *Scope =
942 new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
943 DeadFnScopeMap[SP] = Scope;
945 // Construct subprogram DIE and add variables DIEs.
946 CompileUnit *SPCU = CUMap.lookup(TheCU);
947 assert(SPCU && "Unable to find Compile Unit!");
948 constructSubprogramDIE(SPCU, SP);
949 DIE *ScopeDIE = SPCU->getDIE(SP);
950 for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
951 DIVariable DV(Variables.getElement(vi));
952 if (!DV.isVariable()) continue;
953 DbgVariable NewVar(DV, NULL);
954 if (DIE *VariableDIE =
955 SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
956 ScopeDIE->addChild(VariableDIE);
961 DeleteContainerSeconds(DeadFnScopeMap);
964 // Type Signature [7.27] and ODR Hash code.
966 /// \brief Grabs the string in whichever attribute is passed in and returns
967 /// a reference to it. Returns "" if the attribute doesn't exist.
968 static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) {
969 DIEValue *V = Die->findAttribute(Attr);
971 if (DIEString *S = dyn_cast_or_null<DIEString>(V))
972 return S->getString();
974 return StringRef("");
977 /// Return true if the current DIE is contained within an anonymous namespace.
978 static bool isContainedInAnonNamespace(DIE *Die) {
979 DIE *Parent = Die->getParent();
982 if (Parent->getTag() == dwarf::DW_TAG_namespace &&
983 getDIEStringAttr(Parent, dwarf::DW_AT_name) == "")
985 Parent = Parent->getParent();
991 /// Test if the current CU language is C++ and that we have
992 /// a named type that is not contained in an anonymous namespace.
993 static bool shouldAddODRHash(CompileUnit *CU, DIE *Die) {
994 return CU->getLanguage() == dwarf::DW_LANG_C_plus_plus &&
995 getDIEStringAttr(Die, dwarf::DW_AT_name) != "" &&
996 !isContainedInAnonNamespace(Die);
999 void DwarfDebug::finalizeModuleInfo() {
1000 // Collect info for variables that were optimized out.
1001 collectDeadVariables();
1003 // Attach DW_AT_inline attribute with inlined subprogram DIEs.
1004 computeInlinedDIEs();
1006 // Split out type units and conditionally add an ODR tag to the split
1008 // FIXME: Do type splitting.
1009 for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
1010 DIE *Die = TypeUnits[i];
1012 // If we've requested ODR hashes and it's applicable for an ODR hash then
1013 // add the ODR signature now.
1014 // FIXME: This should be added onto the type unit, not the type, but this
1015 // works as an intermediate stage.
1016 if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
1017 CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
1018 dwarf::DW_FORM_data8,
1019 Hash.computeDIEODRSignature(Die));
1022 // Handle anything that needs to be done on a per-cu basis.
1023 for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
1025 CUI != CUE; ++CUI) {
1026 CompileUnit *TheCU = CUI->second;
1027 // Emit DW_AT_containing_type attribute to connect types with their
1028 // vtable holding type.
1029 TheCU->constructContainingTypeDIEs();
1031 // If we're splitting the dwarf out now that we've got the entire
1032 // CU then construct a skeleton CU based upon it.
1033 if (useSplitDwarf()) {
1035 if (GenerateCUHash) {
1037 ID = CUHash.computeCUSignature(TheCU->getCUDie());
1039 // This should be a unique identifier when we want to build .dwp files.
1040 TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
1041 dwarf::DW_FORM_data8, ID);
1042 // Now construct the skeleton CU associated.
1043 CompileUnit *SkCU = constructSkeletonCU(TheCU);
1044 // This should be a unique identifier when we want to build .dwp files.
1045 SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id,
1046 dwarf::DW_FORM_data8, ID);
1050 // Compute DIE offsets and sizes.
1051 InfoHolder.computeSizeAndOffsets();
1052 if (useSplitDwarf())
1053 SkeletonHolder.computeSizeAndOffsets();
1056 void DwarfDebug::endSections() {
1057 // Standard sections final addresses.
1058 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getTextSection());
1059 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("text_end"));
1060 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getDataSection());
1061 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("data_end"));
1063 // End text sections.
1064 for (unsigned I = 0, E = SectionMap.size(); I != E; ++I) {
1065 Asm->OutStreamer.SwitchSection(SectionMap[I]);
1066 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("section_end", I+1));
1070 // Emit all Dwarf sections that should come after the content.
1071 void DwarfDebug::endModule() {
1073 if (!FirstCU) return;
1075 // End any existing sections.
1076 // TODO: Does this need to happen?
1079 // Finalize the debug info for the module.
1080 finalizeModuleInfo();
1082 if (!useSplitDwarf()) {
1083 // Emit all the DIEs into a debug info section.
1086 // Corresponding abbreviations into a abbrev section.
1087 emitAbbreviations();
1089 // Emit info into a debug loc section.
1092 // Emit info into a debug aranges section.
1095 // Emit info into a debug ranges section.
1098 // Emit info into a debug macinfo section.
1102 // TODO: Fill this in for separated debug sections and separate
1103 // out information into new sections.
1105 // Emit the debug info section and compile units.
1109 // Corresponding abbreviations into a abbrev section.
1110 emitAbbreviations();
1111 emitDebugAbbrevDWO();
1113 // Emit info into a debug loc section.
1116 // Emit info into a debug aranges section.
1119 // Emit info into a debug ranges section.
1122 // Emit info into a debug macinfo section.
1125 // Emit DWO addresses.
1126 InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
1130 // Emit info into the dwarf accelerator table sections.
1131 if (useDwarfAccelTables()) {
1134 emitAccelNamespaces();
1138 // Emit the pubnames and pubtypes sections if requested.
1139 if (HasDwarfPubSections) {
1140 emitDebugPubNames();
1141 emitDebugPubTypes();
1144 // Finally emit string information into a string table.
1146 if (useSplitDwarf())
1151 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
1152 E = CUMap.end(); I != E; ++I)
1155 for (SmallVectorImpl<CompileUnit *>::iterator I = SkeletonCUs.begin(),
1156 E = SkeletonCUs.end(); I != E; ++I)
1159 // Reset these for the next Module if we have one.
1163 // Find abstract variable, if any, associated with Var.
1164 DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
1165 DebugLoc ScopeLoc) {
1166 LLVMContext &Ctx = DV->getContext();
1167 // More then one inlined variable corresponds to one abstract variable.
1168 DIVariable Var = cleanseInlinedVariable(DV, Ctx);
1169 DbgVariable *AbsDbgVariable = AbstractVariables.lookup(Var);
1171 return AbsDbgVariable;
1173 LexicalScope *Scope = LScopes.findAbstractScope(ScopeLoc.getScope(Ctx));
1177 AbsDbgVariable = new DbgVariable(Var, NULL);
1178 addScopeVariable(Scope, AbsDbgVariable);
1179 AbstractVariables[Var] = AbsDbgVariable;
1180 return AbsDbgVariable;
1183 // If Var is a current function argument then add it to CurrentFnArguments list.
1184 bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
1185 DbgVariable *Var, LexicalScope *Scope) {
1186 if (!LScopes.isCurrentFunctionScope(Scope))
1188 DIVariable DV = Var->getVariable();
1189 if (DV.getTag() != dwarf::DW_TAG_arg_variable)
1191 unsigned ArgNo = DV.getArgNumber();
1195 size_t Size = CurrentFnArguments.size();
1197 CurrentFnArguments.resize(MF->getFunction()->arg_size());
1198 // llvm::Function argument size is not good indicator of how many
1199 // arguments does the function have at source level.
1201 CurrentFnArguments.resize(ArgNo * 2);
1202 CurrentFnArguments[ArgNo - 1] = Var;
1206 // Collect variable information from side table maintained by MMI.
1208 DwarfDebug::collectVariableInfoFromMMITable(const MachineFunction *MF,
1209 SmallPtrSet<const MDNode *, 16> &Processed) {
1210 MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
1211 for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
1212 VE = VMap.end(); VI != VE; ++VI) {
1213 const MDNode *Var = VI->first;
1215 Processed.insert(Var);
1217 const std::pair<unsigned, DebugLoc> &VP = VI->second;
1219 LexicalScope *Scope = LScopes.findLexicalScope(VP.second);
1221 // If variable scope is not found then skip this variable.
1225 DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
1226 DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
1227 RegVar->setFrameIndex(VP.first);
1228 if (!addCurrentFnArgument(MF, RegVar, Scope))
1229 addScopeVariable(Scope, RegVar);
1231 AbsDbgVariable->setFrameIndex(VP.first);
1235 // Return true if debug value, encoded by DBG_VALUE instruction, is in a
1237 static bool isDbgValueInDefinedReg(const MachineInstr *MI) {
1238 assert(MI->isDebugValue() && "Invalid DBG_VALUE machine instruction!");
1239 return MI->getNumOperands() == 3 &&
1240 MI->getOperand(0).isReg() && MI->getOperand(0).getReg() &&
1241 (MI->getOperand(1).isImm() ||
1242 (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == 0U));
1245 // Get .debug_loc entry for the instruction range starting at MI.
1246 static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
1247 const MCSymbol *FLabel,
1248 const MCSymbol *SLabel,
1249 const MachineInstr *MI) {
1250 const MDNode *Var = MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1252 assert(MI->getNumOperands() == 3);
1253 if (MI->getOperand(0).isReg()) {
1254 MachineLocation MLoc;
1255 // If the second operand is an immediate, this is a
1256 // register-indirect address.
1257 if (!MI->getOperand(1).isImm())
1258 MLoc.set(MI->getOperand(0).getReg());
1260 MLoc.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm());
1261 return DotDebugLocEntry(FLabel, SLabel, MLoc, Var);
1263 if (MI->getOperand(0).isImm())
1264 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getImm());
1265 if (MI->getOperand(0).isFPImm())
1266 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getFPImm());
1267 if (MI->getOperand(0).isCImm())
1268 return DotDebugLocEntry(FLabel, SLabel, MI->getOperand(0).getCImm());
1270 llvm_unreachable("Unexpected 3 operand DBG_VALUE instruction!");
1273 // Find variables for each lexical scope.
1275 DwarfDebug::collectVariableInfo(const MachineFunction *MF,
1276 SmallPtrSet<const MDNode *, 16> &Processed) {
1278 // Grab the variable info that was squirreled away in the MMI side-table.
1279 collectVariableInfoFromMMITable(MF, Processed);
1281 for (SmallVectorImpl<const MDNode*>::const_iterator
1282 UVI = UserVariables.begin(), UVE = UserVariables.end(); UVI != UVE;
1284 const MDNode *Var = *UVI;
1285 if (Processed.count(Var))
1288 // History contains relevant DBG_VALUE instructions for Var and instructions
1290 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1291 if (History.empty())
1293 const MachineInstr *MInsn = History.front();
1296 LexicalScope *Scope = NULL;
1297 if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
1298 DISubprogram(DV.getContext()).describes(MF->getFunction()))
1299 Scope = LScopes.getCurrentFunctionScope();
1300 else if (MDNode *IA = DV.getInlinedAt())
1301 Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
1303 Scope = LScopes.findLexicalScope(cast<MDNode>(DV->getOperand(1)));
1304 // If variable scope is not found then skip this variable.
1308 Processed.insert(DV);
1309 assert(MInsn->isDebugValue() && "History must begin with debug value");
1310 DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
1311 DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
1312 if (!addCurrentFnArgument(MF, RegVar, Scope))
1313 addScopeVariable(Scope, RegVar);
1315 AbsVar->setMInsn(MInsn);
1317 // Simplify ranges that are fully coalesced.
1318 if (History.size() <= 1 || (History.size() == 2 &&
1319 MInsn->isIdenticalTo(History.back()))) {
1320 RegVar->setMInsn(MInsn);
1324 // Handle multiple DBG_VALUE instructions describing one variable.
1325 RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
1327 for (SmallVectorImpl<const MachineInstr*>::const_iterator
1328 HI = History.begin(), HE = History.end(); HI != HE; ++HI) {
1329 const MachineInstr *Begin = *HI;
1330 assert(Begin->isDebugValue() && "Invalid History entry");
1332 // Check if DBG_VALUE is truncating a range.
1333 if (Begin->getNumOperands() > 1 && Begin->getOperand(0).isReg()
1334 && !Begin->getOperand(0).getReg())
1337 // Compute the range for a register location.
1338 const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
1339 const MCSymbol *SLabel = 0;
1342 // If Begin is the last instruction in History then its value is valid
1343 // until the end of the function.
1344 SLabel = FunctionEndSym;
1346 const MachineInstr *End = HI[1];
1347 DEBUG(dbgs() << "DotDebugLoc Pair:\n"
1348 << "\t" << *Begin << "\t" << *End << "\n");
1349 if (End->isDebugValue())
1350 SLabel = getLabelBeforeInsn(End);
1352 // End is a normal instruction clobbering the range.
1353 SLabel = getLabelAfterInsn(End);
1354 assert(SLabel && "Forgot label after clobber instruction");
1359 // The value is valid until the next DBG_VALUE or clobber.
1360 DotDebugLocEntries.push_back(getDebugLocEntry(Asm, FLabel, SLabel,
1363 DotDebugLocEntries.push_back(DotDebugLocEntry());
1366 // Collect info for variables that were optimized out.
1367 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1368 DIArray Variables = DISubprogram(FnScope->getScopeNode()).getVariables();
1369 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1370 DIVariable DV(Variables.getElement(i));
1371 if (!DV || !DV.isVariable() || !Processed.insert(DV))
1373 if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
1374 addScopeVariable(Scope, new DbgVariable(DV, NULL));
1378 // Return Label preceding the instruction.
1379 MCSymbol *DwarfDebug::getLabelBeforeInsn(const MachineInstr *MI) {
1380 MCSymbol *Label = LabelsBeforeInsn.lookup(MI);
1381 assert(Label && "Didn't insert label before instruction");
1385 // Return Label immediately following the instruction.
1386 MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
1387 return LabelsAfterInsn.lookup(MI);
1390 // Process beginning of an instruction.
1391 void DwarfDebug::beginInstruction(const MachineInstr *MI) {
1392 // Check if source location changes, but ignore DBG_VALUE locations.
1393 if (!MI->isDebugValue()) {
1394 DebugLoc DL = MI->getDebugLoc();
1395 if (DL != PrevInstLoc && (!DL.isUnknown() || UnknownLocations)) {
1398 if (DL == PrologEndLoc) {
1399 Flags |= DWARF2_FLAG_PROLOGUE_END;
1400 PrologEndLoc = DebugLoc();
1402 if (PrologEndLoc.isUnknown())
1403 Flags |= DWARF2_FLAG_IS_STMT;
1405 if (!DL.isUnknown()) {
1406 const MDNode *Scope = DL.getScope(Asm->MF->getFunction()->getContext());
1407 recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
1409 recordSourceLine(0, 0, 0, 0);
1413 // Insert labels where requested.
1414 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1415 LabelsBeforeInsn.find(MI);
1418 if (I == LabelsBeforeInsn.end())
1421 // Label already assigned.
1426 PrevLabel = MMI->getContext().CreateTempSymbol();
1427 Asm->OutStreamer.EmitLabel(PrevLabel);
1429 I->second = PrevLabel;
1432 // Process end of an instruction.
1433 void DwarfDebug::endInstruction(const MachineInstr *MI) {
1434 // Don't create a new label after DBG_VALUE instructions.
1435 // They don't generate code.
1436 if (!MI->isDebugValue())
1439 DenseMap<const MachineInstr*, MCSymbol*>::iterator I =
1440 LabelsAfterInsn.find(MI);
1443 if (I == LabelsAfterInsn.end())
1446 // Label already assigned.
1450 // We need a label after this instruction.
1452 PrevLabel = MMI->getContext().CreateTempSymbol();
1453 Asm->OutStreamer.EmitLabel(PrevLabel);
1455 I->second = PrevLabel;
1458 // Each LexicalScope has first instruction and last instruction to mark
1459 // beginning and end of a scope respectively. Create an inverse map that list
1460 // scopes starts (and ends) with an instruction. One instruction may start (or
1461 // end) multiple scopes. Ignore scopes that are not reachable.
1462 void DwarfDebug::identifyScopeMarkers() {
1463 SmallVector<LexicalScope *, 4> WorkList;
1464 WorkList.push_back(LScopes.getCurrentFunctionScope());
1465 while (!WorkList.empty()) {
1466 LexicalScope *S = WorkList.pop_back_val();
1468 const SmallVectorImpl<LexicalScope *> &Children = S->getChildren();
1469 if (!Children.empty())
1470 for (SmallVectorImpl<LexicalScope *>::const_iterator SI = Children.begin(),
1471 SE = Children.end(); SI != SE; ++SI)
1472 WorkList.push_back(*SI);
1474 if (S->isAbstractScope())
1477 const SmallVectorImpl<InsnRange> &Ranges = S->getRanges();
1480 for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
1481 RE = Ranges.end(); RI != RE; ++RI) {
1482 assert(RI->first && "InsnRange does not have first instruction!");
1483 assert(RI->second && "InsnRange does not have second instruction!");
1484 requestLabelBeforeInsn(RI->first);
1485 requestLabelAfterInsn(RI->second);
1490 // Get MDNode for DebugLoc's scope.
1491 static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
1492 if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
1493 return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
1494 return DL.getScope(Ctx);
1497 // Walk up the scope chain of given debug loc and find line number info
1498 // for the function.
1499 static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
1500 const MDNode *Scope = getScopeNode(DL, Ctx);
1501 DISubprogram SP = getDISubprogram(Scope);
1502 if (SP.isSubprogram()) {
1503 // Check for number of operands since the compatibility is
1505 if (SP->getNumOperands() > 19)
1506 return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
1508 return DebugLoc::get(SP.getLineNumber(), 0, SP);
1514 // Gather pre-function debug information. Assumes being called immediately
1515 // after the function entry point has been emitted.
1516 void DwarfDebug::beginFunction(const MachineFunction *MF) {
1517 if (!MMI->hasDebugInfo()) return;
1518 LScopes.initialize(*MF);
1519 if (LScopes.empty()) return;
1520 identifyScopeMarkers();
1522 // Set DwarfCompileUnitID in MCContext to the Compile Unit this function
1524 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1525 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1526 assert(TheCU && "Unable to find compile unit!");
1527 if (Asm->TM.hasMCUseLoc() &&
1528 Asm->OutStreamer.getKind() == MCStreamer::SK_AsmStreamer)
1529 // Use a single line table if we are using .loc and generating assembly.
1530 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1532 Asm->OutStreamer.getContext().setDwarfCompileUnitID(TheCU->getUniqueID());
1534 FunctionBeginSym = Asm->GetTempSymbol("func_begin",
1535 Asm->getFunctionNumber());
1536 // Assumes in correct section after the entry point.
1537 Asm->OutStreamer.EmitLabel(FunctionBeginSym);
1539 assert(UserVariables.empty() && DbgValues.empty() && "Maps weren't cleaned");
1541 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
1542 // LiveUserVar - Map physreg numbers to the MDNode they contain.
1543 std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
1545 for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
1547 bool AtBlockEntry = true;
1548 for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
1550 const MachineInstr *MI = II;
1552 if (MI->isDebugValue()) {
1553 assert(MI->getNumOperands() > 1 && "Invalid machine instruction!");
1555 // Keep track of user variables.
1557 MI->getOperand(MI->getNumOperands() - 1).getMetadata();
1559 // Variable is in a register, we need to check for clobbers.
1560 if (isDbgValueInDefinedReg(MI))
1561 LiveUserVar[MI->getOperand(0).getReg()] = Var;
1563 // Check the history of this variable.
1564 SmallVectorImpl<const MachineInstr*> &History = DbgValues[Var];
1565 if (History.empty()) {
1566 UserVariables.push_back(Var);
1567 // The first mention of a function argument gets the FunctionBeginSym
1568 // label, so arguments are visible when breaking at function entry.
1570 if (DV.isVariable() && DV.getTag() == dwarf::DW_TAG_arg_variable &&
1571 DISubprogram(getDISubprogram(DV.getContext()))
1572 .describes(MF->getFunction()))
1573 LabelsBeforeInsn[MI] = FunctionBeginSym;
1575 // We have seen this variable before. Try to coalesce DBG_VALUEs.
1576 const MachineInstr *Prev = History.back();
1577 if (Prev->isDebugValue()) {
1578 // Coalesce identical entries at the end of History.
1579 if (History.size() >= 2 &&
1580 Prev->isIdenticalTo(History[History.size() - 2])) {
1581 DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
1583 << "\t" << *History[History.size() - 2] << "\n");
1587 // Terminate old register assignments that don't reach MI;
1588 MachineFunction::const_iterator PrevMBB = Prev->getParent();
1589 if (PrevMBB != I && (!AtBlockEntry || llvm::next(PrevMBB) != I) &&
1590 isDbgValueInDefinedReg(Prev)) {
1591 // Previous register assignment needs to terminate at the end of
1593 MachineBasicBlock::const_iterator LastMI =
1594 PrevMBB->getLastNonDebugInstr();
1595 if (LastMI == PrevMBB->end()) {
1596 // Drop DBG_VALUE for empty range.
1597 DEBUG(dbgs() << "Dropping DBG_VALUE for empty range:\n"
1598 << "\t" << *Prev << "\n");
1600 } else if (llvm::next(PrevMBB) != PrevMBB->getParent()->end())
1601 // Terminate after LastMI.
1602 History.push_back(LastMI);
1606 History.push_back(MI);
1608 // Not a DBG_VALUE instruction.
1610 AtBlockEntry = false;
1612 // First known non-DBG_VALUE and non-frame setup location marks
1613 // the beginning of the function body.
1614 if (!MI->getFlag(MachineInstr::FrameSetup) &&
1615 (PrologEndLoc.isUnknown() && !MI->getDebugLoc().isUnknown()))
1616 PrologEndLoc = MI->getDebugLoc();
1618 // Check if the instruction clobbers any registers with debug vars.
1619 for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
1620 MOE = MI->operands_end(); MOI != MOE; ++MOI) {
1621 if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
1623 for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
1624 AI.isValid(); ++AI) {
1626 const MDNode *Var = LiveUserVar[Reg];
1629 // Reg is now clobbered.
1630 LiveUserVar[Reg] = 0;
1632 // Was MD last defined by a DBG_VALUE referring to Reg?
1633 DbgValueHistoryMap::iterator HistI = DbgValues.find(Var);
1634 if (HistI == DbgValues.end())
1636 SmallVectorImpl<const MachineInstr*> &History = HistI->second;
1637 if (History.empty())
1639 const MachineInstr *Prev = History.back();
1640 // Sanity-check: Register assignments are terminated at the end of
1642 if (!Prev->isDebugValue() || Prev->getParent() != MI->getParent())
1644 // Is the variable still in Reg?
1645 if (!isDbgValueInDefinedReg(Prev) ||
1646 Prev->getOperand(0).getReg() != Reg)
1648 // Var is clobbered. Make sure the next instruction gets a label.
1649 History.push_back(MI);
1656 for (DbgValueHistoryMap::iterator I = DbgValues.begin(), E = DbgValues.end();
1658 SmallVectorImpl<const MachineInstr*> &History = I->second;
1659 if (History.empty())
1662 // Make sure the final register assignments are terminated.
1663 const MachineInstr *Prev = History.back();
1664 if (Prev->isDebugValue() && isDbgValueInDefinedReg(Prev)) {
1665 const MachineBasicBlock *PrevMBB = Prev->getParent();
1666 MachineBasicBlock::const_iterator LastMI =
1667 PrevMBB->getLastNonDebugInstr();
1668 if (LastMI == PrevMBB->end())
1669 // Drop DBG_VALUE for empty range.
1671 else if (PrevMBB != &PrevMBB->getParent()->back()) {
1672 // Terminate after LastMI.
1673 History.push_back(LastMI);
1676 // Request labels for the full history.
1677 for (unsigned i = 0, e = History.size(); i != e; ++i) {
1678 const MachineInstr *MI = History[i];
1679 if (MI->isDebugValue())
1680 requestLabelBeforeInsn(MI);
1682 requestLabelAfterInsn(MI);
1686 PrevInstLoc = DebugLoc();
1687 PrevLabel = FunctionBeginSym;
1689 // Record beginning of function.
1690 if (!PrologEndLoc.isUnknown()) {
1691 DebugLoc FnStartDL = getFnDebugLoc(PrologEndLoc,
1692 MF->getFunction()->getContext());
1693 recordSourceLine(FnStartDL.getLine(), FnStartDL.getCol(),
1694 FnStartDL.getScope(MF->getFunction()->getContext()),
1695 // We'd like to list the prologue as "not statements" but GDB behaves
1696 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1697 DWARF2_FLAG_IS_STMT);
1701 void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
1702 SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
1703 DIVariable DV = Var->getVariable();
1704 // Variables with positive arg numbers are parameters.
1705 if (unsigned ArgNum = DV.getArgNumber()) {
1706 // Keep all parameters in order at the start of the variable list to ensure
1707 // function types are correct (no out-of-order parameters)
1709 // This could be improved by only doing it for optimized builds (unoptimized
1710 // builds have the right order to begin with), searching from the back (this
1711 // would catch the unoptimized case quickly), or doing a binary search
1712 // rather than linear search.
1713 SmallVectorImpl<DbgVariable *>::iterator I = Vars.begin();
1714 while (I != Vars.end()) {
1715 unsigned CurNum = (*I)->getVariable().getArgNumber();
1716 // A local (non-parameter) variable has been found, insert immediately
1720 // A later indexed parameter has been found, insert immediately before it.
1721 if (CurNum > ArgNum)
1725 Vars.insert(I, Var);
1729 Vars.push_back(Var);
1732 // Gather and emit post-function debug information.
1733 void DwarfDebug::endFunction(const MachineFunction *MF) {
1734 if (!MMI->hasDebugInfo() || LScopes.empty()) return;
1736 // Define end label for subprogram.
1737 FunctionEndSym = Asm->GetTempSymbol("func_end",
1738 Asm->getFunctionNumber());
1739 // Assumes in correct section after the entry point.
1740 Asm->OutStreamer.EmitLabel(FunctionEndSym);
1741 // Set DwarfCompileUnitID in MCContext to default value.
1742 Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
1744 SmallPtrSet<const MDNode *, 16> ProcessedVars;
1745 collectVariableInfo(MF, ProcessedVars);
1747 LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
1748 CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
1749 assert(TheCU && "Unable to find compile unit!");
1751 // Construct abstract scopes.
1752 ArrayRef<LexicalScope *> AList = LScopes.getAbstractScopesList();
1753 for (unsigned i = 0, e = AList.size(); i != e; ++i) {
1754 LexicalScope *AScope = AList[i];
1755 DISubprogram SP(AScope->getScopeNode());
1756 if (SP.isSubprogram()) {
1757 // Collect info for variables that were optimized out.
1758 DIArray Variables = SP.getVariables();
1759 for (unsigned i = 0, e = Variables.getNumElements(); i != e; ++i) {
1760 DIVariable DV(Variables.getElement(i));
1761 if (!DV || !DV.isVariable() || !ProcessedVars.insert(DV))
1763 // Check that DbgVariable for DV wasn't created earlier, when
1764 // findAbstractVariable() was called for inlined instance of DV.
1765 LLVMContext &Ctx = DV->getContext();
1766 DIVariable CleanDV = cleanseInlinedVariable(DV, Ctx);
1767 if (AbstractVariables.lookup(CleanDV))
1769 if (LexicalScope *Scope = LScopes.findAbstractScope(DV.getContext()))
1770 addScopeVariable(Scope, new DbgVariable(DV, NULL));
1773 if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
1774 constructScopeDIE(TheCU, AScope);
1777 DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
1779 if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
1780 TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
1783 for (ScopeVariablesMap::iterator
1784 I = ScopeVariables.begin(), E = ScopeVariables.end(); I != E; ++I)
1785 DeleteContainerPointers(I->second);
1786 ScopeVariables.clear();
1787 DeleteContainerPointers(CurrentFnArguments);
1788 UserVariables.clear();
1790 AbstractVariables.clear();
1791 LabelsBeforeInsn.clear();
1792 LabelsAfterInsn.clear();
1796 // Register a source line with debug info. Returns the unique label that was
1797 // emitted and which provides correspondence to the source line list.
1798 void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
1804 DIDescriptor Scope(S);
1806 if (Scope.isCompileUnit()) {
1807 DICompileUnit CU(S);
1808 Fn = CU.getFilename();
1809 Dir = CU.getDirectory();
1810 } else if (Scope.isFile()) {
1812 Fn = F.getFilename();
1813 Dir = F.getDirectory();
1814 } else if (Scope.isSubprogram()) {
1816 Fn = SP.getFilename();
1817 Dir = SP.getDirectory();
1818 } else if (Scope.isLexicalBlockFile()) {
1819 DILexicalBlockFile DBF(S);
1820 Fn = DBF.getFilename();
1821 Dir = DBF.getDirectory();
1822 } else if (Scope.isLexicalBlock()) {
1823 DILexicalBlock DB(S);
1824 Fn = DB.getFilename();
1825 Dir = DB.getDirectory();
1827 llvm_unreachable("Unexpected scope info");
1829 Src = getOrCreateSourceID(Fn, Dir,
1830 Asm->OutStreamer.getContext().getDwarfCompileUnitID());
1832 Asm->OutStreamer.EmitDwarfLocDirective(Src, Line, Col, Flags, 0, 0, Fn);
1835 //===----------------------------------------------------------------------===//
1837 //===----------------------------------------------------------------------===//
1839 // Compute the size and offset of a DIE.
1841 DwarfUnits::computeSizeAndOffset(DIE *Die, unsigned Offset) {
1842 // Get the children.
1843 const std::vector<DIE *> &Children = Die->getChildren();
1845 // Record the abbreviation.
1846 assignAbbrevNumber(Die->getAbbrev());
1848 // Get the abbreviation for this DIE.
1849 unsigned AbbrevNumber = Die->getAbbrevNumber();
1850 const DIEAbbrev *Abbrev = Abbreviations->at(AbbrevNumber - 1);
1853 Die->setOffset(Offset);
1855 // Start the size with the size of abbreviation code.
1856 Offset += MCAsmInfo::getULEB128Size(AbbrevNumber);
1858 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1859 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
1861 // Size the DIE attribute values.
1862 for (unsigned i = 0, N = Values.size(); i < N; ++i)
1863 // Size attribute value.
1864 Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
1866 // Size the DIE children if any.
1867 if (!Children.empty()) {
1868 assert(Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes &&
1869 "Children flag not set");
1871 for (unsigned j = 0, M = Children.size(); j < M; ++j)
1872 Offset = computeSizeAndOffset(Children[j], Offset);
1874 // End of children marker.
1875 Offset += sizeof(int8_t);
1878 Die->setSize(Offset - Die->getOffset());
1882 // Compute the size and offset of all the DIEs.
1883 void DwarfUnits::computeSizeAndOffsets() {
1884 // Offset from the beginning of debug info section.
1885 unsigned SecOffset = 0;
1886 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
1887 E = CUs.end(); I != E; ++I) {
1888 (*I)->setDebugInfoOffset(SecOffset);
1890 sizeof(int32_t) + // Length of Compilation Unit Info
1891 sizeof(int16_t) + // DWARF version number
1892 sizeof(int32_t) + // Offset Into Abbrev. Section
1893 sizeof(int8_t); // Pointer Size (in bytes)
1895 unsigned EndOffset = computeSizeAndOffset((*I)->getCUDie(), Offset);
1896 SecOffset += EndOffset;
1900 // Emit initial Dwarf sections with a label at the start of each one.
1901 void DwarfDebug::emitSectionLabels() {
1902 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
1904 // Dwarf sections base addresses.
1905 DwarfInfoSectionSym =
1906 emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info");
1907 DwarfAbbrevSectionSym =
1908 emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev");
1909 if (useSplitDwarf())
1910 DwarfAbbrevDWOSectionSym =
1911 emitSectionSym(Asm, TLOF.getDwarfAbbrevDWOSection(),
1912 "section_abbrev_dwo");
1913 emitSectionSym(Asm, TLOF.getDwarfARangesSection());
1915 if (const MCSection *MacroInfo = TLOF.getDwarfMacroInfoSection())
1916 emitSectionSym(Asm, MacroInfo);
1918 DwarfLineSectionSym =
1919 emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
1920 emitSectionSym(Asm, TLOF.getDwarfLocSection());
1921 if (HasDwarfPubSections) {
1922 emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
1923 emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
1925 DwarfStrSectionSym =
1926 emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
1927 if (useSplitDwarf()) {
1928 DwarfStrDWOSectionSym =
1929 emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
1930 DwarfAddrSectionSym =
1931 emitSectionSym(Asm, TLOF.getDwarfAddrSection(), "addr_sec");
1933 DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
1936 DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(),
1937 "section_debug_loc");
1939 TextSectionSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin");
1940 emitSectionSym(Asm, TLOF.getDataSection());
1943 // Recursively emits a debug information entry.
1944 void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
1945 // Get the abbreviation for this DIE.
1946 unsigned AbbrevNumber = Die->getAbbrevNumber();
1947 const DIEAbbrev *Abbrev = Abbrevs->at(AbbrevNumber - 1);
1949 // Emit the code (index) for the abbreviation.
1950 if (Asm->isVerbose())
1951 Asm->OutStreamer.AddComment("Abbrev [" + Twine(AbbrevNumber) + "] 0x" +
1952 Twine::utohexstr(Die->getOffset()) + ":0x" +
1953 Twine::utohexstr(Die->getSize()) + " " +
1954 dwarf::TagString(Abbrev->getTag()));
1955 Asm->EmitULEB128(AbbrevNumber);
1957 const SmallVectorImpl<DIEValue*> &Values = Die->getValues();
1958 const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev->getData();
1960 // Emit the DIE attribute values.
1961 for (unsigned i = 0, N = Values.size(); i < N; ++i) {
1962 unsigned Attr = AbbrevData[i].getAttribute();
1963 unsigned Form = AbbrevData[i].getForm();
1964 assert(Form && "Too many attributes for DIE (check abbreviation)");
1966 if (Asm->isVerbose())
1967 Asm->OutStreamer.AddComment(dwarf::AttributeString(Attr));
1970 case dwarf::DW_AT_abstract_origin: {
1971 DIEEntry *E = cast<DIEEntry>(Values[i]);
1972 DIE *Origin = E->getEntry();
1973 unsigned Addr = Origin->getOffset();
1974 if (Form == dwarf::DW_FORM_ref_addr) {
1975 // For DW_FORM_ref_addr, output the offset from beginning of debug info
1976 // section. Origin->getOffset() returns the offset from start of the
1978 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
1979 Addr += Holder.getCUOffset(Origin->getCompileUnit());
1981 Asm->OutStreamer.EmitIntValue(Addr,
1982 Form == dwarf::DW_FORM_ref_addr ? DIEEntry::getRefAddrSize(Asm) : 4);
1985 case dwarf::DW_AT_ranges: {
1986 // DW_AT_range Value encodes offset in debug_range section.
1987 DIEInteger *V = cast<DIEInteger>(Values[i]);
1989 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) {
1990 Asm->EmitLabelPlusOffset(DwarfDebugRangeSectionSym,
1994 Asm->EmitLabelOffsetDifference(DwarfDebugRangeSectionSym,
1996 DwarfDebugRangeSectionSym,
2001 case dwarf::DW_AT_location: {
2002 if (DIELabel *L = dyn_cast<DIELabel>(Values[i])) {
2003 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2004 Asm->EmitLabelReference(L->getValue(), 4);
2006 Asm->EmitLabelDifference(L->getValue(), DwarfDebugLocSectionSym, 4);
2008 Values[i]->EmitValue(Asm, Form);
2012 case dwarf::DW_AT_accessibility: {
2013 if (Asm->isVerbose()) {
2014 DIEInteger *V = cast<DIEInteger>(Values[i]);
2015 Asm->OutStreamer.AddComment(dwarf::AccessibilityString(V->getValue()));
2017 Values[i]->EmitValue(Asm, Form);
2021 // Emit an attribute using the defined form.
2022 Values[i]->EmitValue(Asm, Form);
2027 // Emit the DIE children if any.
2028 if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
2029 const std::vector<DIE *> &Children = Die->getChildren();
2031 for (unsigned j = 0, M = Children.size(); j < M; ++j)
2032 emitDIE(Children[j], Abbrevs);
2034 if (Asm->isVerbose())
2035 Asm->OutStreamer.AddComment("End Of Children Mark");
2040 // Emit the various dwarf units to the unit section USection with
2041 // the abbreviations going into ASection.
2042 void DwarfUnits::emitUnits(DwarfDebug *DD,
2043 const MCSection *USection,
2044 const MCSection *ASection,
2045 const MCSymbol *ASectionSym) {
2046 Asm->OutStreamer.SwitchSection(USection);
2047 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(),
2048 E = CUs.end(); I != E; ++I) {
2049 CompileUnit *TheCU = *I;
2050 DIE *Die = TheCU->getCUDie();
2052 // Emit the compile units header.
2054 .EmitLabel(Asm->GetTempSymbol(USection->getLabelBeginName(),
2055 TheCU->getUniqueID()));
2057 // Emit size of content not including length itself
2058 unsigned ContentSize = Die->getSize() +
2059 sizeof(int16_t) + // DWARF version number
2060 sizeof(int32_t) + // Offset Into Abbrev. Section
2061 sizeof(int8_t); // Pointer Size (in bytes)
2063 Asm->OutStreamer.AddComment("Length of Compilation Unit Info");
2064 Asm->EmitInt32(ContentSize);
2065 Asm->OutStreamer.AddComment("DWARF version number");
2066 Asm->EmitInt16(DD->getDwarfVersion());
2067 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section");
2068 Asm->EmitSectionOffset(Asm->GetTempSymbol(ASection->getLabelBeginName()),
2070 Asm->OutStreamer.AddComment("Address Size (in bytes)");
2071 Asm->EmitInt8(Asm->getDataLayout().getPointerSize());
2073 DD->emitDIE(Die, Abbreviations);
2074 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol(USection->getLabelEndName(),
2075 TheCU->getUniqueID()));
2079 /// For a given compile unit DIE, returns offset from beginning of debug info.
2080 unsigned DwarfUnits::getCUOffset(DIE *Die) {
2081 assert(Die->getTag() == dwarf::DW_TAG_compile_unit &&
2082 "Input DIE should be compile unit in getCUOffset.");
2083 for (SmallVectorImpl<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
2085 CompileUnit *TheCU = *I;
2086 if (TheCU->getCUDie() == Die)
2087 return TheCU->getDebugInfoOffset();
2089 llvm_unreachable("The compile unit DIE should belong to CUs in DwarfUnits.");
2092 // Emit the debug info section.
2093 void DwarfDebug::emitDebugInfo() {
2094 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2096 Holder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoSection(),
2097 Asm->getObjFileLowering().getDwarfAbbrevSection(),
2098 DwarfAbbrevSectionSym);
2101 // Emit the abbreviation section.
2102 void DwarfDebug::emitAbbreviations() {
2103 if (!useSplitDwarf())
2104 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
2107 emitSkeletonAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
2110 void DwarfDebug::emitAbbrevs(const MCSection *Section,
2111 std::vector<DIEAbbrev *> *Abbrevs) {
2112 // Check to see if it is worth the effort.
2113 if (!Abbrevs->empty()) {
2114 // Start the debug abbrev section.
2115 Asm->OutStreamer.SwitchSection(Section);
2117 MCSymbol *Begin = Asm->GetTempSymbol(Section->getLabelBeginName());
2118 Asm->OutStreamer.EmitLabel(Begin);
2120 // For each abbrevation.
2121 for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
2122 // Get abbreviation data
2123 const DIEAbbrev *Abbrev = Abbrevs->at(i);
2125 // Emit the abbrevations code (base 1 index.)
2126 Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
2128 // Emit the abbreviations data.
2132 // Mark end of abbreviations.
2133 Asm->EmitULEB128(0, "EOM(3)");
2135 MCSymbol *End = Asm->GetTempSymbol(Section->getLabelEndName());
2136 Asm->OutStreamer.EmitLabel(End);
2140 // Emit the last address of the section and the end of the line matrix.
2141 void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
2142 // Define last address of section.
2143 Asm->OutStreamer.AddComment("Extended Op");
2146 Asm->OutStreamer.AddComment("Op size");
2147 Asm->EmitInt8(Asm->getDataLayout().getPointerSize() + 1);
2148 Asm->OutStreamer.AddComment("DW_LNE_set_address");
2149 Asm->EmitInt8(dwarf::DW_LNE_set_address);
2151 Asm->OutStreamer.AddComment("Section end label");
2153 Asm->OutStreamer.EmitSymbolValue(Asm->GetTempSymbol("section_end",SectionEnd),
2154 Asm->getDataLayout().getPointerSize());
2156 // Mark end of matrix.
2157 Asm->OutStreamer.AddComment("DW_LNE_end_sequence");
2163 // Emit visible names into a hashed accelerator table section.
2164 void DwarfDebug::emitAccelNames() {
2165 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
2166 dwarf::DW_FORM_data4));
2167 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2168 E = CUMap.end(); I != E; ++I) {
2169 CompileUnit *TheCU = I->second;
2170 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNames();
2171 for (StringMap<std::vector<DIE*> >::const_iterator
2172 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2173 StringRef Name = GI->getKey();
2174 const std::vector<DIE *> &Entities = GI->second;
2175 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2176 DE = Entities.end(); DI != DE; ++DI)
2177 AT.AddName(Name, (*DI));
2181 AT.FinalizeTable(Asm, "Names");
2182 Asm->OutStreamer.SwitchSection(
2183 Asm->getObjFileLowering().getDwarfAccelNamesSection());
2184 MCSymbol *SectionBegin = Asm->GetTempSymbol("names_begin");
2185 Asm->OutStreamer.EmitLabel(SectionBegin);
2187 // Emit the full data.
2188 AT.Emit(Asm, SectionBegin, &InfoHolder);
2191 // Emit objective C classes and categories into a hashed accelerator table
2193 void DwarfDebug::emitAccelObjC() {
2194 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
2195 dwarf::DW_FORM_data4));
2196 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2197 E = CUMap.end(); I != E; ++I) {
2198 CompileUnit *TheCU = I->second;
2199 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelObjC();
2200 for (StringMap<std::vector<DIE*> >::const_iterator
2201 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2202 StringRef Name = GI->getKey();
2203 const std::vector<DIE *> &Entities = GI->second;
2204 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2205 DE = Entities.end(); DI != DE; ++DI)
2206 AT.AddName(Name, (*DI));
2210 AT.FinalizeTable(Asm, "ObjC");
2211 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2212 .getDwarfAccelObjCSection());
2213 MCSymbol *SectionBegin = Asm->GetTempSymbol("objc_begin");
2214 Asm->OutStreamer.EmitLabel(SectionBegin);
2216 // Emit the full data.
2217 AT.Emit(Asm, SectionBegin, &InfoHolder);
2220 // Emit namespace dies into a hashed accelerator table.
2221 void DwarfDebug::emitAccelNamespaces() {
2222 DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
2223 dwarf::DW_FORM_data4));
2224 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2225 E = CUMap.end(); I != E; ++I) {
2226 CompileUnit *TheCU = I->second;
2227 const StringMap<std::vector<DIE*> > &Names = TheCU->getAccelNamespace();
2228 for (StringMap<std::vector<DIE*> >::const_iterator
2229 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2230 StringRef Name = GI->getKey();
2231 const std::vector<DIE *> &Entities = GI->second;
2232 for (std::vector<DIE *>::const_iterator DI = Entities.begin(),
2233 DE = Entities.end(); DI != DE; ++DI)
2234 AT.AddName(Name, (*DI));
2238 AT.FinalizeTable(Asm, "namespac");
2239 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2240 .getDwarfAccelNamespaceSection());
2241 MCSymbol *SectionBegin = Asm->GetTempSymbol("namespac_begin");
2242 Asm->OutStreamer.EmitLabel(SectionBegin);
2244 // Emit the full data.
2245 AT.Emit(Asm, SectionBegin, &InfoHolder);
2248 // Emit type dies into a hashed accelerator table.
2249 void DwarfDebug::emitAccelTypes() {
2250 std::vector<DwarfAccelTable::Atom> Atoms;
2251 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
2252 dwarf::DW_FORM_data4));
2253 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag,
2254 dwarf::DW_FORM_data2));
2255 Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags,
2256 dwarf::DW_FORM_data1));
2257 DwarfAccelTable AT(Atoms);
2258 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2259 E = CUMap.end(); I != E; ++I) {
2260 CompileUnit *TheCU = I->second;
2261 const StringMap<std::vector<std::pair<DIE*, unsigned > > > &Names
2262 = TheCU->getAccelTypes();
2263 for (StringMap<std::vector<std::pair<DIE*, unsigned> > >::const_iterator
2264 GI = Names.begin(), GE = Names.end(); GI != GE; ++GI) {
2265 StringRef Name = GI->getKey();
2266 const std::vector<std::pair<DIE *, unsigned> > &Entities = GI->second;
2267 for (std::vector<std::pair<DIE *, unsigned> >::const_iterator DI
2268 = Entities.begin(), DE = Entities.end(); DI !=DE; ++DI)
2269 AT.AddName(Name, (*DI).first, (*DI).second);
2273 AT.FinalizeTable(Asm, "types");
2274 Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering()
2275 .getDwarfAccelTypesSection());
2276 MCSymbol *SectionBegin = Asm->GetTempSymbol("types_begin");
2277 Asm->OutStreamer.EmitLabel(SectionBegin);
2279 // Emit the full data.
2280 AT.Emit(Asm, SectionBegin, &InfoHolder);
2283 /// emitDebugPubNames - Emit visible names into a debug pubnames section.
2285 void DwarfDebug::emitDebugPubNames() {
2286 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2288 typedef DenseMap<const MDNode*, CompileUnit*> CUMapType;
2289 for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
2290 CompileUnit *TheCU = I->second;
2291 unsigned ID = TheCU->getUniqueID();
2293 if (TheCU->getGlobalNames().empty())
2296 // Start the dwarf pubnames section.
2298 .SwitchSection(Asm->getObjFileLowering().getDwarfPubNamesSection());
2300 Asm->OutStreamer.AddComment("Length of Public Names Info");
2301 Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
2302 Asm->GetTempSymbol("pubnames_begin", ID), 4);
2304 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_begin", ID));
2306 Asm->OutStreamer.AddComment("DWARF Version");
2307 Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
2309 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2310 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2311 DwarfInfoSectionSym);
2313 Asm->OutStreamer.AddComment("Compilation Unit Length");
2314 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(), ID),
2315 Asm->GetTempSymbol(ISec->getLabelBeginName(), ID),
2318 const StringMap<DIE*> &Globals = TheCU->getGlobalNames();
2319 for (StringMap<DIE*>::const_iterator
2320 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2321 const char *Name = GI->getKeyData();
2322 const DIE *Entity = GI->second;
2324 Asm->OutStreamer.AddComment("DIE offset");
2325 Asm->EmitInt32(Entity->getOffset());
2327 if (Asm->isVerbose())
2328 Asm->OutStreamer.AddComment("External Name");
2329 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
2332 Asm->OutStreamer.AddComment("End Mark");
2334 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubnames_end", ID));
2338 void DwarfDebug::emitDebugPubTypes() {
2339 for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
2340 E = CUMap.end(); I != E; ++I) {
2341 CompileUnit *TheCU = I->second;
2342 // Start the dwarf pubtypes section.
2343 Asm->OutStreamer.SwitchSection(
2344 Asm->getObjFileLowering().getDwarfPubTypesSection());
2345 Asm->OutStreamer.AddComment("Length of Public Types Info");
2346 Asm->EmitLabelDifference(
2347 Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
2348 Asm->GetTempSymbol("pubtypes_begin", TheCU->getUniqueID()), 4);
2350 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_begin",
2351 TheCU->getUniqueID()));
2353 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DWARF Version");
2354 Asm->EmitInt16(dwarf::DW_PUBTYPES_VERSION);
2356 Asm->OutStreamer.AddComment("Offset of Compilation Unit Info");
2357 const MCSection *ISec = Asm->getObjFileLowering().getDwarfInfoSection();
2358 Asm->EmitSectionOffset(Asm->GetTempSymbol(ISec->getLabelBeginName(),
2359 TheCU->getUniqueID()),
2360 DwarfInfoSectionSym);
2362 Asm->OutStreamer.AddComment("Compilation Unit Length");
2363 Asm->EmitLabelDifference(Asm->GetTempSymbol(ISec->getLabelEndName(),
2364 TheCU->getUniqueID()),
2365 Asm->GetTempSymbol(ISec->getLabelBeginName(),
2366 TheCU->getUniqueID()),
2369 const StringMap<DIE*> &Globals = TheCU->getGlobalTypes();
2370 for (StringMap<DIE*>::const_iterator
2371 GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
2372 const char *Name = GI->getKeyData();
2373 DIE *Entity = GI->second;
2375 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("DIE offset");
2376 Asm->EmitInt32(Entity->getOffset());
2378 if (Asm->isVerbose()) Asm->OutStreamer.AddComment("External Name");
2379 // Emit the name with a terminating null byte.
2380 Asm->OutStreamer.EmitBytes(StringRef(Name, GI->getKeyLength()+1));
2383 Asm->OutStreamer.AddComment("End Mark");
2385 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("pubtypes_end",
2386 TheCU->getUniqueID()));
2390 // Emit strings into a string section.
2391 void DwarfUnits::emitStrings(const MCSection *StrSection,
2392 const MCSection *OffsetSection = NULL,
2393 const MCSymbol *StrSecSym = NULL) {
2395 if (StringPool.empty()) return;
2397 // Start the dwarf str section.
2398 Asm->OutStreamer.SwitchSection(StrSection);
2400 // Get all of the string pool entries and put them in an array by their ID so
2401 // we can sort them.
2402 SmallVector<std::pair<unsigned,
2403 StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
2405 for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
2406 I = StringPool.begin(), E = StringPool.end();
2408 Entries.push_back(std::make_pair(I->second.second, &*I));
2410 array_pod_sort(Entries.begin(), Entries.end());
2412 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2413 // Emit a label for reference from debug information entries.
2414 Asm->OutStreamer.EmitLabel(Entries[i].second->getValue().first);
2416 // Emit the string itself with a terminating null byte.
2417 Asm->OutStreamer.EmitBytes(StringRef(Entries[i].second->getKeyData(),
2418 Entries[i].second->getKeyLength()+1));
2421 // If we've got an offset section go ahead and emit that now as well.
2422 if (OffsetSection) {
2423 Asm->OutStreamer.SwitchSection(OffsetSection);
2424 unsigned offset = 0;
2425 unsigned size = 4; // FIXME: DWARF64 is 8.
2426 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2427 Asm->OutStreamer.EmitIntValue(offset, size);
2428 offset += Entries[i].second->getKeyLength() + 1;
2433 // Emit strings into a string section.
2434 void DwarfUnits::emitAddresses(const MCSection *AddrSection) {
2436 if (AddressPool.empty()) return;
2438 // Start the dwarf addr section.
2439 Asm->OutStreamer.SwitchSection(AddrSection);
2441 // Order the address pool entries by ID
2442 SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
2444 for (DenseMap<const MCExpr *, unsigned>::iterator I = AddressPool.begin(),
2445 E = AddressPool.end();
2447 Entries[I->second] = I->first;
2449 for (unsigned i = 0, e = Entries.size(); i != e; ++i) {
2450 // Emit an expression for reference from debug information entries.
2451 if (const MCExpr *Expr = Entries[i])
2452 Asm->OutStreamer.EmitValue(Expr, Asm->getDataLayout().getPointerSize());
2454 Asm->OutStreamer.EmitIntValue(0, Asm->getDataLayout().getPointerSize());
2459 // Emit visible names into a debug str section.
2460 void DwarfDebug::emitDebugStr() {
2461 DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
2462 Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
2465 // Emit locations into the debug loc section.
2466 void DwarfDebug::emitDebugLoc() {
2467 if (DotDebugLocEntries.empty())
2470 for (SmallVectorImpl<DotDebugLocEntry>::iterator
2471 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2473 DotDebugLocEntry &Entry = *I;
2474 if (I + 1 != DotDebugLocEntries.end())
2478 // Start the dwarf loc section.
2479 Asm->OutStreamer.SwitchSection(
2480 Asm->getObjFileLowering().getDwarfLocSection());
2481 unsigned char Size = Asm->getDataLayout().getPointerSize();
2482 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0));
2484 for (SmallVectorImpl<DotDebugLocEntry>::iterator
2485 I = DotDebugLocEntries.begin(), E = DotDebugLocEntries.end();
2486 I != E; ++I, ++index) {
2487 DotDebugLocEntry &Entry = *I;
2488 if (Entry.isMerged()) continue;
2489 if (Entry.isEmpty()) {
2490 Asm->OutStreamer.EmitIntValue(0, Size);
2491 Asm->OutStreamer.EmitIntValue(0, Size);
2492 Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index));
2494 Asm->OutStreamer.EmitSymbolValue(Entry.getBeginSym(), Size);
2495 Asm->OutStreamer.EmitSymbolValue(Entry.getEndSym(), Size);
2496 DIVariable DV(Entry.getVariable());
2497 Asm->OutStreamer.AddComment("Loc expr size");
2498 MCSymbol *begin = Asm->OutStreamer.getContext().CreateTempSymbol();
2499 MCSymbol *end = Asm->OutStreamer.getContext().CreateTempSymbol();
2500 Asm->EmitLabelDifference(end, begin, 2);
2501 Asm->OutStreamer.EmitLabel(begin);
2502 if (Entry.isInt()) {
2503 DIBasicType BTy(DV.getType());
2505 (BTy.getEncoding() == dwarf::DW_ATE_signed
2506 || BTy.getEncoding() == dwarf::DW_ATE_signed_char)) {
2507 Asm->OutStreamer.AddComment("DW_OP_consts");
2508 Asm->EmitInt8(dwarf::DW_OP_consts);
2509 Asm->EmitSLEB128(Entry.getInt());
2511 Asm->OutStreamer.AddComment("DW_OP_constu");
2512 Asm->EmitInt8(dwarf::DW_OP_constu);
2513 Asm->EmitULEB128(Entry.getInt());
2515 } else if (Entry.isLocation()) {
2516 MachineLocation Loc = Entry.getLoc();
2517 if (!DV.hasComplexAddress())
2519 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
2521 // Complex address entry.
2522 unsigned N = DV.getNumAddrElements();
2524 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) {
2525 if (Loc.getOffset()) {
2527 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
2528 Asm->OutStreamer.AddComment("DW_OP_deref");
2529 Asm->EmitInt8(dwarf::DW_OP_deref);
2530 Asm->OutStreamer.AddComment("DW_OP_plus_uconst");
2531 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2532 Asm->EmitSLEB128(DV.getAddrElement(1));
2534 // If first address element is OpPlus then emit
2535 // DW_OP_breg + Offset instead of DW_OP_reg + Offset.
2536 MachineLocation TLoc(Loc.getReg(), DV.getAddrElement(1));
2537 Asm->EmitDwarfRegOp(TLoc, DV.isIndirect());
2541 Asm->EmitDwarfRegOp(Loc, DV.isIndirect());
2544 // Emit remaining complex address elements.
2545 for (; i < N; ++i) {
2546 uint64_t Element = DV.getAddrElement(i);
2547 if (Element == DIBuilder::OpPlus) {
2548 Asm->EmitInt8(dwarf::DW_OP_plus_uconst);
2549 Asm->EmitULEB128(DV.getAddrElement(++i));
2550 } else if (Element == DIBuilder::OpDeref) {
2552 Asm->EmitInt8(dwarf::DW_OP_deref);
2554 llvm_unreachable("unknown Opcode found in complex address");
2558 // else ... ignore constant fp. There is not any good way to
2559 // to represent them here in dwarf.
2560 Asm->OutStreamer.EmitLabel(end);
2565 // Emit visible names into a debug aranges section.
2566 void DwarfDebug::emitDebugARanges() {
2567 // Start the dwarf aranges section.
2569 .SwitchSection(Asm->getObjFileLowering().getDwarfARangesSection());
2572 // Emit visible names into a debug ranges section.
2573 void DwarfDebug::emitDebugRanges() {
2574 // Start the dwarf ranges section.
2576 .SwitchSection(Asm->getObjFileLowering().getDwarfRangesSection());
2577 unsigned char Size = Asm->getDataLayout().getPointerSize();
2578 for (SmallVectorImpl<const MCSymbol *>::iterator
2579 I = DebugRangeSymbols.begin(), E = DebugRangeSymbols.end();
2582 Asm->OutStreamer.EmitSymbolValue(const_cast<MCSymbol*>(*I), Size);
2584 Asm->OutStreamer.EmitIntValue(0, Size);
2588 // Emit visible names into a debug macinfo section.
2589 void DwarfDebug::emitDebugMacInfo() {
2590 if (const MCSection *LineInfo =
2591 Asm->getObjFileLowering().getDwarfMacroInfoSection()) {
2592 // Start the dwarf macinfo section.
2593 Asm->OutStreamer.SwitchSection(LineInfo);
2597 // DWARF5 Experimental Separate Dwarf emitters.
2599 // This DIE has the following attributes: DW_AT_comp_dir, DW_AT_stmt_list,
2600 // DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges, DW_AT_dwo_name, DW_AT_dwo_id,
2601 // DW_AT_ranges_base, DW_AT_addr_base. If DW_AT_ranges is present,
2602 // DW_AT_low_pc and DW_AT_high_pc are not used, and vice versa.
2603 CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
2605 DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
2606 CompileUnit *NewCU = new CompileUnit(CU->getUniqueID(), Die, CU->getNode(),
2607 Asm, this, &SkeletonHolder);
2609 NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name,
2610 DICompileUnit(CU->getNode()).getSplitDebugFilename());
2612 // Relocate to the beginning of the addr_base section, else 0 for the
2613 // beginning of the one for this compile unit.
2614 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2615 NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
2616 DwarfAddrSectionSym);
2618 NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
2619 dwarf::DW_FORM_sec_offset, 0);
2621 // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
2622 // into an entity. We're using 0, or a NULL label for this.
2623 NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0);
2625 // DW_AT_stmt_list is a offset of line number information for this
2626 // compile unit in debug_line section.
2627 // FIXME: Should handle multiple compile units.
2628 if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
2629 NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
2630 DwarfLineSectionSym);
2632 NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
2634 if (!CompilationDir.empty())
2635 NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
2637 SkeletonHolder.addUnit(NewCU);
2638 SkeletonCUs.push_back(NewCU);
2643 void DwarfDebug::emitSkeletonAbbrevs(const MCSection *Section) {
2644 assert(useSplitDwarf() && "No split dwarf debug info?");
2645 emitAbbrevs(Section, &SkeletonAbbrevs);
2648 // Emit the .debug_info.dwo section for separated dwarf. This contains the
2649 // compile units that would normally be in debug_info.
2650 void DwarfDebug::emitDebugInfoDWO() {
2651 assert(useSplitDwarf() && "No split dwarf debug info?");
2652 InfoHolder.emitUnits(this, Asm->getObjFileLowering().getDwarfInfoDWOSection(),
2653 Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2654 DwarfAbbrevDWOSectionSym);
2657 // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2658 // abbreviations for the .debug_info.dwo section.
2659 void DwarfDebug::emitDebugAbbrevDWO() {
2660 assert(useSplitDwarf() && "No split dwarf?");
2661 emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
2665 // Emit the .debug_str.dwo section for separated dwarf. This contains the
2666 // string section and is identical in format to traditional .debug_str
2668 void DwarfDebug::emitDebugStrDWO() {
2669 assert(useSplitDwarf() && "No split dwarf?");
2670 const MCSection *OffSec = Asm->getObjFileLowering()
2671 .getDwarfStrOffDWOSection();
2672 const MCSymbol *StrSym = DwarfStrSectionSym;
2673 InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),