LLVM 24.0.0git
DIEAttributeCloner.h
Go to the documentation of this file.
1//===- DIEAttributeCloner.h -------------------------------------*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIB_DWARFLINKER_PARALLEL_DIEATTRIBUTECLONER_H
10#define LLVM_LIB_DWARFLINKER_PARALLEL_DIEATTRIBUTECLONER_H
11
12#include "ArrayList.h"
13#include "DIEGenerator.h"
16#include "DWARFLinkerTypeUnit.h"
17
18namespace llvm {
19namespace dwarf_linker {
20namespace parallel {
21
22/// Information gathered and exchanged between the various
23/// clone*Attr helpers about the attributes of a particular DIE.
25 /// Short Name.
26 StringEntry *Name = nullptr;
27
28 /// Mangled Name.
30
31 /// Does the DIE have an address pointing to live code section?
32 bool HasLiveAddress = false;
33
34 /// Is this DIE only a declaration?
35 bool IsDeclaration = false;
36
37 /// Does the DIE have a ranges attribute?
38 bool HasRanges = false;
39
40 /// Does the DIE have a string offset attribute?
42};
43
44/// This class creates clones of input DIE attributes.
45/// It enumerates attributes of input DIE, creates clone for each
46/// attribute, adds cloned attribute to the output DIE.
48public:
60
72
73 /// Clone attributes of input DIE.
74 void clone();
75
76 /// Create abbreviations for the output DIE after all attributes are cloned.
77 unsigned finalizeAbbreviations(bool HasChildrenToClone);
78
79 /// Cannot be used concurrently.
81
82 unsigned getOutOffset() { return AttrOutOffset; }
83
84protected:
89 std::optional<int64_t> FuncAddressAdjustment,
90 std::optional<int64_t> VarAddressAdjustment,
94 OutUnit->getSectionDescriptor(DebugSectionKind::DebugInfo)),
99 InputDIEIdx = InUnit.getDIEIndex(InputDieEntry);
100
101 // Use DW_FORM_strp form for string attributes for DWARF version less than 5
102 // or if output unit is type unit and attributes are cloned in parallel
103 // (debug_str_offsets ordering would be non-deterministic otherwise).
104 Use_DW_FORM_strp = (InUnit.getVersion() < 5) ||
105 (OutUnit.isTypeUnit() &&
106 InUnit.getGlobalData().getOptions().Threads != 1);
107 }
108
109 /// Clone string attribute.
110 size_t
113
114 /// Clone attribute referencing another DIE.
115 size_t
118
119 /// Clone scalar attribute.
120 size_t
123
124 /// Clone block or exprloc attribute.
125 size_t
128
129 /// Clone address attribute.
130 size_t
133
134 /// Returns the input DIE's DW_AT_high_pc value \p HighPC, constrained so the
135 /// code range it ends stays clear of the symbol the linker places next. \p
136 /// IsLength tells whether high_pc is encoded as a length rather than an
137 /// address.
138 ///
139 /// A scope nested in a function inherits the overrun of the function, so it
140 /// is constrained as well.
141 uint64_t constrainHighPC(uint64_t HighPC, bool IsLength);
142
143 /// Returns true if attribute should be skipped.
144 bool
146
147 /// Output DIE.
148 DIE *OutDIE = nullptr;
149
150 /// Input compilation unit.
152
153 /// Output unit(either "plain" compilation unit, either artificial type unit).
155
156 /// .debug_info section descriptor.
158
159 /// Input DIE entry.
161
162 /// Input DIE index.
164
165 /// Output DIE generator.
167
168 /// Relocation adjustment for the function address ranges.
169 std::optional<int64_t> FuncAddressAdjustment;
170
171 /// Relocation adjustment for the variable locations.
172 std::optional<int64_t> VarAddressAdjustment;
173
174 /// Indicates whether InputDieEntry has an location attribute
175 /// containg address expression.
177
178 /// Output offset after all attributes.
179 unsigned AttrOutOffset = 0;
180
181 /// Patches for the cloned attributes.
183
184 /// This flag forces using DW_FORM_strp for string attributes.
185 bool Use_DW_FORM_strp = false;
186};
187
188} // end of namespace parallel
189} // end of namespace dwarf_linker
190} // end of namespace llvm
191
192#endif // LLVM_LIB_DWARFLINKER_PARALLEL_DIEATTRIBUTECLONER_H
A structured debug information entry.
Definition DIE.h:840
DWARFDebugInfoEntry - A DIE with only the minimum required data.
Stores all information related to a compile unit, be it in its original instance of the object file o...
size_t cloneBlockAttr(const DWARFFormValue &Val, const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec)
Clone block or exprloc attribute.
AttributesInfo AttrInfo
Cannot be used concurrently.
CompileUnit & InUnit
Input compilation unit.
bool HasLocationExpressionAddress
Indicates whether InputDieEntry has an location attribute containg address expression.
SectionDescriptor & DebugInfoOutputSection
.debug_info section descriptor.
unsigned finalizeAbbreviations(bool HasChildrenToClone)
Create abbreviations for the output DIE after all attributes are cloned.
unsigned AttrOutOffset
Output offset after all attributes.
DIEGenerator & Generator
Output DIE generator.
size_t cloneScalarAttr(const DWARFFormValue &Val, const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec)
Clone scalar attribute.
OffsetsPtrVector PatchesOffsets
Patches for the cloned attributes.
size_t cloneDieRefAttr(const DWARFFormValue &Val, const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec)
Clone attribute referencing another DIE.
DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, CompileUnit *OutUnit, const DWARFDebugInfoEntry *InputDieEntry, DIEGenerator &Generator, std::optional< int64_t > FuncAddressAdjustment, std::optional< int64_t > VarAddressAdjustment, bool HasLocationExpressionAddress)
bool shouldSkipAttribute(DWARFAbbreviationDeclaration::AttributeSpec AttrSpec)
Returns true if attribute should be skipped.
size_t cloneStringAttr(const DWARFFormValue &Val, const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec)
Clone string attribute.
DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, CompileUnit::OutputUnitVariantPtr OutUnit, const DWARFDebugInfoEntry *InputDieEntry, DIEGenerator &Generator, std::optional< int64_t > FuncAddressAdjustment, std::optional< int64_t > VarAddressAdjustment, bool HasLocationExpressionAddress)
const DWARFDebugInfoEntry * InputDieEntry
Input DIE entry.
std::optional< int64_t > FuncAddressAdjustment
Relocation adjustment for the function address ranges.
CompileUnit::OutputUnitVariantPtr OutUnit
Output unit(either "plain" compilation unit, either artificial type unit).
size_t cloneAddressAttr(const DWARFFormValue &Val, const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec)
Clone address attribute.
std::optional< int64_t > VarAddressAdjustment
Relocation adjustment for the variable locations.
uint64_t constrainHighPC(uint64_t HighPC, bool IsLength)
Returns the input DIE's DW_AT_high_pc value HighPC, constrained so the code range it ends stays clear...
bool Use_DW_FORM_strp
This flag forces using DW_FORM_strp for string attributes.
DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, TypeUnit *OutUnit, const DWARFDebugInfoEntry *InputDieEntry, DIEGenerator &Generator, std::optional< int64_t > FuncAddressAdjustment, std::optional< int64_t > VarAddressAdjustment, bool HasLocationExpressionAddress)
This class is a helper to create output DIE tree.
Type Unit is used to represent an artificial compilation unit which keeps all type information.
SmallVector< uint64_t * > OffsetsPtrVector
Type for list of pointers to patches offsets.
DebugSectionKind
List of tracked debug tables.
StringMapEntry< EmptyStringSetTag > StringEntry
StringEntry keeps data of the string: the length, external offset and a string body which is placed r...
Definition StringPool.h:23
This is an optimization pass for GlobalISel generic memory operations.
Information gathered and exchanged between the various clone*Attr helpers about the attributes of a p...
bool IsDeclaration
Is this DIE only a declaration?
bool HasRanges
Does the DIE have a ranges attribute?
bool HasLiveAddress
Does the DIE have an address pointing to live code section?
bool HasStringOffsetBaseAttr
Does the DIE have a string offset attribute?
This structure is used to keep data of the concrete section.