1 //===-- llvm/CodeGen/DwarfUnit.cpp - Dwarf Type and 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 "DwarfUnit.h"
14 #include "AddressPool.h"
15 #include "DwarfCompileUnit.h"
16 #include "DwarfExpression.h"
17 #include "llvm/ADT/APFloat.h"
18 #include "llvm/ADT/APInt.h"
19 #include "llvm/CodeGen/TargetRegisterInfo.h"
20 #include "llvm/IR/Constants.h"
21 #include "llvm/IR/DataLayout.h"
22 #include "llvm/IR/GlobalValue.h"
23 #include "llvm/IR/Metadata.h"
24 #include "llvm/MC/MCAsmInfo.h"
25 #include "llvm/MC/MCContext.h"
26 #include "llvm/MC/MCDwarf.h"
27 #include "llvm/MC/MCSection.h"
28 #include "llvm/MC/MCStreamer.h"
29 #include "llvm/Support/Casting.h"
30 #include "llvm/Target/TargetLoweringObjectFile.h"
38 #define DEBUG_TYPE "dwarfdebug"
40 DIEDwarfExpression::DIEDwarfExpression(const AsmPrinter
&AP
,
41 DwarfCompileUnit
&CU
, DIELoc
&DIE
)
42 : DwarfExpression(AP
.getDwarfVersion(), CU
), AP(AP
), OutDIE(DIE
) {}
44 void DIEDwarfExpression::emitOp(uint8_t Op
, const char* Comment
) {
45 CU
.addUInt(getActiveDIE(), dwarf::DW_FORM_data1
, Op
);
48 void DIEDwarfExpression::emitSigned(int64_t Value
) {
49 CU
.addSInt(getActiveDIE(), dwarf::DW_FORM_sdata
, Value
);
52 void DIEDwarfExpression::emitUnsigned(uint64_t Value
) {
53 CU
.addUInt(getActiveDIE(), dwarf::DW_FORM_udata
, Value
);
56 void DIEDwarfExpression::emitData1(uint8_t Value
) {
57 CU
.addUInt(getActiveDIE(), dwarf::DW_FORM_data1
, Value
);
60 void DIEDwarfExpression::emitBaseTypeRef(uint64_t Idx
) {
61 CU
.addBaseTypeRef(getActiveDIE(), Idx
);
64 void DIEDwarfExpression::enableTemporaryBuffer() {
65 assert(!IsBuffering
&& "Already buffering?");
69 void DIEDwarfExpression::disableTemporaryBuffer() { IsBuffering
= false; }
71 unsigned DIEDwarfExpression::getTemporaryBufferSize() {
72 return TmpDIE
.computeSize(AP
.getDwarfFormParams());
75 void DIEDwarfExpression::commitTemporaryBuffer() { OutDIE
.takeValues(TmpDIE
); }
77 bool DIEDwarfExpression::isFrameRegister(const TargetRegisterInfo
&TRI
,
78 llvm::Register MachineReg
) {
79 return MachineReg
== TRI
.getFrameRegister(*AP
.MF
);
82 DwarfUnit::DwarfUnit(dwarf::Tag UnitTag
, const DICompileUnit
*Node
,
83 AsmPrinter
*A
, DwarfDebug
*DW
, DwarfFile
*DWU
,
85 : DIEUnit(UnitTag
), UniqueID(UniqueID
), CUNode(Node
), Asm(A
), DD(DW
),
88 DwarfTypeUnit::DwarfTypeUnit(DwarfCompileUnit
&CU
, AsmPrinter
*A
,
89 DwarfDebug
*DW
, DwarfFile
*DWU
, unsigned UniqueID
,
90 MCDwarfDwoLineTable
*SplitLineTable
)
91 : DwarfUnit(dwarf::DW_TAG_type_unit
, CU
.getCUNode(), A
, DW
, DWU
, UniqueID
),
92 CU(CU
), SplitLineTable(SplitLineTable
) {}
94 DwarfUnit::~DwarfUnit() {
95 for (DIEBlock
*B
: DIEBlocks
)
97 for (DIELoc
*L
: DIELocs
)
101 int64_t DwarfUnit::getDefaultLowerBound() const {
102 switch (getLanguage()) {
106 // The languages below have valid values in all DWARF versions.
107 case dwarf::DW_LANG_C
:
108 case dwarf::DW_LANG_C89
:
109 case dwarf::DW_LANG_C_plus_plus
:
112 case dwarf::DW_LANG_Fortran77
:
113 case dwarf::DW_LANG_Fortran90
:
116 // The languages below have valid values only if the DWARF version >= 3.
117 case dwarf::DW_LANG_C99
:
118 case dwarf::DW_LANG_ObjC
:
119 case dwarf::DW_LANG_ObjC_plus_plus
:
120 if (DD
->getDwarfVersion() >= 3)
124 case dwarf::DW_LANG_Fortran95
:
125 if (DD
->getDwarfVersion() >= 3)
129 // Starting with DWARF v4, all defined languages have valid values.
130 case dwarf::DW_LANG_D
:
131 case dwarf::DW_LANG_Java
:
132 case dwarf::DW_LANG_Python
:
133 case dwarf::DW_LANG_UPC
:
134 if (DD
->getDwarfVersion() >= 4)
138 case dwarf::DW_LANG_Ada83
:
139 case dwarf::DW_LANG_Ada95
:
140 case dwarf::DW_LANG_Cobol74
:
141 case dwarf::DW_LANG_Cobol85
:
142 case dwarf::DW_LANG_Modula2
:
143 case dwarf::DW_LANG_Pascal83
:
144 case dwarf::DW_LANG_PLI
:
145 if (DD
->getDwarfVersion() >= 4)
149 // The languages below are new in DWARF v5.
150 case dwarf::DW_LANG_BLISS
:
151 case dwarf::DW_LANG_C11
:
152 case dwarf::DW_LANG_C_plus_plus_03
:
153 case dwarf::DW_LANG_C_plus_plus_11
:
154 case dwarf::DW_LANG_C_plus_plus_14
:
155 case dwarf::DW_LANG_Dylan
:
156 case dwarf::DW_LANG_Go
:
157 case dwarf::DW_LANG_Haskell
:
158 case dwarf::DW_LANG_OCaml
:
159 case dwarf::DW_LANG_OpenCL
:
160 case dwarf::DW_LANG_RenderScript
:
161 case dwarf::DW_LANG_Rust
:
162 case dwarf::DW_LANG_Swift
:
163 if (DD
->getDwarfVersion() >= 5)
167 case dwarf::DW_LANG_Fortran03
:
168 case dwarf::DW_LANG_Fortran08
:
169 case dwarf::DW_LANG_Julia
:
170 case dwarf::DW_LANG_Modula3
:
171 if (DD
->getDwarfVersion() >= 5)
179 /// Check whether the DIE for this MDNode can be shared across CUs.
180 bool DwarfUnit::isShareableAcrossCUs(const DINode
*D
) const {
181 // When the MDNode can be part of the type system, the DIE can be shared
183 // Combining type units and cross-CU DIE sharing is lower value (since
184 // cross-CU DIE sharing is used in LTO and removes type redundancy at that
185 // level already) but may be implementable for some value in projects
186 // building multiple independent libraries with LTO and then linking those
188 if (isDwoUnit() && !DD
->shareAcrossDWOCUs())
190 return (isa
<DIType
>(D
) ||
191 (isa
<DISubprogram
>(D
) && !cast
<DISubprogram
>(D
)->isDefinition())) &&
192 !DD
->generateTypeUnits();
195 DIE
*DwarfUnit::getDIE(const DINode
*D
) const {
196 if (isShareableAcrossCUs(D
))
197 return DU
->getDIE(D
);
198 return MDNodeToDieMap
.lookup(D
);
201 void DwarfUnit::insertDIE(const DINode
*Desc
, DIE
*D
) {
202 if (isShareableAcrossCUs(Desc
)) {
203 DU
->insertDIE(Desc
, D
);
206 MDNodeToDieMap
.insert(std::make_pair(Desc
, D
));
209 void DwarfUnit::insertDIE(DIE
*D
) {
210 MDNodeToDieMap
.insert(std::make_pair(nullptr, D
));
213 void DwarfUnit::addFlag(DIE
&Die
, dwarf::Attribute Attribute
) {
214 if (DD
->getDwarfVersion() >= 4)
215 addAttribute(Die
, Attribute
, dwarf::DW_FORM_flag_present
, DIEInteger(1));
217 addAttribute(Die
, Attribute
, dwarf::DW_FORM_flag
, DIEInteger(1));
220 void DwarfUnit::addUInt(DIEValueList
&Die
, dwarf::Attribute Attribute
,
221 std::optional
<dwarf::Form
> Form
, uint64_t Integer
) {
223 Form
= DIEInteger::BestForm(false, Integer
);
224 assert(Form
!= dwarf::DW_FORM_implicit_const
&&
225 "DW_FORM_implicit_const is used only for signed integers");
226 addAttribute(Die
, Attribute
, *Form
, DIEInteger(Integer
));
229 void DwarfUnit::addUInt(DIEValueList
&Block
, dwarf::Form Form
,
231 addUInt(Block
, (dwarf::Attribute
)0, Form
, Integer
);
234 void DwarfUnit::addSInt(DIEValueList
&Die
, dwarf::Attribute Attribute
,
235 std::optional
<dwarf::Form
> Form
, int64_t Integer
) {
237 Form
= DIEInteger::BestForm(true, Integer
);
238 addAttribute(Die
, Attribute
, *Form
, DIEInteger(Integer
));
241 void DwarfUnit::addSInt(DIELoc
&Die
, std::optional
<dwarf::Form
> Form
,
243 addSInt(Die
, (dwarf::Attribute
)0, Form
, Integer
);
246 void DwarfUnit::addString(DIE
&Die
, dwarf::Attribute Attribute
,
248 if (CUNode
->isDebugDirectivesOnly())
251 if (DD
->useInlineStrings()) {
252 addAttribute(Die
, Attribute
, dwarf::DW_FORM_string
,
253 new (DIEValueAllocator
)
254 DIEInlineString(String
, DIEValueAllocator
));
258 isDwoUnit() ? dwarf::DW_FORM_GNU_str_index
: dwarf::DW_FORM_strp
;
260 auto StringPoolEntry
=
261 useSegmentedStringOffsetsTable() || IxForm
== dwarf::DW_FORM_GNU_str_index
262 ? DU
->getStringPool().getIndexedEntry(*Asm
, String
)
263 : DU
->getStringPool().getEntry(*Asm
, String
);
265 // For DWARF v5 and beyond, use the smallest strx? form possible.
266 if (useSegmentedStringOffsetsTable()) {
267 IxForm
= dwarf::DW_FORM_strx1
;
268 unsigned Index
= StringPoolEntry
.getIndex();
269 if (Index
> 0xffffff)
270 IxForm
= dwarf::DW_FORM_strx4
;
271 else if (Index
> 0xffff)
272 IxForm
= dwarf::DW_FORM_strx3
;
273 else if (Index
> 0xff)
274 IxForm
= dwarf::DW_FORM_strx2
;
276 addAttribute(Die
, Attribute
, IxForm
, DIEString(StringPoolEntry
));
279 void DwarfUnit::addLabel(DIEValueList
&Die
, dwarf::Attribute Attribute
,
280 dwarf::Form Form
, const MCSymbol
*Label
) {
281 addAttribute(Die
, Attribute
, Form
, DIELabel(Label
));
284 void DwarfUnit::addLabel(DIELoc
&Die
, dwarf::Form Form
, const MCSymbol
*Label
) {
285 addLabel(Die
, (dwarf::Attribute
)0, Form
, Label
);
288 void DwarfUnit::addSectionOffset(DIE
&Die
, dwarf::Attribute Attribute
,
290 addUInt(Die
, Attribute
, DD
->getDwarfSectionOffsetForm(), Integer
);
293 unsigned DwarfTypeUnit::getOrCreateSourceID(const DIFile
*File
) {
295 return getCU().getOrCreateSourceID(File
);
296 if (!UsedLineTable
) {
297 UsedLineTable
= true;
298 // This is a split type unit that needs a line table.
299 addSectionOffset(getUnitDie(), dwarf::DW_AT_stmt_list
, 0);
301 return SplitLineTable
->getFile(
302 File
->getDirectory(), File
->getFilename(), DD
->getMD5AsBytes(File
),
303 Asm
->OutContext
.getDwarfVersion(), File
->getSource());
306 void DwarfUnit::addPoolOpAddress(DIEValueList
&Die
, const MCSymbol
*Label
) {
307 bool UseAddrOffsetFormOrExpressions
=
308 DD
->useAddrOffsetForm() || DD
->useAddrOffsetExpressions();
310 const MCSymbol
*Base
= nullptr;
311 if (Label
->isInSection() && UseAddrOffsetFormOrExpressions
)
312 Base
= DD
->getSectionLabel(&Label
->getSection());
314 uint32_t Index
= DD
->getAddressPool().getIndex(Base
? Base
: Label
);
316 if (DD
->getDwarfVersion() >= 5) {
317 addUInt(Die
, dwarf::DW_FORM_data1
, dwarf::DW_OP_addrx
);
318 addUInt(Die
, dwarf::DW_FORM_addrx
, Index
);
320 addUInt(Die
, dwarf::DW_FORM_data1
, dwarf::DW_OP_GNU_addr_index
);
321 addUInt(Die
, dwarf::DW_FORM_GNU_addr_index
, Index
);
324 if (Base
&& Base
!= Label
) {
325 addUInt(Die
, dwarf::DW_FORM_data1
, dwarf::DW_OP_const4u
);
326 addLabelDelta(Die
, (dwarf::Attribute
)0, Label
, Base
);
327 addUInt(Die
, dwarf::DW_FORM_data1
, dwarf::DW_OP_plus
);
331 void DwarfUnit::addOpAddress(DIELoc
&Die
, const MCSymbol
*Sym
) {
332 if (DD
->getDwarfVersion() >= 5) {
333 addPoolOpAddress(Die
, Sym
);
337 if (DD
->useSplitDwarf()) {
338 addPoolOpAddress(Die
, Sym
);
342 addUInt(Die
, dwarf::DW_FORM_data1
, dwarf::DW_OP_addr
);
343 addLabel(Die
, dwarf::DW_FORM_addr
, Sym
);
346 void DwarfUnit::addLabelDelta(DIEValueList
&Die
, dwarf::Attribute Attribute
,
347 const MCSymbol
*Hi
, const MCSymbol
*Lo
) {
348 addAttribute(Die
, Attribute
, dwarf::DW_FORM_data4
,
349 new (DIEValueAllocator
) DIEDelta(Hi
, Lo
));
352 void DwarfUnit::addDIEEntry(DIE
&Die
, dwarf::Attribute Attribute
, DIE
&Entry
) {
353 addDIEEntry(Die
, Attribute
, DIEEntry(Entry
));
356 void DwarfUnit::addDIETypeSignature(DIE
&Die
, uint64_t Signature
) {
357 // Flag the type unit reference as a declaration so that if it contains
358 // members (implicit special members, static data member definitions, member
359 // declarations for definitions in this CU, etc) consumers don't get confused
360 // and think this is a full definition.
361 addFlag(Die
, dwarf::DW_AT_declaration
);
363 addAttribute(Die
, dwarf::DW_AT_signature
, dwarf::DW_FORM_ref_sig8
,
364 DIEInteger(Signature
));
367 void DwarfUnit::addDIEEntry(DIE
&Die
, dwarf::Attribute Attribute
,
369 const DIEUnit
*CU
= Die
.getUnit();
370 const DIEUnit
*EntryCU
= Entry
.getEntry().getUnit();
372 // We assume that Die belongs to this CU, if it is not linked to any CU yet.
373 CU
= getUnitDie().getUnit();
375 EntryCU
= getUnitDie().getUnit();
376 assert(EntryCU
== CU
|| !DD
->useSplitDwarf() || DD
->shareAcrossDWOCUs() ||
377 !static_cast<const DwarfUnit
*>(CU
)->isDwoUnit());
378 addAttribute(Die
, Attribute
,
379 EntryCU
== CU
? dwarf::DW_FORM_ref4
: dwarf::DW_FORM_ref_addr
,
383 DIE
&DwarfUnit::createAndAddDIE(dwarf::Tag Tag
, DIE
&Parent
, const DINode
*N
) {
384 DIE
&Die
= Parent
.addChild(DIE::get(DIEValueAllocator
, Tag
));
390 void DwarfUnit::addBlock(DIE
&Die
, dwarf::Attribute Attribute
, DIELoc
*Loc
) {
391 Loc
->computeSize(Asm
->getDwarfFormParams());
392 DIELocs
.push_back(Loc
); // Memoize so we can call the destructor later on.
393 addAttribute(Die
, Attribute
, Loc
->BestForm(DD
->getDwarfVersion()), Loc
);
396 void DwarfUnit::addBlock(DIE
&Die
, dwarf::Attribute Attribute
, dwarf::Form Form
,
398 Block
->computeSize(Asm
->getDwarfFormParams());
399 DIEBlocks
.push_back(Block
); // Memoize so we can call the destructor later on.
400 addAttribute(Die
, Attribute
, Form
, Block
);
403 void DwarfUnit::addBlock(DIE
&Die
, dwarf::Attribute Attribute
,
405 addBlock(Die
, Attribute
, Block
->BestForm(), Block
);
408 void DwarfUnit::addSourceLine(DIE
&Die
, unsigned Line
, const DIFile
*File
) {
412 unsigned FileID
= getOrCreateSourceID(File
);
413 addUInt(Die
, dwarf::DW_AT_decl_file
, std::nullopt
, FileID
);
414 addUInt(Die
, dwarf::DW_AT_decl_line
, std::nullopt
, Line
);
417 void DwarfUnit::addSourceLine(DIE
&Die
, const DILocalVariable
*V
) {
420 addSourceLine(Die
, V
->getLine(), V
->getFile());
423 void DwarfUnit::addSourceLine(DIE
&Die
, const DIGlobalVariable
*G
) {
426 addSourceLine(Die
, G
->getLine(), G
->getFile());
429 void DwarfUnit::addSourceLine(DIE
&Die
, const DISubprogram
*SP
) {
432 addSourceLine(Die
, SP
->getLine(), SP
->getFile());
435 void DwarfUnit::addSourceLine(DIE
&Die
, const DILabel
*L
) {
438 addSourceLine(Die
, L
->getLine(), L
->getFile());
441 void DwarfUnit::addSourceLine(DIE
&Die
, const DIType
*Ty
) {
444 addSourceLine(Die
, Ty
->getLine(), Ty
->getFile());
447 void DwarfUnit::addSourceLine(DIE
&Die
, const DIObjCProperty
*Ty
) {
450 addSourceLine(Die
, Ty
->getLine(), Ty
->getFile());
453 void DwarfUnit::addConstantFPValue(DIE
&Die
, const ConstantFP
*CFP
) {
454 // Pass this down to addConstantValue as an unsigned bag of bits.
455 addConstantValue(Die
, CFP
->getValueAPF().bitcastToAPInt(), true);
458 void DwarfUnit::addConstantValue(DIE
&Die
, const ConstantInt
*CI
,
460 addConstantValue(Die
, CI
->getValue(), Ty
);
463 void DwarfUnit::addConstantValue(DIE
&Die
, uint64_t Val
, const DIType
*Ty
) {
464 addConstantValue(Die
, DD
->isUnsignedDIType(Ty
), Val
);
467 void DwarfUnit::addConstantValue(DIE
&Die
, bool Unsigned
, uint64_t Val
) {
468 // FIXME: This is a bit conservative/simple - it emits negative values always
469 // sign extended to 64 bits rather than minimizing the number of bytes.
470 addUInt(Die
, dwarf::DW_AT_const_value
,
471 Unsigned
? dwarf::DW_FORM_udata
: dwarf::DW_FORM_sdata
, Val
);
474 void DwarfUnit::addConstantValue(DIE
&Die
, const APInt
&Val
, const DIType
*Ty
) {
475 addConstantValue(Die
, Val
, DD
->isUnsignedDIType(Ty
));
478 void DwarfUnit::addConstantValue(DIE
&Die
, const APInt
&Val
, bool Unsigned
) {
479 unsigned CIBitWidth
= Val
.getBitWidth();
480 if (CIBitWidth
<= 64) {
481 addConstantValue(Die
, Unsigned
,
482 Unsigned
? Val
.getZExtValue() : Val
.getSExtValue());
486 DIEBlock
*Block
= new (DIEValueAllocator
) DIEBlock
;
488 // Get the raw data form of the large APInt.
489 const uint64_t *Ptr64
= Val
.getRawData();
491 int NumBytes
= Val
.getBitWidth() / 8; // 8 bits per byte.
492 bool LittleEndian
= Asm
->getDataLayout().isLittleEndian();
494 // Output the constant to DWARF one byte at a time.
495 for (int i
= 0; i
< NumBytes
; i
++) {
498 c
= Ptr64
[i
/ 8] >> (8 * (i
& 7));
500 c
= Ptr64
[(NumBytes
- 1 - i
) / 8] >> (8 * ((NumBytes
- 1 - i
) & 7));
501 addUInt(*Block
, dwarf::DW_FORM_data1
, c
);
504 addBlock(Die
, dwarf::DW_AT_const_value
, Block
);
507 void DwarfUnit::addLinkageName(DIE
&Die
, StringRef LinkageName
) {
508 if (!LinkageName
.empty())
510 DD
->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
511 : dwarf::DW_AT_MIPS_linkage_name
,
512 GlobalValue::dropLLVMManglingEscape(LinkageName
));
515 void DwarfUnit::addTemplateParams(DIE
&Buffer
, DINodeArray TParams
) {
516 // Add template parameters.
517 for (const auto *Element
: TParams
) {
518 if (auto *TTP
= dyn_cast
<DITemplateTypeParameter
>(Element
))
519 constructTemplateTypeParameterDIE(Buffer
, TTP
);
520 else if (auto *TVP
= dyn_cast
<DITemplateValueParameter
>(Element
))
521 constructTemplateValueParameterDIE(Buffer
, TVP
);
525 /// Add thrown types.
526 void DwarfUnit::addThrownTypes(DIE
&Die
, DINodeArray ThrownTypes
) {
527 for (const auto *Ty
: ThrownTypes
) {
528 DIE
&TT
= createAndAddDIE(dwarf::DW_TAG_thrown_type
, Die
);
529 addType(TT
, cast
<DIType
>(Ty
));
533 void DwarfUnit::addAccess(DIE
&Die
, DINode::DIFlags Flags
) {
534 if ((Flags
& DINode::FlagAccessibility
) == DINode::FlagProtected
)
535 addUInt(Die
, dwarf::DW_AT_accessibility
, dwarf::DW_FORM_data1
,
536 dwarf::DW_ACCESS_protected
);
537 else if ((Flags
& DINode::FlagAccessibility
) == DINode::FlagPrivate
)
538 addUInt(Die
, dwarf::DW_AT_accessibility
, dwarf::DW_FORM_data1
,
539 dwarf::DW_ACCESS_private
);
540 else if ((Flags
& DINode::FlagAccessibility
) == DINode::FlagPublic
)
541 addUInt(Die
, dwarf::DW_AT_accessibility
, dwarf::DW_FORM_data1
,
542 dwarf::DW_ACCESS_public
);
545 DIE
*DwarfUnit::getOrCreateContextDIE(const DIScope
*Context
) {
546 if (!Context
|| isa
<DIFile
>(Context
) || isa
<DICompileUnit
>(Context
))
547 return &getUnitDie();
548 if (auto *T
= dyn_cast
<DIType
>(Context
))
549 return getOrCreateTypeDIE(T
);
550 if (auto *NS
= dyn_cast
<DINamespace
>(Context
))
551 return getOrCreateNameSpace(NS
);
552 if (auto *SP
= dyn_cast
<DISubprogram
>(Context
))
553 return getOrCreateSubprogramDIE(SP
);
554 if (auto *M
= dyn_cast
<DIModule
>(Context
))
555 return getOrCreateModule(M
);
556 return getDIE(Context
);
559 DIE
*DwarfUnit::createTypeDIE(const DICompositeType
*Ty
) {
560 auto *Context
= Ty
->getScope();
561 DIE
*ContextDIE
= getOrCreateContextDIE(Context
);
563 if (DIE
*TyDIE
= getDIE(Ty
))
567 DIE
&TyDIE
= createAndAddDIE(Ty
->getTag(), *ContextDIE
, Ty
);
569 constructTypeDIE(TyDIE
, cast
<DICompositeType
>(Ty
));
571 updateAcceleratorTables(Context
, Ty
, TyDIE
);
575 DIE
*DwarfUnit::createTypeDIE(const DIScope
*Context
, DIE
&ContextDIE
,
578 DIE
&TyDIE
= createAndAddDIE(Ty
->getTag(), ContextDIE
, Ty
);
580 updateAcceleratorTables(Context
, Ty
, TyDIE
);
582 if (auto *BT
= dyn_cast
<DIBasicType
>(Ty
))
583 constructTypeDIE(TyDIE
, BT
);
584 else if (auto *ST
= dyn_cast
<DIStringType
>(Ty
))
585 constructTypeDIE(TyDIE
, ST
);
586 else if (auto *STy
= dyn_cast
<DISubroutineType
>(Ty
))
587 constructTypeDIE(TyDIE
, STy
);
588 else if (auto *CTy
= dyn_cast
<DICompositeType
>(Ty
)) {
589 if (DD
->generateTypeUnits() && !Ty
->isForwardDecl() &&
590 (Ty
->getRawName() || CTy
->getRawIdentifier())) {
591 // Skip updating the accelerator tables since this is not the full type.
592 if (MDString
*TypeId
= CTy
->getRawIdentifier())
593 DD
->addDwarfTypeUnitType(getCU(), TypeId
->getString(), TyDIE
, CTy
);
595 finishNonUnitTypeDIE(TyDIE
, CTy
);
598 constructTypeDIE(TyDIE
, CTy
);
600 constructTypeDIE(TyDIE
, cast
<DIDerivedType
>(Ty
));
606 DIE
*DwarfUnit::getOrCreateTypeDIE(const MDNode
*TyNode
) {
610 auto *Ty
= cast
<DIType
>(TyNode
);
612 // DW_TAG_restrict_type is not supported in DWARF2
613 if (Ty
->getTag() == dwarf::DW_TAG_restrict_type
&& DD
->getDwarfVersion() <= 2)
614 return getOrCreateTypeDIE(cast
<DIDerivedType
>(Ty
)->getBaseType());
616 // DW_TAG_atomic_type is not supported in DWARF < 5
617 if (Ty
->getTag() == dwarf::DW_TAG_atomic_type
&& DD
->getDwarfVersion() < 5)
618 return getOrCreateTypeDIE(cast
<DIDerivedType
>(Ty
)->getBaseType());
620 // Construct the context before querying for the existence of the DIE in case
621 // such construction creates the DIE.
622 auto *Context
= Ty
->getScope();
623 DIE
*ContextDIE
= getOrCreateContextDIE(Context
);
626 if (DIE
*TyDIE
= getDIE(Ty
))
629 return static_cast<DwarfUnit
*>(ContextDIE
->getUnit())
630 ->createTypeDIE(Context
, *ContextDIE
, Ty
);
633 void DwarfUnit::updateAcceleratorTables(const DIScope
*Context
,
634 const DIType
*Ty
, const DIE
&TyDIE
) {
635 if (!Ty
->getName().empty() && !Ty
->isForwardDecl()) {
636 bool IsImplementation
= false;
637 if (auto *CT
= dyn_cast
<DICompositeType
>(Ty
)) {
638 // A runtime language of 0 actually means C/C++ and that any
639 // non-negative value is some version of Objective-C/C++.
640 IsImplementation
= CT
->getRuntimeLang() == 0 || CT
->isObjcClassComplete();
642 unsigned Flags
= IsImplementation
? dwarf::DW_FLAG_type_implementation
: 0;
643 DD
->addAccelType(*this, CUNode
->getNameTableKind(), Ty
->getName(), TyDIE
,
646 if (!Context
|| isa
<DICompileUnit
>(Context
) || isa
<DIFile
>(Context
) ||
647 isa
<DINamespace
>(Context
) || isa
<DICommonBlock
>(Context
))
648 addGlobalType(Ty
, TyDIE
, Context
);
652 void DwarfUnit::addType(DIE
&Entity
, const DIType
*Ty
,
653 dwarf::Attribute Attribute
) {
654 assert(Ty
&& "Trying to add a type that doesn't exist?");
655 addDIEEntry(Entity
, Attribute
, DIEEntry(*getOrCreateTypeDIE(Ty
)));
658 std::string
DwarfUnit::getParentContextString(const DIScope
*Context
) const {
662 // FIXME: Decide whether to implement this for non-C++ languages.
663 if (!dwarf::isCPlusPlus((dwarf::SourceLanguage
)getLanguage()))
667 SmallVector
<const DIScope
*, 1> Parents
;
668 while (!isa
<DICompileUnit
>(Context
)) {
669 Parents
.push_back(Context
);
670 if (const DIScope
*S
= Context
->getScope())
673 // Structure, etc types will have a NULL context if they're at the top
678 // Reverse iterate over our list to go from the outermost construct to the
680 for (const DIScope
*Ctx
: llvm::reverse(Parents
)) {
681 StringRef Name
= Ctx
->getName();
682 if (Name
.empty() && isa
<DINamespace
>(Ctx
))
683 Name
= "(anonymous namespace)";
692 void DwarfUnit::constructTypeDIE(DIE
&Buffer
, const DIBasicType
*BTy
) {
693 // Get core information.
694 StringRef Name
= BTy
->getName();
695 // Add name if not anonymous or intermediate type.
697 addString(Buffer
, dwarf::DW_AT_name
, Name
);
699 // An unspecified type only has a name attribute.
700 if (BTy
->getTag() == dwarf::DW_TAG_unspecified_type
)
703 if (BTy
->getTag() != dwarf::DW_TAG_string_type
)
704 addUInt(Buffer
, dwarf::DW_AT_encoding
, dwarf::DW_FORM_data1
,
707 uint64_t Size
= BTy
->getSizeInBits() >> 3;
708 addUInt(Buffer
, dwarf::DW_AT_byte_size
, std::nullopt
, Size
);
710 if (BTy
->isBigEndian())
711 addUInt(Buffer
, dwarf::DW_AT_endianity
, std::nullopt
, dwarf::DW_END_big
);
712 else if (BTy
->isLittleEndian())
713 addUInt(Buffer
, dwarf::DW_AT_endianity
, std::nullopt
, dwarf::DW_END_little
);
716 void DwarfUnit::constructTypeDIE(DIE
&Buffer
, const DIStringType
*STy
) {
717 // Get core information.
718 StringRef Name
= STy
->getName();
719 // Add name if not anonymous or intermediate type.
721 addString(Buffer
, dwarf::DW_AT_name
, Name
);
723 if (DIVariable
*Var
= STy
->getStringLength()) {
724 if (auto *VarDIE
= getDIE(Var
))
725 addDIEEntry(Buffer
, dwarf::DW_AT_string_length
, *VarDIE
);
726 } else if (DIExpression
*Expr
= STy
->getStringLengthExp()) {
727 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
728 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
729 // This is to describe the memory location of the
730 // length of a Fortran deferred length string, so
731 // lock it down as such.
732 DwarfExpr
.setMemoryLocationKind();
733 DwarfExpr
.addExpression(Expr
);
734 addBlock(Buffer
, dwarf::DW_AT_string_length
, DwarfExpr
.finalize());
736 uint64_t Size
= STy
->getSizeInBits() >> 3;
737 addUInt(Buffer
, dwarf::DW_AT_byte_size
, std::nullopt
, Size
);
740 if (DIExpression
*Expr
= STy
->getStringLocationExp()) {
741 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
742 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
743 // This is to describe the memory location of the
744 // string, so lock it down as such.
745 DwarfExpr
.setMemoryLocationKind();
746 DwarfExpr
.addExpression(Expr
);
747 addBlock(Buffer
, dwarf::DW_AT_data_location
, DwarfExpr
.finalize());
750 if (STy
->getEncoding()) {
751 // For eventual Unicode support.
752 addUInt(Buffer
, dwarf::DW_AT_encoding
, dwarf::DW_FORM_data1
,
757 void DwarfUnit::constructTypeDIE(DIE
&Buffer
, const DIDerivedType
*DTy
) {
758 // Get core information.
759 StringRef Name
= DTy
->getName();
760 uint64_t Size
= DTy
->getSizeInBits() >> 3;
761 uint16_t Tag
= Buffer
.getTag();
763 // Map to main type, void will not have a type.
764 const DIType
*FromTy
= DTy
->getBaseType();
766 addType(Buffer
, FromTy
);
768 // Add name if not anonymous or intermediate type.
770 addString(Buffer
, dwarf::DW_AT_name
, Name
);
772 addAnnotation(Buffer
, DTy
->getAnnotations());
774 // If alignment is specified for a typedef , create and insert DW_AT_alignment
775 // attribute in DW_TAG_typedef DIE.
776 if (Tag
== dwarf::DW_TAG_typedef
&& DD
->getDwarfVersion() >= 5) {
777 uint32_t AlignInBytes
= DTy
->getAlignInBytes();
778 if (AlignInBytes
> 0)
779 addUInt(Buffer
, dwarf::DW_AT_alignment
, dwarf::DW_FORM_udata
,
783 // Add size if non-zero (derived types might be zero-sized.)
784 if (Size
&& Tag
!= dwarf::DW_TAG_pointer_type
785 && Tag
!= dwarf::DW_TAG_ptr_to_member_type
786 && Tag
!= dwarf::DW_TAG_reference_type
787 && Tag
!= dwarf::DW_TAG_rvalue_reference_type
)
788 addUInt(Buffer
, dwarf::DW_AT_byte_size
, std::nullopt
, Size
);
790 if (Tag
== dwarf::DW_TAG_ptr_to_member_type
)
791 addDIEEntry(Buffer
, dwarf::DW_AT_containing_type
,
792 *getOrCreateTypeDIE(cast
<DIDerivedType
>(DTy
)->getClassType()));
794 addAccess(Buffer
, DTy
->getFlags());
796 // Add source line info if available and TyDesc is not a forward declaration.
797 if (!DTy
->isForwardDecl())
798 addSourceLine(Buffer
, DTy
);
800 // If DWARF address space value is other than None, add it. The IR
801 // verifier checks that DWARF address space only exists for pointer
802 // or reference types.
803 if (DTy
->getDWARFAddressSpace())
804 addUInt(Buffer
, dwarf::DW_AT_address_class
, dwarf::DW_FORM_data4
,
805 *DTy
->getDWARFAddressSpace());
808 void DwarfUnit::constructSubprogramArguments(DIE
&Buffer
, DITypeRefArray Args
) {
809 for (unsigned i
= 1, N
= Args
.size(); i
< N
; ++i
) {
810 const DIType
*Ty
= Args
[i
];
812 assert(i
== N
-1 && "Unspecified parameter must be the last argument");
813 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters
, Buffer
);
815 DIE
&Arg
= createAndAddDIE(dwarf::DW_TAG_formal_parameter
, Buffer
);
817 if (Ty
->isArtificial())
818 addFlag(Arg
, dwarf::DW_AT_artificial
);
823 void DwarfUnit::constructTypeDIE(DIE
&Buffer
, const DISubroutineType
*CTy
) {
824 // Add return type. A void return won't have a type.
825 auto Elements
= cast
<DISubroutineType
>(CTy
)->getTypeArray();
827 if (auto RTy
= Elements
[0])
828 addType(Buffer
, RTy
);
830 bool isPrototyped
= true;
831 if (Elements
.size() == 2 && !Elements
[1])
832 isPrototyped
= false;
834 constructSubprogramArguments(Buffer
, Elements
);
836 // Add prototype flag if we're dealing with a C language and the function has
838 if (isPrototyped
&& dwarf::isC((dwarf::SourceLanguage
)getLanguage()))
839 addFlag(Buffer
, dwarf::DW_AT_prototyped
);
841 // Add a DW_AT_calling_convention if this has an explicit convention.
842 if (CTy
->getCC() && CTy
->getCC() != dwarf::DW_CC_normal
)
843 addUInt(Buffer
, dwarf::DW_AT_calling_convention
, dwarf::DW_FORM_data1
,
846 if (CTy
->isLValueReference())
847 addFlag(Buffer
, dwarf::DW_AT_reference
);
849 if (CTy
->isRValueReference())
850 addFlag(Buffer
, dwarf::DW_AT_rvalue_reference
);
853 void DwarfUnit::addAnnotation(DIE
&Buffer
, DINodeArray Annotations
) {
857 for (const Metadata
*Annotation
: Annotations
->operands()) {
858 const MDNode
*MD
= cast
<MDNode
>(Annotation
);
859 const MDString
*Name
= cast
<MDString
>(MD
->getOperand(0));
860 const auto &Value
= MD
->getOperand(1);
862 DIE
&AnnotationDie
= createAndAddDIE(dwarf::DW_TAG_LLVM_annotation
, Buffer
);
863 addString(AnnotationDie
, dwarf::DW_AT_name
, Name
->getString());
864 if (const auto *Data
= dyn_cast
<MDString
>(Value
))
865 addString(AnnotationDie
, dwarf::DW_AT_const_value
, Data
->getString());
866 else if (const auto *Data
= dyn_cast
<ConstantAsMetadata
>(Value
))
867 addConstantValue(AnnotationDie
, Data
->getValue()->getUniqueInteger(),
870 assert(false && "Unsupported annotation value type");
874 void DwarfUnit::constructTypeDIE(DIE
&Buffer
, const DICompositeType
*CTy
) {
875 // Add name if not anonymous or intermediate type.
876 StringRef Name
= CTy
->getName();
878 uint64_t Size
= CTy
->getSizeInBits() >> 3;
879 uint16_t Tag
= Buffer
.getTag();
882 case dwarf::DW_TAG_array_type
:
883 constructArrayTypeDIE(Buffer
, CTy
);
885 case dwarf::DW_TAG_enumeration_type
:
886 constructEnumTypeDIE(Buffer
, CTy
);
888 case dwarf::DW_TAG_variant_part
:
889 case dwarf::DW_TAG_structure_type
:
890 case dwarf::DW_TAG_union_type
:
891 case dwarf::DW_TAG_class_type
:
892 case dwarf::DW_TAG_namelist
: {
893 // Emit the discriminator for a variant part.
894 DIDerivedType
*Discriminator
= nullptr;
895 if (Tag
== dwarf::DW_TAG_variant_part
) {
896 Discriminator
= CTy
->getDiscriminator();
899 // If the variant part has a discriminant, the discriminant is
900 // represented by a separate debugging information entry which is
901 // a child of the variant part entry.
902 DIE
&DiscMember
= constructMemberDIE(Buffer
, Discriminator
);
903 addDIEEntry(Buffer
, dwarf::DW_AT_discr
, DiscMember
);
907 // Add template parameters to a class, structure or union types.
908 if (Tag
== dwarf::DW_TAG_class_type
||
909 Tag
== dwarf::DW_TAG_structure_type
|| Tag
== dwarf::DW_TAG_union_type
)
910 addTemplateParams(Buffer
, CTy
->getTemplateParams());
912 // Add elements to structure type.
913 DINodeArray Elements
= CTy
->getElements();
914 for (const auto *Element
: Elements
) {
917 if (auto *SP
= dyn_cast
<DISubprogram
>(Element
))
918 getOrCreateSubprogramDIE(SP
);
919 else if (auto *DDTy
= dyn_cast
<DIDerivedType
>(Element
)) {
920 if (DDTy
->getTag() == dwarf::DW_TAG_friend
) {
921 DIE
&ElemDie
= createAndAddDIE(dwarf::DW_TAG_friend
, Buffer
);
922 addType(ElemDie
, DDTy
->getBaseType(), dwarf::DW_AT_friend
);
923 } else if (DDTy
->isStaticMember()) {
924 getOrCreateStaticMemberDIE(DDTy
);
925 } else if (Tag
== dwarf::DW_TAG_variant_part
) {
926 // When emitting a variant part, wrap each member in
928 DIE
&Variant
= createAndAddDIE(dwarf::DW_TAG_variant
, Buffer
);
929 if (const ConstantInt
*CI
=
930 dyn_cast_or_null
<ConstantInt
>(DDTy
->getDiscriminantValue())) {
931 if (DD
->isUnsignedDIType(Discriminator
->getBaseType()))
932 addUInt(Variant
, dwarf::DW_AT_discr_value
, std::nullopt
,
935 addSInt(Variant
, dwarf::DW_AT_discr_value
, std::nullopt
,
938 constructMemberDIE(Variant
, DDTy
);
940 constructMemberDIE(Buffer
, DDTy
);
942 } else if (auto *Property
= dyn_cast
<DIObjCProperty
>(Element
)) {
943 DIE
&ElemDie
= createAndAddDIE(Property
->getTag(), Buffer
);
944 StringRef PropertyName
= Property
->getName();
945 addString(ElemDie
, dwarf::DW_AT_APPLE_property_name
, PropertyName
);
946 if (Property
->getType())
947 addType(ElemDie
, Property
->getType());
948 addSourceLine(ElemDie
, Property
);
949 StringRef GetterName
= Property
->getGetterName();
950 if (!GetterName
.empty())
951 addString(ElemDie
, dwarf::DW_AT_APPLE_property_getter
, GetterName
);
952 StringRef SetterName
= Property
->getSetterName();
953 if (!SetterName
.empty())
954 addString(ElemDie
, dwarf::DW_AT_APPLE_property_setter
, SetterName
);
955 if (unsigned PropertyAttributes
= Property
->getAttributes())
956 addUInt(ElemDie
, dwarf::DW_AT_APPLE_property_attribute
, std::nullopt
,
958 } else if (auto *Composite
= dyn_cast
<DICompositeType
>(Element
)) {
959 if (Composite
->getTag() == dwarf::DW_TAG_variant_part
) {
960 DIE
&VariantPart
= createAndAddDIE(Composite
->getTag(), Buffer
);
961 constructTypeDIE(VariantPart
, Composite
);
963 } else if (Tag
== dwarf::DW_TAG_namelist
) {
964 auto *Var
= dyn_cast
<DINode
>(Element
);
965 auto *VarDIE
= getDIE(Var
);
967 DIE
&ItemDie
= createAndAddDIE(dwarf::DW_TAG_namelist_item
, Buffer
);
968 addDIEEntry(ItemDie
, dwarf::DW_AT_namelist_item
, *VarDIE
);
973 if (CTy
->isAppleBlockExtension())
974 addFlag(Buffer
, dwarf::DW_AT_APPLE_block
);
976 if (CTy
->getExportSymbols())
977 addFlag(Buffer
, dwarf::DW_AT_export_symbols
);
979 // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type
980 // inside C++ composite types to point to the base class with the vtable.
981 // Rust uses DW_AT_containing_type to link a vtable to the type
982 // for which it was created.
983 if (auto *ContainingType
= CTy
->getVTableHolder())
984 addDIEEntry(Buffer
, dwarf::DW_AT_containing_type
,
985 *getOrCreateTypeDIE(ContainingType
));
987 if (CTy
->isObjcClassComplete())
988 addFlag(Buffer
, dwarf::DW_AT_APPLE_objc_complete_type
);
990 // Add the type's non-standard calling convention.
991 // DW_CC_pass_by_value/DW_CC_pass_by_reference are introduced in DWARF 5.
992 if (!Asm
->TM
.Options
.DebugStrictDwarf
|| DD
->getDwarfVersion() >= 5) {
994 if (CTy
->isTypePassByValue())
995 CC
= dwarf::DW_CC_pass_by_value
;
996 else if (CTy
->isTypePassByReference())
997 CC
= dwarf::DW_CC_pass_by_reference
;
999 addUInt(Buffer
, dwarf::DW_AT_calling_convention
, dwarf::DW_FORM_data1
,
1008 // Add name if not anonymous or intermediate type.
1010 addString(Buffer
, dwarf::DW_AT_name
, Name
);
1012 addAnnotation(Buffer
, CTy
->getAnnotations());
1014 if (Tag
== dwarf::DW_TAG_enumeration_type
||
1015 Tag
== dwarf::DW_TAG_class_type
|| Tag
== dwarf::DW_TAG_structure_type
||
1016 Tag
== dwarf::DW_TAG_union_type
) {
1017 // Add size if non-zero (derived types might be zero-sized.)
1018 // Ignore the size if it's a non-enum forward decl.
1019 // TODO: Do we care about size for enum forward declarations?
1021 (!CTy
->isForwardDecl() || Tag
== dwarf::DW_TAG_enumeration_type
))
1022 addUInt(Buffer
, dwarf::DW_AT_byte_size
, std::nullopt
, Size
);
1023 else if (!CTy
->isForwardDecl())
1024 // Add zero size if it is not a forward declaration.
1025 addUInt(Buffer
, dwarf::DW_AT_byte_size
, std::nullopt
, 0);
1027 // If we're a forward decl, say so.
1028 if (CTy
->isForwardDecl())
1029 addFlag(Buffer
, dwarf::DW_AT_declaration
);
1031 // Add accessibility info if available.
1032 addAccess(Buffer
, CTy
->getFlags());
1034 // Add source line info if available.
1035 if (!CTy
->isForwardDecl())
1036 addSourceLine(Buffer
, CTy
);
1038 // No harm in adding the runtime language to the declaration.
1039 unsigned RLang
= CTy
->getRuntimeLang();
1041 addUInt(Buffer
, dwarf::DW_AT_APPLE_runtime_class
, dwarf::DW_FORM_data1
,
1044 // Add align info if available.
1045 if (uint32_t AlignInBytes
= CTy
->getAlignInBytes())
1046 addUInt(Buffer
, dwarf::DW_AT_alignment
, dwarf::DW_FORM_udata
,
1051 void DwarfUnit::constructTemplateTypeParameterDIE(
1052 DIE
&Buffer
, const DITemplateTypeParameter
*TP
) {
1054 createAndAddDIE(dwarf::DW_TAG_template_type_parameter
, Buffer
);
1055 // Add the type if it exists, it could be void and therefore no type.
1057 addType(ParamDIE
, TP
->getType());
1058 if (!TP
->getName().empty())
1059 addString(ParamDIE
, dwarf::DW_AT_name
, TP
->getName());
1060 if (TP
->isDefault() && isCompatibleWithVersion(5))
1061 addFlag(ParamDIE
, dwarf::DW_AT_default_value
);
1064 void DwarfUnit::constructTemplateValueParameterDIE(
1065 DIE
&Buffer
, const DITemplateValueParameter
*VP
) {
1066 DIE
&ParamDIE
= createAndAddDIE(VP
->getTag(), Buffer
);
1068 // Add the type if there is one, template template and template parameter
1069 // packs will not have a type.
1070 if (VP
->getTag() == dwarf::DW_TAG_template_value_parameter
)
1071 addType(ParamDIE
, VP
->getType());
1072 if (!VP
->getName().empty())
1073 addString(ParamDIE
, dwarf::DW_AT_name
, VP
->getName());
1074 if (VP
->isDefault() && isCompatibleWithVersion(5))
1075 addFlag(ParamDIE
, dwarf::DW_AT_default_value
);
1076 if (Metadata
*Val
= VP
->getValue()) {
1077 if (ConstantInt
*CI
= mdconst::dyn_extract
<ConstantInt
>(Val
))
1078 addConstantValue(ParamDIE
, CI
, VP
->getType());
1079 else if (GlobalValue
*GV
= mdconst::dyn_extract
<GlobalValue
>(Val
)) {
1080 // We cannot describe the location of dllimport'd entities: the
1081 // computation of their address requires loads from the IAT.
1082 if (!GV
->hasDLLImportStorageClass()) {
1083 // For declaration non-type template parameters (such as global values
1085 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1086 addOpAddress(*Loc
, Asm
->getSymbol(GV
));
1087 // Emit DW_OP_stack_value to use the address as the immediate value of
1088 // the parameter, rather than a pointer to it.
1089 addUInt(*Loc
, dwarf::DW_FORM_data1
, dwarf::DW_OP_stack_value
);
1090 addBlock(ParamDIE
, dwarf::DW_AT_location
, Loc
);
1092 } else if (VP
->getTag() == dwarf::DW_TAG_GNU_template_template_param
) {
1093 assert(isa
<MDString
>(Val
));
1094 addString(ParamDIE
, dwarf::DW_AT_GNU_template_name
,
1095 cast
<MDString
>(Val
)->getString());
1096 } else if (VP
->getTag() == dwarf::DW_TAG_GNU_template_parameter_pack
) {
1097 addTemplateParams(ParamDIE
, cast
<MDTuple
>(Val
));
1102 DIE
*DwarfUnit::getOrCreateNameSpace(const DINamespace
*NS
) {
1103 // Construct the context before querying for the existence of the DIE in case
1104 // such construction creates the DIE.
1105 DIE
*ContextDIE
= getOrCreateContextDIE(NS
->getScope());
1107 if (DIE
*NDie
= getDIE(NS
))
1109 DIE
&NDie
= createAndAddDIE(dwarf::DW_TAG_namespace
, *ContextDIE
, NS
);
1111 StringRef Name
= NS
->getName();
1113 addString(NDie
, dwarf::DW_AT_name
, NS
->getName());
1115 Name
= "(anonymous namespace)";
1116 DD
->addAccelNamespace(*this, CUNode
->getNameTableKind(), Name
, NDie
);
1117 addGlobalName(Name
, NDie
, NS
->getScope());
1118 if (NS
->getExportSymbols())
1119 addFlag(NDie
, dwarf::DW_AT_export_symbols
);
1123 DIE
*DwarfUnit::getOrCreateModule(const DIModule
*M
) {
1124 // Construct the context before querying for the existence of the DIE in case
1125 // such construction creates the DIE.
1126 DIE
*ContextDIE
= getOrCreateContextDIE(M
->getScope());
1128 if (DIE
*MDie
= getDIE(M
))
1130 DIE
&MDie
= createAndAddDIE(dwarf::DW_TAG_module
, *ContextDIE
, M
);
1132 if (!M
->getName().empty()) {
1133 addString(MDie
, dwarf::DW_AT_name
, M
->getName());
1134 addGlobalName(M
->getName(), MDie
, M
->getScope());
1136 if (!M
->getConfigurationMacros().empty())
1137 addString(MDie
, dwarf::DW_AT_LLVM_config_macros
,
1138 M
->getConfigurationMacros());
1139 if (!M
->getIncludePath().empty())
1140 addString(MDie
, dwarf::DW_AT_LLVM_include_path
, M
->getIncludePath());
1141 if (!M
->getAPINotesFile().empty())
1142 addString(MDie
, dwarf::DW_AT_LLVM_apinotes
, M
->getAPINotesFile());
1144 addUInt(MDie
, dwarf::DW_AT_decl_file
, std::nullopt
,
1145 getOrCreateSourceID(M
->getFile()));
1147 addUInt(MDie
, dwarf::DW_AT_decl_line
, std::nullopt
, M
->getLineNo());
1149 addFlag(MDie
, dwarf::DW_AT_declaration
);
1154 DIE
*DwarfUnit::getOrCreateSubprogramDIE(const DISubprogram
*SP
, bool Minimal
) {
1155 // Construct the context before querying for the existence of the DIE in case
1156 // such construction creates the DIE (as is the case for member function
1159 Minimal
? &getUnitDie() : getOrCreateContextDIE(SP
->getScope());
1161 if (DIE
*SPDie
= getDIE(SP
))
1164 if (auto *SPDecl
= SP
->getDeclaration()) {
1166 // Add subprogram definitions to the CU die directly.
1167 ContextDIE
= &getUnitDie();
1168 // Build the decl now to ensure it precedes the definition.
1169 getOrCreateSubprogramDIE(SPDecl
);
1173 // DW_TAG_inlined_subroutine may refer to this DIE.
1174 DIE
&SPDie
= createAndAddDIE(dwarf::DW_TAG_subprogram
, *ContextDIE
, SP
);
1176 // Stop here and fill this in later, depending on whether or not this
1177 // subprogram turns out to have inlined instances or not.
1178 if (SP
->isDefinition())
1181 static_cast<DwarfUnit
*>(SPDie
.getUnit())
1182 ->applySubprogramAttributes(SP
, SPDie
);
1186 bool DwarfUnit::applySubprogramDefinitionAttributes(const DISubprogram
*SP
,
1187 DIE
&SPDie
, bool Minimal
) {
1188 DIE
*DeclDie
= nullptr;
1189 StringRef DeclLinkageName
;
1190 if (auto *SPDecl
= SP
->getDeclaration()) {
1192 DITypeRefArray DeclArgs
, DefinitionArgs
;
1193 DeclArgs
= SPDecl
->getType()->getTypeArray();
1194 DefinitionArgs
= SP
->getType()->getTypeArray();
1196 if (DeclArgs
.size() && DefinitionArgs
.size())
1197 if (DefinitionArgs
[0] != nullptr && DeclArgs
[0] != DefinitionArgs
[0])
1198 addType(SPDie
, DefinitionArgs
[0]);
1200 DeclDie
= getDIE(SPDecl
);
1201 assert(DeclDie
&& "This DIE should've already been constructed when the "
1202 "definition DIE was created in "
1203 "getOrCreateSubprogramDIE");
1204 // Look at the Decl's linkage name only if we emitted it.
1205 if (DD
->useAllLinkageNames())
1206 DeclLinkageName
= SPDecl
->getLinkageName();
1207 unsigned DeclID
= getOrCreateSourceID(SPDecl
->getFile());
1208 unsigned DefID
= getOrCreateSourceID(SP
->getFile());
1209 if (DeclID
!= DefID
)
1210 addUInt(SPDie
, dwarf::DW_AT_decl_file
, std::nullopt
, DefID
);
1212 if (SP
->getLine() != SPDecl
->getLine())
1213 addUInt(SPDie
, dwarf::DW_AT_decl_line
, std::nullopt
, SP
->getLine());
1217 // Add function template parameters.
1218 addTemplateParams(SPDie
, SP
->getTemplateParams());
1220 // Add the linkage name if we have one and it isn't in the Decl.
1221 StringRef LinkageName
= SP
->getLinkageName();
1222 assert(((LinkageName
.empty() || DeclLinkageName
.empty()) ||
1223 LinkageName
== DeclLinkageName
) &&
1224 "decl has a linkage name and it is different");
1225 if (DeclLinkageName
.empty() &&
1226 // Always emit it for abstract subprograms.
1227 (DD
->useAllLinkageNames() || DU
->getAbstractScopeDIEs().lookup(SP
)))
1228 addLinkageName(SPDie
, LinkageName
);
1233 // Refer to the function declaration where all the other attributes will be
1235 addDIEEntry(SPDie
, dwarf::DW_AT_specification
, *DeclDie
);
1239 void DwarfUnit::applySubprogramAttributes(const DISubprogram
*SP
, DIE
&SPDie
,
1240 bool SkipSPAttributes
) {
1241 // If -fdebug-info-for-profiling is enabled, need to emit the subprogram
1242 // and its source location.
1243 bool SkipSPSourceLocation
= SkipSPAttributes
&&
1244 !CUNode
->getDebugInfoForProfiling();
1245 if (!SkipSPSourceLocation
)
1246 if (applySubprogramDefinitionAttributes(SP
, SPDie
, SkipSPAttributes
))
1249 // Constructors and operators for anonymous aggregates do not have names.
1250 if (!SP
->getName().empty())
1251 addString(SPDie
, dwarf::DW_AT_name
, SP
->getName());
1253 addAnnotation(SPDie
, SP
->getAnnotations());
1255 if (!SkipSPSourceLocation
)
1256 addSourceLine(SPDie
, SP
);
1258 // Skip the rest of the attributes under -gmlt to save space.
1259 if (SkipSPAttributes
)
1262 // Add the prototype if we have a prototype and we have a C like
1264 if (SP
->isPrototyped() && dwarf::isC((dwarf::SourceLanguage
)getLanguage()))
1265 addFlag(SPDie
, dwarf::DW_AT_prototyped
);
1267 if (SP
->isObjCDirect())
1268 addFlag(SPDie
, dwarf::DW_AT_APPLE_objc_direct
);
1271 DITypeRefArray Args
;
1272 if (const DISubroutineType
*SPTy
= SP
->getType()) {
1273 Args
= SPTy
->getTypeArray();
1277 // Add a DW_AT_calling_convention if this has an explicit convention.
1278 if (CC
&& CC
!= dwarf::DW_CC_normal
)
1279 addUInt(SPDie
, dwarf::DW_AT_calling_convention
, dwarf::DW_FORM_data1
, CC
);
1281 // Add a return type. If this is a type like a C/C++ void type we don't add a
1284 if (auto Ty
= Args
[0])
1287 unsigned VK
= SP
->getVirtuality();
1289 addUInt(SPDie
, dwarf::DW_AT_virtuality
, dwarf::DW_FORM_data1
, VK
);
1290 if (SP
->getVirtualIndex() != -1u) {
1291 DIELoc
*Block
= getDIELoc();
1292 addUInt(*Block
, dwarf::DW_FORM_data1
, dwarf::DW_OP_constu
);
1293 addUInt(*Block
, dwarf::DW_FORM_udata
, SP
->getVirtualIndex());
1294 addBlock(SPDie
, dwarf::DW_AT_vtable_elem_location
, Block
);
1296 ContainingTypeMap
.insert(std::make_pair(&SPDie
, SP
->getContainingType()));
1299 if (!SP
->isDefinition()) {
1300 addFlag(SPDie
, dwarf::DW_AT_declaration
);
1302 // Add arguments. Do not add arguments for subprogram definition. They will
1303 // be handled while processing variables.
1304 constructSubprogramArguments(SPDie
, Args
);
1307 addThrownTypes(SPDie
, SP
->getThrownTypes());
1309 if (SP
->isArtificial())
1310 addFlag(SPDie
, dwarf::DW_AT_artificial
);
1312 if (!SP
->isLocalToUnit())
1313 addFlag(SPDie
, dwarf::DW_AT_external
);
1315 if (DD
->useAppleExtensionAttributes()) {
1316 if (SP
->isOptimized())
1317 addFlag(SPDie
, dwarf::DW_AT_APPLE_optimized
);
1319 if (unsigned isa
= Asm
->getISAEncoding())
1320 addUInt(SPDie
, dwarf::DW_AT_APPLE_isa
, dwarf::DW_FORM_flag
, isa
);
1323 if (SP
->isLValueReference())
1324 addFlag(SPDie
, dwarf::DW_AT_reference
);
1326 if (SP
->isRValueReference())
1327 addFlag(SPDie
, dwarf::DW_AT_rvalue_reference
);
1329 if (SP
->isNoReturn())
1330 addFlag(SPDie
, dwarf::DW_AT_noreturn
);
1332 addAccess(SPDie
, SP
->getFlags());
1334 if (SP
->isExplicit())
1335 addFlag(SPDie
, dwarf::DW_AT_explicit
);
1337 if (SP
->isMainSubprogram())
1338 addFlag(SPDie
, dwarf::DW_AT_main_subprogram
);
1340 addFlag(SPDie
, dwarf::DW_AT_pure
);
1341 if (SP
->isElemental())
1342 addFlag(SPDie
, dwarf::DW_AT_elemental
);
1343 if (SP
->isRecursive())
1344 addFlag(SPDie
, dwarf::DW_AT_recursive
);
1346 if (!SP
->getTargetFuncName().empty())
1347 addString(SPDie
, dwarf::DW_AT_trampoline
, SP
->getTargetFuncName());
1349 if (DD
->getDwarfVersion() >= 5 && SP
->isDeleted())
1350 addFlag(SPDie
, dwarf::DW_AT_deleted
);
1353 void DwarfUnit::constructSubrangeDIE(DIE
&Buffer
, const DISubrange
*SR
,
1355 DIE
&DW_Subrange
= createAndAddDIE(dwarf::DW_TAG_subrange_type
, Buffer
);
1356 addDIEEntry(DW_Subrange
, dwarf::DW_AT_type
, *IndexTy
);
1358 // The LowerBound value defines the lower bounds which is typically zero for
1359 // C/C++. The Count value is the number of elements. Values are 64 bit. If
1360 // Count == -1 then the array is unbounded and we do not emit
1361 // DW_AT_lower_bound and DW_AT_count attributes.
1362 int64_t DefaultLowerBound
= getDefaultLowerBound();
1364 auto AddBoundTypeEntry
= [&](dwarf::Attribute Attr
,
1365 DISubrange::BoundType Bound
) -> void {
1366 if (auto *BV
= dyn_cast_if_present
<DIVariable
*>(Bound
)) {
1367 if (auto *VarDIE
= getDIE(BV
))
1368 addDIEEntry(DW_Subrange
, Attr
, *VarDIE
);
1369 } else if (auto *BE
= dyn_cast_if_present
<DIExpression
*>(Bound
)) {
1370 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1371 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
1372 DwarfExpr
.setMemoryLocationKind();
1373 DwarfExpr
.addExpression(BE
);
1374 addBlock(DW_Subrange
, Attr
, DwarfExpr
.finalize());
1375 } else if (auto *BI
= dyn_cast_if_present
<ConstantInt
*>(Bound
)) {
1376 if (Attr
== dwarf::DW_AT_count
) {
1377 if (BI
->getSExtValue() != -1)
1378 addUInt(DW_Subrange
, Attr
, std::nullopt
, BI
->getSExtValue());
1379 } else if (Attr
!= dwarf::DW_AT_lower_bound
|| DefaultLowerBound
== -1 ||
1380 BI
->getSExtValue() != DefaultLowerBound
)
1381 addSInt(DW_Subrange
, Attr
, dwarf::DW_FORM_sdata
, BI
->getSExtValue());
1385 AddBoundTypeEntry(dwarf::DW_AT_lower_bound
, SR
->getLowerBound());
1387 AddBoundTypeEntry(dwarf::DW_AT_count
, SR
->getCount());
1389 AddBoundTypeEntry(dwarf::DW_AT_upper_bound
, SR
->getUpperBound());
1391 AddBoundTypeEntry(dwarf::DW_AT_byte_stride
, SR
->getStride());
1394 void DwarfUnit::constructGenericSubrangeDIE(DIE
&Buffer
,
1395 const DIGenericSubrange
*GSR
,
1397 DIE
&DwGenericSubrange
=
1398 createAndAddDIE(dwarf::DW_TAG_generic_subrange
, Buffer
);
1399 addDIEEntry(DwGenericSubrange
, dwarf::DW_AT_type
, *IndexTy
);
1401 int64_t DefaultLowerBound
= getDefaultLowerBound();
1403 auto AddBoundTypeEntry
= [&](dwarf::Attribute Attr
,
1404 DIGenericSubrange::BoundType Bound
) -> void {
1405 if (auto *BV
= dyn_cast_if_present
<DIVariable
*>(Bound
)) {
1406 if (auto *VarDIE
= getDIE(BV
))
1407 addDIEEntry(DwGenericSubrange
, Attr
, *VarDIE
);
1408 } else if (auto *BE
= dyn_cast_if_present
<DIExpression
*>(Bound
)) {
1409 if (BE
->isConstant() &&
1410 DIExpression::SignedOrUnsignedConstant::SignedConstant
==
1411 *BE
->isConstant()) {
1412 if (Attr
!= dwarf::DW_AT_lower_bound
|| DefaultLowerBound
== -1 ||
1413 static_cast<int64_t>(BE
->getElement(1)) != DefaultLowerBound
)
1414 addSInt(DwGenericSubrange
, Attr
, dwarf::DW_FORM_sdata
,
1417 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1418 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
1419 DwarfExpr
.setMemoryLocationKind();
1420 DwarfExpr
.addExpression(BE
);
1421 addBlock(DwGenericSubrange
, Attr
, DwarfExpr
.finalize());
1426 AddBoundTypeEntry(dwarf::DW_AT_lower_bound
, GSR
->getLowerBound());
1427 AddBoundTypeEntry(dwarf::DW_AT_count
, GSR
->getCount());
1428 AddBoundTypeEntry(dwarf::DW_AT_upper_bound
, GSR
->getUpperBound());
1429 AddBoundTypeEntry(dwarf::DW_AT_byte_stride
, GSR
->getStride());
1432 DIE
*DwarfUnit::getIndexTyDie() {
1435 // Construct an integer type to use for indexes.
1436 IndexTyDie
= &createAndAddDIE(dwarf::DW_TAG_base_type
, getUnitDie());
1437 StringRef Name
= "__ARRAY_SIZE_TYPE__";
1438 addString(*IndexTyDie
, dwarf::DW_AT_name
, Name
);
1439 addUInt(*IndexTyDie
, dwarf::DW_AT_byte_size
, std::nullopt
, sizeof(int64_t));
1440 addUInt(*IndexTyDie
, dwarf::DW_AT_encoding
, dwarf::DW_FORM_data1
,
1441 dwarf::getArrayIndexTypeEncoding(
1442 (dwarf::SourceLanguage
)getLanguage()));
1443 DD
->addAccelType(*this, CUNode
->getNameTableKind(), Name
, *IndexTyDie
,
1448 /// Returns true if the vector's size differs from the sum of sizes of elements
1449 /// the user specified. This can occur if the vector has been rounded up to
1450 /// fit memory alignment constraints.
1451 static bool hasVectorBeenPadded(const DICompositeType
*CTy
) {
1452 assert(CTy
&& CTy
->isVector() && "Composite type is not a vector");
1453 const uint64_t ActualSize
= CTy
->getSizeInBits();
1455 // Obtain the size of each element in the vector.
1456 DIType
*BaseTy
= CTy
->getBaseType();
1457 assert(BaseTy
&& "Unknown vector element type.");
1458 const uint64_t ElementSize
= BaseTy
->getSizeInBits();
1460 // Locate the number of elements in the vector.
1461 const DINodeArray Elements
= CTy
->getElements();
1462 assert(Elements
.size() == 1 &&
1463 Elements
[0]->getTag() == dwarf::DW_TAG_subrange_type
&&
1464 "Invalid vector element array, expected one element of type subrange");
1465 const auto Subrange
= cast
<DISubrange
>(Elements
[0]);
1466 const auto NumVecElements
=
1467 Subrange
->getCount()
1468 ? cast
<ConstantInt
*>(Subrange
->getCount())->getSExtValue()
1471 // Ensure we found the element count and that the actual size is wide
1472 // enough to contain the requested size.
1473 assert(ActualSize
>= (NumVecElements
* ElementSize
) && "Invalid vector size");
1474 return ActualSize
!= (NumVecElements
* ElementSize
);
1477 void DwarfUnit::constructArrayTypeDIE(DIE
&Buffer
, const DICompositeType
*CTy
) {
1478 if (CTy
->isVector()) {
1479 addFlag(Buffer
, dwarf::DW_AT_GNU_vector
);
1480 if (hasVectorBeenPadded(CTy
))
1481 addUInt(Buffer
, dwarf::DW_AT_byte_size
, std::nullopt
,
1482 CTy
->getSizeInBits() / CHAR_BIT
);
1485 if (DIVariable
*Var
= CTy
->getDataLocation()) {
1486 if (auto *VarDIE
= getDIE(Var
))
1487 addDIEEntry(Buffer
, dwarf::DW_AT_data_location
, *VarDIE
);
1488 } else if (DIExpression
*Expr
= CTy
->getDataLocationExp()) {
1489 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1490 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
1491 DwarfExpr
.setMemoryLocationKind();
1492 DwarfExpr
.addExpression(Expr
);
1493 addBlock(Buffer
, dwarf::DW_AT_data_location
, DwarfExpr
.finalize());
1496 if (DIVariable
*Var
= CTy
->getAssociated()) {
1497 if (auto *VarDIE
= getDIE(Var
))
1498 addDIEEntry(Buffer
, dwarf::DW_AT_associated
, *VarDIE
);
1499 } else if (DIExpression
*Expr
= CTy
->getAssociatedExp()) {
1500 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1501 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
1502 DwarfExpr
.setMemoryLocationKind();
1503 DwarfExpr
.addExpression(Expr
);
1504 addBlock(Buffer
, dwarf::DW_AT_associated
, DwarfExpr
.finalize());
1507 if (DIVariable
*Var
= CTy
->getAllocated()) {
1508 if (auto *VarDIE
= getDIE(Var
))
1509 addDIEEntry(Buffer
, dwarf::DW_AT_allocated
, *VarDIE
);
1510 } else if (DIExpression
*Expr
= CTy
->getAllocatedExp()) {
1511 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1512 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
1513 DwarfExpr
.setMemoryLocationKind();
1514 DwarfExpr
.addExpression(Expr
);
1515 addBlock(Buffer
, dwarf::DW_AT_allocated
, DwarfExpr
.finalize());
1518 if (auto *RankConst
= CTy
->getRankConst()) {
1519 addSInt(Buffer
, dwarf::DW_AT_rank
, dwarf::DW_FORM_sdata
,
1520 RankConst
->getSExtValue());
1521 } else if (auto *RankExpr
= CTy
->getRankExp()) {
1522 DIELoc
*Loc
= new (DIEValueAllocator
) DIELoc
;
1523 DIEDwarfExpression
DwarfExpr(*Asm
, getCU(), *Loc
);
1524 DwarfExpr
.setMemoryLocationKind();
1525 DwarfExpr
.addExpression(RankExpr
);
1526 addBlock(Buffer
, dwarf::DW_AT_rank
, DwarfExpr
.finalize());
1529 // Emit the element type.
1530 addType(Buffer
, CTy
->getBaseType());
1532 // Get an anonymous type for index type.
1533 // FIXME: This type should be passed down from the front end
1534 // as different languages may have different sizes for indexes.
1535 DIE
*IdxTy
= getIndexTyDie();
1537 // Add subranges to array type.
1538 DINodeArray Elements
= CTy
->getElements();
1539 for (DINode
*E
: Elements
) {
1540 // FIXME: Should this really be such a loose cast?
1541 if (auto *Element
= dyn_cast_or_null
<DINode
>(E
)) {
1542 if (Element
->getTag() == dwarf::DW_TAG_subrange_type
)
1543 constructSubrangeDIE(Buffer
, cast
<DISubrange
>(Element
), IdxTy
);
1544 else if (Element
->getTag() == dwarf::DW_TAG_generic_subrange
)
1545 constructGenericSubrangeDIE(Buffer
, cast
<DIGenericSubrange
>(Element
),
1551 void DwarfUnit::constructEnumTypeDIE(DIE
&Buffer
, const DICompositeType
*CTy
) {
1552 const DIType
*DTy
= CTy
->getBaseType();
1553 bool IsUnsigned
= DTy
&& DD
->isUnsignedDIType(DTy
);
1555 if (DD
->getDwarfVersion() >= 3)
1556 addType(Buffer
, DTy
);
1557 if (DD
->getDwarfVersion() >= 4 && (CTy
->getFlags() & DINode::FlagEnumClass
))
1558 addFlag(Buffer
, dwarf::DW_AT_enum_class
);
1561 auto *Context
= CTy
->getScope();
1562 bool IndexEnumerators
= !Context
|| isa
<DICompileUnit
>(Context
) || isa
<DIFile
>(Context
) ||
1563 isa
<DINamespace
>(Context
) || isa
<DICommonBlock
>(Context
);
1564 DINodeArray Elements
= CTy
->getElements();
1566 // Add enumerators to enumeration type.
1567 for (const DINode
*E
: Elements
) {
1568 auto *Enum
= dyn_cast_or_null
<DIEnumerator
>(E
);
1570 DIE
&Enumerator
= createAndAddDIE(dwarf::DW_TAG_enumerator
, Buffer
);
1571 StringRef Name
= Enum
->getName();
1572 addString(Enumerator
, dwarf::DW_AT_name
, Name
);
1573 addConstantValue(Enumerator
, Enum
->getValue(), IsUnsigned
);
1574 if (IndexEnumerators
)
1575 addGlobalName(Name
, Enumerator
, Context
);
1580 void DwarfUnit::constructContainingTypeDIEs() {
1581 for (auto &P
: ContainingTypeMap
) {
1582 DIE
&SPDie
= *P
.first
;
1583 const DINode
*D
= P
.second
;
1586 DIE
*NDie
= getDIE(D
);
1589 addDIEEntry(SPDie
, dwarf::DW_AT_containing_type
, *NDie
);
1593 DIE
&DwarfUnit::constructMemberDIE(DIE
&Buffer
, const DIDerivedType
*DT
) {
1594 DIE
&MemberDie
= createAndAddDIE(DT
->getTag(), Buffer
);
1595 StringRef Name
= DT
->getName();
1597 addString(MemberDie
, dwarf::DW_AT_name
, Name
);
1599 addAnnotation(MemberDie
, DT
->getAnnotations());
1601 if (DIType
*Resolved
= DT
->getBaseType())
1602 addType(MemberDie
, Resolved
);
1604 addSourceLine(MemberDie
, DT
);
1606 if (DT
->getTag() == dwarf::DW_TAG_inheritance
&& DT
->isVirtual()) {
1608 // For C++, virtual base classes are not at fixed offset. Use following
1609 // expression to extract appropriate offset from vtable.
1610 // BaseAddr = ObAddr + *((*ObAddr) - Offset)
1612 DIELoc
*VBaseLocationDie
= new (DIEValueAllocator
) DIELoc
;
1613 addUInt(*VBaseLocationDie
, dwarf::DW_FORM_data1
, dwarf::DW_OP_dup
);
1614 addUInt(*VBaseLocationDie
, dwarf::DW_FORM_data1
, dwarf::DW_OP_deref
);
1615 addUInt(*VBaseLocationDie
, dwarf::DW_FORM_data1
, dwarf::DW_OP_constu
);
1616 addUInt(*VBaseLocationDie
, dwarf::DW_FORM_udata
, DT
->getOffsetInBits());
1617 addUInt(*VBaseLocationDie
, dwarf::DW_FORM_data1
, dwarf::DW_OP_minus
);
1618 addUInt(*VBaseLocationDie
, dwarf::DW_FORM_data1
, dwarf::DW_OP_deref
);
1619 addUInt(*VBaseLocationDie
, dwarf::DW_FORM_data1
, dwarf::DW_OP_plus
);
1621 addBlock(MemberDie
, dwarf::DW_AT_data_member_location
, VBaseLocationDie
);
1623 uint64_t Size
= DT
->getSizeInBits();
1624 uint64_t FieldSize
= DD
->getBaseTypeSize(DT
);
1625 uint32_t AlignInBytes
= DT
->getAlignInBytes();
1626 uint64_t OffsetInBytes
;
1628 bool IsBitfield
= DT
->isBitField();
1630 // Handle bitfield, assume bytes are 8 bits.
1631 if (DD
->useDWARF2Bitfields())
1632 addUInt(MemberDie
, dwarf::DW_AT_byte_size
, std::nullopt
, FieldSize
/ 8);
1633 addUInt(MemberDie
, dwarf::DW_AT_bit_size
, std::nullopt
, Size
);
1635 uint64_t Offset
= DT
->getOffsetInBits();
1636 // We can't use DT->getAlignInBits() here: AlignInBits for member type
1637 // is non-zero if and only if alignment was forced (e.g. _Alignas()),
1638 // which can't be done with bitfields. Thus we use FieldSize here.
1639 uint32_t AlignInBits
= FieldSize
;
1640 uint32_t AlignMask
= ~(AlignInBits
- 1);
1641 // The bits from the start of the storage unit to the start of the field.
1642 uint64_t StartBitOffset
= Offset
- (Offset
& AlignMask
);
1643 // The byte offset of the field's aligned storage unit inside the struct.
1644 OffsetInBytes
= (Offset
- StartBitOffset
) / 8;
1646 if (DD
->useDWARF2Bitfields()) {
1647 uint64_t HiMark
= (Offset
+ FieldSize
) & AlignMask
;
1648 uint64_t FieldOffset
= (HiMark
- FieldSize
);
1649 Offset
-= FieldOffset
;
1651 // Maybe we need to work from the other end.
1652 if (Asm
->getDataLayout().isLittleEndian())
1653 Offset
= FieldSize
- (Offset
+ Size
);
1655 addUInt(MemberDie
, dwarf::DW_AT_bit_offset
, std::nullopt
, Offset
);
1656 OffsetInBytes
= FieldOffset
>> 3;
1658 addUInt(MemberDie
, dwarf::DW_AT_data_bit_offset
, std::nullopt
, Offset
);
1661 // This is not a bitfield.
1662 OffsetInBytes
= DT
->getOffsetInBits() / 8;
1664 addUInt(MemberDie
, dwarf::DW_AT_alignment
, dwarf::DW_FORM_udata
,
1668 if (DD
->getDwarfVersion() <= 2) {
1669 DIELoc
*MemLocationDie
= new (DIEValueAllocator
) DIELoc
;
1670 addUInt(*MemLocationDie
, dwarf::DW_FORM_data1
, dwarf::DW_OP_plus_uconst
);
1671 addUInt(*MemLocationDie
, dwarf::DW_FORM_udata
, OffsetInBytes
);
1672 addBlock(MemberDie
, dwarf::DW_AT_data_member_location
, MemLocationDie
);
1673 } else if (!IsBitfield
|| DD
->useDWARF2Bitfields()) {
1674 // In DWARF v3, DW_FORM_data4/8 in DW_AT_data_member_location are
1675 // interpreted as location-list pointers. Interpreting constants as
1676 // pointers is not expected, so we use DW_FORM_udata to encode the
1678 if (DD
->getDwarfVersion() == 3)
1679 addUInt(MemberDie
, dwarf::DW_AT_data_member_location
,
1680 dwarf::DW_FORM_udata
, OffsetInBytes
);
1682 addUInt(MemberDie
, dwarf::DW_AT_data_member_location
, std::nullopt
,
1687 addAccess(MemberDie
, DT
->getFlags());
1689 if (DT
->isVirtual())
1690 addUInt(MemberDie
, dwarf::DW_AT_virtuality
, dwarf::DW_FORM_data1
,
1691 dwarf::DW_VIRTUALITY_virtual
);
1693 // Objective-C properties.
1694 if (DINode
*PNode
= DT
->getObjCProperty())
1695 if (DIE
*PDie
= getDIE(PNode
))
1696 addAttribute(MemberDie
, dwarf::DW_AT_APPLE_property
,
1697 dwarf::DW_FORM_ref4
, DIEEntry(*PDie
));
1699 if (DT
->isArtificial())
1700 addFlag(MemberDie
, dwarf::DW_AT_artificial
);
1705 DIE
*DwarfUnit::getOrCreateStaticMemberDIE(const DIDerivedType
*DT
) {
1709 // Construct the context before querying for the existence of the DIE in case
1710 // such construction creates the DIE.
1711 DIE
*ContextDIE
= getOrCreateContextDIE(DT
->getScope());
1712 assert(dwarf::isType(ContextDIE
->getTag()) &&
1713 "Static member should belong to a type.");
1715 if (DIE
*StaticMemberDIE
= getDIE(DT
))
1716 return StaticMemberDIE
;
1718 DIE
&StaticMemberDIE
= createAndAddDIE(DT
->getTag(), *ContextDIE
, DT
);
1720 const DIType
*Ty
= DT
->getBaseType();
1722 addString(StaticMemberDIE
, dwarf::DW_AT_name
, DT
->getName());
1723 addType(StaticMemberDIE
, Ty
);
1724 addSourceLine(StaticMemberDIE
, DT
);
1725 addFlag(StaticMemberDIE
, dwarf::DW_AT_external
);
1726 addFlag(StaticMemberDIE
, dwarf::DW_AT_declaration
);
1728 // FIXME: We could omit private if the parent is a class_type, and
1729 // public if the parent is something else.
1730 addAccess(StaticMemberDIE
, DT
->getFlags());
1732 if (const ConstantInt
*CI
= dyn_cast_or_null
<ConstantInt
>(DT
->getConstant()))
1733 addConstantValue(StaticMemberDIE
, CI
, Ty
);
1734 if (const ConstantFP
*CFP
= dyn_cast_or_null
<ConstantFP
>(DT
->getConstant()))
1735 addConstantFPValue(StaticMemberDIE
, CFP
);
1737 if (uint32_t AlignInBytes
= DT
->getAlignInBytes())
1738 addUInt(StaticMemberDIE
, dwarf::DW_AT_alignment
, dwarf::DW_FORM_udata
,
1741 return &StaticMemberDIE
;
1744 void DwarfUnit::emitCommonHeader(bool UseOffsets
, dwarf::UnitType UT
) {
1745 // Emit size of content not including length itself
1746 if (!DD
->useSectionsAsReferences())
1747 EndLabel
= Asm
->emitDwarfUnitLength(
1748 isDwoUnit() ? "debug_info_dwo" : "debug_info", "Length of Unit");
1750 Asm
->emitDwarfUnitLength(getHeaderSize() + getUnitDie().getSize(),
1753 Asm
->OutStreamer
->AddComment("DWARF version number");
1754 unsigned Version
= DD
->getDwarfVersion();
1755 Asm
->emitInt16(Version
);
1757 // DWARF v5 reorders the address size and adds a unit type.
1759 Asm
->OutStreamer
->AddComment("DWARF Unit Type");
1761 Asm
->OutStreamer
->AddComment("Address Size (in bytes)");
1762 Asm
->emitInt8(Asm
->MAI
->getCodePointerSize());
1765 // We share one abbreviations table across all units so it's always at the
1766 // start of the section. Use a relocatable offset where needed to ensure
1767 // linking doesn't invalidate that offset.
1768 Asm
->OutStreamer
->AddComment("Offset Into Abbrev. Section");
1769 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
1771 Asm
->emitDwarfLengthOrOffset(0);
1773 Asm
->emitDwarfSymbolReference(
1774 TLOF
.getDwarfAbbrevSection()->getBeginSymbol(), false);
1777 Asm
->OutStreamer
->AddComment("Address Size (in bytes)");
1778 Asm
->emitInt8(Asm
->MAI
->getCodePointerSize());
1782 void DwarfTypeUnit::emitHeader(bool UseOffsets
) {
1783 if (!DD
->useSplitDwarf()) {
1784 LabelBegin
= Asm
->createTempSymbol("tu_begin");
1785 Asm
->OutStreamer
->emitLabel(LabelBegin
);
1787 DwarfUnit::emitCommonHeader(UseOffsets
,
1788 DD
->useSplitDwarf() ? dwarf::DW_UT_split_type
1789 : dwarf::DW_UT_type
);
1790 Asm
->OutStreamer
->AddComment("Type Signature");
1791 Asm
->OutStreamer
->emitIntValue(TypeSignature
, sizeof(TypeSignature
));
1792 Asm
->OutStreamer
->AddComment("Type DIE Offset");
1793 // In a skeleton type unit there is no type DIE so emit a zero offset.
1794 Asm
->emitDwarfLengthOrOffset(Ty
? Ty
->getOffset() : 0);
1797 void DwarfUnit::addSectionDelta(DIE
&Die
, dwarf::Attribute Attribute
,
1798 const MCSymbol
*Hi
, const MCSymbol
*Lo
) {
1799 addAttribute(Die
, Attribute
, DD
->getDwarfSectionOffsetForm(),
1800 new (DIEValueAllocator
) DIEDelta(Hi
, Lo
));
1803 void DwarfUnit::addSectionLabel(DIE
&Die
, dwarf::Attribute Attribute
,
1804 const MCSymbol
*Label
, const MCSymbol
*Sec
) {
1805 if (Asm
->doesDwarfUseRelocationsAcrossSections())
1806 addLabel(Die
, Attribute
, DD
->getDwarfSectionOffsetForm(), Label
);
1808 addSectionDelta(Die
, Attribute
, Label
, Sec
);
1811 bool DwarfTypeUnit::isDwoUnit() const {
1812 // Since there are no skeleton type units, all type units are dwo type units
1813 // when split DWARF is being used.
1814 return DD
->useSplitDwarf();
1817 void DwarfTypeUnit::addGlobalName(StringRef Name
, const DIE
&Die
,
1818 const DIScope
*Context
) {
1819 getCU().addGlobalNameForTypeUnit(Name
, Context
);
1822 void DwarfTypeUnit::addGlobalType(const DIType
*Ty
, const DIE
&Die
,
1823 const DIScope
*Context
) {
1824 getCU().addGlobalTypeUnitType(Ty
, Context
);
1827 const MCSymbol
*DwarfUnit::getCrossSectionRelativeBaseAddress() const {
1828 if (!Asm
->doesDwarfUseRelocationsAcrossSections())
1832 return getSection()->getBeginSymbol();
1835 void DwarfUnit::addStringOffsetsStart() {
1836 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
1837 addSectionLabel(getUnitDie(), dwarf::DW_AT_str_offsets_base
,
1838 DU
->getStringOffsetsStartSym(),
1839 TLOF
.getDwarfStrOffSection()->getBeginSymbol());
1842 void DwarfUnit::addRnglistsBase() {
1843 assert(DD
->getDwarfVersion() >= 5 &&
1844 "DW_AT_rnglists_base requires DWARF version 5 or later");
1845 const TargetLoweringObjectFile
&TLOF
= Asm
->getObjFileLowering();
1846 addSectionLabel(getUnitDie(), dwarf::DW_AT_rnglists_base
,
1847 DU
->getRnglistsTableBaseSym(),
1848 TLOF
.getDwarfRnglistsSection()->getBeginSymbol());
1851 void DwarfTypeUnit::finishNonUnitTypeDIE(DIE
& D
, const DICompositeType
*CTy
) {
1852 DD
->getAddressPool().resetUsedFlag(true);
1855 bool DwarfUnit::isCompatibleWithVersion(uint16_t Version
) const {
1856 return !Asm
->TM
.Options
.DebugStrictDwarf
|| DD
->getDwarfVersion() >= Version
;