LLVM 24.0.0git
DWARFLinkerUnit.h
Go to the documentation of this file.
1//===- DWARFLinkerUnit.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_DWARFLINKERUNIT_H
10#define LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERUNIT_H
11
13#include "OutputSections.h"
14#include "llvm/CodeGen/DIE.h"
19#include "llvm/Support/LEB128.h"
20#include <memory>
21#include <mutex>
22
23namespace llvm {
24namespace dwarf_linker {
25namespace parallel {
26
27class DwarfUnit;
29
30/// Base class for all Dwarf units(Compile unit/Type table unit).
31class DwarfUnit : public OutputSections {
32public:
33 virtual ~DwarfUnit() = default;
38
39 /// Unique id of the unit.
40 unsigned getUniqueID() const { return ID; }
41
42 /// Returns size of this(newly generated) compile unit.
43 uint64_t getUnitSize() const { return UnitSize; }
44
45 /// Returns this unit name.
46 StringRef getUnitName() const { return UnitName; }
47
48 /// Return the DW_AT_LLVM_sysroot of the compile unit or an empty StringRef.
50
51 /// Return true if this compile unit is from Clang module.
52 bool isClangModule() const { return !ClangModuleName.empty(); }
53
54 /// Return Clang module name;
55 const std::string &getClangModuleName() const { return ClangModuleName; }
56
57 /// Return global data.
59
60 /// Returns true if unit is inter-connected(it references/referenced by other
61 /// unit).
62 bool isInterconnectedCU() const { return IsInterconnectedCU; }
63
64 /// Mark this unit as inter-connected(it references/referenced by other unit).
66
67 /// Adds \p Abbrev into unit`s abbreviation table.
68 void assignAbbrev(DIEAbbrev &Abbrev);
69
70 /// Returns abbreviations for this compile unit.
71 const std::vector<std::unique_ptr<DIEAbbrev>> &getAbbreviations() const {
72 return Abbreviations;
73 }
74
75 /// Returns output unit DIE.
77
78 /// Set output unit DIE.
79 void setOutUnitDIE(DIE *UnitDie) {
80 OutUnitDIE = UnitDie;
81
82 if (OutUnitDIE != nullptr) {
84 UnitTag = OutUnitDIE->getTag();
85 }
86 }
87
88 /// Returns unit DWARF tag.
89 dwarf::Tag getTag() const { return UnitTag; }
90
91 /// \defgroup Methods used to emit unit's debug info:
92 ///
93 /// @{
94 /// Emit unit's abbreviations.
96
97 /// Emit .debug_info section for unit DIEs.
98 Error emitDebugInfo(const Triple &TargetTriple);
99
100 /// Emit .debug_line section. When \p OrigRowIndices is non-empty it
101 /// must be the same length as \p OutLineTable.Rows and carry the input
102 /// row index each output row originated from (or an invalid-row
103 /// sentinel for manufactured end-of-range rows); if
104 /// \p RowIndexToSeqStartOffset is non-null, the emitter populates it
105 /// with an entry for each real row mapping input row index to the
106 /// byte offset of the DW_LNE_set_address that opens the output
107 /// sequence containing the row.
109 const Triple &TargetTriple, const DWARFDebugLine::LineTable &OutLineTable,
110 ArrayRef<uint64_t> OrigRowIndices = {},
111 DenseMap<uint64_t, uint64_t> *RowIndexToSeqStartOffset = nullptr);
112
113 /// Emit the .debug_str_offsets section for current unit.
115 /// @}
116
117 /// \defgroup Methods used for reporting warnings and errors:
118 ///
119 /// @{
120 void warn(const Twine &Warning) { GlobalData.warn(Warning, getUnitName()); }
121
122 void error(const Twine &Err) { GlobalData.warn(Err, getUnitName()); }
123 /// @}
124
125 /// \defgroup Methods and data members used for building accelerator tables:
126 ///
127 /// @{
128
130
131 /// This structure keeps fields which would be used for creating accelerator
132 /// table.
133 struct AccelInfo {
135 AvoidForPubSections = false;
137 }
138
139 /// Name of the entry.
140 StringEntry *String = nullptr;
141
142 /// Output offset of the DIE this entry describes.
144
145 /// Output offset of the enclosing non-declaration DIE, used for the
146 /// DW_IDX_parent field of DWARF 5 name index entries.
147 std::optional<uint64_t> ParentOffset;
148
149 /// Hash of the fully qualified name.
151
152 /// Tag of the DIE this entry describes.
153 dwarf::Tag Tag = dwarf::DW_TAG_null;
154
155 /// Type of this accelerator record.
157
158 /// Avoid emitting this entry for pub sections.
160
161 /// Is this an ObjC class implementation?
163 };
164
165 /// Emit .debug_pubnames and .debug_pubtypes for \p Unit.
166 void emitPubAccelerators();
167
168 /// Enumerates accelerator data.
169 virtual void
171
172 /// @}
173
174 /// Returns index(inside .debug_str_offsets) of specified string.
176 return DebugStringIndexMap.getValueIndex(String);
177 }
178
179protected:
180 /// Emit single abbreviation entry.
181 void emitDwarfAbbrevEntry(const DIEAbbrev &Abbrev,
182 SectionDescriptor &AbbrevSection);
183
184 /// Emit single pubnames/pubtypes accelerator entry.
185 std::optional<uint64_t>
186 emitPubAcceleratorEntry(SectionDescriptor &OutSection, const AccelInfo &Info,
187 std::optional<uint64_t> LengthOffset);
188
189 /// Unique ID for the unit.
190 unsigned ID = 0;
191
192 /// The name of this unit.
193 std::string UnitName;
194
195 /// The DW_AT_LLVM_sysroot of this unit.
196 std::string SysRoot;
197
198 /// If this is a Clang module, this holds the module's name.
199 std::string ClangModuleName;
200
202
203 /// DWARF unit tag.
204 dwarf::Tag UnitTag = dwarf::DW_TAG_null;
205
206 /// true if current unit references_to/is_referenced by other unit.
207 std::atomic<bool> IsInterconnectedCU = {false};
208
209 /// FoldingSet that uniques the abbreviations.
211
212 /// Storage for the unique Abbreviations.
213 std::vector<std::unique_ptr<DIEAbbrev>> Abbreviations;
214
215 /// Output unit DIE.
216 DIE *OutUnitDIE = nullptr;
217
218 /// Cache for file names for this unit. Entries are heap-allocated so the
219 /// StringRefs handed out by getDirAndFilenameFromLineTable keep pointing at
220 /// valid storage when a later insertion rehashes the map.
224
225 /// Guards FileNames. During the parallel type-name assignment phase a unit's
226 /// cache is filled both by its own worker and, through cross-unit type-name
227 /// references, by other units' workers, so access must be serialized.
228 std::mutex FileNamesMutex;
229
230 /// Maps a string into the index inside .debug_str_offsets section.
232};
233
234inline bool isODRLanguage(uint16_t Language) {
235 switch (Language) {
236 case dwarf::DW_LANG_C_plus_plus:
237 case dwarf::DW_LANG_C_plus_plus_03:
238 case dwarf::DW_LANG_C_plus_plus_11:
239 case dwarf::DW_LANG_C_plus_plus_14:
240 case dwarf::DW_LANG_ObjC_plus_plus:
241 return true;
242 default:
243 return false;
244 };
245
246 return false;
247}
248
249} // end of namespace parallel
250} // end of namespace dwarf_linker
251} // end of namespace llvm
252
253#endif // LLVM_LIB_DWARFLINKER_PARALLEL_DWARFLINKERUNIT_H
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Dwarf abbreviation, describes the organization of a debug information object.
Definition DIE.h:80
A structured debug information entry.
Definition DIE.h:840
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
This template class is used to instantiate a specialized implementation of the folding set to the nod...
Definition FoldingSet.h:529
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
This class stores values sequentually and assigns index to the each value.
Base class for all Dwarf units(Compile unit/Type table unit).
unsigned getUniqueID() const
Unique id of the unit.
std::string UnitName
The name of this unit.
DenseMap< uint64_t, std::unique_ptr< std::pair< std::string, std::string > > > FileNamesCache
Cache for file names for this unit.
LinkingGlobalData & getGlobalData()
Return global data.
std::vector< std::unique_ptr< DIEAbbrev > > Abbreviations
Storage for the unique Abbreviations.
dwarf::Tag getTag() const
Returns unit DWARF tag.
std::string SysRoot
The DW_AT_LLVM_sysroot of this unit.
bool isClangModule() const
Return true if this compile unit is from Clang module.
uint64_t getUnitSize() const
Returns size of this(newly generated) compile unit.
void assignAbbrev(DIEAbbrev &Abbrev)
Adds Abbrev into unit`s abbreviation table.
void setInterconnectedCU()
Mark this unit as inter-connected(it references/referenced by other unit).
std::mutex FileNamesMutex
Guards FileNames.
IndexedValuesMap< const StringEntry * > DebugStringIndexMap
Maps a string into the index inside .debug_str_offsets section.
std::optional< uint64_t > emitPubAcceleratorEntry(SectionDescriptor &OutSection, const AccelInfo &Info, std::optional< uint64_t > LengthOffset)
Emit single pubnames/pubtypes accelerator entry.
unsigned ID
Unique ID for the unit.
StringRef getUnitName() const
Returns this unit name.
const std::string & getClangModuleName() const
Return Clang module name;.
std::atomic< bool > IsInterconnectedCU
true if current unit references_to/is_referenced by other unit.
void setOutUnitDIE(DIE *UnitDie)
Set output unit DIE.
DwarfUnit(LinkingGlobalData &GlobalData, unsigned ID, StringRef ClangModuleName)
std::string ClangModuleName
If this is a Clang module, this holds the module's name.
bool isInterconnectedCU() const
Returns true if unit is inter-connected(it references/referenced by other unit).
virtual uint64_t getDebugStrIndex(const StringEntry *String)
Returns index(inside .debug_str_offsets) of specified string.
const std::vector< std::unique_ptr< DIEAbbrev > > & getAbbreviations() const
Returns abbreviations for this compile unit.
void emitDwarfAbbrevEntry(const DIEAbbrev &Abbrev, SectionDescriptor &AbbrevSection)
Emit single abbreviation entry.
FoldingSet< DIEAbbrev > AbbreviationsSet
FoldingSet that uniques the abbreviations.
StringRef getSysRoot()
Return the DW_AT_LLVM_sysroot of the compile unit or an empty StringRef.
DIE * getOutUnitDIE()
Returns output unit DIE.
This class keeps data and services common for the whole linking process.
OutputSections(LinkingGlobalData &GlobalData)
uint16_t getDebugInfoHeaderSize() const
Return size of header of debug_info table.
An efficient, type-erasing, non-owning reference to a callable.
Error emitDebugInfo(const Triple &TargetTriple)
Emit .debug_info section for unit DIEs.
Error emitDebugLine(const Triple &TargetTriple, const DWARFDebugLine::LineTable &OutLineTable, ArrayRef< uint64_t > OrigRowIndices={}, DenseMap< uint64_t, uint64_t > *RowIndexToSeqStartOffset=nullptr)
Emit .debug_line section.
Error emitDebugStringOffsetSection()
Emit the .debug_str_offsets section for current unit.
virtual void forEachAcceleratorRecord(function_ref< void(AccelInfo &)> Handler)=0
Enumerates accelerator data.
void emitPubAccelerators()
Emit .debug_pubnames and .debug_pubtypes for Unit.
bool isODRLanguage(uint16_t Language)
DenseMap< uint64_t, DwarfUnit * > MacroOffset2UnitMapTy
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.
This structure keeps fields which would be used for creating accelerator table.
bool AvoidForPubSections
Avoid emitting this entry for pub sections.
std::optional< uint64_t > ParentOffset
Output offset of the enclosing non-declaration DIE, used for the DW_IDX_parent field of DWARF 5 name ...
uint64_t OutOffset
Output offset of the DIE this entry describes.
AccelType Type
Type of this accelerator record.
uint32_t QualifiedNameHash
Hash of the fully qualified name.
bool ObjcClassImplementation
Is this an ObjC class implementation?
dwarf::Tag Tag
Tag of the DIE this entry describes.
This structure is used to keep data of the concrete section.