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
unsigned uint64_t
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
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:48
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.
FoldingSetImpl< T, Trait > FoldingSet
This template class is used to instantiate a specialized implementation of the folding set to the nod...
Definition FoldingSet.h:560
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.