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"
14#include "DWARFLinkerCompileUnit.h"
15#include "DWARFLinkerGlobalData.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.
24struct AttributesInfo {
25 /// Short Name.
26 StringEntry *Name = nullptr;
27
28 /// Mangled Name.
29 StringEntry *MangledName = nullptr;
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?
41 bool HasStringOffsetBaseAttr = false;
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.
47class DIEAttributeCloner {
48public:
49 DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, CompileUnit *OutUnit,
50 const DWARFDebugInfoEntry *InputDieEntry,
51 DIEGenerator &Generator,
52 std::optional<int64_t> FuncAddressAdjustment,
53 std::optional<int64_t> VarAddressAdjustment,
54 bool HasLocationExpressionAddress)
55 : DIEAttributeCloner(OutDIE, InUnit,
56 CompileUnit::OutputUnitVariantPtr(OutUnit),
57 InputDieEntry, Generator, FuncAddressAdjustment,
58 VarAddressAdjustment, HasLocationExpressionAddress) {
59 }
60
61 DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit, TypeUnit *OutUnit,
62 const DWARFDebugInfoEntry *InputDieEntry,
63 DIEGenerator &Generator,
64 std::optional<int64_t> FuncAddressAdjustment,
65 std::optional<int64_t> VarAddressAdjustment,
66 bool HasLocationExpressionAddress)
67 : DIEAttributeCloner(OutDIE, InUnit,
68 CompileUnit::OutputUnitVariantPtr(OutUnit),
69 InputDieEntry, Generator, FuncAddressAdjustment,
70 VarAddressAdjustment, HasLocationExpressionAddress) {
71 }
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.
80 AttributesInfo AttrInfo;
81
82 unsigned getOutOffset() { return AttrOutOffset; }
83
84protected:
85 DIEAttributeCloner(DIE *OutDIE, CompileUnit &InUnit,
86 CompileUnit::OutputUnitVariantPtr OutUnit,
87 const DWARFDebugInfoEntry *InputDieEntry,
88 DIEGenerator &Generator,
89 std::optional<int64_t> FuncAddressAdjustment,
90 std::optional<int64_t> VarAddressAdjustment,
91 bool HasLocationExpressionAddress)
92 : OutDIE(OutDIE), InUnit(InUnit), OutUnit(OutUnit),
93 DebugInfoOutputSection(
94 OutUnit->getSectionDescriptor(SectionKind: DebugSectionKind::DebugInfo)),
95 InputDieEntry(InputDieEntry), Generator(Generator),
96 FuncAddressAdjustment(FuncAddressAdjustment),
97 VarAddressAdjustment(VarAddressAdjustment),
98 HasLocationExpressionAddress(HasLocationExpressionAddress) {
99 InputDIEIdx = InUnit.getDIEIndex(Die: 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
111 cloneStringAttr(const DWARFFormValue &Val,
112 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);
113
114 /// Clone attribute referencing another DIE.
115 size_t
116 cloneDieRefAttr(const DWARFFormValue &Val,
117 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);
118
119 /// Clone scalar attribute.
120 size_t
121 cloneScalarAttr(const DWARFFormValue &Val,
122 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);
123
124 /// Clone block or exprloc attribute.
125 size_t
126 cloneBlockAttr(const DWARFFormValue &Val,
127 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);
128
129 /// Clone address attribute.
130 size_t
131 cloneAddressAttr(const DWARFFormValue &Val,
132 const DWARFAbbreviationDeclaration::AttributeSpec &AttrSpec);
133
134 /// Returns true if attribute should be skipped.
135 bool
136 shouldSkipAttribute(DWARFAbbreviationDeclaration::AttributeSpec AttrSpec);
137
138 /// Output DIE.
139 DIE *OutDIE = nullptr;
140
141 /// Input compilation unit.
142 CompileUnit &InUnit;
143
144 /// Output unit(either "plain" compilation unit, either artificial type unit).
145 CompileUnit::OutputUnitVariantPtr OutUnit;
146
147 /// .debug_info section descriptor.
148 SectionDescriptor &DebugInfoOutputSection;
149
150 /// Input DIE entry.
151 const DWARFDebugInfoEntry *InputDieEntry = nullptr;
152
153 /// Input DIE index.
154 uint32_t InputDIEIdx = 0;
155
156 /// Output DIE generator.
157 DIEGenerator &Generator;
158
159 /// Relocation adjustment for the function address ranges.
160 std::optional<int64_t> FuncAddressAdjustment;
161
162 /// Relocation adjustment for the variable locations.
163 std::optional<int64_t> VarAddressAdjustment;
164
165 /// Indicates whether InputDieEntry has an location attribute
166 /// containg address expression.
167 bool HasLocationExpressionAddress = false;
168
169 /// Output offset after all attributes.
170 unsigned AttrOutOffset = 0;
171
172 /// Patches for the cloned attributes.
173 OffsetsPtrVector PatchesOffsets;
174
175 /// This flag forces using DW_FORM_strp for string attributes.
176 bool Use_DW_FORM_strp = false;
177};
178
179} // end of namespace parallel
180} // end of namespace dwarf_linker
181} // end of namespace llvm
182
183#endif // LLVM_LIB_DWARFLINKER_PARALLEL_DIEATTRIBUTECLONER_H
184