1 //===- llvm/CodeGen/DwarfDebug.cpp - Dwarf Debug Framework ----------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains support for writing dwarf debug info into asm files.
11 //===----------------------------------------------------------------------===//
13 #include "DwarfDebug.h"
14 #include "ByteStreamer.h"
16 #include "DebugLocEntry.h"
17 #include "DebugLocStream.h"
18 #include "DwarfCompileUnit.h"
19 #include "DwarfExpression.h"
20 #include "DwarfFile.h"
21 #include "DwarfUnit.h"
22 #include "llvm/ADT/APInt.h"
23 #include "llvm/ADT/DenseMap.h"
24 #include "llvm/ADT/DenseSet.h"
25 #include "llvm/ADT/MapVector.h"
26 #include "llvm/ADT/STLExtras.h"
27 #include "llvm/ADT/SmallVector.h"
28 #include "llvm/ADT/StringRef.h"
29 #include "llvm/ADT/Triple.h"
30 #include "llvm/ADT/Twine.h"
31 #include "llvm/BinaryFormat/Dwarf.h"
32 #include "llvm/CodeGen/AccelTable.h"
33 #include "llvm/CodeGen/AsmPrinter.h"
34 #include "llvm/CodeGen/DIE.h"
35 #include "llvm/CodeGen/LexicalScopes.h"
36 #include "llvm/CodeGen/MachineBasicBlock.h"
37 #include "llvm/CodeGen/MachineFunction.h"
38 #include "llvm/CodeGen/MachineInstr.h"
39 #include "llvm/CodeGen/MachineModuleInfo.h"
40 #include "llvm/CodeGen/MachineOperand.h"
41 #include "llvm/CodeGen/TargetInstrInfo.h"
42 #include "llvm/CodeGen/TargetRegisterInfo.h"
43 #include "llvm/CodeGen/TargetSubtargetInfo.h"
44 #include "llvm/DebugInfo/DWARF/DWARFExpression.h"
45 #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
46 #include "llvm/IR/Constants.h"
47 #include "llvm/IR/DebugInfoMetadata.h"
48 #include "llvm/IR/DebugLoc.h"
49 #include "llvm/IR/Function.h"
50 #include "llvm/IR/GlobalVariable.h"
51 #include "llvm/IR/Module.h"
52 #include "llvm/MC/MCAsmInfo.h"
53 #include "llvm/MC/MCContext.h"
54 #include "llvm/MC/MCDwarf.h"
55 #include "llvm/MC/MCSection.h"
56 #include "llvm/MC/MCStreamer.h"
57 #include "llvm/MC/MCSymbol.h"
58 #include "llvm/MC/MCTargetOptions.h"
59 #include "llvm/MC/MachineLocation.h"
60 #include "llvm/MC/SectionKind.h"
61 #include "llvm/Pass.h"
62 #include "llvm/Support/Casting.h"
63 #include "llvm/Support/CommandLine.h"
64 #include "llvm/Support/Debug.h"
65 #include "llvm/Support/ErrorHandling.h"
66 #include "llvm/Support/MD5.h"
67 #include "llvm/Support/MathExtras.h"
68 #include "llvm/Support/Timer.h"
69 #include "llvm/Support/raw_ostream.h"
70 #include "llvm/Target/TargetLoweringObjectFile.h"
71 #include "llvm/Target/TargetMachine.h"
72 #include "llvm/Target/TargetOptions.h"
84 #define DEBUG_TYPE "dwarfdebug"
87 DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden
,
88 cl::desc("Disable debug info printing"));
90 static cl::opt
<bool> UseDwarfRangesBaseAddressSpecifier(
91 "use-dwarf-ranges-base-address-specifier", cl::Hidden
,
92 cl::desc("Use base address specifiers in debug_ranges"), cl::init(false));
94 static cl::opt
<bool> GenerateARangeSection("generate-arange-section",
96 cl::desc("Generate dwarf aranges"),
100 GenerateDwarfTypeUnits("generate-type-units", cl::Hidden
,
101 cl::desc("Generate DWARF4 type units."),
104 static cl::opt
<bool> SplitDwarfCrossCuReferences(
105 "split-dwarf-cross-cu-references", cl::Hidden
,
106 cl::desc("Enable cross-cu references in DWO files"), cl::init(false));
108 enum DefaultOnOff
{ Default
, Enable
, Disable
};
110 static cl::opt
<DefaultOnOff
> UnknownLocations(
111 "use-unknown-locations", cl::Hidden
,
112 cl::desc("Make an absence of debug location information explicit."),
113 cl::values(clEnumVal(Default
, "At top of block or after label"),
114 clEnumVal(Enable
, "In all cases"), clEnumVal(Disable
, "Never")),
117 static cl::opt
<AccelTableKind
> AccelTables(
118 "accel-tables", cl::Hidden
, cl::desc("Output dwarf accelerator tables."),
119 cl::values(clEnumValN(AccelTableKind::Default
, "Default",
120 "Default for platform"),
121 clEnumValN(AccelTableKind::None
, "Disable", "Disabled."),
122 clEnumValN(AccelTableKind::Apple
, "Apple", "Apple"),
123 clEnumValN(AccelTableKind::Dwarf
, "Dwarf", "DWARF")),
124 cl::init(AccelTableKind::Default
));
126 static cl::opt
<DefaultOnOff
>
127 DwarfInlinedStrings("dwarf-inlined-strings", cl::Hidden
,
128 cl::desc("Use inlined strings rather than string section."),
129 cl::values(clEnumVal(Default
, "Default for platform"),
130 clEnumVal(Enable
, "Enabled"),
131 clEnumVal(Disable
, "Disabled")),
135 NoDwarfRangesSection("no-dwarf-ranges-section", cl::Hidden
,
136 cl::desc("Disable emission .debug_ranges section."),
139 static cl::opt
<DefaultOnOff
> DwarfSectionsAsReferences(
140 "dwarf-sections-as-references", cl::Hidden
,
141 cl::desc("Use sections+offset as references rather than labels."),
142 cl::values(clEnumVal(Default
, "Default for platform"),
143 clEnumVal(Enable
, "Enabled"), clEnumVal(Disable
, "Disabled")),
146 enum LinkageNameOption
{
152 static cl::opt
<LinkageNameOption
>
153 DwarfLinkageNames("dwarf-linkage-names", cl::Hidden
,
154 cl::desc("Which DWARF linkage-name attributes to emit."),
155 cl::values(clEnumValN(DefaultLinkageNames
, "Default",
156 "Default for platform"),
157 clEnumValN(AllLinkageNames
, "All", "All"),
158 clEnumValN(AbstractLinkageNames
, "Abstract",
159 "Abstract subprograms")),
160 cl::init(DefaultLinkageNames
));
162 static const char *const DWARFGroupName
= "dwarf";
163 static const char *const DWARFGroupDescription
= "DWARF Emission";
164 static const char *const DbgTimerName
= "writer";
165 static const char *const DbgTimerDescription
= "DWARF Debug Writer";
166 static constexpr unsigned ULEB128PadSize
= 4;
168 void DebugLocDwarfExpression::emitOp(uint8_t Op
, const char *Comment
) {
170 Op
, Comment
? Twine(Comment
) + " " + dwarf::OperationEncodingString(Op
)
171 : dwarf::OperationEncodingString(Op
));
174 void DebugLocDwarfExpression::emitSigned(int64_t Value
) {
175 BS
.EmitSLEB128(Value
, Twine(Value
));
178 void DebugLocDwarfExpression::emitUnsigned(uint64_t Value
) {
179 BS
.EmitULEB128(Value
, Twine(Value
));
182 void DebugLocDwarfExpression::emitData1(uint8_t Value
) {
183 BS
.EmitInt8(Value
, Twine(Value
));
186 void DebugLocDwarfExpression::emitBaseTypeRef(uint64_t Idx
) {
187 assert(Idx
< (1ULL << (ULEB128PadSize
* 7)) && "Idx wont fit");
188 BS
.EmitULEB128(Idx
, Twine(Idx
), ULEB128PadSize
);
191 bool DebugLocDwarfExpression::isFrameRegister(const TargetRegisterInfo
&TRI
,
192 unsigned MachineReg
) {
193 // This information is not available while emitting .debug_loc entries.
197 bool DbgVariable::isBlockByrefVariable() const {
198 assert(getVariable() && "Invalid complex DbgVariable!");
199 return getVariable()->getType()->isBlockByrefStruct();
202 const DIType
*DbgVariable::getType() const {
203 DIType
*Ty
= getVariable()->getType();
204 // FIXME: isBlockByrefVariable should be reformulated in terms of complex
205 // addresses instead.
206 if (Ty
->isBlockByrefStruct()) {
207 /* Byref variables, in Blocks, are declared by the programmer as
208 "SomeType VarName;", but the compiler creates a
209 __Block_byref_x_VarName struct, and gives the variable VarName
210 either the struct, or a pointer to the struct, as its type. This
211 is necessary for various behind-the-scenes things the compiler
212 needs to do with by-reference variables in blocks.
214 However, as far as the original *programmer* is concerned, the
215 variable should still have type 'SomeType', as originally declared.
217 The following function dives into the __Block_byref_x_VarName
218 struct to find the original type of the variable. This will be
219 passed back to the code generating the type for the Debug
220 Information Entry for the variable 'VarName'. 'VarName' will then
221 have the original type 'SomeType' in its debug information.
223 The original type 'SomeType' will be the type of the field named
224 'VarName' inside the __Block_byref_x_VarName struct.
226 NOTE: In order for this to not completely fail on the debugger
227 side, the Debug Information Entry for the variable VarName needs to
228 have a DW_AT_location that tells the debugger how to unwind through
229 the pointers and __Block_byref_x_VarName struct to find the actual
230 value of the variable. The function addBlockByrefType does this. */
231 DIType
*subType
= Ty
;
232 uint16_t tag
= Ty
->getTag();
234 if (tag
== dwarf::DW_TAG_pointer_type
)
235 subType
= cast
<DIDerivedType
>(Ty
)->getBaseType();
237 auto Elements
= cast
<DICompositeType
>(subType
)->getElements();
238 for (unsigned i
= 0, N
= Elements
.size(); i
< N
; ++i
) {
239 auto *DT
= cast
<DIDerivedType
>(Elements
[i
]);
240 if (getName() == DT
->getName())
241 return DT
->getBaseType();
247 ArrayRef
<DbgVariable::FrameIndexExpr
> DbgVariable::getFrameIndexExprs() const {
248 if (FrameIndexExprs
.size() == 1)
249 return FrameIndexExprs
;
251 assert(llvm::all_of(FrameIndexExprs
,
252 [](const FrameIndexExpr
&A
) {
253 return A
.Expr
->isFragment();
255 "multiple FI expressions without DW_OP_LLVM_fragment");
256 llvm::sort(FrameIndexExprs
,
257 [](const FrameIndexExpr
&A
, const FrameIndexExpr
&B
) -> bool {
258 return A
.Expr
->getFragmentInfo()->OffsetInBits
<
259 B
.Expr
->getFragmentInfo()->OffsetInBits
;
262 return FrameIndexExprs
;
265 void DbgVariable::addMMIEntry(const DbgVariable
&V
) {
266 assert(DebugLocListIndex
== ~0U && !MInsn
&& "not an MMI entry");
267 assert(V
.DebugLocListIndex
== ~0U && !V
.MInsn
&& "not an MMI entry");
268 assert(V
.getVariable() == getVariable() && "conflicting variable");
269 assert(V
.getInlinedAt() == getInlinedAt() && "conflicting inlined-at location");
271 assert(!FrameIndexExprs
.empty() && "Expected an MMI entry");
272 assert(!V
.FrameIndexExprs
.empty() && "Expected an MMI entry");
274 // FIXME: This logic should not be necessary anymore, as we now have proper
275 // deduplication. However, without it, we currently run into the assertion
276 // below, which means that we are likely dealing with broken input, i.e. two
277 // non-fragment entries for the same variable at different frame indices.
278 if (FrameIndexExprs
.size()) {
279 auto *Expr
= FrameIndexExprs
.back().Expr
;
280 if (!Expr
|| !Expr
->isFragment())
284 for (const auto &FIE
: V
.FrameIndexExprs
)
285 // Ignore duplicate entries.
286 if (llvm::none_of(FrameIndexExprs
, [&](const FrameIndexExpr
&Other
) {
287 return FIE
.FI
== Other
.FI
&& FIE
.Expr
== Other
.Expr
;
289 FrameIndexExprs
.push_back(FIE
);
291 assert((FrameIndexExprs
.size() == 1 ||
292 llvm::all_of(FrameIndexExprs
,
293 [](FrameIndexExpr
&FIE
) {
294 return FIE
.Expr
&& FIE
.Expr
->isFragment();
296 "conflicting locations for variable");
299 static AccelTableKind
computeAccelTableKind(unsigned DwarfVersion
,
300 bool GenerateTypeUnits
,
303 // Honor an explicit request.
304 if (AccelTables
!= AccelTableKind::Default
)
307 // Accelerator tables with type units are currently not supported.
308 if (GenerateTypeUnits
)
309 return AccelTableKind::None
;
311 // Accelerator tables get emitted if targetting DWARF v5 or LLDB. DWARF v5
312 // always implies debug_names. For lower standard versions we use apple
313 // accelerator tables on apple platforms and debug_names elsewhere.
314 if (DwarfVersion
>= 5)
315 return AccelTableKind::Dwarf
;
316 if (Tuning
== DebuggerKind::LLDB
)
317 return TT
.isOSBinFormatMachO() ? AccelTableKind::Apple
318 : AccelTableKind::Dwarf
;
319 return AccelTableKind::None
;
322 DwarfDebug::DwarfDebug(AsmPrinter
*A
, Module
*M
)
323 : DebugHandlerBase(A
), DebugLocs(A
->OutStreamer
->isVerboseAsm()),
324 InfoHolder(A
, "info_string", DIEValueAllocator
),
325 SkeletonHolder(A
, "skel_string", DIEValueAllocator
),
326 IsDarwin(A
->TM
.getTargetTriple().isOSDarwin()) {
327 const Triple
&TT
= Asm
->TM
.getTargetTriple();
329 // Make sure we know our "debugger tuning". The target option takes
330 // precedence; fall back to triple-based defaults.
331 if (Asm
->TM
.Options
.DebuggerTuning
!= DebuggerKind::Default
)
332 DebuggerTuning
= Asm
->TM
.Options
.DebuggerTuning
;
334 DebuggerTuning
= DebuggerKind::LLDB
;
335 else if (TT
.isPS4CPU())
336 DebuggerTuning
= DebuggerKind::SCE
;
338 DebuggerTuning
= DebuggerKind::GDB
;
340 if (DwarfInlinedStrings
== Default
)
341 UseInlineStrings
= TT
.isNVPTX();
343 UseInlineStrings
= DwarfInlinedStrings
== Enable
;
345 UseLocSection
= !TT
.isNVPTX();
347 HasAppleExtensionAttributes
= tuneForLLDB();
349 // Handle split DWARF.
350 HasSplitDwarf
= !Asm
->TM
.Options
.MCOptions
.SplitDwarfFile
.empty();
352 // SCE defaults to linkage names only for abstract subprograms.
353 if (DwarfLinkageNames
== DefaultLinkageNames
)
354 UseAllLinkageNames
= !tuneForSCE();
356 UseAllLinkageNames
= DwarfLinkageNames
== AllLinkageNames
;
358 unsigned DwarfVersionNumber
= Asm
->TM
.Options
.MCOptions
.DwarfVersion
;
359 unsigned DwarfVersion
= DwarfVersionNumber
? DwarfVersionNumber
360 : MMI
->getModule()->getDwarfVersion();
361 // Use dwarf 4 by default if nothing is requested. For NVPTX, use dwarf 2.
363 TT
.isNVPTX() ? 2 : (DwarfVersion
? DwarfVersion
: dwarf::DWARF_VERSION
);
365 UseRangesSection
= !NoDwarfRangesSection
&& !TT
.isNVPTX();
367 // Use sections as references. Force for NVPTX.
368 if (DwarfSectionsAsReferences
== Default
)
369 UseSectionsAsReferences
= TT
.isNVPTX();
371 UseSectionsAsReferences
= DwarfSectionsAsReferences
== Enable
;
373 // Don't generate type units for unsupported object file formats.
375 A
->TM
.getTargetTriple().isOSBinFormatELF() && GenerateDwarfTypeUnits
;
377 TheAccelTableKind
= computeAccelTableKind(
378 DwarfVersion
, GenerateTypeUnits
, DebuggerTuning
, A
->TM
.getTargetTriple());
380 // Work around a GDB bug. GDB doesn't support the standard opcode;
381 // SCE doesn't support GNU's; LLDB prefers the standard opcode, which
382 // is defined as of DWARF 3.
383 // See GDB bug 11616 - DW_OP_form_tls_address is unimplemented
384 // https://sourceware.org/bugzilla/show_bug.cgi?id=11616
385 UseGNUTLSOpcode
= tuneForGDB() || DwarfVersion
< 3;
387 // GDB does not fully support the DWARF 4 representation for bitfields.
388 UseDWARF2Bitfields
= (DwarfVersion
< 4) || tuneForGDB();
390 // The DWARF v5 string offsets table has - possibly shared - contributions
391 // from each compile and type unit each preceded by a header. The string
392 // offsets table used by the pre-DWARF v5 split-DWARF implementation uses
393 // a monolithic string offsets table without any header.
394 UseSegmentedStringOffsetsTable
= DwarfVersion
>= 5;
396 Asm
->OutStreamer
->getContext().setDwarfVersion(DwarfVersion
);
399 // Define out of line so we don't have to include DwarfUnit.h in DwarfDebug.h.
400 DwarfDebug::~DwarfDebug() = default;
402 static bool isObjCClass(StringRef Name
) {
403 return Name
.startswith("+") || Name
.startswith("-");
406 static bool hasObjCCategory(StringRef Name
) {
407 if (!isObjCClass(Name
))
410 return Name
.find(") ") != StringRef::npos
;
413 static void getObjCClassCategory(StringRef In
, StringRef
&Class
,
414 StringRef
&Category
) {
415 if (!hasObjCCategory(In
)) {
416 Class
= In
.slice(In
.find('[') + 1, In
.find(' '));
421 Class
= In
.slice(In
.find('[') + 1, In
.find('('));
422 Category
= In
.slice(In
.find('[') + 1, In
.find(' '));
425 static StringRef
getObjCMethodName(StringRef In
) {
426 return In
.slice(In
.find(' ') + 1, In
.find(']'));
429 // Add the various names to the Dwarf accelerator table names.
430 void DwarfDebug::addSubprogramNames(const DICompileUnit
&CU
,
431 const DISubprogram
*SP
, DIE
&Die
) {
432 if (getAccelTableKind() != AccelTableKind::Apple
&&
433 CU
.getNameTableKind() == DICompileUnit::DebugNameTableKind::None
)
436 if (!SP
->isDefinition())
439 if (SP
->getName() != "")
440 addAccelName(CU
, SP
->getName(), Die
);
442 // If the linkage name is different than the name, go ahead and output that as
443 // well into the name table. Only do that if we are going to actually emit
445 if (SP
->getLinkageName() != "" && SP
->getName() != SP
->getLinkageName() &&
446 (useAllLinkageNames() || InfoHolder
.getAbstractSPDies().lookup(SP
)))
447 addAccelName(CU
, SP
->getLinkageName(), Die
);
449 // If this is an Objective-C selector name add it to the ObjC accelerator
451 if (isObjCClass(SP
->getName())) {
452 StringRef Class
, Category
;
453 getObjCClassCategory(SP
->getName(), Class
, Category
);
454 addAccelObjC(CU
, Class
, Die
);
456 addAccelObjC(CU
, Category
, Die
);
457 // Also add the base method name to the name table.
458 addAccelName(CU
, getObjCMethodName(SP
->getName()), Die
);
462 /// Check whether we should create a DIE for the given Scope, return true
463 /// if we don't create a DIE (the corresponding DIE is null).
464 bool DwarfDebug::isLexicalScopeDIENull(LexicalScope
*Scope
) {
465 if (Scope
->isAbstractScope())
468 // We don't create a DIE if there is no Range.
469 const SmallVectorImpl
<InsnRange
> &Ranges
= Scope
->getRanges();
473 if (Ranges
.size() > 1)
476 // We don't create a DIE if we have a single Range and the end label
478 return !getLabelAfterInsn(Ranges
.front().second
);
481 template <typename Func
> static void forBothCUs(DwarfCompileUnit
&CU
, Func F
) {
483 if (auto *SkelCU
= CU
.getSkeleton())
484 if (CU
.getCUNode()->getSplitDebugInlining())
488 bool DwarfDebug::shareAcrossDWOCUs() const {
489 return SplitDwarfCrossCuReferences
;
492 void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit
&SrcCU
,
493 LexicalScope
*Scope
) {
494 assert(Scope
&& Scope
->getScopeNode());
495 assert(Scope
->isAbstractScope());
496 assert(!Scope
->getInlinedAt());
498 auto *SP
= cast
<DISubprogram
>(Scope
->getScopeNode());
500 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
501 // was inlined from another compile unit.
502 if (useSplitDwarf() && !shareAcrossDWOCUs() && !SP
->getUnit()->getSplitDebugInlining())
503 // Avoid building the original CU if it won't be used
504 SrcCU
.constructAbstractSubprogramScopeDIE(Scope
);
506 auto &CU
= getOrCreateDwarfCompileUnit(SP
->getUnit());
507 if (auto *SkelCU
= CU
.getSkeleton()) {
508 (shareAcrossDWOCUs() ? CU
: SrcCU
)
509 .constructAbstractSubprogramScopeDIE(Scope
);
510 if (CU
.getCUNode()->getSplitDebugInlining())
511 SkelCU
->constructAbstractSubprogramScopeDIE(Scope
);
513 CU
.constructAbstractSubprogramScopeDIE(Scope
);
517 void DwarfDebug::constructCallSiteEntryDIEs(const DISubprogram
&SP
,
518 DwarfCompileUnit
&CU
, DIE
&ScopeDIE
,
519 const MachineFunction
&MF
) {
520 // Add a call site-related attribute (DWARF5, Sec. 3.3.1.3). Do this only if
521 // the subprogram is required to have one.
522 if (!SP
.areAllCallsDescribed() || !SP
.isDefinition())
525 // Use DW_AT_call_all_calls to express that call site entries are present
526 // for both tail and non-tail calls. Don't use DW_AT_call_all_source_calls
527 // because one of its requirements is not met: call site entries for
528 // optimized-out calls are elided.
529 CU
.addFlag(ScopeDIE
, dwarf::DW_AT_call_all_calls
);
531 const TargetInstrInfo
*TII
= MF
.getSubtarget().getInstrInfo();
532 assert(TII
&& "TargetInstrInfo not found: cannot label tail calls");
534 // Emit call site entries for each call or tail call in the function.
535 for (const MachineBasicBlock
&MBB
: MF
) {
536 for (const MachineInstr
&MI
: MBB
.instrs()) {
537 // Skip instructions which aren't calls. Both calls and tail-calling jump
538 // instructions (e.g TAILJMPd64) are classified correctly here.
542 // TODO: Add support for targets with delay slots (see: beginInstruction).
543 if (MI
.hasDelaySlot())
546 // If this is a direct call, find the callee's subprogram.
547 const MachineOperand
&CalleeOp
= MI
.getOperand(0);
548 if (!CalleeOp
.isGlobal())
550 const Function
*CalleeDecl
= dyn_cast
<Function
>(CalleeOp
.getGlobal());
551 if (!CalleeDecl
|| !CalleeDecl
->getSubprogram())
554 // TODO: Omit call site entries for runtime calls (objc_msgSend, etc).
555 // TODO: Add support for indirect calls.
557 bool IsTail
= TII
->isTailCall(MI
);
559 // For tail calls, no return PC information is needed. For regular calls,
560 // the return PC is needed to disambiguate paths in the call graph which
561 // could lead to some target function.
562 const MCExpr
*PCOffset
=
563 IsTail
? nullptr : getFunctionLocalOffsetAfterInsn(&MI
);
565 assert((IsTail
|| PCOffset
) && "Call without return PC information");
566 LLVM_DEBUG(dbgs() << "CallSiteEntry: " << MF
.getName() << " -> "
567 << CalleeDecl
->getName() << (IsTail
? " [tail]" : "")
569 CU
.constructCallSiteEntryDIE(ScopeDIE
, *CalleeDecl
->getSubprogram(),
575 void DwarfDebug::addGnuPubAttributes(DwarfCompileUnit
&U
, DIE
&D
) const {
576 if (!U
.hasDwarfPubSections())
579 U
.addFlag(D
, dwarf::DW_AT_GNU_pubnames
);
582 void DwarfDebug::finishUnitAttributes(const DICompileUnit
*DIUnit
,
583 DwarfCompileUnit
&NewCU
) {
584 DIE
&Die
= NewCU
.getUnitDie();
585 StringRef FN
= DIUnit
->getFilename();
587 StringRef Producer
= DIUnit
->getProducer();
588 StringRef Flags
= DIUnit
->getFlags();
589 if (!Flags
.empty() && !useAppleExtensionAttributes()) {
590 std::string ProducerWithFlags
= Producer
.str() + " " + Flags
.str();
591 NewCU
.addString(Die
, dwarf::DW_AT_producer
, ProducerWithFlags
);
593 NewCU
.addString(Die
, dwarf::DW_AT_producer
, Producer
);
595 NewCU
.addUInt(Die
, dwarf::DW_AT_language
, dwarf::DW_FORM_data2
,
596 DIUnit
->getSourceLanguage());
597 NewCU
.addString(Die
, dwarf::DW_AT_name
, FN
);
599 // Add DW_str_offsets_base to the unit DIE, except for split units.
600 if (useSegmentedStringOffsetsTable() && !useSplitDwarf())
601 NewCU
.addStringOffsetsStart();
603 if (!useSplitDwarf()) {
604 NewCU
.initStmtList();
606 // If we're using split dwarf the compilation dir is going to be in the
607 // skeleton CU and so we don't need to duplicate it here.
608 if (!CompilationDir
.empty())
609 NewCU
.addString(Die
, dwarf::DW_AT_comp_dir
, CompilationDir
);
611 addGnuPubAttributes(NewCU
, Die
);
614 if (useAppleExtensionAttributes()) {
615 if (DIUnit
->isOptimized())
616 NewCU
.addFlag(Die
, dwarf::DW_AT_APPLE_optimized
);
618 StringRef Flags
= DIUnit
->getFlags();
620 NewCU
.addString(Die
, dwarf::DW_AT_APPLE_flags
, Flags
);
622 if (unsigned RVer
= DIUnit
->getRuntimeVersion())
623 NewCU
.addUInt(Die
, dwarf::DW_AT_APPLE_major_runtime_vers
,
624 dwarf::DW_FORM_data1
, RVer
);
627 if (DIUnit
->getDWOId()) {
628 // This CU is either a clang module DWO or a skeleton CU.
629 NewCU
.addUInt(Die
, dwarf::DW_AT_GNU_dwo_id
, dwarf::DW_FORM_data8
,
631 if (!DIUnit
->getSplitDebugFilename().empty())
632 // This is a prefabricated skeleton CU.
633 NewCU
.addString(Die
, dwarf::DW_AT_GNU_dwo_name
,
634 DIUnit
->getSplitDebugFilename());
637 // Create new DwarfCompileUnit for the given metadata node with tag
638 // DW_TAG_compile_unit.
640 DwarfDebug::getOrCreateDwarfCompileUnit(const DICompileUnit
*DIUnit
) {
641 if (auto *CU
= CUMap
.lookup(DIUnit
))
644 CompilationDir
= DIUnit
->getDirectory();
646 auto OwnedUnit
= llvm::make_unique
<DwarfCompileUnit
>(
647 InfoHolder
.getUnits().size(), DIUnit
, Asm
, this, &InfoHolder
);
648 DwarfCompileUnit
&NewCU
= *OwnedUnit
;
649 InfoHolder
.addUnit(std::move(OwnedUnit
));
651 for (auto *IE
: DIUnit
->getImportedEntities())
652 NewCU
.addImportedEntity(IE
);
654 // LTO with assembly output shares a single line table amongst multiple CUs.
655 // To avoid the compilation directory being ambiguous, let the line table
656 // explicitly describe the directory of all files, never relying on the
657 // compilation directory.
658 if (!Asm
->OutStreamer
->hasRawTextSupport() || SingleCU
)
659 Asm
->OutStreamer
->emitDwarfFile0Directive(
660 CompilationDir
, DIUnit
->getFilename(),
661 NewCU
.getMD5AsBytes(DIUnit
->getFile()), DIUnit
->getSource(),
662 NewCU
.getUniqueID());
664 if (useSplitDwarf()) {
665 NewCU
.setSkeleton(constructSkeletonCU(NewCU
));
666 NewCU
.setSection(Asm
->getObjFileLowering().getDwarfInfoDWOSection());
668 finishUnitAttributes(DIUnit
, NewCU
);
669 NewCU
.setSection(Asm
->getObjFileLowering().getDwarfInfoSection());
672 CUMap
.insert({DIUnit
, &NewCU
});
673 CUDieMap
.insert({&NewCU
.getUnitDie(), &NewCU
});
677 void DwarfDebug::constructAndAddImportedEntityDIE(DwarfCompileUnit
&TheCU
,
678 const DIImportedEntity
*N
) {
679 if (isa
<DILocalScope
>(N
->getScope()))
681 if (DIE
*D
= TheCU
.getOrCreateContextDIE(N
->getScope()))
682 D
->addChild(TheCU
.constructImportedEntityDIE(N
));
685 /// Sort and unique GVEs by comparing their fragment offset.
686 static SmallVectorImpl
<DwarfCompileUnit::GlobalExpr
> &
687 sortGlobalExprs(SmallVectorImpl
<DwarfCompileUnit::GlobalExpr
> &GVEs
) {
689 GVEs
, [](DwarfCompileUnit::GlobalExpr A
, DwarfCompileUnit::GlobalExpr B
) {
690 // Sort order: first null exprs, then exprs without fragment
691 // info, then sort by fragment offset in bits.
692 // FIXME: Come up with a more comprehensive comparator so
693 // the sorting isn't non-deterministic, and so the following
694 // std::unique call works correctly.
695 if (!A
.Expr
|| !B
.Expr
)
697 auto FragmentA
= A
.Expr
->getFragmentInfo();
698 auto FragmentB
= B
.Expr
->getFragmentInfo();
699 if (!FragmentA
|| !FragmentB
)
701 return FragmentA
->OffsetInBits
< FragmentB
->OffsetInBits
;
703 GVEs
.erase(std::unique(GVEs
.begin(), GVEs
.end(),
704 [](DwarfCompileUnit::GlobalExpr A
,
705 DwarfCompileUnit::GlobalExpr B
) {
706 return A
.Expr
== B
.Expr
;
712 // Emit all Dwarf sections that should come prior to the content. Create
713 // global DIEs and emit initial debug info sections. This is invoked by
714 // the target AsmPrinter.
715 void DwarfDebug::beginModule() {
716 NamedRegionTimer
T(DbgTimerName
, DbgTimerDescription
, DWARFGroupName
,
717 DWARFGroupDescription
, TimePassesIsEnabled
);
718 if (DisableDebugInfoPrinting
) {
719 MMI
->setDebugInfoAvailability(false);
723 const Module
*M
= MMI
->getModule();
725 unsigned NumDebugCUs
= std::distance(M
->debug_compile_units_begin(),
726 M
->debug_compile_units_end());
727 // Tell MMI whether we have debug info.
728 assert(MMI
->hasDebugInfo() == (NumDebugCUs
> 0) &&
729 "DebugInfoAvailabilty initialized unexpectedly");
730 SingleCU
= NumDebugCUs
== 1;
731 DenseMap
<DIGlobalVariable
*, SmallVector
<DwarfCompileUnit::GlobalExpr
, 1>>
733 for (const GlobalVariable
&Global
: M
->globals()) {
734 SmallVector
<DIGlobalVariableExpression
*, 1> GVs
;
735 Global
.getDebugInfo(GVs
);
736 for (auto *GVE
: GVs
)
737 GVMap
[GVE
->getVariable()].push_back({&Global
, GVE
->getExpression()});
740 // Create the symbol that designates the start of the unit's contribution
741 // to the string offsets table. In a split DWARF scenario, only the skeleton
742 // unit has the DW_AT_str_offsets_base attribute (and hence needs the symbol).
743 if (useSegmentedStringOffsetsTable())
744 (useSplitDwarf() ? SkeletonHolder
: InfoHolder
)
745 .setStringOffsetsStartSym(Asm
->createTempSymbol("str_offsets_base"));
748 // Create the symbols that designates the start of the DWARF v5 range list
749 // and locations list tables. They are located past the table headers.
750 if (getDwarfVersion() >= 5) {
751 DwarfFile
&Holder
= useSplitDwarf() ? SkeletonHolder
: InfoHolder
;
752 Holder
.setRnglistsTableBaseSym(
753 Asm
->createTempSymbol("rnglists_table_base"));
754 Holder
.setLoclistsTableBaseSym(
755 Asm
->createTempSymbol("loclists_table_base"));
758 InfoHolder
.setRnglistsTableBaseSym(
759 Asm
->createTempSymbol("rnglists_dwo_table_base"));
762 // Create the symbol that points to the first entry following the debug
763 // address table (.debug_addr) header.
764 AddrPool
.setLabel(Asm
->createTempSymbol("addr_table_base"));
766 for (DICompileUnit
*CUNode
: M
->debug_compile_units()) {
767 // FIXME: Move local imported entities into a list attached to the
768 // subprogram, then this search won't be needed and a
769 // getImportedEntities().empty() test should go below with the rest.
770 bool HasNonLocalImportedEntities
= llvm::any_of(
771 CUNode
->getImportedEntities(), [](const DIImportedEntity
*IE
) {
772 return !isa
<DILocalScope
>(IE
->getScope());
775 if (!HasNonLocalImportedEntities
&& CUNode
->getEnumTypes().empty() &&
776 CUNode
->getRetainedTypes().empty() &&
777 CUNode
->getGlobalVariables().empty() && CUNode
->getMacros().empty())
780 DwarfCompileUnit
&CU
= getOrCreateDwarfCompileUnit(CUNode
);
783 for (auto *GVE
: CUNode
->getGlobalVariables()) {
784 // Don't bother adding DIGlobalVariableExpressions listed in the CU if we
785 // already know about the variable and it isn't adding a constant
787 auto &GVMapEntry
= GVMap
[GVE
->getVariable()];
788 auto *Expr
= GVE
->getExpression();
789 if (!GVMapEntry
.size() || (Expr
&& Expr
->isConstant()))
790 GVMapEntry
.push_back({nullptr, Expr
});
792 DenseSet
<DIGlobalVariable
*> Processed
;
793 for (auto *GVE
: CUNode
->getGlobalVariables()) {
794 DIGlobalVariable
*GV
= GVE
->getVariable();
795 if (Processed
.insert(GV
).second
)
796 CU
.getOrCreateGlobalVariableDIE(GV
, sortGlobalExprs(GVMap
[GV
]));
799 for (auto *Ty
: CUNode
->getEnumTypes()) {
800 // The enum types array by design contains pointers to
801 // MDNodes rather than DIRefs. Unique them here.
802 CU
.getOrCreateTypeDIE(cast
<DIType
>(Ty
));
804 for (auto *Ty
: CUNode
->getRetainedTypes()) {
805 // The retained types array by design contains pointers to
806 // MDNodes rather than DIRefs. Unique them here.
807 if (DIType
*RT
= dyn_cast
<DIType
>(Ty
))
808 // There is no point in force-emitting a forward declaration.
809 CU
.getOrCreateTypeDIE(RT
);
811 // Emit imported_modules last so that the relevant context is already
813 for (auto *IE
: CUNode
->getImportedEntities())
814 constructAndAddImportedEntityDIE(CU
, IE
);
818 void DwarfDebug::finishEntityDefinitions() {
819 for (const auto &Entity
: ConcreteEntities
) {
820 DIE
*Die
= Entity
->getDIE();
822 // FIXME: Consider the time-space tradeoff of just storing the unit pointer
823 // in the ConcreteEntities list, rather than looking it up again here.
824 // DIE::getUnit isn't simple - it walks parent pointers, etc.
825 DwarfCompileUnit
*Unit
= CUDieMap
.lookup(Die
->getUnitDie());
827 Unit
->finishEntityDefinition(Entity
.get());
831 void DwarfDebug::finishSubprogramDefinitions() {
832 for (const DISubprogram
*SP
: ProcessedSPNodes
) {
833 assert(SP
->getUnit()->getEmissionKind() != DICompileUnit::NoDebug
);
835 getOrCreateDwarfCompileUnit(SP
->getUnit()),
836 [&](DwarfCompileUnit
&CU
) { CU
.finishSubprogramDefinition(SP
); });
840 void DwarfDebug::finalizeModuleInfo() {
841 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
843 finishSubprogramDefinitions();
845 finishEntityDefinitions();
847 // Include the DWO file name in the hash if there's more than one CU.
848 // This handles ThinLTO's situation where imported CUs may very easily be
849 // duplicate with the same CU partially imported into another ThinLTO unit.
851 if (CUMap
.size() > 1)
852 DWOName
= Asm
->TM
.Options
.MCOptions
.SplitDwarfFile
;
854 // Handle anything that needs to be done on a per-unit basis after
855 // all other generation.
856 for (const auto &P
: CUMap
) {
857 auto &TheCU
= *P
.second
;
858 if (TheCU
.getCUNode()->isDebugDirectivesOnly())
860 // Emit DW_AT_containing_type attribute to connect types with their
861 // vtable holding type.
862 TheCU
.constructContainingTypeDIEs();
864 // Add CU specific attributes if we need to add any.
865 // If we're splitting the dwarf out now that we've got the entire
866 // CU then add the dwo id to it.
867 auto *SkCU
= TheCU
.getSkeleton();
868 if (useSplitDwarf() && !empty(TheCU
.getUnitDie().children())) {
869 finishUnitAttributes(TheCU
.getCUNode(), TheCU
);
870 TheCU
.addString(TheCU
.getUnitDie(), dwarf::DW_AT_GNU_dwo_name
,
871 Asm
->TM
.Options
.MCOptions
.SplitDwarfFile
);
872 SkCU
->addString(SkCU
->getUnitDie(), dwarf::DW_AT_GNU_dwo_name
,
873 Asm
->TM
.Options
.MCOptions
.SplitDwarfFile
);
874 // Emit a unique identifier for this CU.
876 DIEHash(Asm
).computeCUSignature(DWOName
, TheCU
.getUnitDie());
877 if (getDwarfVersion() >= 5) {
881 TheCU
.addUInt(TheCU
.getUnitDie(), dwarf::DW_AT_GNU_dwo_id
,
882 dwarf::DW_FORM_data8
, ID
);
883 SkCU
->addUInt(SkCU
->getUnitDie(), dwarf::DW_AT_GNU_dwo_id
,
884 dwarf::DW_FORM_data8
, ID
);
887 if (getDwarfVersion() < 5 && !SkeletonHolder
.getRangeLists().empty()) {
888 const MCSymbol
*Sym
= TLOF
.getDwarfRangesSection()->getBeginSymbol();
889 SkCU
->addSectionLabel(SkCU
->getUnitDie(), dwarf::DW_AT_GNU_ranges_base
,
893 finishUnitAttributes(SkCU
->getCUNode(), *SkCU
);
896 // If we have code split among multiple sections or non-contiguous
897 // ranges of code then emit a DW_AT_ranges attribute on the unit that will
898 // remain in the .o file, otherwise add a DW_AT_low_pc.
899 // FIXME: We should use ranges allow reordering of code ala
900 // .subsections_via_symbols in mach-o. This would mean turning on
901 // ranges for all subprogram DIEs for mach-o.
902 DwarfCompileUnit
&U
= SkCU
? *SkCU
: TheCU
;
904 // We don't keep track of which addresses are used in which CU so this
905 // is a bit pessimistic under LTO.
906 if (!AddrPool
.isEmpty() &&
907 (getDwarfVersion() >= 5 ||
908 (SkCU
&& !empty(TheCU
.getUnitDie().children()))))
909 U
.addAddrTableBase();
911 if (unsigned NumRanges
= TheCU
.getRanges().size()) {
912 if (NumRanges
> 1 && useRangesSection())
913 // A DW_AT_low_pc attribute may also be specified in combination with
914 // DW_AT_ranges to specify the default base address for use in
915 // location lists (see Section 2.6.2) and range lists (see Section
917 U
.addUInt(U
.getUnitDie(), dwarf::DW_AT_low_pc
, dwarf::DW_FORM_addr
, 0);
919 U
.setBaseAddress(TheCU
.getRanges().front().getStart());
920 U
.attachRangesOrLowHighPC(U
.getUnitDie(), TheCU
.takeRanges());
923 if (getDwarfVersion() >= 5) {
924 if (U
.hasRangeLists())
927 if (!DebugLocs
.getLists().empty() && !useSplitDwarf())
931 auto *CUNode
= cast
<DICompileUnit
>(P
.first
);
932 // If compile Unit has macros, emit "DW_AT_macro_info" attribute.
933 if (CUNode
->getMacros())
934 U
.addSectionLabel(U
.getUnitDie(), dwarf::DW_AT_macro_info
,
935 U
.getMacroLabelBegin(),
936 TLOF
.getDwarfMacinfoSection()->getBeginSymbol());
939 // Emit all frontend-produced Skeleton CUs, i.e., Clang modules.
940 for (auto *CUNode
: MMI
->getModule()->debug_compile_units())
941 if (CUNode
->getDWOId())
942 getOrCreateDwarfCompileUnit(CUNode
);
944 // Compute DIE offsets and sizes.
945 InfoHolder
.computeSizeAndOffsets();
947 SkeletonHolder
.computeSizeAndOffsets();
950 // Emit all Dwarf sections that should come after the content.
951 void DwarfDebug::endModule() {
952 assert(CurFn
== nullptr);
953 assert(CurMI
== nullptr);
955 for (const auto &P
: CUMap
) {
956 auto &CU
= *P
.second
;
957 CU
.createBaseTypeDIEs();
960 // If we aren't actually generating debug info (check beginModule -
961 // conditionalized on !DisableDebugInfoPrinting and the presence of the
962 // llvm.dbg.cu metadata node)
963 if (!MMI
->hasDebugInfo())
966 // Finalize the debug info for the module.
967 finalizeModuleInfo();
974 // Emit info into a debug loc section.
977 // Corresponding abbreviations into a abbrev section.
980 // Emit all the DIEs into a debug info section.
983 // Emit info into a debug aranges section.
984 if (GenerateARangeSection
)
987 // Emit info into a debug ranges section.
990 // Emit info into a debug macinfo section.
993 if (useSplitDwarf()) {
996 emitDebugAbbrevDWO();
998 emitDebugRangesDWO();
1003 // Emit info into the dwarf accelerator table sections.
1004 switch (getAccelTableKind()) {
1005 case AccelTableKind::Apple
:
1008 emitAccelNamespaces();
1011 case AccelTableKind::Dwarf
:
1012 emitAccelDebugNames();
1014 case AccelTableKind::None
:
1016 case AccelTableKind::Default
:
1017 llvm_unreachable("Default should have already been resolved.");
1020 // Emit the pubnames and pubtypes sections if requested.
1021 emitDebugPubSections();
1024 // FIXME: AbstractVariables.clear();
1027 void DwarfDebug::ensureAbstractEntityIsCreated(DwarfCompileUnit
&CU
,
1029 const MDNode
*ScopeNode
) {
1030 if (CU
.getExistingAbstractEntity(Node
))
1033 CU
.createAbstractEntity(Node
, LScopes
.getOrCreateAbstractScope(
1034 cast
<DILocalScope
>(ScopeNode
)));
1037 void DwarfDebug::ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit
&CU
,
1038 const DINode
*Node
, const MDNode
*ScopeNode
) {
1039 if (CU
.getExistingAbstractEntity(Node
))
1042 if (LexicalScope
*Scope
=
1043 LScopes
.findAbstractScope(cast_or_null
<DILocalScope
>(ScopeNode
)))
1044 CU
.createAbstractEntity(Node
, Scope
);
1047 // Collect variable information from side table maintained by MF.
1048 void DwarfDebug::collectVariableInfoFromMFTable(
1049 DwarfCompileUnit
&TheCU
, DenseSet
<InlinedEntity
> &Processed
) {
1050 SmallDenseMap
<InlinedEntity
, DbgVariable
*> MFVars
;
1051 for (const auto &VI
: Asm
->MF
->getVariableDbgInfo()) {
1054 assert(VI
.Var
->isValidLocationForIntrinsic(VI
.Loc
) &&
1055 "Expected inlined-at fields to agree");
1057 InlinedEntity
Var(VI
.Var
, VI
.Loc
->getInlinedAt());
1058 Processed
.insert(Var
);
1059 LexicalScope
*Scope
= LScopes
.findLexicalScope(VI
.Loc
);
1061 // If variable scope is not found then skip this variable.
1065 ensureAbstractEntityIsCreatedIfScoped(TheCU
, Var
.first
, Scope
->getScopeNode());
1066 auto RegVar
= llvm::make_unique
<DbgVariable
>(
1067 cast
<DILocalVariable
>(Var
.first
), Var
.second
);
1068 RegVar
->initializeMMI(VI
.Expr
, VI
.Slot
);
1069 if (DbgVariable
*DbgVar
= MFVars
.lookup(Var
))
1070 DbgVar
->addMMIEntry(*RegVar
);
1071 else if (InfoHolder
.addScopeVariable(Scope
, RegVar
.get())) {
1072 MFVars
.insert({Var
, RegVar
.get()});
1073 ConcreteEntities
.push_back(std::move(RegVar
));
1078 // Get .debug_loc entry for the instruction range starting at MI.
1079 static DebugLocEntry::Value
getDebugLocValue(const MachineInstr
*MI
) {
1080 const DIExpression
*Expr
= MI
->getDebugExpression();
1081 assert(MI
->getNumOperands() == 4);
1082 if (MI
->getOperand(0).isReg()) {
1083 auto RegOp
= MI
->getOperand(0);
1084 auto Op1
= MI
->getOperand(1);
1085 // If the second operand is an immediate, this is a
1086 // register-indirect address.
1087 assert((!Op1
.isImm() || (Op1
.getImm() == 0)) && "unexpected offset");
1088 MachineLocation
MLoc(RegOp
.getReg(), Op1
.isImm());
1089 return DebugLocEntry::Value(Expr
, MLoc
);
1091 if (MI
->getOperand(0).isImm())
1092 return DebugLocEntry::Value(Expr
, MI
->getOperand(0).getImm());
1093 if (MI
->getOperand(0).isFPImm())
1094 return DebugLocEntry::Value(Expr
, MI
->getOperand(0).getFPImm());
1095 if (MI
->getOperand(0).isCImm())
1096 return DebugLocEntry::Value(Expr
, MI
->getOperand(0).getCImm());
1098 llvm_unreachable("Unexpected 4-operand DBG_VALUE instruction!");
1101 /// Build the location list for all DBG_VALUEs in the function that
1102 /// describe the same variable. The resulting DebugLocEntries will have
1103 /// strict monotonically increasing begin addresses and will never
1106 // See the definition of DbgValueHistoryMap::Entry for an explanation of the
1107 // different kinds of history map entries. One thing to be aware of is that if
1108 // a debug value is ended by another entry (rather than being valid until the
1109 // end of the function), that entry's instruction may or may not be included in
1110 // the range, depending on if the entry is a clobbering entry (it has an
1111 // instruction that clobbers one or more preceding locations), or if it is an
1112 // (overlapping) debug value entry. This distinction can be seen in the example
1113 // below. The first debug value is ended by the clobbering entry 2, and the
1114 // second and third debug values are ended by the overlapping debug value entry
1119 // History map entries [type, end index, mi]
1121 // 0 | [DbgValue, 2, DBG_VALUE $reg0, [...] (fragment 0, 32)]
1122 // 1 | | [DbgValue, 4, DBG_VALUE $reg1, [...] (fragment 32, 32)]
1123 // 2 | | [Clobber, $reg0 = [...], -, -]
1124 // 3 | | [DbgValue, 4, DBG_VALUE 123, [...] (fragment 64, 32)]
1125 // 4 [DbgValue, ~0, DBG_VALUE @g, [...] (fragment 0, 96)]
1127 // Output [start, end) [Value...]:
1129 // [0-1) [(reg0, fragment 0, 32)]
1130 // [1-3) [(reg0, fragment 0, 32), (reg1, fragment 32, 32)]
1131 // [3-4) [(reg1, fragment 32, 32), (123, fragment 64, 32)]
1132 // [4-) [(@g, fragment 0, 96)]
1133 void DwarfDebug::buildLocationList(SmallVectorImpl
<DebugLocEntry
> &DebugLoc
,
1134 const DbgValueHistoryMap::Entries
&Entries
) {
1136 std::pair
<DbgValueHistoryMap::EntryIndex
, DebugLocEntry::Value
>;
1137 SmallVector
<OpenRange
, 4> OpenRanges
;
1139 for (auto EB
= Entries
.begin(), EI
= EB
, EE
= Entries
.end(); EI
!= EE
; ++EI
) {
1140 const MachineInstr
*Instr
= EI
->getInstr();
1142 if (EI
->isDbgValue()) {
1143 // Check if a variable is inaccessible in this range.
1144 // TODO: This should only truncate open ranges that are overlapping.
1145 if (Instr
->getNumOperands() > 1 &&
1146 Instr
->getOperand(0).isReg() && !Instr
->getOperand(0).getReg()) {
1152 // Remove all values that are no longer live.
1153 size_t Index
= std::distance(EB
, EI
);
1155 remove_if(OpenRanges
, [&](OpenRange
&R
) { return R
.first
<= Index
; });
1156 OpenRanges
.erase(Last
, OpenRanges
.end());
1158 // If we are dealing with a clobbering entry, this iteration will result in
1159 // a location list entry starting after the clobbering instruction.
1160 const MCSymbol
*StartLabel
=
1161 EI
->isClobber() ? getLabelAfterInsn(Instr
) : getLabelBeforeInsn(Instr
);
1162 assert(StartLabel
&&
1163 "Forgot label before/after instruction starting a range!");
1165 const MCSymbol
*EndLabel
;
1166 if (std::next(EI
) == Entries
.end())
1167 EndLabel
= Asm
->getFunctionEnd();
1168 else if (std::next(EI
)->isClobber())
1169 EndLabel
= getLabelAfterInsn(std::next(EI
)->getInstr());
1171 EndLabel
= getLabelBeforeInsn(std::next(EI
)->getInstr());
1172 assert(EndLabel
&& "Forgot label after instruction ending a range!");
1174 if (EI
->isDbgValue())
1175 LLVM_DEBUG(dbgs() << "DotDebugLoc: " << *Instr
<< "\n");
1177 // If this history map entry has a debug value, add that to the list of
1179 if (EI
->isDbgValue()) {
1180 auto Value
= getDebugLocValue(Instr
);
1181 OpenRanges
.emplace_back(EI
->getEndIndex(), Value
);
1184 // Location list entries with empty location descriptions are redundant
1185 // information in DWARF, so do not emit those.
1186 if (OpenRanges
.empty())
1189 // Omit entries with empty ranges as they do not have any effect in DWARF.
1190 if (StartLabel
== EndLabel
) {
1191 LLVM_DEBUG(dbgs() << "Omitting location list entry with empty range.\n");
1195 SmallVector
<DebugLocEntry::Value
, 4> Values
;
1196 for (auto &R
: OpenRanges
)
1197 Values
.push_back(R
.second
);
1198 DebugLoc
.emplace_back(StartLabel
, EndLabel
, Values
);
1200 // Attempt to coalesce the ranges of two otherwise identical
1202 auto CurEntry
= DebugLoc
.rbegin();
1204 dbgs() << CurEntry
->getValues().size() << " Values:\n";
1205 for (auto &Value
: CurEntry
->getValues())
1207 dbgs() << "-----\n";
1210 auto PrevEntry
= std::next(CurEntry
);
1211 if (PrevEntry
!= DebugLoc
.rend() && PrevEntry
->MergeRanges(*CurEntry
))
1212 DebugLoc
.pop_back();
1216 DbgEntity
*DwarfDebug::createConcreteEntity(DwarfCompileUnit
&TheCU
,
1217 LexicalScope
&Scope
,
1219 const DILocation
*Location
,
1220 const MCSymbol
*Sym
) {
1221 ensureAbstractEntityIsCreatedIfScoped(TheCU
, Node
, Scope
.getScopeNode());
1222 if (isa
<const DILocalVariable
>(Node
)) {
1223 ConcreteEntities
.push_back(
1224 llvm::make_unique
<DbgVariable
>(cast
<const DILocalVariable
>(Node
),
1226 InfoHolder
.addScopeVariable(&Scope
,
1227 cast
<DbgVariable
>(ConcreteEntities
.back().get()));
1228 } else if (isa
<const DILabel
>(Node
)) {
1229 ConcreteEntities
.push_back(
1230 llvm::make_unique
<DbgLabel
>(cast
<const DILabel
>(Node
),
1232 InfoHolder
.addScopeLabel(&Scope
,
1233 cast
<DbgLabel
>(ConcreteEntities
.back().get()));
1235 return ConcreteEntities
.back().get();
1238 /// Determine whether a *singular* DBG_VALUE is valid for the entirety of its
1239 /// enclosing lexical scope. The check ensures there are no other instructions
1240 /// in the same lexical scope preceding the DBG_VALUE and that its range is
1241 /// either open or otherwise rolls off the end of the scope.
1242 static bool validThroughout(LexicalScopes
&LScopes
,
1243 const MachineInstr
*DbgValue
,
1244 const MachineInstr
*RangeEnd
) {
1245 assert(DbgValue
->getDebugLoc() && "DBG_VALUE without a debug location");
1246 auto MBB
= DbgValue
->getParent();
1247 auto DL
= DbgValue
->getDebugLoc();
1248 auto *LScope
= LScopes
.findLexicalScope(DL
);
1249 // Scope doesn't exist; this is a dead DBG_VALUE.
1252 auto &LSRange
= LScope
->getRanges();
1253 if (LSRange
.size() == 0)
1256 // Determine if the DBG_VALUE is valid at the beginning of its lexical block.
1257 const MachineInstr
*LScopeBegin
= LSRange
.front().first
;
1258 // Early exit if the lexical scope begins outside of the current block.
1259 if (LScopeBegin
->getParent() != MBB
)
1261 MachineBasicBlock::const_reverse_iterator
Pred(DbgValue
);
1262 for (++Pred
; Pred
!= MBB
->rend(); ++Pred
) {
1263 if (Pred
->getFlag(MachineInstr::FrameSetup
))
1265 auto PredDL
= Pred
->getDebugLoc();
1266 if (!PredDL
|| Pred
->isMetaInstruction())
1268 // Check whether the instruction preceding the DBG_VALUE is in the same
1269 // (sub)scope as the DBG_VALUE.
1270 if (DL
->getScope() == PredDL
->getScope())
1272 auto *PredScope
= LScopes
.findLexicalScope(PredDL
);
1273 if (!PredScope
|| LScope
->dominates(PredScope
))
1277 // If the range of the DBG_VALUE is open-ended, report success.
1281 // Fail if there are instructions belonging to our scope in another block.
1282 const MachineInstr
*LScopeEnd
= LSRange
.back().second
;
1283 if (LScopeEnd
->getParent() != MBB
)
1286 // Single, constant DBG_VALUEs in the prologue are promoted to be live
1287 // throughout the function. This is a hack, presumably for DWARF v2 and not
1288 // necessarily correct. It would be much better to use a dbg.declare instead
1289 // if we know the constant is live throughout the scope.
1290 if (DbgValue
->getOperand(0).isImm() && MBB
->pred_empty())
1296 // Find variables for each lexical scope.
1297 void DwarfDebug::collectEntityInfo(DwarfCompileUnit
&TheCU
,
1298 const DISubprogram
*SP
,
1299 DenseSet
<InlinedEntity
> &Processed
) {
1300 // Grab the variable info that was squirreled away in the MMI side-table.
1301 collectVariableInfoFromMFTable(TheCU
, Processed
);
1303 for (const auto &I
: DbgValues
) {
1304 InlinedEntity IV
= I
.first
;
1305 if (Processed
.count(IV
))
1308 // Instruction ranges, specifying where IV is accessible.
1309 const auto &HistoryMapEntries
= I
.second
;
1310 if (HistoryMapEntries
.empty())
1313 LexicalScope
*Scope
= nullptr;
1314 const DILocalVariable
*LocalVar
= cast
<DILocalVariable
>(IV
.first
);
1315 if (const DILocation
*IA
= IV
.second
)
1316 Scope
= LScopes
.findInlinedScope(LocalVar
->getScope(), IA
);
1318 Scope
= LScopes
.findLexicalScope(LocalVar
->getScope());
1319 // If variable scope is not found then skip this variable.
1323 Processed
.insert(IV
);
1324 DbgVariable
*RegVar
= cast
<DbgVariable
>(createConcreteEntity(TheCU
,
1325 *Scope
, LocalVar
, IV
.second
));
1327 const MachineInstr
*MInsn
= HistoryMapEntries
.front().getInstr();
1328 assert(MInsn
->isDebugValue() && "History must begin with debug value");
1330 // Check if there is a single DBG_VALUE, valid throughout the var's scope.
1331 // If the history map contains a single debug value, there may be an
1332 // additional entry which clobbers the debug value.
1333 bool SingleValueWithClobber
=
1334 HistoryMapEntries
.size() == 2 && HistoryMapEntries
[1].isClobber();
1335 if (HistoryMapEntries
.size() == 1 || SingleValueWithClobber
) {
1337 SingleValueWithClobber
? HistoryMapEntries
[1].getInstr() : nullptr;
1338 if (validThroughout(LScopes
, MInsn
, End
)) {
1339 RegVar
->initializeDbgValue(MInsn
);
1344 // Do not emit location lists if .debug_loc secton is disabled.
1345 if (!useLocSection())
1348 // Handle multiple DBG_VALUE instructions describing one variable.
1349 DebugLocStream::ListBuilder
List(DebugLocs
, TheCU
, *Asm
, *RegVar
, *MInsn
);
1351 // Build the location list for this variable.
1352 SmallVector
<DebugLocEntry
, 8> Entries
;
1353 buildLocationList(Entries
, HistoryMapEntries
);
1355 // If the variable has a DIBasicType, extract it. Basic types cannot have
1356 // unique identifiers, so don't bother resolving the type with the
1358 const DIBasicType
*BT
= dyn_cast
<DIBasicType
>(
1359 static_cast<const Metadata
*>(LocalVar
->getType()));
1361 // Finalize the entry by lowering it into a DWARF bytestream.
1362 for (auto &Entry
: Entries
)
1363 Entry
.finalize(*Asm
, List
, BT
, TheCU
);
1366 // For each InlinedEntity collected from DBG_LABEL instructions, convert to
1367 // DWARF-related DbgLabel.
1368 for (const auto &I
: DbgLabels
) {
1369 InlinedEntity IL
= I
.first
;
1370 const MachineInstr
*MI
= I
.second
;
1374 LexicalScope
*Scope
= nullptr;
1375 const DILabel
*Label
= cast
<DILabel
>(IL
.first
);
1376 // Get inlined DILocation if it is inlined label.
1377 if (const DILocation
*IA
= IL
.second
)
1378 Scope
= LScopes
.findInlinedScope(Label
->getScope(), IA
);
1380 Scope
= LScopes
.findLexicalScope(Label
->getScope());
1381 // If label scope is not found then skip this label.
1385 Processed
.insert(IL
);
1386 /// At this point, the temporary label is created.
1387 /// Save the temporary label to DbgLabel entity to get the
1388 /// actually address when generating Dwarf DIE.
1389 MCSymbol
*Sym
= getLabelBeforeInsn(MI
);
1390 createConcreteEntity(TheCU
, *Scope
, Label
, IL
.second
, Sym
);
1393 // Collect info for variables/labels that were optimized out.
1394 for (const DINode
*DN
: SP
->getRetainedNodes()) {
1395 if (!Processed
.insert(InlinedEntity(DN
, nullptr)).second
)
1397 LexicalScope
*Scope
= nullptr;
1398 if (auto *DV
= dyn_cast
<DILocalVariable
>(DN
)) {
1399 Scope
= LScopes
.findLexicalScope(DV
->getScope());
1400 } else if (auto *DL
= dyn_cast
<DILabel
>(DN
)) {
1401 Scope
= LScopes
.findLexicalScope(DL
->getScope());
1405 createConcreteEntity(TheCU
, *Scope
, DN
, nullptr);
1409 // Process beginning of an instruction.
1410 void DwarfDebug::beginInstruction(const MachineInstr
*MI
) {
1411 DebugHandlerBase::beginInstruction(MI
);
1414 const auto *SP
= MI
->getMF()->getFunction().getSubprogram();
1415 if (!SP
|| SP
->getUnit()->getEmissionKind() == DICompileUnit::NoDebug
)
1418 // Check if source location changes, but ignore DBG_VALUE and CFI locations.
1419 // If the instruction is part of the function frame setup code, do not emit
1420 // any line record, as there is no correspondence with any user code.
1421 if (MI
->isMetaInstruction() || MI
->getFlag(MachineInstr::FrameSetup
))
1423 const DebugLoc
&DL
= MI
->getDebugLoc();
1424 // When we emit a line-0 record, we don't update PrevInstLoc; so look at
1425 // the last line number actually emitted, to see if it was line 0.
1426 unsigned LastAsmLine
=
1427 Asm
->OutStreamer
->getContext().getCurrentDwarfLoc().getLine();
1429 // Request a label after the call in order to emit AT_return_pc information
1430 // in call site entries. TODO: Add support for targets with delay slots.
1431 if (SP
->areAllCallsDescribed() && MI
->isCall() && !MI
->hasDelaySlot())
1432 requestLabelAfterInsn(MI
);
1434 if (DL
== PrevInstLoc
) {
1435 // If we have an ongoing unspecified location, nothing to do here.
1438 // We have an explicit location, same as the previous location.
1439 // But we might be coming back to it after a line 0 record.
1440 if (LastAsmLine
== 0 && DL
.getLine() != 0) {
1441 // Reinstate the source location but not marked as a statement.
1442 const MDNode
*Scope
= DL
.getScope();
1443 recordSourceLine(DL
.getLine(), DL
.getCol(), Scope
, /*Flags=*/0);
1449 // We have an unspecified location, which might want to be line 0.
1450 // If we have already emitted a line-0 record, don't repeat it.
1451 if (LastAsmLine
== 0)
1453 // If user said Don't Do That, don't do that.
1454 if (UnknownLocations
== Disable
)
1456 // See if we have a reason to emit a line-0 record now.
1457 // Reasons to emit a line-0 record include:
1458 // - User asked for it (UnknownLocations).
1459 // - Instruction has a label, so it's referenced from somewhere else,
1460 // possibly debug information; we want it to have a source location.
1461 // - Instruction is at the top of a block; we don't want to inherit the
1462 // location from the physically previous (maybe unrelated) block.
1463 if (UnknownLocations
== Enable
|| PrevLabel
||
1464 (PrevInstBB
&& PrevInstBB
!= MI
->getParent())) {
1465 // Preserve the file and column numbers, if we can, to save space in
1466 // the encoded line table.
1467 // Do not update PrevInstLoc, it remembers the last non-0 line.
1468 const MDNode
*Scope
= nullptr;
1469 unsigned Column
= 0;
1471 Scope
= PrevInstLoc
.getScope();
1472 Column
= PrevInstLoc
.getCol();
1474 recordSourceLine(/*Line=*/0, Column
, Scope
, /*Flags=*/0);
1479 // We have an explicit location, different from the previous location.
1480 // Don't repeat a line-0 record, but otherwise emit the new location.
1481 // (The new location might be an explicit line 0, which we do emit.)
1482 if (DL
.getLine() == 0 && LastAsmLine
== 0)
1485 if (DL
== PrologEndLoc
) {
1486 Flags
|= DWARF2_FLAG_PROLOGUE_END
| DWARF2_FLAG_IS_STMT
;
1487 PrologEndLoc
= DebugLoc();
1489 // If the line changed, we call that a new statement; unless we went to
1490 // line 0 and came back, in which case it is not a new statement.
1491 unsigned OldLine
= PrevInstLoc
? PrevInstLoc
.getLine() : LastAsmLine
;
1492 if (DL
.getLine() && DL
.getLine() != OldLine
)
1493 Flags
|= DWARF2_FLAG_IS_STMT
;
1495 const MDNode
*Scope
= DL
.getScope();
1496 recordSourceLine(DL
.getLine(), DL
.getCol(), Scope
, Flags
);
1498 // If we're not at line 0, remember this location.
1503 static DebugLoc
findPrologueEndLoc(const MachineFunction
*MF
) {
1504 // First known non-DBG_VALUE and non-frame setup location marks
1505 // the beginning of the function body.
1506 for (const auto &MBB
: *MF
)
1507 for (const auto &MI
: MBB
)
1508 if (!MI
.isMetaInstruction() && !MI
.getFlag(MachineInstr::FrameSetup
) &&
1510 return MI
.getDebugLoc();
1514 /// Register a source line with debug info. Returns the unique label that was
1515 /// emitted and which provides correspondence to the source line list.
1516 static void recordSourceLine(AsmPrinter
&Asm
, unsigned Line
, unsigned Col
,
1517 const MDNode
*S
, unsigned Flags
, unsigned CUID
,
1518 uint16_t DwarfVersion
,
1519 ArrayRef
<std::unique_ptr
<DwarfCompileUnit
>> DCUs
) {
1521 unsigned FileNo
= 1;
1522 unsigned Discriminator
= 0;
1523 if (auto *Scope
= cast_or_null
<DIScope
>(S
)) {
1524 Fn
= Scope
->getFilename();
1525 if (Line
!= 0 && DwarfVersion
>= 4)
1526 if (auto *LBF
= dyn_cast
<DILexicalBlockFile
>(Scope
))
1527 Discriminator
= LBF
->getDiscriminator();
1529 FileNo
= static_cast<DwarfCompileUnit
&>(*DCUs
[CUID
])
1530 .getOrCreateSourceID(Scope
->getFile());
1532 Asm
.OutStreamer
->EmitDwarfLocDirective(FileNo
, Line
, Col
, Flags
, 0,
1536 DebugLoc
DwarfDebug::emitInitialLocDirective(const MachineFunction
&MF
,
1538 // Get beginning of function.
1539 if (DebugLoc PrologEndLoc
= findPrologueEndLoc(&MF
)) {
1540 // Ensure the compile unit is created if the function is called before
1542 (void)getOrCreateDwarfCompileUnit(
1543 MF
.getFunction().getSubprogram()->getUnit());
1544 // We'd like to list the prologue as "not statements" but GDB behaves
1545 // poorly if we do that. Revisit this with caution/GDB (7.5+) testing.
1546 const DISubprogram
*SP
= PrologEndLoc
->getInlinedAtScope()->getSubprogram();
1547 ::recordSourceLine(*Asm
, SP
->getScopeLine(), 0, SP
, DWARF2_FLAG_IS_STMT
,
1548 CUID
, getDwarfVersion(), getUnits());
1549 return PrologEndLoc
;
1554 // Gather pre-function debug information. Assumes being called immediately
1555 // after the function entry point has been emitted.
1556 void DwarfDebug::beginFunctionImpl(const MachineFunction
*MF
) {
1559 auto *SP
= MF
->getFunction().getSubprogram();
1560 assert(LScopes
.empty() || SP
== LScopes
.getCurrentFunctionScope()->getScopeNode());
1561 if (SP
->getUnit()->getEmissionKind() == DICompileUnit::NoDebug
)
1564 DwarfCompileUnit
&CU
= getOrCreateDwarfCompileUnit(SP
->getUnit());
1566 // Set DwarfDwarfCompileUnitID in MCContext to the Compile Unit this function
1567 // belongs to so that we add to the correct per-cu line table in the
1569 if (Asm
->OutStreamer
->hasRawTextSupport())
1570 // Use a single line table if we are generating assembly.
1571 Asm
->OutStreamer
->getContext().setDwarfCompileUnitID(0);
1573 Asm
->OutStreamer
->getContext().setDwarfCompileUnitID(CU
.getUniqueID());
1575 // Record beginning of function.
1576 PrologEndLoc
= emitInitialLocDirective(
1577 *MF
, Asm
->OutStreamer
->getContext().getDwarfCompileUnitID());
1580 void DwarfDebug::skippedNonDebugFunction() {
1581 // If we don't have a subprogram for this function then there will be a hole
1582 // in the range information. Keep note of this by setting the previously used
1583 // section to nullptr.
1588 // Gather and emit post-function debug information.
1589 void DwarfDebug::endFunctionImpl(const MachineFunction
*MF
) {
1590 const DISubprogram
*SP
= MF
->getFunction().getSubprogram();
1592 assert(CurFn
== MF
&&
1593 "endFunction should be called with the same function as beginFunction");
1595 // Set DwarfDwarfCompileUnitID in MCContext to default value.
1596 Asm
->OutStreamer
->getContext().setDwarfCompileUnitID(0);
1598 LexicalScope
*FnScope
= LScopes
.getCurrentFunctionScope();
1599 assert(!FnScope
|| SP
== FnScope
->getScopeNode());
1600 DwarfCompileUnit
&TheCU
= *CUMap
.lookup(SP
->getUnit());
1601 if (TheCU
.getCUNode()->isDebugDirectivesOnly()) {
1602 PrevLabel
= nullptr;
1607 DenseSet
<InlinedEntity
> Processed
;
1608 collectEntityInfo(TheCU
, SP
, Processed
);
1610 // Add the range of this function to the list of ranges for the CU.
1611 TheCU
.addRange(RangeSpan(Asm
->getFunctionBegin(), Asm
->getFunctionEnd()));
1613 // Under -gmlt, skip building the subprogram if there are no inlined
1614 // subroutines inside it. But with -fdebug-info-for-profiling, the subprogram
1615 // is still needed as we need its source location.
1616 if (!TheCU
.getCUNode()->getDebugInfoForProfiling() &&
1617 TheCU
.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly
&&
1618 LScopes
.getAbstractScopesList().empty() && !IsDarwin
) {
1619 assert(InfoHolder
.getScopeVariables().empty());
1620 PrevLabel
= nullptr;
1626 size_t NumAbstractScopes
= LScopes
.getAbstractScopesList().size();
1628 // Construct abstract scopes.
1629 for (LexicalScope
*AScope
: LScopes
.getAbstractScopesList()) {
1630 auto *SP
= cast
<DISubprogram
>(AScope
->getScopeNode());
1631 for (const DINode
*DN
: SP
->getRetainedNodes()) {
1632 if (!Processed
.insert(InlinedEntity(DN
, nullptr)).second
)
1635 const MDNode
*Scope
= nullptr;
1636 if (auto *DV
= dyn_cast
<DILocalVariable
>(DN
))
1637 Scope
= DV
->getScope();
1638 else if (auto *DL
= dyn_cast
<DILabel
>(DN
))
1639 Scope
= DL
->getScope();
1641 llvm_unreachable("Unexpected DI type!");
1643 // Collect info for variables/labels that were optimized out.
1644 ensureAbstractEntityIsCreated(TheCU
, DN
, Scope
);
1645 assert(LScopes
.getAbstractScopesList().size() == NumAbstractScopes
1646 && "ensureAbstractEntityIsCreated inserted abstract scopes");
1648 constructAbstractSubprogramScopeDIE(TheCU
, AScope
);
1651 ProcessedSPNodes
.insert(SP
);
1652 DIE
&ScopeDIE
= TheCU
.constructSubprogramScopeDIE(SP
, FnScope
);
1653 if (auto *SkelCU
= TheCU
.getSkeleton())
1654 if (!LScopes
.getAbstractScopesList().empty() &&
1655 TheCU
.getCUNode()->getSplitDebugInlining())
1656 SkelCU
->constructSubprogramScopeDIE(SP
, FnScope
);
1658 // Construct call site entries.
1659 constructCallSiteEntryDIEs(*SP
, TheCU
, ScopeDIE
, *MF
);
1662 // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
1663 // DbgVariables except those that are also in AbstractVariables (since they
1664 // can be used cross-function)
1665 InfoHolder
.getScopeVariables().clear();
1666 InfoHolder
.getScopeLabels().clear();
1667 PrevLabel
= nullptr;
1671 // Register a source line with debug info. Returns the unique label that was
1672 // emitted and which provides correspondence to the source line list.
1673 void DwarfDebug::recordSourceLine(unsigned Line
, unsigned Col
, const MDNode
*S
,
1675 ::recordSourceLine(*Asm
, Line
, Col
, S
, Flags
,
1676 Asm
->OutStreamer
->getContext().getDwarfCompileUnitID(),
1677 getDwarfVersion(), getUnits());
1680 //===----------------------------------------------------------------------===//
1682 //===----------------------------------------------------------------------===//
1684 // Emit the debug info section.
1685 void DwarfDebug::emitDebugInfo() {
1686 DwarfFile
&Holder
= useSplitDwarf() ? SkeletonHolder
: InfoHolder
;
1687 Holder
.emitUnits(/* UseOffsets */ false);
1690 // Emit the abbreviation section.
1691 void DwarfDebug::emitAbbreviations() {
1692 DwarfFile
&Holder
= useSplitDwarf() ? SkeletonHolder
: InfoHolder
;
1694 Holder
.emitAbbrevs(Asm
->getObjFileLowering().getDwarfAbbrevSection());
1697 void DwarfDebug::emitStringOffsetsTableHeader() {
1698 DwarfFile
&Holder
= useSplitDwarf() ? SkeletonHolder
: InfoHolder
;
1699 Holder
.getStringPool().emitStringOffsetsTableHeader(
1700 *Asm
, Asm
->getObjFileLowering().getDwarfStrOffSection(),
1701 Holder
.getStringOffsetsStartSym());
1704 template <typename AccelTableT
>
1705 void DwarfDebug::emitAccel(AccelTableT
&Accel
, MCSection
*Section
,
1706 StringRef TableName
) {
1707 Asm
->OutStreamer
->SwitchSection(Section
);
1709 // Emit the full data.
1710 emitAppleAccelTable(Asm
, Accel
, TableName
, Section
->getBeginSymbol());
1713 void DwarfDebug::emitAccelDebugNames() {
1714 // Don't emit anything if we have no compilation units to index.
1715 if (getUnits().empty())
1718 emitDWARF5AccelTable(Asm
, AccelDebugNames
, *this, getUnits());
1721 // Emit visible names into a hashed accelerator table section.
1722 void DwarfDebug::emitAccelNames() {
1723 emitAccel(AccelNames
, Asm
->getObjFileLowering().getDwarfAccelNamesSection(),
1727 // Emit objective C classes and categories into a hashed accelerator table
1729 void DwarfDebug::emitAccelObjC() {
1730 emitAccel(AccelObjC
, Asm
->getObjFileLowering().getDwarfAccelObjCSection(),
1734 // Emit namespace dies into a hashed accelerator table.
1735 void DwarfDebug::emitAccelNamespaces() {
1736 emitAccel(AccelNamespace
,
1737 Asm
->getObjFileLowering().getDwarfAccelNamespaceSection(),
1741 // Emit type dies into a hashed accelerator table.
1742 void DwarfDebug::emitAccelTypes() {
1743 emitAccel(AccelTypes
, Asm
->getObjFileLowering().getDwarfAccelTypesSection(),
1747 // Public name handling.
1748 // The format for the various pubnames:
1750 // dwarf pubnames - offset/name pairs where the offset is the offset into the CU
1751 // for the DIE that is named.
1753 // gnu pubnames - offset/index value/name tuples where the offset is the offset
1754 // into the CU and the index value is computed according to the type of value
1755 // for the DIE that is named.
1757 // For type units the offset is the offset of the skeleton DIE. For split dwarf
1758 // it's the offset within the debug_info/debug_types dwo section, however, the
1759 // reference in the pubname header doesn't change.
1761 /// computeIndexValue - Compute the gdb index value for the DIE and CU.
1762 static dwarf::PubIndexEntryDescriptor
computeIndexValue(DwarfUnit
*CU
,
1764 // Entities that ended up only in a Type Unit reference the CU instead (since
1765 // the pub entry has offsets within the CU there's no real offset that can be
1766 // provided anyway). As it happens all such entities (namespaces and types,
1767 // types only in C++ at that) are rendered as TYPE+EXTERNAL. If this turns out
1768 // not to be true it would be necessary to persist this information from the
1769 // point at which the entry is added to the index data structure - since by
1770 // the time the index is built from that, the original type/namespace DIE in a
1771 // type unit has already been destroyed so it can't be queried for properties
1773 if (Die
->getTag() == dwarf::DW_TAG_compile_unit
)
1774 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE
,
1775 dwarf::GIEL_EXTERNAL
);
1776 dwarf::GDBIndexEntryLinkage Linkage
= dwarf::GIEL_STATIC
;
1778 // We could have a specification DIE that has our most of our knowledge,
1779 // look for that now.
1780 if (DIEValue SpecVal
= Die
->findAttribute(dwarf::DW_AT_specification
)) {
1781 DIE
&SpecDIE
= SpecVal
.getDIEEntry().getEntry();
1782 if (SpecDIE
.findAttribute(dwarf::DW_AT_external
))
1783 Linkage
= dwarf::GIEL_EXTERNAL
;
1784 } else if (Die
->findAttribute(dwarf::DW_AT_external
))
1785 Linkage
= dwarf::GIEL_EXTERNAL
;
1787 switch (Die
->getTag()) {
1788 case dwarf::DW_TAG_class_type
:
1789 case dwarf::DW_TAG_structure_type
:
1790 case dwarf::DW_TAG_union_type
:
1791 case dwarf::DW_TAG_enumeration_type
:
1792 return dwarf::PubIndexEntryDescriptor(
1793 dwarf::GIEK_TYPE
, CU
->getLanguage() != dwarf::DW_LANG_C_plus_plus
1794 ? dwarf::GIEL_STATIC
1795 : dwarf::GIEL_EXTERNAL
);
1796 case dwarf::DW_TAG_typedef
:
1797 case dwarf::DW_TAG_base_type
:
1798 case dwarf::DW_TAG_subrange_type
:
1799 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE
, dwarf::GIEL_STATIC
);
1800 case dwarf::DW_TAG_namespace
:
1801 return dwarf::GIEK_TYPE
;
1802 case dwarf::DW_TAG_subprogram
:
1803 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_FUNCTION
, Linkage
);
1804 case dwarf::DW_TAG_variable
:
1805 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE
, Linkage
);
1806 case dwarf::DW_TAG_enumerator
:
1807 return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_VARIABLE
,
1808 dwarf::GIEL_STATIC
);
1810 return dwarf::GIEK_NONE
;
1814 /// emitDebugPubSections - Emit visible names and types into debug pubnames and
1815 /// pubtypes sections.
1816 void DwarfDebug::emitDebugPubSections() {
1817 for (const auto &NU
: CUMap
) {
1818 DwarfCompileUnit
*TheU
= NU
.second
;
1819 if (!TheU
->hasDwarfPubSections())
1822 bool GnuStyle
= TheU
->getCUNode()->getNameTableKind() ==
1823 DICompileUnit::DebugNameTableKind::GNU
;
1825 Asm
->OutStreamer
->SwitchSection(
1826 GnuStyle
? Asm
->getObjFileLowering().getDwarfGnuPubNamesSection()
1827 : Asm
->getObjFileLowering().getDwarfPubNamesSection());
1828 emitDebugPubSection(GnuStyle
, "Names", TheU
, TheU
->getGlobalNames());
1830 Asm
->OutStreamer
->SwitchSection(
1831 GnuStyle
? Asm
->getObjFileLowering().getDwarfGnuPubTypesSection()
1832 : Asm
->getObjFileLowering().getDwarfPubTypesSection());
1833 emitDebugPubSection(GnuStyle
, "Types", TheU
, TheU
->getGlobalTypes());
1837 void DwarfDebug::emitSectionReference(const DwarfCompileUnit
&CU
) {
1838 if (useSectionsAsReferences())
1839 Asm
->EmitDwarfOffset(CU
.getSection()->getBeginSymbol(),
1840 CU
.getDebugSectionOffset());
1842 Asm
->emitDwarfSymbolReference(CU
.getLabelBegin());
1845 void DwarfDebug::emitDebugPubSection(bool GnuStyle
, StringRef Name
,
1846 DwarfCompileUnit
*TheU
,
1847 const StringMap
<const DIE
*> &Globals
) {
1848 if (auto *Skeleton
= TheU
->getSkeleton())
1852 Asm
->OutStreamer
->AddComment("Length of Public " + Name
+ " Info");
1853 MCSymbol
*BeginLabel
= Asm
->createTempSymbol("pub" + Name
+ "_begin");
1854 MCSymbol
*EndLabel
= Asm
->createTempSymbol("pub" + Name
+ "_end");
1855 Asm
->EmitLabelDifference(EndLabel
, BeginLabel
, 4);
1857 Asm
->OutStreamer
->EmitLabel(BeginLabel
);
1859 Asm
->OutStreamer
->AddComment("DWARF Version");
1860 Asm
->emitInt16(dwarf::DW_PUBNAMES_VERSION
);
1862 Asm
->OutStreamer
->AddComment("Offset of Compilation Unit Info");
1863 emitSectionReference(*TheU
);
1865 Asm
->OutStreamer
->AddComment("Compilation Unit Length");
1866 Asm
->emitInt32(TheU
->getLength());
1868 // Emit the pubnames for this compilation unit.
1869 for (const auto &GI
: Globals
) {
1870 const char *Name
= GI
.getKeyData();
1871 const DIE
*Entity
= GI
.second
;
1873 Asm
->OutStreamer
->AddComment("DIE offset");
1874 Asm
->emitInt32(Entity
->getOffset());
1877 dwarf::PubIndexEntryDescriptor Desc
= computeIndexValue(TheU
, Entity
);
1878 Asm
->OutStreamer
->AddComment(
1879 Twine("Attributes: ") + dwarf::GDBIndexEntryKindString(Desc
.Kind
) +
1880 ", " + dwarf::GDBIndexEntryLinkageString(Desc
.Linkage
));
1881 Asm
->emitInt8(Desc
.toBits());
1884 Asm
->OutStreamer
->AddComment("External Name");
1885 Asm
->OutStreamer
->EmitBytes(StringRef(Name
, GI
.getKeyLength() + 1));
1888 Asm
->OutStreamer
->AddComment("End Mark");
1890 Asm
->OutStreamer
->EmitLabel(EndLabel
);
1893 /// Emit null-terminated strings into a debug str section.
1894 void DwarfDebug::emitDebugStr() {
1895 MCSection
*StringOffsetsSection
= nullptr;
1896 if (useSegmentedStringOffsetsTable()) {
1897 emitStringOffsetsTableHeader();
1898 StringOffsetsSection
= Asm
->getObjFileLowering().getDwarfStrOffSection();
1900 DwarfFile
&Holder
= useSplitDwarf() ? SkeletonHolder
: InfoHolder
;
1901 Holder
.emitStrings(Asm
->getObjFileLowering().getDwarfStrSection(),
1902 StringOffsetsSection
, /* UseRelativeOffsets = */ true);
1905 void DwarfDebug::emitDebugLocEntry(ByteStreamer
&Streamer
, const
1906 DebugLocStream::Entry
&Entry
,
1907 const DwarfCompileUnit
*CU
) {
1908 auto &&Comments
= DebugLocs
.getComments(Entry
);
1909 auto Comment
= Comments
.begin();
1910 auto End
= Comments
.end();
1912 // The expressions are inserted into a byte stream rather early (see
1913 // DwarfExpression::addExpression) so for those ops (e.g. DW_OP_convert) that
1914 // need to reference a base_type DIE the offset of that DIE is not yet known.
1915 // To deal with this we instead insert a placeholder early and then extract
1916 // it here and replace it with the real reference.
1917 unsigned PtrSize
= Asm
->MAI
->getCodePointerSize();
1918 DWARFDataExtractor
Data(StringRef(DebugLocs
.getBytes(Entry
).data(),
1919 DebugLocs
.getBytes(Entry
).size()),
1920 Asm
->getDataLayout().isLittleEndian(), PtrSize
);
1921 DWARFExpression
Expr(Data
, getDwarfVersion(), PtrSize
);
1923 using Encoding
= DWARFExpression::Operation::Encoding
;
1924 uint32_t Offset
= 0;
1925 for (auto &Op
: Expr
) {
1926 assert(Op
.getCode() != dwarf::DW_OP_const_type
&&
1927 "3 operand ops not yet supported");
1928 Streamer
.EmitInt8(Op
.getCode(), Comment
!= End
? *(Comment
++) : "");
1930 for (unsigned I
= 0; I
< 2; ++I
) {
1931 if (Op
.getDescription().Op
[I
] == Encoding::SizeNA
)
1933 if (Op
.getDescription().Op
[I
] == Encoding::BaseTypeRef
) {
1935 uint64_t Offset
= CU
->ExprRefedBaseTypes
[Op
.getRawOperand(I
)].Die
->getOffset();
1936 assert(Offset
< (1ULL << (ULEB128PadSize
* 7)) && "Offset wont fit");
1937 Asm
->EmitULEB128(Offset
, nullptr, ULEB128PadSize
);
1939 // Emit a reference to the 'generic type'.
1940 Asm
->EmitULEB128(0, nullptr, ULEB128PadSize
);
1942 // Make sure comments stay aligned.
1943 for (unsigned J
= 0; J
< ULEB128PadSize
; ++J
)
1947 for (uint32_t J
= Offset
; J
< Op
.getOperandEndOffset(I
); ++J
)
1948 Streamer
.EmitInt8(Data
.getData()[J
], Comment
!= End
? *(Comment
++) : "");
1950 Offset
= Op
.getOperandEndOffset(I
);
1952 assert(Offset
== Op
.getEndOffset());
1956 static void emitDebugLocValue(const AsmPrinter
&AP
, const DIBasicType
*BT
,
1957 const DebugLocEntry::Value
&Value
,
1958 DwarfExpression
&DwarfExpr
) {
1959 auto *DIExpr
= Value
.getExpression();
1960 DIExpressionCursor
ExprCursor(DIExpr
);
1961 DwarfExpr
.addFragmentOffset(DIExpr
);
1963 if (Value
.isInt()) {
1964 if (BT
&& (BT
->getEncoding() == dwarf::DW_ATE_signed
||
1965 BT
->getEncoding() == dwarf::DW_ATE_signed_char
))
1966 DwarfExpr
.addSignedConstant(Value
.getInt());
1968 DwarfExpr
.addUnsignedConstant(Value
.getInt());
1969 } else if (Value
.isLocation()) {
1970 MachineLocation Location
= Value
.getLoc();
1971 if (Location
.isIndirect())
1972 DwarfExpr
.setMemoryLocationKind();
1973 DIExpressionCursor
Cursor(DIExpr
);
1974 const TargetRegisterInfo
&TRI
= *AP
.MF
->getSubtarget().getRegisterInfo();
1975 if (!DwarfExpr
.addMachineRegExpression(TRI
, Cursor
, Location
.getReg()))
1977 return DwarfExpr
.addExpression(std::move(Cursor
));
1978 } else if (Value
.isConstantFP()) {
1979 APInt RawBytes
= Value
.getConstantFP()->getValueAPF().bitcastToAPInt();
1980 DwarfExpr
.addUnsignedConstant(RawBytes
);
1982 DwarfExpr
.addExpression(std::move(ExprCursor
));
1985 void DebugLocEntry::finalize(const AsmPrinter
&AP
,
1986 DebugLocStream::ListBuilder
&List
,
1987 const DIBasicType
*BT
,
1988 DwarfCompileUnit
&TheCU
) {
1989 assert(!Values
.empty() &&
1990 "location list entries without values are redundant");
1991 assert(Begin
!= End
&& "unexpected location list entry with empty range");
1992 DebugLocStream::EntryBuilder
Entry(List
, Begin
, End
);
1993 BufferByteStreamer Streamer
= Entry
.getStreamer();
1994 DebugLocDwarfExpression
DwarfExpr(AP
.getDwarfVersion(), Streamer
, TheCU
);
1995 const DebugLocEntry::Value
&Value
= Values
[0];
1996 if (Value
.isFragment()) {
1997 // Emit all fragments that belong to the same variable and range.
1998 assert(llvm::all_of(Values
, [](DebugLocEntry::Value P
) {
1999 return P
.isFragment();
2000 }) && "all values are expected to be fragments");
2001 assert(std::is_sorted(Values
.begin(), Values
.end()) &&
2002 "fragments are expected to be sorted");
2004 for (auto Fragment
: Values
)
2005 emitDebugLocValue(AP
, BT
, Fragment
, DwarfExpr
);
2008 assert(Values
.size() == 1 && "only fragments may have >1 value");
2009 emitDebugLocValue(AP
, BT
, Value
, DwarfExpr
);
2011 DwarfExpr
.finalize();
2014 void DwarfDebug::emitDebugLocEntryLocation(const DebugLocStream::Entry
&Entry
,
2015 const DwarfCompileUnit
*CU
) {
2017 Asm
->OutStreamer
->AddComment("Loc expr size");
2018 if (getDwarfVersion() >= 5)
2019 Asm
->EmitULEB128(DebugLocs
.getBytes(Entry
).size());
2020 else if (DebugLocs
.getBytes(Entry
).size() <= std::numeric_limits
<uint16_t>::max())
2021 Asm
->emitInt16(DebugLocs
.getBytes(Entry
).size());
2023 // The entry is too big to fit into 16 bit, drop it as there is nothing we
2029 APByteStreamer
Streamer(*Asm
);
2030 emitDebugLocEntry(Streamer
, Entry
, CU
);
2033 // Emit the common part of the DWARF 5 range/locations list tables header.
2034 static void emitListsTableHeaderStart(AsmPrinter
*Asm
, const DwarfFile
&Holder
,
2035 MCSymbol
*TableStart
,
2036 MCSymbol
*TableEnd
) {
2037 // Build the table header, which starts with the length field.
2038 Asm
->OutStreamer
->AddComment("Length");
2039 Asm
->EmitLabelDifference(TableEnd
, TableStart
, 4);
2040 Asm
->OutStreamer
->EmitLabel(TableStart
);
2041 // Version number (DWARF v5 and later).
2042 Asm
->OutStreamer
->AddComment("Version");
2043 Asm
->emitInt16(Asm
->OutStreamer
->getContext().getDwarfVersion());
2045 Asm
->OutStreamer
->AddComment("Address size");
2046 Asm
->emitInt8(Asm
->MAI
->getCodePointerSize());
2047 // Segment selector size.
2048 Asm
->OutStreamer
->AddComment("Segment selector size");
2052 // Emit the header of a DWARF 5 range list table list table. Returns the symbol
2053 // that designates the end of the table for the caller to emit when the table is
2055 static MCSymbol
*emitRnglistsTableHeader(AsmPrinter
*Asm
,
2056 const DwarfFile
&Holder
) {
2057 MCSymbol
*TableStart
= Asm
->createTempSymbol("debug_rnglist_table_start");
2058 MCSymbol
*TableEnd
= Asm
->createTempSymbol("debug_rnglist_table_end");
2059 emitListsTableHeaderStart(Asm
, Holder
, TableStart
, TableEnd
);
2061 Asm
->OutStreamer
->AddComment("Offset entry count");
2062 Asm
->emitInt32(Holder
.getRangeLists().size());
2063 Asm
->OutStreamer
->EmitLabel(Holder
.getRnglistsTableBaseSym());
2065 for (const RangeSpanList
&List
: Holder
.getRangeLists())
2066 Asm
->EmitLabelDifference(List
.getSym(), Holder
.getRnglistsTableBaseSym(),
2072 // Emit the header of a DWARF 5 locations list table. Returns the symbol that
2073 // designates the end of the table for the caller to emit when the table is
2075 static MCSymbol
*emitLoclistsTableHeader(AsmPrinter
*Asm
,
2076 const DwarfFile
&Holder
) {
2077 MCSymbol
*TableStart
= Asm
->createTempSymbol("debug_loclist_table_start");
2078 MCSymbol
*TableEnd
= Asm
->createTempSymbol("debug_loclist_table_end");
2079 emitListsTableHeaderStart(Asm
, Holder
, TableStart
, TableEnd
);
2081 // FIXME: Generate the offsets table and use DW_FORM_loclistx with the
2082 // DW_AT_loclists_base attribute. Until then set the number of offsets to 0.
2083 Asm
->OutStreamer
->AddComment("Offset entry count");
2085 Asm
->OutStreamer
->EmitLabel(Holder
.getLoclistsTableBaseSym());
2090 // Emit locations into the .debug_loc/.debug_rnglists section.
2091 void DwarfDebug::emitDebugLoc() {
2092 if (DebugLocs
.getLists().empty())
2095 bool IsLocLists
= getDwarfVersion() >= 5;
2096 MCSymbol
*TableEnd
= nullptr;
2098 Asm
->OutStreamer
->SwitchSection(
2099 Asm
->getObjFileLowering().getDwarfLoclistsSection());
2100 TableEnd
= emitLoclistsTableHeader(Asm
, useSplitDwarf() ? SkeletonHolder
2103 Asm
->OutStreamer
->SwitchSection(
2104 Asm
->getObjFileLowering().getDwarfLocSection());
2107 unsigned char Size
= Asm
->MAI
->getCodePointerSize();
2108 for (const auto &List
: DebugLocs
.getLists()) {
2109 Asm
->OutStreamer
->EmitLabel(List
.Label
);
2111 const DwarfCompileUnit
*CU
= List
.CU
;
2112 const MCSymbol
*Base
= CU
->getBaseAddress();
2113 for (const auto &Entry
: DebugLocs
.getEntries(List
)) {
2115 // Set up the range. This range is relative to the entry point of the
2116 // compile unit. This is a hard coded 0 for low_pc when we're emitting
2117 // ranges, or the DW_AT_low_pc on the compile unit otherwise.
2119 Asm
->OutStreamer
->AddComment("DW_LLE_offset_pair");
2120 Asm
->OutStreamer
->EmitIntValue(dwarf::DW_LLE_offset_pair
, 1);
2121 Asm
->OutStreamer
->AddComment(" starting offset");
2122 Asm
->EmitLabelDifferenceAsULEB128(Entry
.BeginSym
, Base
);
2123 Asm
->OutStreamer
->AddComment(" ending offset");
2124 Asm
->EmitLabelDifferenceAsULEB128(Entry
.EndSym
, Base
);
2126 Asm
->EmitLabelDifference(Entry
.BeginSym
, Base
, Size
);
2127 Asm
->EmitLabelDifference(Entry
.EndSym
, Base
, Size
);
2130 emitDebugLocEntryLocation(Entry
, CU
);
2134 // We have no base address.
2136 // TODO: Use DW_LLE_base_addressx + DW_LLE_offset_pair, or
2137 // DW_LLE_startx_length in case if there is only a single range.
2138 // That should reduce the size of the debug data emited.
2139 // For now just use the DW_LLE_startx_length for all cases.
2140 Asm
->OutStreamer
->AddComment("DW_LLE_startx_length");
2141 Asm
->emitInt8(dwarf::DW_LLE_startx_length
);
2142 Asm
->OutStreamer
->AddComment(" start idx");
2143 Asm
->EmitULEB128(AddrPool
.getIndex(Entry
.BeginSym
));
2144 Asm
->OutStreamer
->AddComment(" length");
2145 Asm
->EmitLabelDifferenceAsULEB128(Entry
.EndSym
, Entry
.BeginSym
);
2147 Asm
->OutStreamer
->EmitSymbolValue(Entry
.BeginSym
, Size
);
2148 Asm
->OutStreamer
->EmitSymbolValue(Entry
.EndSym
, Size
);
2151 emitDebugLocEntryLocation(Entry
, CU
);
2155 // .debug_loclists section ends with DW_LLE_end_of_list.
2156 Asm
->OutStreamer
->AddComment("DW_LLE_end_of_list");
2157 Asm
->OutStreamer
->EmitIntValue(dwarf::DW_LLE_end_of_list
, 1);
2159 // Terminate the .debug_loc list with two 0 values.
2160 Asm
->OutStreamer
->EmitIntValue(0, Size
);
2161 Asm
->OutStreamer
->EmitIntValue(0, Size
);
2166 Asm
->OutStreamer
->EmitLabel(TableEnd
);
2169 void DwarfDebug::emitDebugLocDWO() {
2170 for (const auto &List
: DebugLocs
.getLists()) {
2171 Asm
->OutStreamer
->SwitchSection(
2172 Asm
->getObjFileLowering().getDwarfLocDWOSection());
2173 Asm
->OutStreamer
->EmitLabel(List
.Label
);
2174 for (const auto &Entry
: DebugLocs
.getEntries(List
)) {
2175 // GDB only supports startx_length in pre-standard split-DWARF.
2176 // (in v5 standard loclists, it currently* /only/ supports base_address +
2177 // offset_pair, so the implementations can't really share much since they
2178 // need to use different representations)
2179 // * as of October 2018, at least
2180 // Ideally/in v5, this could use SectionLabels to reuse existing addresses
2181 // in the address pool to minimize object size/relocations.
2182 Asm
->emitInt8(dwarf::DW_LLE_startx_length
);
2183 unsigned idx
= AddrPool
.getIndex(Entry
.BeginSym
);
2184 Asm
->EmitULEB128(idx
);
2185 Asm
->EmitLabelDifference(Entry
.EndSym
, Entry
.BeginSym
, 4);
2187 emitDebugLocEntryLocation(Entry
, List
.CU
);
2189 Asm
->emitInt8(dwarf::DW_LLE_end_of_list
);
2194 const MCSymbol
*Start
, *End
;
2197 // Emit a debug aranges section, containing a CU lookup for any
2198 // address we can tie back to a CU.
2199 void DwarfDebug::emitDebugARanges() {
2200 // Provides a unique id per text section.
2201 MapVector
<MCSection
*, SmallVector
<SymbolCU
, 8>> SectionMap
;
2203 // Filter labels by section.
2204 for (const SymbolCU
&SCU
: ArangeLabels
) {
2205 if (SCU
.Sym
->isInSection()) {
2206 // Make a note of this symbol and it's section.
2207 MCSection
*Section
= &SCU
.Sym
->getSection();
2208 if (!Section
->getKind().isMetadata())
2209 SectionMap
[Section
].push_back(SCU
);
2211 // Some symbols (e.g. common/bss on mach-o) can have no section but still
2212 // appear in the output. This sucks as we rely on sections to build
2213 // arange spans. We can do it without, but it's icky.
2214 SectionMap
[nullptr].push_back(SCU
);
2218 DenseMap
<DwarfCompileUnit
*, std::vector
<ArangeSpan
>> Spans
;
2220 for (auto &I
: SectionMap
) {
2221 MCSection
*Section
= I
.first
;
2222 SmallVector
<SymbolCU
, 8> &List
= I
.second
;
2223 if (List
.size() < 1)
2226 // If we have no section (e.g. common), just write out
2227 // individual spans for each symbol.
2229 for (const SymbolCU
&Cur
: List
) {
2231 Span
.Start
= Cur
.Sym
;
2234 Spans
[Cur
.CU
].push_back(Span
);
2239 // Sort the symbols by offset within the section.
2240 llvm::stable_sort(List
, [&](const SymbolCU
&A
, const SymbolCU
&B
) {
2241 unsigned IA
= A
.Sym
? Asm
->OutStreamer
->GetSymbolOrder(A
.Sym
) : 0;
2242 unsigned IB
= B
.Sym
? Asm
->OutStreamer
->GetSymbolOrder(B
.Sym
) : 0;
2244 // Symbols with no order assigned should be placed at the end.
2245 // (e.g. section end labels)
2253 // Insert a final terminator.
2254 List
.push_back(SymbolCU(nullptr, Asm
->OutStreamer
->endSection(Section
)));
2256 // Build spans between each label.
2257 const MCSymbol
*StartSym
= List
[0].Sym
;
2258 for (size_t n
= 1, e
= List
.size(); n
< e
; n
++) {
2259 const SymbolCU
&Prev
= List
[n
- 1];
2260 const SymbolCU
&Cur
= List
[n
];
2262 // Try and build the longest span we can within the same CU.
2263 if (Cur
.CU
!= Prev
.CU
) {
2265 Span
.Start
= StartSym
;
2268 Spans
[Prev
.CU
].push_back(Span
);
2274 // Start the dwarf aranges section.
2275 Asm
->OutStreamer
->SwitchSection(
2276 Asm
->getObjFileLowering().getDwarfARangesSection());
2278 unsigned PtrSize
= Asm
->MAI
->getCodePointerSize();
2280 // Build a list of CUs used.
2281 std::vector
<DwarfCompileUnit
*> CUs
;
2282 for (const auto &it
: Spans
) {
2283 DwarfCompileUnit
*CU
= it
.first
;
2287 // Sort the CU list (again, to ensure consistent output order).
2288 llvm::sort(CUs
, [](const DwarfCompileUnit
*A
, const DwarfCompileUnit
*B
) {
2289 return A
->getUniqueID() < B
->getUniqueID();
2292 // Emit an arange table for each CU we used.
2293 for (DwarfCompileUnit
*CU
: CUs
) {
2294 std::vector
<ArangeSpan
> &List
= Spans
[CU
];
2296 // Describe the skeleton CU's offset and length, not the dwo file's.
2297 if (auto *Skel
= CU
->getSkeleton())
2300 // Emit size of content not including length itself.
2301 unsigned ContentSize
=
2302 sizeof(int16_t) + // DWARF ARange version number
2303 sizeof(int32_t) + // Offset of CU in the .debug_info section
2304 sizeof(int8_t) + // Pointer Size (in bytes)
2305 sizeof(int8_t); // Segment Size (in bytes)
2307 unsigned TupleSize
= PtrSize
* 2;
2309 // 7.20 in the Dwarf specs requires the table to be aligned to a tuple.
2311 OffsetToAlignment(sizeof(int32_t) + ContentSize
, TupleSize
);
2313 ContentSize
+= Padding
;
2314 ContentSize
+= (List
.size() + 1) * TupleSize
;
2316 // For each compile unit, write the list of spans it covers.
2317 Asm
->OutStreamer
->AddComment("Length of ARange Set");
2318 Asm
->emitInt32(ContentSize
);
2319 Asm
->OutStreamer
->AddComment("DWARF Arange version number");
2320 Asm
->emitInt16(dwarf::DW_ARANGES_VERSION
);
2321 Asm
->OutStreamer
->AddComment("Offset Into Debug Info Section");
2322 emitSectionReference(*CU
);
2323 Asm
->OutStreamer
->AddComment("Address Size (in bytes)");
2324 Asm
->emitInt8(PtrSize
);
2325 Asm
->OutStreamer
->AddComment("Segment Size (in bytes)");
2328 Asm
->OutStreamer
->emitFill(Padding
, 0xff);
2330 for (const ArangeSpan
&Span
: List
) {
2331 Asm
->EmitLabelReference(Span
.Start
, PtrSize
);
2333 // Calculate the size as being from the span start to it's end.
2335 Asm
->EmitLabelDifference(Span
.End
, Span
.Start
, PtrSize
);
2337 // For symbols without an end marker (e.g. common), we
2338 // write a single arange entry containing just that one symbol.
2339 uint64_t Size
= SymSize
[Span
.Start
];
2343 Asm
->OutStreamer
->EmitIntValue(Size
, PtrSize
);
2347 Asm
->OutStreamer
->AddComment("ARange terminator");
2348 Asm
->OutStreamer
->EmitIntValue(0, PtrSize
);
2349 Asm
->OutStreamer
->EmitIntValue(0, PtrSize
);
2353 /// Emit a single range list. We handle both DWARF v5 and earlier.
2354 static void emitRangeList(DwarfDebug
&DD
, AsmPrinter
*Asm
,
2355 const RangeSpanList
&List
) {
2357 auto DwarfVersion
= DD
.getDwarfVersion();
2358 // Emit our symbol so we can find the beginning of the range.
2359 Asm
->OutStreamer
->EmitLabel(List
.getSym());
2360 // Gather all the ranges that apply to the same section so they can share
2361 // a base address entry.
2362 MapVector
<const MCSection
*, std::vector
<const RangeSpan
*>> SectionRanges
;
2363 // Size for our labels.
2364 auto Size
= Asm
->MAI
->getCodePointerSize();
2366 for (const RangeSpan
&Range
: List
.getRanges())
2367 SectionRanges
[&Range
.getStart()->getSection()].push_back(&Range
);
2369 const DwarfCompileUnit
&CU
= List
.getCU();
2370 const MCSymbol
*CUBase
= CU
.getBaseAddress();
2371 bool BaseIsSet
= false;
2372 for (const auto &P
: SectionRanges
) {
2373 // Don't bother with a base address entry if there's only one range in
2374 // this section in this range list - for example ranges for a CU will
2375 // usually consist of single regions from each of many sections
2376 // (-ffunction-sections, or just C++ inline functions) except under LTO
2377 // or optnone where there may be holes in a single CU's section
2379 auto *Base
= CUBase
;
2380 if (!Base
&& (P
.second
.size() > 1 || DwarfVersion
< 5) &&
2381 (CU
.getCUNode()->getRangesBaseAddress() || DwarfVersion
>= 5)) {
2383 // FIXME/use care: This may not be a useful base address if it's not
2384 // the lowest address/range in this object.
2385 Base
= P
.second
.front()->getStart();
2386 if (DwarfVersion
>= 5) {
2387 Base
= DD
.getSectionLabel(&Base
->getSection());
2388 Asm
->OutStreamer
->AddComment("DW_RLE_base_addressx");
2389 Asm
->OutStreamer
->EmitIntValue(dwarf::DW_RLE_base_addressx
, 1);
2390 Asm
->OutStreamer
->AddComment(" base address index");
2391 Asm
->EmitULEB128(DD
.getAddressPool().getIndex(Base
));
2393 Asm
->OutStreamer
->EmitIntValue(-1, Size
);
2394 Asm
->OutStreamer
->AddComment(" base address");
2395 Asm
->OutStreamer
->EmitSymbolValue(Base
, Size
);
2397 } else if (BaseIsSet
&& DwarfVersion
< 5) {
2400 Asm
->OutStreamer
->EmitIntValue(-1, Size
);
2401 Asm
->OutStreamer
->EmitIntValue(0, Size
);
2404 for (const auto *RS
: P
.second
) {
2405 const MCSymbol
*Begin
= RS
->getStart();
2406 const MCSymbol
*End
= RS
->getEnd();
2407 assert(Begin
&& "Range without a begin symbol?");
2408 assert(End
&& "Range without an end symbol?");
2410 if (DwarfVersion
>= 5) {
2411 // Emit DW_RLE_offset_pair when we have a base.
2412 Asm
->OutStreamer
->AddComment("DW_RLE_offset_pair");
2413 Asm
->OutStreamer
->EmitIntValue(dwarf::DW_RLE_offset_pair
, 1);
2414 Asm
->OutStreamer
->AddComment(" starting offset");
2415 Asm
->EmitLabelDifferenceAsULEB128(Begin
, Base
);
2416 Asm
->OutStreamer
->AddComment(" ending offset");
2417 Asm
->EmitLabelDifferenceAsULEB128(End
, Base
);
2419 Asm
->EmitLabelDifference(Begin
, Base
, Size
);
2420 Asm
->EmitLabelDifference(End
, Base
, Size
);
2422 } else if (DwarfVersion
>= 5) {
2423 Asm
->OutStreamer
->AddComment("DW_RLE_startx_length");
2424 Asm
->OutStreamer
->EmitIntValue(dwarf::DW_RLE_startx_length
, 1);
2425 Asm
->OutStreamer
->AddComment(" start index");
2426 Asm
->EmitULEB128(DD
.getAddressPool().getIndex(Begin
));
2427 Asm
->OutStreamer
->AddComment(" length");
2428 Asm
->EmitLabelDifferenceAsULEB128(End
, Begin
);
2430 Asm
->OutStreamer
->EmitSymbolValue(Begin
, Size
);
2431 Asm
->OutStreamer
->EmitSymbolValue(End
, Size
);
2435 if (DwarfVersion
>= 5) {
2436 Asm
->OutStreamer
->AddComment("DW_RLE_end_of_list");
2437 Asm
->OutStreamer
->EmitIntValue(dwarf::DW_RLE_end_of_list
, 1);
2439 // Terminate the list with two 0 values.
2440 Asm
->OutStreamer
->EmitIntValue(0, Size
);
2441 Asm
->OutStreamer
->EmitIntValue(0, Size
);
2445 static void emitDebugRangesImpl(DwarfDebug
&DD
, AsmPrinter
*Asm
,
2446 const DwarfFile
&Holder
, MCSymbol
*TableEnd
) {
2447 for (const RangeSpanList
&List
: Holder
.getRangeLists())
2448 emitRangeList(DD
, Asm
, List
);
2451 Asm
->OutStreamer
->EmitLabel(TableEnd
);
2454 /// Emit address ranges into the .debug_ranges section or into the DWARF v5
2455 /// .debug_rnglists section.
2456 void DwarfDebug::emitDebugRanges() {
2460 const auto &Holder
= useSplitDwarf() ? SkeletonHolder
: InfoHolder
;
2462 if (Holder
.getRangeLists().empty())
2465 assert(useRangesSection());
2466 assert(llvm::none_of(CUMap
, [](const decltype(CUMap
)::value_type
&Pair
) {
2467 return Pair
.second
->getCUNode()->isDebugDirectivesOnly();
2470 // Start the dwarf ranges section.
2471 MCSymbol
*TableEnd
= nullptr;
2472 if (getDwarfVersion() >= 5) {
2473 Asm
->OutStreamer
->SwitchSection(
2474 Asm
->getObjFileLowering().getDwarfRnglistsSection());
2475 TableEnd
= emitRnglistsTableHeader(Asm
, Holder
);
2477 Asm
->OutStreamer
->SwitchSection(
2478 Asm
->getObjFileLowering().getDwarfRangesSection());
2480 emitDebugRangesImpl(*this, Asm
, Holder
, TableEnd
);
2483 void DwarfDebug::emitDebugRangesDWO() {
2484 assert(useSplitDwarf());
2489 const auto &Holder
= InfoHolder
;
2491 if (Holder
.getRangeLists().empty())
2494 assert(getDwarfVersion() >= 5);
2495 assert(useRangesSection());
2496 assert(llvm::none_of(CUMap
, [](const decltype(CUMap
)::value_type
&Pair
) {
2497 return Pair
.second
->getCUNode()->isDebugDirectivesOnly();
2500 // Start the dwarf ranges section.
2501 Asm
->OutStreamer
->SwitchSection(
2502 Asm
->getObjFileLowering().getDwarfRnglistsDWOSection());
2503 MCSymbol
*TableEnd
= emitRnglistsTableHeader(Asm
, Holder
);
2505 emitDebugRangesImpl(*this, Asm
, Holder
, TableEnd
);
2508 void DwarfDebug::handleMacroNodes(DIMacroNodeArray Nodes
, DwarfCompileUnit
&U
) {
2509 for (auto *MN
: Nodes
) {
2510 if (auto *M
= dyn_cast
<DIMacro
>(MN
))
2512 else if (auto *F
= dyn_cast
<DIMacroFile
>(MN
))
2513 emitMacroFile(*F
, U
);
2515 llvm_unreachable("Unexpected DI type!");
2519 void DwarfDebug::emitMacro(DIMacro
&M
) {
2520 Asm
->EmitULEB128(M
.getMacinfoType());
2521 Asm
->EmitULEB128(M
.getLine());
2522 StringRef Name
= M
.getName();
2523 StringRef Value
= M
.getValue();
2524 Asm
->OutStreamer
->EmitBytes(Name
);
2525 if (!Value
.empty()) {
2526 // There should be one space between macro name and macro value.
2528 Asm
->OutStreamer
->EmitBytes(Value
);
2530 Asm
->emitInt8('\0');
2533 void DwarfDebug::emitMacroFile(DIMacroFile
&F
, DwarfCompileUnit
&U
) {
2534 assert(F
.getMacinfoType() == dwarf::DW_MACINFO_start_file
);
2535 Asm
->EmitULEB128(dwarf::DW_MACINFO_start_file
);
2536 Asm
->EmitULEB128(F
.getLine());
2537 Asm
->EmitULEB128(U
.getOrCreateSourceID(F
.getFile()));
2538 handleMacroNodes(F
.getElements(), U
);
2539 Asm
->EmitULEB128(dwarf::DW_MACINFO_end_file
);
2542 /// Emit macros into a debug macinfo section.
2543 void DwarfDebug::emitDebugMacinfo() {
2547 if (llvm::all_of(CUMap
, [](const decltype(CUMap
)::value_type
&Pair
) {
2548 return Pair
.second
->getCUNode()->isDebugDirectivesOnly();
2552 // Start the dwarf macinfo section.
2553 Asm
->OutStreamer
->SwitchSection(
2554 Asm
->getObjFileLowering().getDwarfMacinfoSection());
2556 for (const auto &P
: CUMap
) {
2557 auto &TheCU
= *P
.second
;
2558 if (TheCU
.getCUNode()->isDebugDirectivesOnly())
2560 auto *SkCU
= TheCU
.getSkeleton();
2561 DwarfCompileUnit
&U
= SkCU
? *SkCU
: TheCU
;
2562 auto *CUNode
= cast
<DICompileUnit
>(P
.first
);
2563 DIMacroNodeArray Macros
= CUNode
->getMacros();
2564 if (!Macros
.empty()) {
2565 Asm
->OutStreamer
->EmitLabel(U
.getMacroLabelBegin());
2566 handleMacroNodes(Macros
, U
);
2569 Asm
->OutStreamer
->AddComment("End Of Macro List Mark");
2573 // DWARF5 Experimental Separate Dwarf emitters.
2575 void DwarfDebug::initSkeletonUnit(const DwarfUnit
&U
, DIE
&Die
,
2576 std::unique_ptr
<DwarfCompileUnit
> NewU
) {
2578 if (!CompilationDir
.empty())
2579 NewU
->addString(Die
, dwarf::DW_AT_comp_dir
, CompilationDir
);
2581 addGnuPubAttributes(*NewU
, Die
);
2583 SkeletonHolder
.addUnit(std::move(NewU
));
2586 DwarfCompileUnit
&DwarfDebug::constructSkeletonCU(const DwarfCompileUnit
&CU
) {
2588 auto OwnedUnit
= llvm::make_unique
<DwarfCompileUnit
>(
2589 CU
.getUniqueID(), CU
.getCUNode(), Asm
, this, &SkeletonHolder
);
2590 DwarfCompileUnit
&NewCU
= *OwnedUnit
;
2591 NewCU
.setSection(Asm
->getObjFileLowering().getDwarfInfoSection());
2593 NewCU
.initStmtList();
2595 if (useSegmentedStringOffsetsTable())
2596 NewCU
.addStringOffsetsStart();
2598 initSkeletonUnit(CU
, NewCU
.getUnitDie(), std::move(OwnedUnit
));
2603 // Emit the .debug_info.dwo section for separated dwarf. This contains the
2604 // compile units that would normally be in debug_info.
2605 void DwarfDebug::emitDebugInfoDWO() {
2606 assert(useSplitDwarf() && "No split dwarf debug info?");
2607 // Don't emit relocations into the dwo file.
2608 InfoHolder
.emitUnits(/* UseOffsets */ true);
2611 // Emit the .debug_abbrev.dwo section for separated dwarf. This contains the
2612 // abbreviations for the .debug_info.dwo section.
2613 void DwarfDebug::emitDebugAbbrevDWO() {
2614 assert(useSplitDwarf() && "No split dwarf?");
2615 InfoHolder
.emitAbbrevs(Asm
->getObjFileLowering().getDwarfAbbrevDWOSection());
2618 void DwarfDebug::emitDebugLineDWO() {
2619 assert(useSplitDwarf() && "No split dwarf?");
2620 SplitTypeUnitFileTable
.Emit(
2621 *Asm
->OutStreamer
, MCDwarfLineTableParams(),
2622 Asm
->getObjFileLowering().getDwarfLineDWOSection());
2625 void DwarfDebug::emitStringOffsetsTableHeaderDWO() {
2626 assert(useSplitDwarf() && "No split dwarf?");
2627 InfoHolder
.getStringPool().emitStringOffsetsTableHeader(
2628 *Asm
, Asm
->getObjFileLowering().getDwarfStrOffDWOSection(),
2629 InfoHolder
.getStringOffsetsStartSym());
2632 // Emit the .debug_str.dwo section for separated dwarf. This contains the
2633 // string section and is identical in format to traditional .debug_str
2635 void DwarfDebug::emitDebugStrDWO() {
2636 if (useSegmentedStringOffsetsTable())
2637 emitStringOffsetsTableHeaderDWO();
2638 assert(useSplitDwarf() && "No split dwarf?");
2639 MCSection
*OffSec
= Asm
->getObjFileLowering().getDwarfStrOffDWOSection();
2640 InfoHolder
.emitStrings(Asm
->getObjFileLowering().getDwarfStrDWOSection(),
2641 OffSec
, /* UseRelativeOffsets = */ false);
2644 // Emit address pool.
2645 void DwarfDebug::emitDebugAddr() {
2646 AddrPool
.emit(*Asm
, Asm
->getObjFileLowering().getDwarfAddrSection());
2649 MCDwarfDwoLineTable
*DwarfDebug::getDwoLineTable(const DwarfCompileUnit
&CU
) {
2650 if (!useSplitDwarf())
2652 const DICompileUnit
*DIUnit
= CU
.getCUNode();
2653 SplitTypeUnitFileTable
.maybeSetRootFile(
2654 DIUnit
->getDirectory(), DIUnit
->getFilename(),
2655 CU
.getMD5AsBytes(DIUnit
->getFile()), DIUnit
->getSource());
2656 return &SplitTypeUnitFileTable
;
2659 uint64_t DwarfDebug::makeTypeSignature(StringRef Identifier
) {
2661 Hash
.update(Identifier
);
2662 // ... take the least significant 8 bytes and return those. Our MD5
2663 // implementation always returns its results in little endian, so we actually
2664 // need the "high" word.
2665 MD5::MD5Result Result
;
2667 return Result
.high();
2670 void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit
&CU
,
2671 StringRef Identifier
, DIE
&RefDie
,
2672 const DICompositeType
*CTy
) {
2673 // Fast path if we're building some type units and one has already used the
2674 // address pool we know we're going to throw away all this work anyway, so
2675 // don't bother building dependent types.
2676 if (!TypeUnitsUnderConstruction
.empty() && AddrPool
.hasBeenUsed())
2679 auto Ins
= TypeSignatures
.insert(std::make_pair(CTy
, 0));
2681 CU
.addDIETypeSignature(RefDie
, Ins
.first
->second
);
2685 bool TopLevelType
= TypeUnitsUnderConstruction
.empty();
2686 AddrPool
.resetUsedFlag();
2688 auto OwnedUnit
= llvm::make_unique
<DwarfTypeUnit
>(CU
, Asm
, this, &InfoHolder
,
2689 getDwoLineTable(CU
));
2690 DwarfTypeUnit
&NewTU
= *OwnedUnit
;
2691 DIE
&UnitDie
= NewTU
.getUnitDie();
2692 TypeUnitsUnderConstruction
.emplace_back(std::move(OwnedUnit
), CTy
);
2694 NewTU
.addUInt(UnitDie
, dwarf::DW_AT_language
, dwarf::DW_FORM_data2
,
2697 uint64_t Signature
= makeTypeSignature(Identifier
);
2698 NewTU
.setTypeSignature(Signature
);
2699 Ins
.first
->second
= Signature
;
2701 if (useSplitDwarf()) {
2702 MCSection
*Section
=
2703 getDwarfVersion() <= 4
2704 ? Asm
->getObjFileLowering().getDwarfTypesDWOSection()
2705 : Asm
->getObjFileLowering().getDwarfInfoDWOSection();
2706 NewTU
.setSection(Section
);
2708 MCSection
*Section
=
2709 getDwarfVersion() <= 4
2710 ? Asm
->getObjFileLowering().getDwarfTypesSection(Signature
)
2711 : Asm
->getObjFileLowering().getDwarfInfoSection(Signature
);
2712 NewTU
.setSection(Section
);
2713 // Non-split type units reuse the compile unit's line table.
2714 CU
.applyStmtList(UnitDie
);
2717 // Add DW_AT_str_offsets_base to the type unit DIE, but not for split type
2719 if (useSegmentedStringOffsetsTable() && !useSplitDwarf())
2720 NewTU
.addStringOffsetsStart();
2722 NewTU
.setType(NewTU
.createTypeDIE(CTy
));
2725 auto TypeUnitsToAdd
= std::move(TypeUnitsUnderConstruction
);
2726 TypeUnitsUnderConstruction
.clear();
2728 // Types referencing entries in the address table cannot be placed in type
2730 if (AddrPool
.hasBeenUsed()) {
2732 // Remove all the types built while building this type.
2733 // This is pessimistic as some of these types might not be dependent on
2734 // the type that used an address.
2735 for (const auto &TU
: TypeUnitsToAdd
)
2736 TypeSignatures
.erase(TU
.second
);
2738 // Construct this type in the CU directly.
2739 // This is inefficient because all the dependent types will be rebuilt
2740 // from scratch, including building them in type units, discovering that
2741 // they depend on addresses, throwing them out and rebuilding them.
2742 CU
.constructTypeDIE(RefDie
, cast
<DICompositeType
>(CTy
));
2746 // If the type wasn't dependent on fission addresses, finish adding the type
2747 // and all its dependent types.
2748 for (auto &TU
: TypeUnitsToAdd
) {
2749 InfoHolder
.computeSizeAndOffsetsForUnit(TU
.first
.get());
2750 InfoHolder
.emitUnit(TU
.first
.get(), useSplitDwarf());
2753 CU
.addDIETypeSignature(RefDie
, Signature
);
2756 DwarfDebug::NonTypeUnitContext::NonTypeUnitContext(DwarfDebug
*DD
)
2758 TypeUnitsUnderConstruction(std::move(DD
->TypeUnitsUnderConstruction
)) {
2759 DD
->TypeUnitsUnderConstruction
.clear();
2760 assert(TypeUnitsUnderConstruction
.empty() || !DD
->AddrPool
.hasBeenUsed());
2763 DwarfDebug::NonTypeUnitContext::~NonTypeUnitContext() {
2764 DD
->TypeUnitsUnderConstruction
= std::move(TypeUnitsUnderConstruction
);
2765 DD
->AddrPool
.resetUsedFlag();
2768 DwarfDebug::NonTypeUnitContext
DwarfDebug::enterNonTypeUnitContext() {
2769 return NonTypeUnitContext(this);
2772 // Add the Name along with its companion DIE to the appropriate accelerator
2773 // table (for AccelTableKind::Dwarf it's always AccelDebugNames, for
2774 // AccelTableKind::Apple, we use the table we got as an argument). If
2775 // accelerator tables are disabled, this function does nothing.
2776 template <typename DataT
>
2777 void DwarfDebug::addAccelNameImpl(const DICompileUnit
&CU
,
2778 AccelTable
<DataT
> &AppleAccel
, StringRef Name
,
2780 if (getAccelTableKind() == AccelTableKind::None
)
2783 if (getAccelTableKind() != AccelTableKind::Apple
&&
2784 CU
.getNameTableKind() != DICompileUnit::DebugNameTableKind::Default
)
2787 DwarfFile
&Holder
= useSplitDwarf() ? SkeletonHolder
: InfoHolder
;
2788 DwarfStringPoolEntryRef Ref
= Holder
.getStringPool().getEntry(*Asm
, Name
);
2790 switch (getAccelTableKind()) {
2791 case AccelTableKind::Apple
:
2792 AppleAccel
.addName(Ref
, Die
);
2794 case AccelTableKind::Dwarf
:
2795 AccelDebugNames
.addName(Ref
, Die
);
2797 case AccelTableKind::Default
:
2798 llvm_unreachable("Default should have already been resolved.");
2799 case AccelTableKind::None
:
2800 llvm_unreachable("None handled above");
2804 void DwarfDebug::addAccelName(const DICompileUnit
&CU
, StringRef Name
,
2806 addAccelNameImpl(CU
, AccelNames
, Name
, Die
);
2809 void DwarfDebug::addAccelObjC(const DICompileUnit
&CU
, StringRef Name
,
2811 // ObjC names go only into the Apple accelerator tables.
2812 if (getAccelTableKind() == AccelTableKind::Apple
)
2813 addAccelNameImpl(CU
, AccelObjC
, Name
, Die
);
2816 void DwarfDebug::addAccelNamespace(const DICompileUnit
&CU
, StringRef Name
,
2818 addAccelNameImpl(CU
, AccelNamespace
, Name
, Die
);
2821 void DwarfDebug::addAccelType(const DICompileUnit
&CU
, StringRef Name
,
2822 const DIE
&Die
, char Flags
) {
2823 addAccelNameImpl(CU
, AccelTypes
, Name
, Die
);
2826 uint16_t DwarfDebug::getDwarfVersion() const {
2827 return Asm
->OutStreamer
->getContext().getDwarfVersion();
2830 void DwarfDebug::addSectionLabel(const MCSymbol
*Sym
) {
2831 SectionLabels
.insert(std::make_pair(&Sym
->getSection(), Sym
));
2834 const MCSymbol
*DwarfDebug::getSectionLabel(const MCSection
*S
) {
2835 return SectionLabels
.find(S
)->second
;