1 //===- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Units ------------===//
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 constructing a dwarf compile unit.
11 //===----------------------------------------------------------------------===//
13 #include "DwarfCompileUnit.h"
14 #include "AddressPool.h"
15 #include "DwarfExpression.h"
16 #include "llvm/ADT/None.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/SmallString.h"
19 #include "llvm/BinaryFormat/Dwarf.h"
20 #include "llvm/CodeGen/AsmPrinter.h"
21 #include "llvm/CodeGen/DIE.h"
22 #include "llvm/CodeGen/MachineFunction.h"
23 #include "llvm/CodeGen/MachineInstr.h"
24 #include "llvm/CodeGen/MachineOperand.h"
25 #include "llvm/CodeGen/TargetFrameLowering.h"
26 #include "llvm/CodeGen/TargetRegisterInfo.h"
27 #include "llvm/CodeGen/TargetSubtargetInfo.h"
28 #include "llvm/IR/DataLayout.h"
29 #include "llvm/IR/DebugInfo.h"
30 #include "llvm/IR/GlobalVariable.h"
31 #include "llvm/MC/MCSection.h"
32 #include "llvm/MC/MCStreamer.h"
33 #include "llvm/MC/MCSymbol.h"
34 #include "llvm/MC/MCSymbolWasm.h"
35 #include "llvm/MC/MachineLocation.h"
36 #include "llvm/Target/TargetLoweringObjectFile.h"
37 #include "llvm/Target/TargetMachine.h"
38 #include "llvm/Target/TargetOptions.h"
45 static dwarf::Tag
GetCompileUnitType(UnitKind Kind
, DwarfDebug
*DW
) {
47 // According to DWARF Debugging Information Format Version 5,
48 // 3.1.2 Skeleton Compilation Unit Entries:
49 // "When generating a split DWARF object file (see Section 7.3.2
50 // on page 187), the compilation unit in the .debug_info section
51 // is a "skeleton" compilation unit with the tag DW_TAG_skeleton_unit"
52 if (DW
->getDwarfVersion() >= 5 && Kind
== UnitKind::Skeleton
)
53 return dwarf::DW_TAG_skeleton_unit
;
55 return dwarf::DW_TAG_compile_unit
;
58 DwarfCompileUnit::DwarfCompileUnit(unsigned UID
, const DICompileUnit
*Node
,
59 AsmPrinter
*A
, DwarfDebug
*DW
,
60 DwarfFile
*DWU
, UnitKind Kind
)
61 : DwarfUnit(GetCompileUnitType(Kind
, DW
), Node
, A
, DW
, DWU
), UniqueID(UID
) {
62 insertDIE(Node
, &getUnitDie());
63 MacroLabelBegin
= Asm
->createTempSymbol("cu_macro_begin");
66 /// addLabelAddress - Add a dwarf label attribute data and value using
67 /// DW_FORM_addr or DW_FORM_GNU_addr_index.
68 void DwarfCompileUnit::addLabelAddress(DIE
&Die
, dwarf::Attribute Attribute
,
69 const MCSymbol
*Label
) {
70 // Don't use the address pool in non-fission or in the skeleton unit itself.
71 if ((!DD
->useSplitDwarf() || !Skeleton
) && DD
->getDwarfVersion() < 5)
72 return addLocalLabelAddress(Die
, Attribute
, Label
);
75 DD
->addArangeLabel(SymbolCU(this, Label
));
77 bool UseAddrOffsetFormOrExpressions
=
78 DD
->useAddrOffsetForm() || DD
->useAddrOffsetExpressions();
80 const MCSymbol
*Base
= nullptr;
81 if (Label
->isInSection() && UseAddrOffsetFormOrExpressions
)
82 Base
= DD
->getSectionLabel(&Label
->getSection());
84 if (!Base
|| Base
== Label
) {
85 unsigned idx
= DD
->getAddressPool().getIndex(Label
);
86 addAttribute(Die
, Attribute
,
87 DD
->getDwarfVersion() >= 5 ? dwarf::DW_FORM_addrx
88 : dwarf::DW_FORM_GNU_addr_index
,
93 // Could be extended to work with DWARFv4 Split DWARF if that's important for
94 // someone. In that case DW_FORM_data would be used.
95 assert(DD
->getDwarfVersion() >= 5 &&
96 "Addr+offset expressions are only valuable when using debug_addr (to "
97 "reduce relocations) available in DWARFv5 or higher");
98 if (DD
->useAddrOffsetExpressions()) {
99 auto *Loc
= new (DIEValueAllocator
) DIEBlock();
100 addPoolOpAddress(*Loc
, Label
);
101 addBlock(Die
, Attribute
, dwarf::DW_FORM_exprloc
, Loc
);
103 addAttribute(Die
, Attribute
, dwarf::DW_FORM_LLVM_addrx_offset
,
104 new (DIEValueAllocator
) DIEAddrOffset(
105 DD
->getAddressPool().getIndex(Base
), Label
, Base
));
108 void DwarfCompileUnit::addLocalLabelAddress(DIE
&Die
,
109 dwarf::Attribute Attribute
,
110 const MCSymbol
*Label
) {
112 DD
->addArangeLabel(SymbolCU(this, Label
));
115 addAttribute(Die
, Attribute
, dwarf::DW_FORM_addr
, DIELabel(Label
));
117 addAttribute(Die
, Attribute
, dwarf::DW_FORM_addr
, DIEInteger(0));
120 unsigned DwarfCompileUnit::getOrCreateSourceID(const DIFile
*File
) {
121 // If we print assembly, we can't separate .file entries according to
122 // compile units. Thus all files will belong to the default compile unit.
124 // FIXME: add a better feature test than hasRawTextSupport. Even better,
125 // extend .file to support this.
126 unsigned CUID
= Asm
->OutStreamer
->hasRawTextSupport() ? 0 : getUniqueID();
128 return Asm
->OutStreamer
->emitDwarfFileDirective(0, "", "", None
, None
,
130 return Asm
->OutStreamer
->emitDwarfFileDirective(
131 0, File
->getDirectory(), File
->getFilename(), DD
->getMD5AsBytes(File
),
132 File
->getSource(), CUID
);
135 DIE
*DwarfCompileUnit::getOrCreateGlobalVariableDIE(
136 const DIGlobalVariable
*GV
, ArrayRef
<GlobalExpr
> GlobalExprs
) {
137 // Check for pre-existence.
138 if (DIE
*Die
= getDIE(GV
))
143 auto *GVContext
= GV
->getScope();
144 const DIType
*GTy
= GV
->getType();
146 // Construct the context before querying for the existence of the DIE in
147 // case such construction creates the DIE.
148 auto *CB
= GVContext
? dyn_cast
<DICommonBlock
>(GVContext
) : nullptr;
149 DIE
*ContextDIE
= CB
? getOrCreateCommonBlock(CB
, GlobalExprs
)
150 : getOrCreateContextDIE(GVContext
);
153 DIE
*VariableDIE
= &createAndAddDIE(GV
->getTag(), *ContextDIE
, GV
);
154 DIScope
*DeclContext
;
155 if (auto *SDMDecl
= GV
->getStaticDataMemberDeclaration()) {
156 DeclContext
= SDMDecl
->getScope();
157 assert(SDMDecl
->isStaticMember() && "Expected static member decl");
158 assert(GV
->isDefinition());
159 // We need the declaration DIE that is in the static member's class.
160 DIE
*VariableSpecDIE
= getOrCreateStaticMemberDIE(SDMDecl
);
161 addDIEEntry(*VariableDIE
, dwarf::DW_AT_specification
, *VariableSpecDIE
);
162 // If the global variable's type is different from the one in the class
163 // member type, assume that it's more specific and also emit it.
164 if (GTy
!= SDMDecl
->getBaseType())
165 addType(*VariableDIE
, GTy
);
167 DeclContext
= GV
->getScope();
168 // Add name and type.
169 addString(*VariableDIE
, dwarf::DW_AT_name
, GV
->getDisplayName());
171 addType(*VariableDIE
, GTy
);
174 if (!GV
->isLocalToUnit())
175 addFlag(*VariableDIE
, dwarf::DW_AT_external
);
177 // Add line number info.
178 addSourceLine(*VariableDIE
, GV
);
181 if (!GV
->isDefinition())
182 addFlag(*VariableDIE
, dwarf::DW_AT_declaration
);
184 addGlobalName(GV
->getName(), *VariableDIE
, DeclContext
);
186 if (uint32_t AlignInBytes
= GV
->getAlignInBytes())
187 addUInt(*VariableDIE
, dwarf::DW_AT_alignment
, dwarf::DW_FORM_udata
,
190 if (MDTuple
*TP
= GV
->getTemplateParams())
191 addTemplateParams(*VariableDIE
, DINodeArray(TP
));
194 addLocationAttribute(VariableDIE
, GV
, GlobalExprs
);
199 void DwarfCompileUnit::addLocationAttribute(
200 DIE
*VariableDIE
, const DIGlobalVariable
*GV
, ArrayRef
<GlobalExpr
> GlobalExprs
) {
201 bool addToAccelTable
= false;
202 DIELoc
*Loc
= nullptr;
203 Optional
<unsigned> NVPTXAddressSpace
;
204 std::unique_ptr
<DIEDwarfExpression
> DwarfExpr
;
205 for (const auto &GE
: GlobalExprs
) {
206 const GlobalVariable
*Global
= GE
.Var
;
207 const DIExpression
*Expr
= GE
.Expr
;
209 // For compatibility with DWARF 3 and earlier,
210 // DW_AT_location(DW_OP_constu, X, DW_OP_stack_value) or
211 // DW_AT_location(DW_OP_consts, X, DW_OP_stack_value) becomes
212 // DW_AT_const_value(X).
213 if (GlobalExprs
.size() == 1 && Expr
&& Expr
->isConstant()) {
214 addToAccelTable
= true;
217 DIExpression::SignedOrUnsignedConstant::UnsignedConstant
==
219 Expr
->getElement(1));
223 // We cannot describe the location of dllimport'd variables: the
224 // computation of their address requires loads from the IAT.
225 if (Global
&& Global
->hasDLLImportStorageClass())
228 // Nothing to describe without address or constant.
229 if (!Global
&& (!Expr
|| !Expr
->isConstant()))
232 if (Global
&& Global
->isThreadLocal() &&
233 !Asm
->getObjFileLowering().supportDebugThreadLocalLocation())
237 addToAccelTable
= true;
238 Loc
= new (DIEValueAllocator
) DIELoc
;
239 DwarfExpr
= std::make_unique
<DIEDwarfExpression
>(*Asm
, *this, *Loc
);
244 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
245 // cuda-gdb requires DW_AT_address_class for all variables to be able to
246 // correctly interpret address space of the variable address.
247 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap DW_OP_xderef
248 // sequence for the NVPTX + gdb target.
249 unsigned LocalNVPTXAddressSpace
;
250 if (Asm
->TM
.getTargetTriple().isNVPTX() && DD
->tuneForGDB()) {
251 const DIExpression
*NewExpr
=
252 DIExpression::extractAddressClass(Expr
, LocalNVPTXAddressSpace
);
253 if (NewExpr
!= Expr
) {
255 NVPTXAddressSpace
= LocalNVPTXAddressSpace
;
258 DwarfExpr
->addFragmentOffset(Expr
);
262 const MCSymbol
*Sym
= Asm
->getSymbol(Global
);
263 if (Global
->isThreadLocal()) {
264 if (Asm
->TM
.useEmulatedTLS()) {
265 // TODO: add debug info for emulated thread local mode.
267 // FIXME: Make this work with -gsplit-dwarf.
268 unsigned PointerSize
= Asm
->getDataLayout().getPointerSize();
269 assert((PointerSize
== 4 || PointerSize
== 8) &&
270 "Add support for other sizes if necessary");
271 // Based on GCC's support for TLS:
272 if (!DD
->useSplitDwarf()) {
273 // 1) Start with a constNu of the appropriate pointer size
274 addUInt(*Loc
, dwarf::DW_FORM_data1
,
275 PointerSize
== 4 ? dwarf::DW_OP_const4u
276 : dwarf::DW_OP_const8u
);
277 // 2) containing the (relocated) offset of the TLS variable
278 // within the module's TLS block.
280 PointerSize
== 4 ? dwarf::DW_FORM_data4
281 : dwarf::DW_FORM_data8
,
282 Asm
->getObjFileLowering().getDebugThreadLocalSymbol(Sym
));
284 addUInt(*Loc
, dwarf::DW_FORM_data1
, dwarf::DW_OP_GNU_const_index
);
285 addUInt(*Loc
, dwarf::DW_FORM_udata
,
286 DD
->getAddressPool().getIndex(Sym
, /* TLS */ true));
288 // 3) followed by an OP to make the debugger do a TLS lookup.
289 addUInt(*Loc
, dwarf::DW_FORM_data1
,
290 DD
->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address
291 : dwarf::DW_OP_form_tls_address
);
294 DD
->addArangeLabel(SymbolCU(this, Sym
));
295 addOpAddress(*Loc
, Sym
);
298 // Global variables attached to symbols are memory locations.
299 // It would be better if this were unconditional, but malformed input that
300 // mixes non-fragments and fragments for the same variable is too expensive
301 // to detect in the verifier.
302 if (DwarfExpr
->isUnknownLocation())
303 DwarfExpr
->setMemoryLocationKind();
304 DwarfExpr
->addExpression(Expr
);
306 if (Asm
->TM
.getTargetTriple().isNVPTX() && DD
->tuneForGDB()) {
308 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
309 // cuda-gdb requires DW_AT_address_class for all variables to be able to
310 // correctly interpret address space of the variable address.
311 const unsigned NVPTX_ADDR_global_space
= 5;
312 addUInt(*VariableDIE
, dwarf::DW_AT_address_class
, dwarf::DW_FORM_data1
,
313 NVPTXAddressSpace
? *NVPTXAddressSpace
: NVPTX_ADDR_global_space
);
316 addBlock(*VariableDIE
, dwarf::DW_AT_location
, DwarfExpr
->finalize());
318 if (DD
->useAllLinkageNames())
319 addLinkageName(*VariableDIE
, GV
->getLinkageName());
321 if (addToAccelTable
) {
322 DD
->addAccelName(*CUNode
, GV
->getName(), *VariableDIE
);
324 // If the linkage name is different than the name, go ahead and output
325 // that as well into the name table.
326 if (GV
->getLinkageName() != "" && GV
->getName() != GV
->getLinkageName() &&
327 DD
->useAllLinkageNames())
328 DD
->addAccelName(*CUNode
, GV
->getLinkageName(), *VariableDIE
);
332 DIE
*DwarfCompileUnit::getOrCreateCommonBlock(
333 const DICommonBlock
*CB
, ArrayRef
<GlobalExpr
> GlobalExprs
) {
334 // Construct the context before querying for the existence of the DIE in case
335 // such construction creates the DIE.
336 DIE
*ContextDIE
= getOrCreateContextDIE(CB
->getScope());
338 if (DIE
*NDie
= getDIE(CB
))
340 DIE
&NDie
= createAndAddDIE(dwarf::DW_TAG_common_block
, *ContextDIE
, CB
);
341 StringRef Name
= CB
->getName().empty() ? "_BLNK_" : CB
->getName();
342 addString(NDie
, dwarf::DW_AT_name
, Name
);
343 addGlobalName(Name
, NDie
, CB
->getScope());
345 addSourceLine(NDie
, CB
->getLineNo(), CB
->getFile());
346 if (DIGlobalVariable
*V
= CB
->getDecl())
347 getCU().addLocationAttribute(&NDie
, V
, GlobalExprs
);
351 void DwarfCompileUnit::addRange(RangeSpan Range
) {
352 DD
->insertSectionLabel(Range
.Begin
);
354 bool SameAsPrevCU
= this == DD
->getPrevCU();
356 // If we have no current ranges just add the range and return, otherwise,
357 // check the current section and CU against the previous section and CU we
358 // emitted into and the subprogram was contained within. If these are the
359 // same then extend our current range, otherwise add this as a new range.
360 if (CURanges
.empty() || !SameAsPrevCU
||
361 (&CURanges
.back().End
->getSection() !=
362 &Range
.End
->getSection())) {
363 CURanges
.push_back(Range
);
367 CURanges
.back().End
= Range
.End
;
370 void DwarfCompileUnit::initStmtList() {
371 if (CUNode
->isDebugDirectivesOnly())
374 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
375 if (DD
->useSectionsAsReferences()) {
376 LineTableStartSym
= TLOF
.getDwarfLineSection()->getBeginSymbol();
379 Asm
->OutStreamer
->getDwarfLineTableSymbol(getUniqueID());
382 // DW_AT_stmt_list is a offset of line number information for this
383 // compile unit in debug_line section. For split dwarf this is
384 // left in the skeleton CU and so not included.
385 // The line table entries are not always emitted in assembly, so it
386 // is not okay to use line_table_start here.
387 addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list
, LineTableStartSym
,
388 TLOF
.getDwarfLineSection()->getBeginSymbol());
391 void DwarfCompileUnit::applyStmtList(DIE
&D
) {
392 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
393 addSectionLabel(D
, dwarf::DW_AT_stmt_list
, LineTableStartSym
,
394 TLOF
.getDwarfLineSection()->getBeginSymbol());
397 void DwarfCompileUnit::attachLowHighPC(DIE
&D
, const MCSymbol
*Begin
,
398 const MCSymbol
*End
) {
399 assert(Begin
&& "Begin label should not be null!");
400 assert(End
&& "End label should not be null!");
401 assert(Begin
->isDefined() && "Invalid starting label");
402 assert(End
->isDefined() && "Invalid end label");
404 addLabelAddress(D
, dwarf::DW_AT_low_pc
, Begin
);
405 if (DD
->getDwarfVersion() < 4)
406 addLabelAddress(D
, dwarf::DW_AT_high_pc
, End
);
408 addLabelDelta(D
, dwarf::DW_AT_high_pc
, End
, Begin
);
411 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc
412 // and DW_AT_high_pc attributes. If there are global variables in this
413 // scope then create and insert DIEs for these variables.
414 DIE
&DwarfCompileUnit::updateSubprogramScopeDIE(const DISubprogram
*SP
) {
415 DIE
*SPDie
= getOrCreateSubprogramDIE(SP
, includeMinimalInlineScopes());
417 SmallVector
<RangeSpan
, 2> BB_List
;
418 // If basic block sections are on, ranges for each basic block section has
419 // to be emitted separately.
420 for (const auto &R
: Asm
->MBBSectionRanges
)
421 BB_List
.push_back({R
.second
.BeginLabel
, R
.second
.EndLabel
});
423 attachRangesOrLowHighPC(*SPDie
, BB_List
);
425 if (DD
->useAppleExtensionAttributes() &&
426 !DD
->getCurrentFunction()->getTarget().Options
.DisableFramePointerElim(
427 *DD
->getCurrentFunction()))
428 addFlag(*SPDie
, dwarf::DW_AT_APPLE_omit_frame_ptr
);
430 // Only include DW_AT_frame_base in full debug info
431 if (!includeMinimalInlineScopes()) {
432 const TargetFrameLowering
*TFI
= Asm
->MF
->getSubtarget().getFrameLowering();
433 TargetFrameLowering::DwarfFrameBase FrameBase
=
434 TFI
->getDwarfFrameBase(*Asm
->MF
);
435 switch (FrameBase
.Kind
) {
436 case TargetFrameLowering::DwarfFrameBase::Register
: {
437 if (Register::isPhysicalRegister(FrameBase
.Location
.Reg
)) {
438 MachineLocation
Location(FrameBase
.Location
.Reg
);
439 addAddress(*SPDie
, dwarf::DW_AT_frame_base
, Location
);
443 case TargetFrameLowering::DwarfFrameBase::CFA
: {
444 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
445 addUInt(*Loc
, dwarf::DW_FORM_data1
, dwarf::DW_OP_call_frame_cfa
);
446 addBlock(*SPDie
, dwarf::DW_AT_frame_base
, Loc
);
449 case TargetFrameLowering::DwarfFrameBase::WasmFrameBase
: {
450 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h
451 // don't want to depend on target specific headers in this code?
452 const unsigned TI_GLOBAL_RELOC
= 3;
453 if (FrameBase
.Location
.WasmLoc
.Kind
== TI_GLOBAL_RELOC
) {
454 // These need to be relocatable.
455 assert(FrameBase
.Location
.WasmLoc
.Index
== 0); // Only SP so far.
456 auto SPSym
= cast
<MCSymbolWasm
>(
457 Asm
->GetExternalSymbolSymbol("__stack_pointer"));
458 // FIXME: this repeats what WebAssemblyMCInstLower::
459 // GetExternalSymbolSymbol does, since if there's no code that
460 // refers to this symbol, we have to set it here.
461 SPSym
->setType(wasm::WASM_SYMBOL_TYPE_GLOBAL
);
462 SPSym
->setGlobalType(wasm::WasmGlobalType
{
463 uint8_t(Asm
->getSubtargetInfo().getTargetTriple().getArch() ==
465 ? wasm::WASM_TYPE_I64
466 : wasm::WASM_TYPE_I32
),
468 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
469 addUInt(*Loc
, dwarf::DW_FORM_data1
, dwarf::DW_OP_WASM_location
);
470 addSInt(*Loc
, dwarf::DW_FORM_sdata
, TI_GLOBAL_RELOC
);
472 addLabel(*Loc
, dwarf::DW_FORM_data4
, SPSym
);
473 DD
->addArangeLabel(SymbolCU(this, SPSym
));
475 // FIXME: when writing dwo, we need to avoid relocations. Probably
476 // the "right" solution is to treat globals the way func and data
477 // symbols are (with entries in .debug_addr).
478 // For now, since we only ever use index 0, this should work as-is.
479 addUInt(*Loc
, dwarf::DW_FORM_data4
, FrameBase
.Location
.WasmLoc
.Index
);
481 addUInt(*Loc
, dwarf::DW_FORM_data1
, dwarf::DW_OP_stack_value
);
482 addBlock(*SPDie
, dwarf::DW_AT_frame_base
, Loc
);
484 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
485 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
486 DIExpressionCursor
Cursor({});
487 DwarfExpr
.addWasmLocation(FrameBase
.Location
.WasmLoc
.Kind
,
488 FrameBase
.Location
.WasmLoc
.Index
);
489 DwarfExpr
.addExpression(std::move(Cursor
));
490 addBlock(*SPDie
, dwarf::DW_AT_frame_base
, DwarfExpr
.finalize());
497 // Add name to the name table, we do this here because we're guaranteed
498 // to have concrete versions of our DW_TAG_subprogram nodes.
499 DD
->addSubprogramNames(*CUNode
, SP
, *SPDie
);
504 // Construct a DIE for this scope.
505 void DwarfCompileUnit::constructScopeDIE(
506 LexicalScope
*Scope
, SmallVectorImpl
<DIE
*> &FinalChildren
) {
507 if (!Scope
|| !Scope
->getScopeNode())
510 auto *DS
= Scope
->getScopeNode();
512 assert((Scope
->getInlinedAt() || !isa
<DISubprogram
>(DS
)) &&
513 "Only handle inlined subprograms here, use "
514 "constructSubprogramScopeDIE for non-inlined "
517 SmallVector
<DIE
*, 8> Children
;
519 // We try to create the scope DIE first, then the children DIEs. This will
520 // avoid creating un-used children then removing them later when we find out
521 // the scope DIE is null.
523 if (Scope
->getParent() && isa
<DISubprogram
>(DS
)) {
524 ScopeDIE
= constructInlinedScopeDIE(Scope
);
527 // We create children when the scope DIE is not null.
528 createScopeChildrenDIE(Scope
, Children
);
530 // Early exit when we know the scope DIE is going to be null.
531 if (DD
->isLexicalScopeDIENull(Scope
))
534 bool HasNonScopeChildren
= false;
536 // We create children here when we know the scope DIE is not going to be
537 // null and the children will be added to the scope DIE.
538 createScopeChildrenDIE(Scope
, Children
, &HasNonScopeChildren
);
540 // If there are only other scopes as children, put them directly in the
541 // parent instead, as this scope would serve no purpose.
542 if (!HasNonScopeChildren
) {
543 FinalChildren
.insert(FinalChildren
.end(),
544 std::make_move_iterator(Children
.begin()),
545 std::make_move_iterator(Children
.end()));
548 ScopeDIE
= constructLexicalScopeDIE(Scope
);
549 assert(ScopeDIE
&& "Scope DIE should not be null.");
553 for (auto &I
: Children
)
554 ScopeDIE
->addChild(std::move(I
));
556 FinalChildren
.push_back(std::move(ScopeDIE
));
559 void DwarfCompileUnit::addScopeRangeList(DIE
&ScopeDIE
,
560 SmallVector
<RangeSpan
, 2> Range
) {
562 HasRangeLists
= true;
564 // Add the range list to the set of ranges to be emitted.
566 (DD
->getDwarfVersion() < 5 && Skeleton
? Skeleton
->DU
: DU
)
567 ->addRange(*(Skeleton
? Skeleton
: this), std::move(Range
));
569 uint32_t Index
= IndexAndList
.first
;
570 auto &List
= *IndexAndList
.second
;
572 // Under fission, ranges are specified by constant offsets relative to the
573 // CU's DW_AT_GNU_ranges_base.
574 // FIXME: For DWARF v5, do not generate the DW_AT_ranges attribute under
575 // fission until we support the forms using the .debug_addr section
576 // (DW_RLE_startx_endx etc.).
577 if (DD
->getDwarfVersion() >= 5)
578 addUInt(ScopeDIE
, dwarf::DW_AT_ranges
, dwarf::DW_FORM_rnglistx
, Index
);
580 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
581 const MCSymbol
*RangeSectionSym
=
582 TLOF
.getDwarfRangesSection()->getBeginSymbol();
584 addSectionDelta(ScopeDIE
, dwarf::DW_AT_ranges
, List
.Label
,
587 addSectionLabel(ScopeDIE
, dwarf::DW_AT_ranges
, List
.Label
,
592 void DwarfCompileUnit::attachRangesOrLowHighPC(
593 DIE
&Die
, SmallVector
<RangeSpan
, 2> Ranges
) {
594 assert(!Ranges
.empty());
595 if (!DD
->useRangesSection() ||
596 (Ranges
.size() == 1 &&
597 (!DD
->alwaysUseRanges() ||
598 DD
->getSectionLabel(&Ranges
.front().Begin
->getSection()) ==
599 Ranges
.front().Begin
))) {
600 const RangeSpan
&Front
= Ranges
.front();
601 const RangeSpan
&Back
= Ranges
.back();
602 attachLowHighPC(Die
, Front
.Begin
, Back
.End
);
604 addScopeRangeList(Die
, std::move(Ranges
));
607 void DwarfCompileUnit::attachRangesOrLowHighPC(
608 DIE
&Die
, const SmallVectorImpl
<InsnRange
> &Ranges
) {
609 SmallVector
<RangeSpan
, 2> List
;
610 List
.reserve(Ranges
.size());
611 for (const InsnRange
&R
: Ranges
) {
612 auto *BeginLabel
= DD
->getLabelBeforeInsn(R
.first
);
613 auto *EndLabel
= DD
->getLabelAfterInsn(R
.second
);
615 const auto *BeginMBB
= R
.first
->getParent();
616 const auto *EndMBB
= R
.second
->getParent();
618 const auto *MBB
= BeginMBB
;
619 // Basic block sections allows basic block subsets to be placed in unique
620 // sections. For each section, the begin and end label must be added to the
621 // list. If there is more than one range, debug ranges must be used.
622 // Otherwise, low/high PC can be used.
623 // FIXME: Debug Info Emission depends on block order and this assumes that
624 // the order of blocks will be frozen beyond this point.
626 if (MBB
->sameSection(EndMBB
) || MBB
->isEndSection()) {
627 auto MBBSectionRange
= Asm
->MBBSectionRanges
[MBB
->getSectionIDNum()];
629 {MBB
->sameSection(BeginMBB
) ? BeginLabel
630 : MBBSectionRange
.BeginLabel
,
631 MBB
->sameSection(EndMBB
) ? EndLabel
: MBBSectionRange
.EndLabel
});
633 if (MBB
->sameSection(EndMBB
))
635 MBB
= MBB
->getNextNode();
638 attachRangesOrLowHighPC(Die
, std::move(List
));
641 // This scope represents inlined body of a function. Construct DIE to
642 // represent this concrete inlined copy of the function.
643 DIE
*DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope
*Scope
) {
644 assert(Scope
->getScopeNode());
645 auto *DS
= Scope
->getScopeNode();
646 auto *InlinedSP
= getDISubprogram(DS
);
647 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
648 // was inlined from another compile unit.
649 DIE
*OriginDIE
= getAbstractSPDies()[InlinedSP
];
650 assert(OriginDIE
&& "Unable to find original DIE for an inlined subprogram.");
652 auto ScopeDIE
= DIE::get(DIEValueAllocator
, dwarf::DW_TAG_inlined_subroutine
);
653 addDIEEntry(*ScopeDIE
, dwarf::DW_AT_abstract_origin
, *OriginDIE
);
655 attachRangesOrLowHighPC(*ScopeDIE
, Scope
->getRanges());
657 // Add the call site information to the DIE.
658 const DILocation
*IA
= Scope
->getInlinedAt();
659 addUInt(*ScopeDIE
, dwarf::DW_AT_call_file
, None
,
660 getOrCreateSourceID(IA
->getFile()));
661 addUInt(*ScopeDIE
, dwarf::DW_AT_call_line
, None
, IA
->getLine());
663 addUInt(*ScopeDIE
, dwarf::DW_AT_call_column
, None
, IA
->getColumn());
664 if (IA
->getDiscriminator() && DD
->getDwarfVersion() >= 4)
665 addUInt(*ScopeDIE
, dwarf::DW_AT_GNU_discriminator
, None
,
666 IA
->getDiscriminator());
668 // Add name to the name table, we do this here because we're guaranteed
669 // to have concrete versions of our DW_TAG_inlined_subprogram nodes.
670 DD
->addSubprogramNames(*CUNode
, InlinedSP
, *ScopeDIE
);
675 // Construct new DW_TAG_lexical_block for this scope and attach
676 // DW_AT_low_pc/DW_AT_high_pc labels.
677 DIE
*DwarfCompileUnit::constructLexicalScopeDIE(LexicalScope
*Scope
) {
678 if (DD
->isLexicalScopeDIENull(Scope
))
681 auto ScopeDIE
= DIE::get(DIEValueAllocator
, dwarf::DW_TAG_lexical_block
);
682 if (Scope
->isAbstractScope())
685 attachRangesOrLowHighPC(*ScopeDIE
, Scope
->getRanges());
690 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
691 DIE
*DwarfCompileUnit::constructVariableDIE(DbgVariable
&DV
, bool Abstract
) {
692 auto D
= constructVariableDIEImpl(DV
, Abstract
);
697 DIE
*DwarfCompileUnit::constructLabelDIE(DbgLabel
&DL
,
698 const LexicalScope
&Scope
) {
699 auto LabelDie
= DIE::get(DIEValueAllocator
, DL
.getTag());
700 insertDIE(DL
.getLabel(), LabelDie
);
701 DL
.setDIE(*LabelDie
);
703 if (Scope
.isAbstractScope())
704 applyLabelAttributes(DL
, *LabelDie
);
709 DIE
*DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable
&DV
,
711 // Define variable debug information entry.
712 auto VariableDie
= DIE::get(DIEValueAllocator
, DV
.getTag());
713 insertDIE(DV
.getVariable(), VariableDie
);
716 applyVariableAttributes(DV
, *VariableDie
);
720 // Add variable address.
722 unsigned Index
= DV
.getDebugLocListIndex();
724 addLocationList(*VariableDie
, dwarf::DW_AT_location
, Index
);
725 auto TagOffset
= DV
.getDebugLocListTagOffset();
727 addUInt(*VariableDie
, dwarf::DW_AT_LLVM_tag_offset
, dwarf::DW_FORM_data1
,
732 // Check if variable has a single location description.
733 if (auto *DVal
= DV
.getValueLoc()) {
734 if (!DVal
->isVariadic()) {
735 const DbgValueLocEntry
*Entry
= DVal
->getLocEntries().begin();
736 if (Entry
->isLocation()) {
737 addVariableAddress(DV
, *VariableDie
, Entry
->getLoc());
738 } else if (Entry
->isInt()) {
739 auto *Expr
= DV
.getSingleExpression();
740 if (Expr
&& Expr
->getNumElements()) {
741 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
742 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
743 // If there is an expression, emit raw unsigned bytes.
744 DwarfExpr
.addFragmentOffset(Expr
);
745 DwarfExpr
.addUnsignedConstant(Entry
->getInt());
746 DwarfExpr
.addExpression(Expr
);
747 addBlock(*VariableDie
, dwarf::DW_AT_location
, DwarfExpr
.finalize());
748 if (DwarfExpr
.TagOffset
)
749 addUInt(*VariableDie
, dwarf::DW_AT_LLVM_tag_offset
,
750 dwarf::DW_FORM_data1
, *DwarfExpr
.TagOffset
);
752 addConstantValue(*VariableDie
, Entry
->getInt(), DV
.getType());
753 } else if (Entry
->isConstantFP()) {
754 addConstantFPValue(*VariableDie
, Entry
->getConstantFP());
755 } else if (Entry
->isConstantInt()) {
756 addConstantValue(*VariableDie
, Entry
->getConstantInt(), DV
.getType());
757 } else if (Entry
->isTargetIndexLocation()) {
758 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
759 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
760 const DIBasicType
*BT
= dyn_cast
<DIBasicType
>(
761 static_cast<const Metadata
*>(DV
.getVariable()->getType()));
762 DwarfDebug::emitDebugLocValue(*Asm
, BT
, *DVal
, DwarfExpr
);
763 addBlock(*VariableDie
, dwarf::DW_AT_location
, DwarfExpr
.finalize());
767 // If any of the location entries are registers with the value 0, then the
768 // location is undefined.
769 if (any_of(DVal
->getLocEntries(), [](const DbgValueLocEntry
&Entry
) {
770 return Entry
.isLocation() && !Entry
.getLoc().getReg();
773 const DIExpression
*Expr
= DV
.getSingleExpression();
774 assert(Expr
&& "Variadic Debug Value must have an Expression.");
775 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
776 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
777 DwarfExpr
.addFragmentOffset(Expr
);
778 DIExpressionCursor
Cursor(Expr
);
779 const TargetRegisterInfo
&TRI
= *Asm
->MF
->getSubtarget().getRegisterInfo();
781 auto AddEntry
= [&](const DbgValueLocEntry
&Entry
,
782 DIExpressionCursor
&Cursor
) {
783 if (Entry
.isLocation()) {
784 if (!DwarfExpr
.addMachineRegExpression(TRI
, Cursor
,
785 Entry
.getLoc().getReg()))
787 } else if (Entry
.isInt()) {
788 // If there is an expression, emit raw unsigned bytes.
789 DwarfExpr
.addUnsignedConstant(Entry
.getInt());
790 } else if (Entry
.isConstantFP()) {
791 APInt RawBytes
= Entry
.getConstantFP()->getValueAPF().bitcastToAPInt();
792 DwarfExpr
.addUnsignedConstant(RawBytes
);
793 } else if (Entry
.isConstantInt()) {
794 APInt RawBytes
= Entry
.getConstantInt()->getValue();
795 DwarfExpr
.addUnsignedConstant(RawBytes
);
796 } else if (Entry
.isTargetIndexLocation()) {
797 TargetIndexLocation Loc
= Entry
.getTargetIndexLocation();
798 // TODO TargetIndexLocation is a target-independent. Currently only the
799 // WebAssembly-specific encoding is supported.
800 assert(Asm
->TM
.getTargetTriple().isWasm());
801 DwarfExpr
.addWasmLocation(Loc
.Index
, static_cast<uint64_t>(Loc
.Offset
));
803 llvm_unreachable("Unsupported Entry type.");
808 DwarfExpr
.addExpression(
810 [&](unsigned Idx
, DIExpressionCursor
&Cursor
) -> bool {
811 return AddEntry(DVal
->getLocEntries()[Idx
], Cursor
);
814 // Now attach the location information to the DIE.
815 addBlock(*VariableDie
, dwarf::DW_AT_location
, DwarfExpr
.finalize());
816 if (DwarfExpr
.TagOffset
)
817 addUInt(*VariableDie
, dwarf::DW_AT_LLVM_tag_offset
, dwarf::DW_FORM_data1
,
818 *DwarfExpr
.TagOffset
);
823 // .. else use frame index.
824 if (!DV
.hasFrameIndexExprs())
827 Optional
<unsigned> NVPTXAddressSpace
;
828 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
829 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
830 for (auto &Fragment
: DV
.getFrameIndexExprs()) {
832 const DIExpression
*Expr
= Fragment
.Expr
;
833 const TargetFrameLowering
*TFI
= Asm
->MF
->getSubtarget().getFrameLowering();
835 TFI
->getFrameIndexReference(*Asm
->MF
, Fragment
.FI
, FrameReg
);
836 DwarfExpr
.addFragmentOffset(Expr
);
838 auto *TRI
= Asm
->MF
->getSubtarget().getRegisterInfo();
839 SmallVector
<uint64_t, 8> Ops
;
840 TRI
->getOffsetOpcodes(Offset
, Ops
);
843 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
844 // cuda-gdb requires DW_AT_address_class for all variables to be able to
845 // correctly interpret address space of the variable address.
846 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap DW_OP_xderef
847 // sequence for the NVPTX + gdb target.
848 unsigned LocalNVPTXAddressSpace
;
849 if (Asm
->TM
.getTargetTriple().isNVPTX() && DD
->tuneForGDB()) {
850 const DIExpression
*NewExpr
=
851 DIExpression::extractAddressClass(Expr
, LocalNVPTXAddressSpace
);
852 if (NewExpr
!= Expr
) {
854 NVPTXAddressSpace
= LocalNVPTXAddressSpace
;
858 Ops
.append(Expr
->elements_begin(), Expr
->elements_end());
859 DIExpressionCursor
Cursor(Ops
);
860 DwarfExpr
.setMemoryLocationKind();
861 if (const MCSymbol
*FrameSymbol
= Asm
->getFunctionFrameSymbol())
862 addOpAddress(*Loc
, FrameSymbol
);
864 DwarfExpr
.addMachineRegExpression(
865 *Asm
->MF
->getSubtarget().getRegisterInfo(), Cursor
, FrameReg
);
866 DwarfExpr
.addExpression(std::move(Cursor
));
868 if (Asm
->TM
.getTargetTriple().isNVPTX() && DD
->tuneForGDB()) {
870 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
871 // cuda-gdb requires DW_AT_address_class for all variables to be able to
872 // correctly interpret address space of the variable address.
873 const unsigned NVPTX_ADDR_local_space
= 6;
874 addUInt(*VariableDie
, dwarf::DW_AT_address_class
, dwarf::DW_FORM_data1
,
875 NVPTXAddressSpace
? *NVPTXAddressSpace
: NVPTX_ADDR_local_space
);
877 addBlock(*VariableDie
, dwarf::DW_AT_location
, DwarfExpr
.finalize());
878 if (DwarfExpr
.TagOffset
)
879 addUInt(*VariableDie
, dwarf::DW_AT_LLVM_tag_offset
, dwarf::DW_FORM_data1
,
880 *DwarfExpr
.TagOffset
);
885 DIE
*DwarfCompileUnit::constructVariableDIE(DbgVariable
&DV
,
886 const LexicalScope
&Scope
,
887 DIE
*&ObjectPointer
) {
888 auto Var
= constructVariableDIE(DV
, Scope
.isAbstractScope());
889 if (DV
.isObjectPointer())
894 /// Return all DIVariables that appear in count: expressions.
895 static SmallVector
<const DIVariable
*, 2> dependencies(DbgVariable
*Var
) {
896 SmallVector
<const DIVariable
*, 2> Result
;
897 auto *Array
= dyn_cast
<DICompositeType
>(Var
->getType());
898 if (!Array
|| Array
->getTag() != dwarf::DW_TAG_array_type
)
900 if (auto *DLVar
= Array
->getDataLocation())
901 Result
.push_back(DLVar
);
902 if (auto *AsVar
= Array
->getAssociated())
903 Result
.push_back(AsVar
);
904 if (auto *AlVar
= Array
->getAllocated())
905 Result
.push_back(AlVar
);
906 for (auto *El
: Array
->getElements()) {
907 if (auto *Subrange
= dyn_cast
<DISubrange
>(El
)) {
908 if (auto Count
= Subrange
->getCount())
909 if (auto *Dependency
= Count
.dyn_cast
<DIVariable
*>())
910 Result
.push_back(Dependency
);
911 if (auto LB
= Subrange
->getLowerBound())
912 if (auto *Dependency
= LB
.dyn_cast
<DIVariable
*>())
913 Result
.push_back(Dependency
);
914 if (auto UB
= Subrange
->getUpperBound())
915 if (auto *Dependency
= UB
.dyn_cast
<DIVariable
*>())
916 Result
.push_back(Dependency
);
917 if (auto ST
= Subrange
->getStride())
918 if (auto *Dependency
= ST
.dyn_cast
<DIVariable
*>())
919 Result
.push_back(Dependency
);
920 } else if (auto *GenericSubrange
= dyn_cast
<DIGenericSubrange
>(El
)) {
921 if (auto Count
= GenericSubrange
->getCount())
922 if (auto *Dependency
= Count
.dyn_cast
<DIVariable
*>())
923 Result
.push_back(Dependency
);
924 if (auto LB
= GenericSubrange
->getLowerBound())
925 if (auto *Dependency
= LB
.dyn_cast
<DIVariable
*>())
926 Result
.push_back(Dependency
);
927 if (auto UB
= GenericSubrange
->getUpperBound())
928 if (auto *Dependency
= UB
.dyn_cast
<DIVariable
*>())
929 Result
.push_back(Dependency
);
930 if (auto ST
= GenericSubrange
->getStride())
931 if (auto *Dependency
= ST
.dyn_cast
<DIVariable
*>())
932 Result
.push_back(Dependency
);
938 /// Sort local variables so that variables appearing inside of helper
939 /// expressions come first.
940 static SmallVector
<DbgVariable
*, 8>
941 sortLocalVars(SmallVectorImpl
<DbgVariable
*> &Input
) {
942 SmallVector
<DbgVariable
*, 8> Result
;
943 SmallVector
<PointerIntPair
<DbgVariable
*, 1>, 8> WorkList
;
944 // Map back from a DIVariable to its containing DbgVariable.
945 SmallDenseMap
<const DILocalVariable
*, DbgVariable
*> DbgVar
;
946 // Set of DbgVariables in Result.
947 SmallDenseSet
<DbgVariable
*, 8> Visited
;
948 // For cycle detection.
949 SmallDenseSet
<DbgVariable
*, 8> Visiting
;
951 // Initialize the worklist and the DIVariable lookup table.
952 for (auto Var
: reverse(Input
)) {
953 DbgVar
.insert({Var
->getVariable(), Var
});
954 WorkList
.push_back({Var
, 0});
957 // Perform a stable topological sort by doing a DFS.
958 while (!WorkList
.empty()) {
959 auto Item
= WorkList
.back();
960 DbgVariable
*Var
= Item
.getPointer();
961 bool visitedAllDependencies
= Item
.getInt();
964 // Dependency is in a different lexical scope or a global.
969 if (Visited
.count(Var
))
972 // Add to Result if all dependencies are visited.
973 if (visitedAllDependencies
) {
975 Result
.push_back(Var
);
980 auto Res
= Visiting
.insert(Var
);
982 assert(false && "dependency cycle in local variables");
986 // Push dependencies and this node onto the worklist, so that this node is
987 // visited again after all of its dependencies are handled.
988 WorkList
.push_back({Var
, 1});
989 for (auto *Dependency
: dependencies(Var
)) {
990 auto Dep
= dyn_cast_or_null
<const DILocalVariable
>(Dependency
);
991 WorkList
.push_back({DbgVar
[Dep
], 0});
997 DIE
*DwarfCompileUnit::createScopeChildrenDIE(LexicalScope
*Scope
,
998 SmallVectorImpl
<DIE
*> &Children
,
999 bool *HasNonScopeChildren
) {
1000 assert(Children
.empty());
1001 DIE
*ObjectPointer
= nullptr;
1003 // Emit function arguments (order is significant).
1004 auto Vars
= DU
->getScopeVariables().lookup(Scope
);
1005 for (auto &DV
: Vars
.Args
)
1006 Children
.push_back(constructVariableDIE(*DV
.second
, *Scope
, ObjectPointer
));
1008 // Emit local variables.
1009 auto Locals
= sortLocalVars(Vars
.Locals
);
1010 for (DbgVariable
*DV
: Locals
)
1011 Children
.push_back(constructVariableDIE(*DV
, *Scope
, ObjectPointer
));
1013 // Skip imported directives in gmlt-like data.
1014 if (!includeMinimalInlineScopes()) {
1015 // There is no need to emit empty lexical block DIE.
1016 for (const auto *IE
: ImportedEntities
[Scope
->getScopeNode()])
1018 constructImportedEntityDIE(cast
<DIImportedEntity
>(IE
)));
1021 if (HasNonScopeChildren
)
1022 *HasNonScopeChildren
= !Children
.empty();
1024 for (DbgLabel
*DL
: DU
->getScopeLabels().lookup(Scope
))
1025 Children
.push_back(constructLabelDIE(*DL
, *Scope
));
1027 for (LexicalScope
*LS
: Scope
->getChildren())
1028 constructScopeDIE(LS
, Children
);
1030 return ObjectPointer
;
1033 DIE
&DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram
*Sub
,
1034 LexicalScope
*Scope
) {
1035 DIE
&ScopeDIE
= updateSubprogramScopeDIE(Sub
);
1038 assert(!Scope
->getInlinedAt());
1039 assert(!Scope
->isAbstractScope());
1040 // Collect lexical scope children first.
1041 // ObjectPointer might be a local (non-argument) local variable if it's a
1042 // block's synthetic this pointer.
1043 if (DIE
*ObjectPointer
= createAndAddScopeChildren(Scope
, ScopeDIE
))
1044 addDIEEntry(ScopeDIE
, dwarf::DW_AT_object_pointer
, *ObjectPointer
);
1047 // If this is a variadic function, add an unspecified parameter.
1048 DITypeRefArray FnArgs
= Sub
->getType()->getTypeArray();
1050 // If we have a single element of null, it is a function that returns void.
1051 // If we have more than one elements and the last one is null, it is a
1052 // variadic function.
1053 if (FnArgs
.size() > 1 && !FnArgs
[FnArgs
.size() - 1] &&
1054 !includeMinimalInlineScopes())
1056 DIE::get(DIEValueAllocator
, dwarf::DW_TAG_unspecified_parameters
));
1061 DIE
*DwarfCompileUnit::createAndAddScopeChildren(LexicalScope
*Scope
,
1063 // We create children when the scope DIE is not null.
1064 SmallVector
<DIE
*, 8> Children
;
1065 DIE
*ObjectPointer
= createScopeChildrenDIE(Scope
, Children
);
1068 for (auto &I
: Children
)
1069 ScopeDIE
.addChild(std::move(I
));
1071 return ObjectPointer
;
1074 void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(
1075 LexicalScope
*Scope
) {
1076 DIE
*&AbsDef
= getAbstractSPDies()[Scope
->getScopeNode()];
1080 auto *SP
= cast
<DISubprogram
>(Scope
->getScopeNode());
1083 DwarfCompileUnit
*ContextCU
= this;
1085 if (includeMinimalInlineScopes())
1086 ContextDIE
= &getUnitDie();
1087 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
1088 // the important distinction that the debug node is not associated with the
1089 // DIE (since the debug node will be associated with the concrete DIE, if
1090 // any). It could be refactored to some common utility function.
1091 else if (auto *SPDecl
= SP
->getDeclaration()) {
1092 ContextDIE
= &getUnitDie();
1093 getOrCreateSubprogramDIE(SPDecl
);
1095 ContextDIE
= getOrCreateContextDIE(SP
->getScope());
1096 // The scope may be shared with a subprogram that has already been
1097 // constructed in another CU, in which case we need to construct this
1098 // subprogram in the same CU.
1099 ContextCU
= DD
->lookupCU(ContextDIE
->getUnitDie());
1102 // Passing null as the associated node because the abstract definition
1103 // shouldn't be found by lookup.
1104 AbsDef
= &ContextCU
->createAndAddDIE(dwarf::DW_TAG_subprogram
, *ContextDIE
, nullptr);
1105 ContextCU
->applySubprogramAttributesToDefinition(SP
, *AbsDef
);
1107 if (!ContextCU
->includeMinimalInlineScopes())
1108 ContextCU
->addUInt(*AbsDef
, dwarf::DW_AT_inline
, None
, dwarf::DW_INL_inlined
);
1109 if (DIE
*ObjectPointer
= ContextCU
->createAndAddScopeChildren(Scope
, *AbsDef
))
1110 ContextCU
->addDIEEntry(*AbsDef
, dwarf::DW_AT_object_pointer
, *ObjectPointer
);
1113 bool DwarfCompileUnit::useGNUAnalogForDwarf5Feature() const {
1114 return DD
->getDwarfVersion() == 4 && !DD
->tuneForLLDB();
1117 dwarf::Tag
DwarfCompileUnit::getDwarf5OrGNUTag(dwarf::Tag Tag
) const {
1118 if (!useGNUAnalogForDwarf5Feature())
1121 case dwarf::DW_TAG_call_site
:
1122 return dwarf::DW_TAG_GNU_call_site
;
1123 case dwarf::DW_TAG_call_site_parameter
:
1124 return dwarf::DW_TAG_GNU_call_site_parameter
;
1126 llvm_unreachable("DWARF5 tag with no GNU analog");
1131 DwarfCompileUnit::getDwarf5OrGNUAttr(dwarf::Attribute Attr
) const {
1132 if (!useGNUAnalogForDwarf5Feature())
1135 case dwarf::DW_AT_call_all_calls
:
1136 return dwarf::DW_AT_GNU_all_call_sites
;
1137 case dwarf::DW_AT_call_target
:
1138 return dwarf::DW_AT_GNU_call_site_target
;
1139 case dwarf::DW_AT_call_origin
:
1140 return dwarf::DW_AT_abstract_origin
;
1141 case dwarf::DW_AT_call_return_pc
:
1142 return dwarf::DW_AT_low_pc
;
1143 case dwarf::DW_AT_call_value
:
1144 return dwarf::DW_AT_GNU_call_site_value
;
1145 case dwarf::DW_AT_call_tail_call
:
1146 return dwarf::DW_AT_GNU_tail_call
;
1148 llvm_unreachable("DWARF5 attribute with no GNU analog");
1153 DwarfCompileUnit::getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc
) const {
1154 if (!useGNUAnalogForDwarf5Feature())
1157 case dwarf::DW_OP_entry_value
:
1158 return dwarf::DW_OP_GNU_entry_value
;
1160 llvm_unreachable("DWARF5 location atom with no GNU analog");
1164 DIE
&DwarfCompileUnit::constructCallSiteEntryDIE(DIE
&ScopeDIE
,
1165 const DISubprogram
*CalleeSP
,
1167 const MCSymbol
*PCAddr
,
1168 const MCSymbol
*CallAddr
,
1170 // Insert a call site entry DIE within ScopeDIE.
1171 DIE
&CallSiteDIE
= createAndAddDIE(getDwarf5OrGNUTag(dwarf::DW_TAG_call_site
),
1176 addAddress(CallSiteDIE
, getDwarf5OrGNUAttr(dwarf::DW_AT_call_target
),
1177 MachineLocation(CallReg
));
1179 DIE
*CalleeDIE
= getOrCreateSubprogramDIE(CalleeSP
);
1180 assert(CalleeDIE
&& "Could not create DIE for call site entry origin");
1181 addDIEEntry(CallSiteDIE
, getDwarf5OrGNUAttr(dwarf::DW_AT_call_origin
),
1186 // Attach DW_AT_call_tail_call to tail calls for standards compliance.
1187 addFlag(CallSiteDIE
, getDwarf5OrGNUAttr(dwarf::DW_AT_call_tail_call
));
1189 // Attach the address of the branch instruction to allow the debugger to
1190 // show where the tail call occurred. This attribute has no GNU analog.
1192 // GDB works backwards from non-standard usage of DW_AT_low_pc (in DWARF4
1193 // mode -- equivalently, in DWARF5 mode, DW_AT_call_return_pc) at tail-call
1194 // site entries to figure out the PC of tail-calling branch instructions.
1195 // This means it doesn't need the compiler to emit DW_AT_call_pc, so we
1196 // don't emit it here.
1198 // There's no need to tie non-GDB debuggers to this non-standardness, as it
1199 // adds unnecessary complexity to the debugger. For non-GDB debuggers, emit
1200 // the standard DW_AT_call_pc info.
1201 if (!useGNUAnalogForDwarf5Feature())
1202 addLabelAddress(CallSiteDIE
, dwarf::DW_AT_call_pc
, CallAddr
);
1205 // Attach the return PC to allow the debugger to disambiguate call paths
1206 // from one function to another.
1208 // The return PC is only really needed when the call /isn't/ a tail call, but
1209 // GDB expects it in DWARF4 mode, even for tail calls (see the comment above
1210 // the DW_AT_call_pc emission logic for an explanation).
1211 if (!IsTail
|| useGNUAnalogForDwarf5Feature()) {
1212 assert(PCAddr
&& "Missing return PC information for a call");
1213 addLabelAddress(CallSiteDIE
,
1214 getDwarf5OrGNUAttr(dwarf::DW_AT_call_return_pc
), PCAddr
);
1220 void DwarfCompileUnit::constructCallSiteParmEntryDIEs(
1221 DIE
&CallSiteDIE
, SmallVector
<DbgCallSiteParam
, 4> &Params
) {
1222 for (const auto &Param
: Params
) {
1223 unsigned Register
= Param
.getRegister();
1224 auto CallSiteDieParam
=
1225 DIE::get(DIEValueAllocator
,
1226 getDwarf5OrGNUTag(dwarf::DW_TAG_call_site_parameter
));
1227 insertDIE(CallSiteDieParam
);
1228 addAddress(*CallSiteDieParam
, dwarf::DW_AT_location
,
1229 MachineLocation(Register
));
1231 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1232 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
1233 DwarfExpr
.setCallSiteParamValueFlag();
1235 DwarfDebug::emitDebugLocValue(*Asm
, nullptr, Param
.getValue(), DwarfExpr
);
1237 addBlock(*CallSiteDieParam
, getDwarf5OrGNUAttr(dwarf::DW_AT_call_value
),
1238 DwarfExpr
.finalize());
1240 CallSiteDIE
.addChild(CallSiteDieParam
);
1244 DIE
*DwarfCompileUnit::constructImportedEntityDIE(
1245 const DIImportedEntity
*Module
) {
1246 DIE
*IMDie
= DIE::get(DIEValueAllocator
, (dwarf::Tag
)Module
->getTag());
1247 insertDIE(Module
, IMDie
);
1249 auto *Entity
= Module
->getEntity();
1250 if (auto *NS
= dyn_cast
<DINamespace
>(Entity
))
1251 EntityDie
= getOrCreateNameSpace(NS
);
1252 else if (auto *M
= dyn_cast
<DIModule
>(Entity
))
1253 EntityDie
= getOrCreateModule(M
);
1254 else if (auto *SP
= dyn_cast
<DISubprogram
>(Entity
))
1255 EntityDie
= getOrCreateSubprogramDIE(SP
);
1256 else if (auto *T
= dyn_cast
<DIType
>(Entity
))
1257 EntityDie
= getOrCreateTypeDIE(T
);
1258 else if (auto *GV
= dyn_cast
<DIGlobalVariable
>(Entity
))
1259 EntityDie
= getOrCreateGlobalVariableDIE(GV
, {});
1261 EntityDie
= getDIE(Entity
);
1263 addSourceLine(*IMDie
, Module
->getLine(), Module
->getFile());
1264 addDIEEntry(*IMDie
, dwarf::DW_AT_import
, *EntityDie
);
1265 StringRef Name
= Module
->getName();
1267 addString(*IMDie
, dwarf::DW_AT_name
, Name
);
1272 void DwarfCompileUnit::finishSubprogramDefinition(const DISubprogram
*SP
) {
1273 DIE
*D
= getDIE(SP
);
1274 if (DIE
*AbsSPDIE
= getAbstractSPDies().lookup(SP
)) {
1276 // If this subprogram has an abstract definition, reference that
1277 addDIEEntry(*D
, dwarf::DW_AT_abstract_origin
, *AbsSPDIE
);
1279 assert(D
|| includeMinimalInlineScopes());
1281 // And attach the attributes
1282 applySubprogramAttributesToDefinition(SP
, *D
);
1286 void DwarfCompileUnit::finishEntityDefinition(const DbgEntity
*Entity
) {
1287 DbgEntity
*AbsEntity
= getExistingAbstractEntity(Entity
->getEntity());
1289 auto *Die
= Entity
->getDIE();
1290 /// Label may be used to generate DW_AT_low_pc, so put it outside
1292 const DbgLabel
*Label
= nullptr;
1293 if (AbsEntity
&& AbsEntity
->getDIE()) {
1294 addDIEEntry(*Die
, dwarf::DW_AT_abstract_origin
, *AbsEntity
->getDIE());
1295 Label
= dyn_cast
<const DbgLabel
>(Entity
);
1297 if (const DbgVariable
*Var
= dyn_cast
<const DbgVariable
>(Entity
))
1298 applyVariableAttributes(*Var
, *Die
);
1299 else if ((Label
= dyn_cast
<const DbgLabel
>(Entity
)))
1300 applyLabelAttributes(*Label
, *Die
);
1302 llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel.");
1306 if (const auto *Sym
= Label
->getSymbol())
1307 addLabelAddress(*Die
, dwarf::DW_AT_low_pc
, Sym
);
1310 DbgEntity
*DwarfCompileUnit::getExistingAbstractEntity(const DINode
*Node
) {
1311 auto &AbstractEntities
= getAbstractEntities();
1312 auto I
= AbstractEntities
.find(Node
);
1313 if (I
!= AbstractEntities
.end())
1314 return I
->second
.get();
1318 void DwarfCompileUnit::createAbstractEntity(const DINode
*Node
,
1319 LexicalScope
*Scope
) {
1320 assert(Scope
&& Scope
->isAbstractScope());
1321 auto &Entity
= getAbstractEntities()[Node
];
1322 if (isa
<const DILocalVariable
>(Node
)) {
1323 Entity
= std::make_unique
<DbgVariable
>(
1324 cast
<const DILocalVariable
>(Node
), nullptr /* IA */);;
1325 DU
->addScopeVariable(Scope
, cast
<DbgVariable
>(Entity
.get()));
1326 } else if (isa
<const DILabel
>(Node
)) {
1327 Entity
= std::make_unique
<DbgLabel
>(
1328 cast
<const DILabel
>(Node
), nullptr /* IA */);
1329 DU
->addScopeLabel(Scope
, cast
<DbgLabel
>(Entity
.get()));
1333 void DwarfCompileUnit::emitHeader(bool UseOffsets
) {
1334 // Don't bother labeling the .dwo unit, as its offset isn't used.
1335 if (!Skeleton
&& !DD
->useSectionsAsReferences()) {
1336 LabelBegin
= Asm
->createTempSymbol("cu_begin");
1337 Asm
->OutStreamer
->emitLabel(LabelBegin
);
1340 dwarf::UnitType UT
= Skeleton
? dwarf::DW_UT_split_compile
1341 : DD
->useSplitDwarf() ? dwarf::DW_UT_skeleton
1342 : dwarf::DW_UT_compile
;
1343 DwarfUnit::emitCommonHeader(UseOffsets
, UT
);
1344 if (DD
->getDwarfVersion() >= 5 && UT
!= dwarf::DW_UT_compile
)
1345 Asm
->emitInt64(getDWOId());
1348 bool DwarfCompileUnit::hasDwarfPubSections() const {
1349 switch (CUNode
->getNameTableKind()) {
1350 case DICompileUnit::DebugNameTableKind::None
:
1352 // Opting in to GNU Pubnames/types overrides the default to ensure these are
1353 // generated for things like Gold's gdb_index generation.
1354 case DICompileUnit::DebugNameTableKind::GNU
:
1356 case DICompileUnit::DebugNameTableKind::Default
:
1357 return DD
->tuneForGDB() && !includeMinimalInlineScopes() &&
1358 !CUNode
->isDebugDirectivesOnly() &&
1359 DD
->getAccelTableKind() != AccelTableKind::Apple
&&
1360 DD
->getDwarfVersion() < 5;
1362 llvm_unreachable("Unhandled DICompileUnit::DebugNameTableKind enum");
1365 /// addGlobalName - Add a new global name to the compile unit.
1366 void DwarfCompileUnit::addGlobalName(StringRef Name
, const DIE
&Die
,
1367 const DIScope
*Context
) {
1368 if (!hasDwarfPubSections())
1370 std::string FullName
= getParentContextString(Context
) + Name
.str();
1371 GlobalNames
[FullName
] = &Die
;
1374 void DwarfCompileUnit::addGlobalNameForTypeUnit(StringRef Name
,
1375 const DIScope
*Context
) {
1376 if (!hasDwarfPubSections())
1378 std::string FullName
= getParentContextString(Context
) + Name
.str();
1379 // Insert, allowing the entry to remain as-is if it's already present
1380 // This way the CU-level type DIE is preferred over the "can't describe this
1381 // type as a unit offset because it's not really in the CU at all, it's only
1383 GlobalNames
.insert(std::make_pair(std::move(FullName
), &getUnitDie()));
1386 /// Add a new global type to the unit.
1387 void DwarfCompileUnit::addGlobalType(const DIType
*Ty
, const DIE
&Die
,
1388 const DIScope
*Context
) {
1389 if (!hasDwarfPubSections())
1391 std::string FullName
= getParentContextString(Context
) + Ty
->getName().str();
1392 GlobalTypes
[FullName
] = &Die
;
1395 void DwarfCompileUnit::addGlobalTypeUnitType(const DIType
*Ty
,
1396 const DIScope
*Context
) {
1397 if (!hasDwarfPubSections())
1399 std::string FullName
= getParentContextString(Context
) + Ty
->getName().str();
1400 // Insert, allowing the entry to remain as-is if it's already present
1401 // This way the CU-level type DIE is preferred over the "can't describe this
1402 // type as a unit offset because it's not really in the CU at all, it's only
1404 GlobalTypes
.insert(std::make_pair(std::move(FullName
), &getUnitDie()));
1407 void DwarfCompileUnit::addVariableAddress(const DbgVariable
&DV
, DIE
&Die
,
1408 MachineLocation Location
) {
1409 if (DV
.hasComplexAddress())
1410 addComplexAddress(DV
, Die
, dwarf::DW_AT_location
, Location
);
1412 addAddress(Die
, dwarf::DW_AT_location
, Location
);
1415 /// Add an address attribute to a die based on the location provided.
1416 void DwarfCompileUnit::addAddress(DIE
&Die
, dwarf::Attribute Attribute
,
1417 const MachineLocation
&Location
) {
1418 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1419 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
1420 if (Location
.isIndirect())
1421 DwarfExpr
.setMemoryLocationKind();
1423 DIExpressionCursor
Cursor({});
1424 const TargetRegisterInfo
&TRI
= *Asm
->MF
->getSubtarget().getRegisterInfo();
1425 if (!DwarfExpr
.addMachineRegExpression(TRI
, Cursor
, Location
.getReg()))
1427 DwarfExpr
.addExpression(std::move(Cursor
));
1429 // Now attach the location information to the DIE.
1430 addBlock(Die
, Attribute
, DwarfExpr
.finalize());
1432 if (DwarfExpr
.TagOffset
)
1433 addUInt(Die
, dwarf::DW_AT_LLVM_tag_offset
, dwarf::DW_FORM_data1
,
1434 *DwarfExpr
.TagOffset
);
1437 /// Start with the address based on the location provided, and generate the
1438 /// DWARF information necessary to find the actual variable given the extra
1439 /// address information encoded in the DbgVariable, starting from the starting
1440 /// location. Add the DWARF information to the die.
1441 void DwarfCompileUnit::addComplexAddress(const DbgVariable
&DV
, DIE
&Die
,
1442 dwarf::Attribute Attribute
,
1443 const MachineLocation
&Location
) {
1444 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1445 DIEDwarfExpression
DwarfExpr(*Asm
, *this, *Loc
);
1446 const DIExpression
*DIExpr
= DV
.getSingleExpression();
1447 DwarfExpr
.addFragmentOffset(DIExpr
);
1448 DwarfExpr
.setLocation(Location
, DIExpr
);
1450 DIExpressionCursor
Cursor(DIExpr
);
1452 if (DIExpr
->isEntryValue())
1453 DwarfExpr
.beginEntryValueExpression(Cursor
);
1455 const TargetRegisterInfo
&TRI
= *Asm
->MF
->getSubtarget().getRegisterInfo();
1456 if (!DwarfExpr
.addMachineRegExpression(TRI
, Cursor
, Location
.getReg()))
1458 DwarfExpr
.addExpression(std::move(Cursor
));
1460 // Now attach the location information to the DIE.
1461 addBlock(Die
, Attribute
, DwarfExpr
.finalize());
1463 if (DwarfExpr
.TagOffset
)
1464 addUInt(Die
, dwarf::DW_AT_LLVM_tag_offset
, dwarf::DW_FORM_data1
,
1465 *DwarfExpr
.TagOffset
);
1468 /// Add a Dwarf loclistptr attribute data and value.
1469 void DwarfCompileUnit::addLocationList(DIE
&Die
, dwarf::Attribute Attribute
,
1471 dwarf::Form Form
= (DD
->getDwarfVersion() >= 5)
1472 ? dwarf::DW_FORM_loclistx
1473 : DD
->getDwarfSectionOffsetForm();
1474 addAttribute(Die
, Attribute
, Form
, DIELocList(Index
));
1477 void DwarfCompileUnit::applyVariableAttributes(const DbgVariable
&Var
,
1479 StringRef Name
= Var
.getName();
1481 addString(VariableDie
, dwarf::DW_AT_name
, Name
);
1482 const auto *DIVar
= Var
.getVariable();
1484 if (uint32_t AlignInBytes
= DIVar
->getAlignInBytes())
1485 addUInt(VariableDie
, dwarf::DW_AT_alignment
, dwarf::DW_FORM_udata
,
1488 addSourceLine(VariableDie
, DIVar
);
1489 addType(VariableDie
, Var
.getType());
1490 if (Var
.isArtificial())
1491 addFlag(VariableDie
, dwarf::DW_AT_artificial
);
1494 void DwarfCompileUnit::applyLabelAttributes(const DbgLabel
&Label
,
1496 StringRef Name
= Label
.getName();
1498 addString(LabelDie
, dwarf::DW_AT_name
, Name
);
1499 const auto *DILabel
= Label
.getLabel();
1500 addSourceLine(LabelDie
, DILabel
);
1503 /// Add a Dwarf expression attribute data and value.
1504 void DwarfCompileUnit::addExpr(DIELoc
&Die
, dwarf::Form Form
,
1505 const MCExpr
*Expr
) {
1506 addAttribute(Die
, (dwarf::Attribute
)0, Form
, DIEExpr(Expr
));
1509 void DwarfCompileUnit::applySubprogramAttributesToDefinition(
1510 const DISubprogram
*SP
, DIE
&SPDie
) {
1511 auto *SPDecl
= SP
->getDeclaration();
1512 auto *Context
= SPDecl
? SPDecl
->getScope() : SP
->getScope();
1513 applySubprogramAttributes(SP
, SPDie
, includeMinimalInlineScopes());
1514 addGlobalName(SP
->getName(), SPDie
, Context
);
1517 bool DwarfCompileUnit::isDwoUnit() const {
1518 return DD
->useSplitDwarf() && Skeleton
;
1521 void DwarfCompileUnit::finishNonUnitTypeDIE(DIE
& D
, const DICompositeType
*CTy
) {
1522 constructTypeDIE(D
, CTy
);
1525 bool DwarfCompileUnit::includeMinimalInlineScopes() const {
1526 return getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly
||
1527 (DD
->useSplitDwarf() && !Skeleton
);
1530 void DwarfCompileUnit::addAddrTableBase() {
1531 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
1532 MCSymbol
*Label
= DD
->getAddressPool().getLabel();
1533 addSectionLabel(getUnitDie(),
1534 DD
->getDwarfVersion() >= 5 ? dwarf::DW_AT_addr_base
1535 : dwarf::DW_AT_GNU_addr_base
,
1536 Label
, TLOF
.getDwarfAddrSection()->getBeginSymbol());
1539 void DwarfCompileUnit::addBaseTypeRef(DIEValueList
&Die
, int64_t Idx
) {
1540 addAttribute(Die
, (dwarf::Attribute
)0, dwarf::DW_FORM_udata
,
1541 new (DIEValueAllocator
) DIEBaseTypeRef(this, Idx
));
1544 void DwarfCompileUnit::createBaseTypeDIEs() {
1545 // Insert the base_type DIEs directly after the CU so that their offsets will
1546 // fit in the fixed size ULEB128 used inside the location expressions.
1547 // Maintain order by iterating backwards and inserting to the front of CU
1549 for (auto &Btr
: reverse(ExprRefedBaseTypes
)) {
1550 DIE
&Die
= getUnitDie().addChildFront(
1551 DIE::get(DIEValueAllocator
, dwarf::DW_TAG_base_type
));
1552 SmallString
<32> Str
;
1553 addString(Die
, dwarf::DW_AT_name
,
1554 Twine(dwarf::AttributeEncodingString(Btr
.Encoding
) +
1555 "_" + Twine(Btr
.BitSize
)).toStringRef(Str
));
1556 addUInt(Die
, dwarf::DW_AT_encoding
, dwarf::DW_FORM_data1
, Btr
.Encoding
);
1557 addUInt(Die
, dwarf::DW_AT_byte_size
, None
, Btr
.BitSize
/ 8);