1 //===- llvm/CodeGen/DwarfCompileUnit.h - Dwarf Compile Unit -----*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file contains support for writing dwarf compile unit.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H
14 #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H
16 #include "DwarfDebug.h"
17 #include "DwarfUnit.h"
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/ADT/StringMap.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/BinaryFormat/Dwarf.h"
24 #include "llvm/CodeGen/DbgEntityHistoryCalculator.h"
25 #include "llvm/CodeGen/LexicalScopes.h"
26 #include "llvm/IR/DebugInfoMetadata.h"
27 #include "llvm/Support/Casting.h"
44 enum class UnitKind
{ Skeleton
, Full
};
46 class DwarfCompileUnit final
: public DwarfUnit
{
47 /// A numeric ID unique among all CUs in the module
49 bool HasRangeLists
= false;
51 /// The start of the unit line section, this is also
52 /// reused in appyStmtList.
53 MCSymbol
*LineTableStartSym
;
55 /// Skeleton unit associated with this unit.
56 DwarfCompileUnit
*Skeleton
= nullptr;
58 /// The start of the unit within its section.
59 MCSymbol
*LabelBegin
= nullptr;
61 /// The start of the unit macro info within macro section.
62 MCSymbol
*MacroLabelBegin
;
64 using ImportedEntityList
= SmallVector
<const MDNode
*, 8>;
65 using ImportedEntityMap
= DenseMap
<const MDNode
*, ImportedEntityList
>;
67 ImportedEntityMap ImportedEntities
;
69 /// GlobalNames - A map of globally visible named entities for this unit.
70 StringMap
<const DIE
*> GlobalNames
;
72 /// GlobalTypes - A map of globally visible types for this unit.
73 StringMap
<const DIE
*> GlobalTypes
;
75 // List of ranges for a given compile unit.
76 SmallVector
<RangeSpan
, 2> CURanges
;
78 // The base address of this unit, if any. Used for relative references in
80 const MCSymbol
*BaseAddress
= nullptr;
82 DenseMap
<const MDNode
*, DIE
*> AbstractSPDies
;
83 DenseMap
<const DINode
*, std::unique_ptr
<DbgEntity
>> AbstractEntities
;
85 /// DWO ID for correlating skeleton and split units.
88 const DIFile
*LastFile
= nullptr;
91 /// Construct a DIE for the given DbgVariable without initializing the
92 /// DbgVariable's DIE reference.
93 DIE
*constructVariableDIEImpl(const DbgVariable
&DV
, bool Abstract
);
95 bool isDwoUnit() const override
;
97 DenseMap
<const MDNode
*, DIE
*> &getAbstractSPDies() {
98 if (isDwoUnit() && !DD
->shareAcrossDWOCUs())
99 return AbstractSPDies
;
100 return DU
->getAbstractSPDies();
103 DenseMap
<const DINode
*, std::unique_ptr
<DbgEntity
>> &getAbstractEntities() {
104 if (isDwoUnit() && !DD
->shareAcrossDWOCUs())
105 return AbstractEntities
;
106 return DU
->getAbstractEntities();
109 void finishNonUnitTypeDIE(DIE
& D
, const DICompositeType
*CTy
) override
;
112 DwarfCompileUnit(unsigned UID
, const DICompileUnit
*Node
, AsmPrinter
*A
,
113 DwarfDebug
*DW
, DwarfFile
*DWU
,
114 UnitKind Kind
= UnitKind::Full
);
116 bool hasRangeLists() const { return HasRangeLists
; }
117 unsigned getUniqueID() const { return UniqueID
; }
119 DwarfCompileUnit
*getSkeleton() const {
123 bool includeMinimalInlineScopes() const;
127 /// Apply the DW_AT_stmt_list from this compile unit to the specified DIE.
128 void applyStmtList(DIE
&D
);
130 /// Get line table start symbol for this unit.
131 MCSymbol
*getLineTableStartSym() const { return LineTableStartSym
; }
133 /// A pair of GlobalVariable and DIExpression.
135 const GlobalVariable
*Var
;
136 const DIExpression
*Expr
;
140 BaseTypeRef(unsigned BitSize
, dwarf::TypeKind Encoding
) :
141 BitSize(BitSize
), Encoding(Encoding
) {}
143 dwarf::TypeKind Encoding
;
147 std::vector
<BaseTypeRef
> ExprRefedBaseTypes
;
149 /// Get or create global variable DIE.
151 getOrCreateGlobalVariableDIE(const DIGlobalVariable
*GV
,
152 ArrayRef
<GlobalExpr
> GlobalExprs
);
154 DIE
*getOrCreateCommonBlock(const DICommonBlock
*CB
,
155 ArrayRef
<GlobalExpr
> GlobalExprs
);
157 void addLocationAttribute(DIE
*ToDIE
, const DIGlobalVariable
*GV
,
158 ArrayRef
<GlobalExpr
> GlobalExprs
);
160 /// addLabelAddress - Add a dwarf label attribute data and value using
161 /// either DW_FORM_addr or DW_FORM_GNU_addr_index.
162 void addLabelAddress(DIE
&Die
, dwarf::Attribute Attribute
,
163 const MCSymbol
*Label
);
165 /// addLocalLabelAddress - Add a dwarf label attribute data and value using
166 /// DW_FORM_addr only.
167 void addLocalLabelAddress(DIE
&Die
, dwarf::Attribute Attribute
,
168 const MCSymbol
*Label
);
170 DwarfCompileUnit
&getCU() override
{ return *this; }
172 unsigned getOrCreateSourceID(const DIFile
*File
) override
;
174 void addImportedEntity(const DIImportedEntity
* IE
) {
175 DIScope
*Scope
= IE
->getScope();
176 assert(Scope
&& "Invalid Scope encoding!");
177 if (!isa
<DILocalScope
>(Scope
))
178 // No need to add imported enities that are not local declaration.
181 auto *LocalScope
= cast
<DILocalScope
>(Scope
)->getNonLexicalBlockFileScope();
182 ImportedEntities
[LocalScope
].push_back(IE
);
185 /// addRange - Add an address range to the list of ranges for this unit.
186 void addRange(RangeSpan Range
);
188 void attachLowHighPC(DIE
&D
, const MCSymbol
*Begin
, const MCSymbol
*End
);
190 /// Find DIE for the given subprogram and attach appropriate
191 /// DW_AT_low_pc and DW_AT_high_pc attributes. If there are global
192 /// variables in this scope then create and insert DIEs for these
194 DIE
&updateSubprogramScopeDIE(const DISubprogram
*SP
);
196 void constructScopeDIE(LexicalScope
*Scope
, DIE
&ParentScopeDIE
);
198 /// A helper function to construct a RangeSpanList for a given
200 void addScopeRangeList(DIE
&ScopeDIE
, SmallVector
<RangeSpan
, 2> Range
);
202 void attachRangesOrLowHighPC(DIE
&D
, SmallVector
<RangeSpan
, 2> Ranges
);
204 void attachRangesOrLowHighPC(DIE
&D
,
205 const SmallVectorImpl
<InsnRange
> &Ranges
);
207 /// This scope represents inlined body of a function. Construct
208 /// DIE to represent this concrete inlined copy of the function.
209 DIE
*constructInlinedScopeDIE(LexicalScope
*Scope
);
211 /// Construct new DW_TAG_lexical_block for this scope and
212 /// attach DW_AT_low_pc/DW_AT_high_pc labels.
213 DIE
*constructLexicalScopeDIE(LexicalScope
*Scope
);
215 /// constructVariableDIE - Construct a DIE for the given DbgVariable.
216 DIE
*constructVariableDIE(DbgVariable
&DV
, bool Abstract
= false);
218 DIE
*constructVariableDIE(DbgVariable
&DV
, const LexicalScope
&Scope
,
219 DIE
*&ObjectPointer
);
221 /// Construct a DIE for the given DbgLabel.
222 DIE
*constructLabelDIE(DbgLabel
&DL
, const LexicalScope
&Scope
);
224 void createBaseTypeDIEs();
226 /// Construct a DIE for this subprogram scope.
227 DIE
&constructSubprogramScopeDIE(const DISubprogram
*Sub
,
228 LexicalScope
*Scope
);
230 DIE
*createAndAddScopeChildren(LexicalScope
*Scope
, DIE
&ScopeDIE
);
232 void constructAbstractSubprogramScopeDIE(LexicalScope
*Scope
);
234 /// Whether to use the GNU analog for a DWARF5 tag, attribute, or location
235 /// atom. Only applicable when emitting otherwise DWARF4-compliant debug info.
236 bool useGNUAnalogForDwarf5Feature() const;
238 /// This takes a DWARF 5 tag and returns it or a GNU analog.
239 dwarf::Tag
getDwarf5OrGNUTag(dwarf::Tag Tag
) const;
241 /// This takes a DWARF 5 attribute and returns it or a GNU analog.
242 dwarf::Attribute
getDwarf5OrGNUAttr(dwarf::Attribute Attr
) const;
244 /// This takes a DWARF 5 location atom and either returns it or a GNU analog.
245 dwarf::LocationAtom
getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc
) const;
247 /// Construct a call site entry DIE describing a call within \p Scope to a
248 /// callee described by \p CalleeSP.
249 /// \p IsTail specifies whether the call is a tail call.
250 /// \p PCAddr points to the PC value after the call instruction.
251 /// \p CallAddr points to the PC value at the call instruction (or is null).
252 /// \p CallReg is a register location for an indirect call. For direct calls
253 /// the \p CallReg is set to 0.
254 DIE
&constructCallSiteEntryDIE(DIE
&ScopeDIE
, const DISubprogram
*CalleeSP
,
255 bool IsTail
, const MCSymbol
*PCAddr
,
256 const MCSymbol
*CallAddr
, unsigned CallReg
);
257 /// Construct call site parameter DIEs for the \p CallSiteDIE. The \p Params
258 /// were collected by the \ref collectCallSiteParameters.
259 /// Note: The order of parameters does not matter, since debuggers recognize
260 /// call site parameters by the DW_AT_location attribute.
261 void constructCallSiteParmEntryDIEs(DIE
&CallSiteDIE
,
262 SmallVector
<DbgCallSiteParam
, 4> &Params
);
264 /// Construct import_module DIE.
265 DIE
*constructImportedEntityDIE(const DIImportedEntity
*Module
);
267 void finishSubprogramDefinition(const DISubprogram
*SP
);
268 void finishEntityDefinition(const DbgEntity
*Entity
);
270 /// Find abstract variable associated with Var.
271 using InlinedEntity
= DbgValueHistoryMap::InlinedEntity
;
272 DbgEntity
*getExistingAbstractEntity(const DINode
*Node
);
273 void createAbstractEntity(const DINode
*Node
, LexicalScope
*Scope
);
275 /// Set the skeleton unit associated with this unit.
276 void setSkeleton(DwarfCompileUnit
&Skel
) { Skeleton
= &Skel
; }
278 unsigned getHeaderSize() const override
{
279 // DWARF v5 added the DWO ID to the header for split/skeleton units.
281 DD
->getDwarfVersion() >= 5 && DD
->useSplitDwarf() ? sizeof(uint64_t)
283 return DwarfUnit::getHeaderSize() + DWOIdSize
;
285 unsigned getLength() {
286 return Asm
->getUnitLengthFieldByteSize() + // Length field
287 getHeaderSize() + getUnitDie().getSize();
290 void emitHeader(bool UseOffsets
) override
;
292 /// Add the DW_AT_addr_base attribute to the unit DIE.
293 void addAddrTableBase();
295 MCSymbol
*getLabelBegin() const {
296 assert(LabelBegin
&& "LabelBegin is not initialized");
300 MCSymbol
*getMacroLabelBegin() const {
301 return MacroLabelBegin
;
304 /// Add a new global name to the compile unit.
305 void addGlobalName(StringRef Name
, const DIE
&Die
,
306 const DIScope
*Context
) override
;
308 /// Add a new global name present in a type unit to this compile unit.
309 void addGlobalNameForTypeUnit(StringRef Name
, const DIScope
*Context
);
311 /// Add a new global type to the compile unit.
312 void addGlobalType(const DIType
*Ty
, const DIE
&Die
,
313 const DIScope
*Context
) override
;
315 /// Add a new global type present in a type unit to this compile unit.
316 void addGlobalTypeUnitType(const DIType
*Ty
, const DIScope
*Context
);
318 const StringMap
<const DIE
*> &getGlobalNames() const { return GlobalNames
; }
319 const StringMap
<const DIE
*> &getGlobalTypes() const { return GlobalTypes
; }
321 /// Add DW_AT_location attribute for a DbgVariable based on provided
323 void addVariableAddress(const DbgVariable
&DV
, DIE
&Die
,
324 MachineLocation Location
);
325 /// Add an address attribute to a die based on the location provided.
326 void addAddress(DIE
&Die
, dwarf::Attribute Attribute
,
327 const MachineLocation
&Location
);
329 /// Start with the address based on the location provided, and generate the
330 /// DWARF information necessary to find the actual variable (navigating the
331 /// extra location information encoded in the type) based on the starting
332 /// location. Add the DWARF information to the die.
333 void addComplexAddress(const DbgVariable
&DV
, DIE
&Die
,
334 dwarf::Attribute Attribute
,
335 const MachineLocation
&Location
);
337 /// Add a Dwarf loclistptr attribute data and value.
338 void addLocationList(DIE
&Die
, dwarf::Attribute Attribute
, unsigned Index
);
339 void applyVariableAttributes(const DbgVariable
&Var
, DIE
&VariableDie
);
341 /// Add a Dwarf expression attribute data and value.
342 void addExpr(DIELoc
&Die
, dwarf::Form Form
, const MCExpr
*Expr
);
344 void applySubprogramAttributesToDefinition(const DISubprogram
*SP
,
347 void applyLabelAttributes(const DbgLabel
&Label
, DIE
&LabelDie
);
349 /// getRanges - Get the list of ranges for this unit.
350 const SmallVectorImpl
<RangeSpan
> &getRanges() const { return CURanges
; }
351 SmallVector
<RangeSpan
, 2> takeRanges() { return std::move(CURanges
); }
353 void setBaseAddress(const MCSymbol
*Base
) { BaseAddress
= Base
; }
354 const MCSymbol
*getBaseAddress() const { return BaseAddress
; }
356 uint64_t getDWOId() const { return DWOId
; }
357 void setDWOId(uint64_t DwoId
) { DWOId
= DwoId
; }
359 bool hasDwarfPubSections() const;
361 void addBaseTypeRef(DIEValueList
&Die
, int64_t Idx
);
364 } // end namespace llvm
366 #endif // LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H