LLVM 24.0.0git
AccelTable.h
Go to the documentation of this file.
1//==- include/llvm/CodeGen/AccelTable.h - Accelerator Tables -----*- 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/// \file
9/// This file contains support for writing accelerator tables.
10///
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CODEGEN_ACCELTABLE_H
14#define LLVM_CODEGEN_ACCELTABLE_H
15
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/MapVector.h"
19#include "llvm/ADT/StringRef.h"
21#include "llvm/CodeGen/DIE.h"
25#include "llvm/Support/DJB.h"
26#include "llvm/Support/Debug.h"
27#include <cstdint>
28#include <variant>
29#include <vector>
30
31/// \file
32/// The DWARF and Apple accelerator tables are an indirect hash table optimized
33/// for null lookup rather than access to known data. The Apple accelerator
34/// tables are a precursor of the newer DWARF v5 accelerator tables. Both
35/// formats share common design ideas.
36///
37/// The Apple accelerator table are output into an on-disk format that looks
38/// like this:
39///
40/// .------------------.
41/// | HEADER |
42/// |------------------|
43/// | BUCKETS |
44/// |------------------|
45/// | HASHES |
46/// |------------------|
47/// | OFFSETS |
48/// |------------------|
49/// | DATA |
50/// `------------------'
51///
52/// The header contains a magic number, version, type of hash function,
53/// the number of buckets, total number of hashes, and room for a special struct
54/// of data and the length of that struct.
55///
56/// The buckets contain an index (e.g. 6) into the hashes array. The hashes
57/// section contains all of the 32-bit hash values in contiguous memory, and the
58/// offsets contain the offset into the data area for the particular hash.
59///
60/// For a lookup example, we could hash a function name and take it modulo the
61/// number of buckets giving us our bucket. From there we take the bucket value
62/// as an index into the hashes table and look at each successive hash as long
63/// as the hash value is still the same modulo result (bucket value) as earlier.
64/// If we have a match we look at that same entry in the offsets table and grab
65/// the offset in the data for our final match.
66///
67/// The DWARF v5 accelerator table consists of zero or more name indices that
68/// are output into an on-disk format that looks like this:
69///
70/// .------------------.
71/// | HEADER |
72/// |------------------|
73/// | CU LIST |
74/// |------------------|
75/// | LOCAL TU LIST |
76/// |------------------|
77/// | FOREIGN TU LIST |
78/// |------------------|
79/// | HASH TABLE |
80/// |------------------|
81/// | NAME TABLE |
82/// |------------------|
83/// | ABBREV TABLE |
84/// |------------------|
85/// | ENTRY POOL |
86/// `------------------'
87///
88/// For the full documentation please refer to the DWARF 5 standard.
89///
90///
91/// This file defines the class template AccelTable, which is represents an
92/// abstract view of an Accelerator table, without any notion of an on-disk
93/// layout. This class is parameterized by an entry type, which should derive
94/// from AccelTableData. This is the type of individual entries in the table,
95/// and it should store the data necessary to emit them. AppleAccelTableData is
96/// the base class for Apple Accelerator Table entries, which have a uniform
97/// structure based on a sequence of Atoms. There are different sub-classes
98/// derived from AppleAccelTable, which differ in the set of Atoms and how they
99/// obtain their values.
100///
101/// An Apple Accelerator Table can be serialized by calling emitAppleAccelTable
102/// function.
103
104namespace llvm {
105
106class AsmPrinter;
107class DwarfDebug;
108class DwarfTypeUnit;
109class MCSymbol;
110class raw_ostream;
111
112/// Interface which the different types of accelerator table data have to
113/// conform. It serves as a base class for different values of the template
114/// argument of the AccelTable class template.
116public:
117 virtual ~AccelTableData() = default;
118
119 bool operator<(const AccelTableData &Other) const {
120 return order() < Other.order();
121 }
122
123 // Subclasses should implement:
124 // static uint32_t hash(StringRef Name);
125
126#ifndef NDEBUG
127 virtual void print(raw_ostream &OS) const = 0;
128#endif
129protected:
130 virtual uint64_t order() const = 0;
131};
132
133/// A base class holding non-template-dependant functionality of the AccelTable
134/// class. Clients should not use this class directly but rather instantiate
135/// AccelTable with a type derived from AccelTableData.
137public:
139
140 /// Represents a group of entries with identical name (and hence, hash value).
141 struct HashData {
144 std::vector<AccelTableData *> Values;
146
147 /// Get all AccelTableData cast as a `T`.
148 template <typename T = AccelTableData *> auto getValues() const {
149 static_assert(std::is_pointer<T>());
150 static_assert(
151 std::is_base_of<AccelTableData, std::remove_pointer_t<T>>());
152 return map_range(
153 Values, [](AccelTableData *Data) { return static_cast<T>(Data); });
154 }
155
156#ifndef NDEBUG
157 LLVM_ABI void print(raw_ostream &OS) const;
158 void dump() const { print(dbgs()); }
159#endif
160 };
161 using HashList = std::vector<HashData *>;
162 using BucketList = std::vector<HashList>;
163
164protected:
165 /// Allocator for HashData and Values.
167
170
174
177
179
181
182public:
183 LLVM_ABI void finalize(AsmPrinter *Asm, StringRef Prefix);
187 uint32_t getUniqueNameCount() const { return Entries.size(); }
188
189#ifndef NDEBUG
190 LLVM_ABI void print(raw_ostream &OS) const;
191 void dump() const { print(dbgs()); }
192#endif
193
195 void operator=(const AccelTableBase &) = delete;
196};
197
198/// This class holds an abstract representation of an Accelerator Table,
199/// consisting of a sequence of buckets, each bucket containint a sequence of
200/// HashData entries. The class is parameterized by the type of entries it
201/// holds. The type template parameter also defines the hash function to use for
202/// hashing names.
203template <typename DataT> class AccelTable : public AccelTableBase {
204public:
205 AccelTable() : AccelTableBase(DataT::hash) {}
206
207 template <typename... Types>
208 void addName(DwarfStringPoolEntryRef Name, Types &&... Args);
209 void clear() { Entries.clear(); }
210 const StringEntries getEntries() const { return Entries; }
211};
212
213template <typename AccelTableDataT>
214template <typename... Types>
216 Types &&... Args) {
217 assert(Buckets.empty() && "Already finalized!");
218 // If the string is in the list already then add this die to the list
219 // otherwise add a new one.
220 auto &It = Entries[Name.getString()];
221 if (It.Values.empty()) {
222 It.Name = Name;
223 It.HashValue = Hash(Name.getString());
224 }
225 It.Values.push_back(new (Allocator)
226 AccelTableDataT(std::forward<Types>(Args)...));
227}
228
229/// A base class for different implementations of Data classes for Apple
230/// Accelerator Tables. The columns in the table are defined by the static Atoms
231/// variable defined on the subclasses.
233public:
234 /// An Atom defines the form of the data in an Apple accelerator table.
235 /// Conceptually it is a column in the accelerator consisting of a type and a
236 /// specification of the form of its data.
237 struct Atom {
238 /// Atom Type.
240 /// DWARF Form.
242
244
245#ifndef NDEBUG
246 LLVM_ABI void print(raw_ostream &OS) const;
247 void dump() const { print(dbgs()); }
248#endif
249 };
250 // Subclasses should define:
251 // static constexpr Atom Atoms[];
252
253 virtual void emit(AsmPrinter *Asm) const = 0;
254
255 static uint32_t hash(StringRef Buffer) { return djbHash(Buffer); }
256};
257
258/// Helper class to identify an entry in DWARF5AccelTable based on their DIE
259/// offset and UnitID.
263 bool IsTU = false;
264 OffsetAndUnitID() = delete;
267 uint64_t offset() const { return Offset; };
268 uint32_t unitID() const { return UnitID; };
269 bool isTU() const { return IsTU; }
270};
271
272template <> struct DenseMapInfo<OffsetAndUnitID> {
273 static unsigned getHashValue(const OffsetAndUnitID &Val) {
274 return (unsigned)llvm::hash_combine(Val.offset(), Val.unitID(), Val.IsTU);
275 }
276 static bool isEqual(const OffsetAndUnitID &LHS, const OffsetAndUnitID &RHS) {
277 return LHS.offset() == RHS.offset() && LHS.unitID() == RHS.unitID() &&
278 LHS.IsTU == RHS.isTU();
279 }
280};
281
282/// The Data class implementation for DWARF v5 accelerator table. Unlike the
283/// Apple Data classes, this class is just a DIE wrapper, and does not know to
284/// serialize itself. The complete serialization logic is in the
285/// emitDWARF5AccelTable function.
287public:
288 static uint32_t hash(StringRef Name) { return caseFoldingDjbHash(Name); }
289
290 DWARF5AccelTableData(const DIE &Die, const uint32_t UnitID, const bool IsTU);
292 const std::optional<uint64_t> DefiningParentOffset,
293 const unsigned DieTag, const unsigned UnitID,
294 const bool IsTU)
295 : OffsetVal(DieOffset), ParentOffset(DefiningParentOffset),
297
298#ifndef NDEBUG
299 void print(raw_ostream &OS) const override;
300#endif
301
303 assert(isNormalized() && "Accessing DIE Offset before normalizing.");
304 return std::get<uint64_t>(OffsetVal);
305 }
306
308 return {getDieOffset(), getUnitID(), isTU()};
309 }
310
311 unsigned getDieTag() const { return DieTag; }
312 unsigned getUnitID() const { return UnitID; }
313 bool isTU() const { return IsTU; }
315 assert(!isNormalized() && "Accessing offset after normalizing.");
316 const DIE *Entry = std::get<const DIE *>(OffsetVal);
318 OffsetVal = Entry->getOffset();
319 }
320 bool isNormalized() const {
321 return std::holds_alternative<uint64_t>(OffsetVal);
322 }
323
324 std::optional<uint64_t> getParentDieOffset() const {
325 if (auto OffsetAndId = getParentDieOffsetAndUnitID())
326 return OffsetAndId->offset();
327 return {};
328 }
329
330 std::optional<OffsetAndUnitID> getParentDieOffsetAndUnitID() const {
331 assert(isNormalized() && "Accessing DIE Offset before normalizing.");
332 if (!ParentOffset)
333 return std::nullopt;
335 }
336
337 /// Sets AbbrevIndex for an Entry.
338 void setAbbrevNumber(uint16_t AbbrevNum) { AbbrevNumber = AbbrevNum; }
339
340 /// Returns AbbrevIndex for an Entry.
342
343 /// If `Die` has a non-null parent and the parent is not a declaration,
344 /// return its offset.
345 static std::optional<uint64_t> getDefiningParentDieOffset(const DIE &Die);
346
347protected:
348 std::variant<const DIE *, uint64_t> OffsetVal;
349 std::optional<uint64_t> ParentOffset;
354 uint64_t order() const override { return getDieOffset(); }
355};
356
358public:
366 /// Add attribute encoding to an abbreviation.
368 AttrVect.push_back(Attr);
369 }
370 /// Set abbreviation tag index.
371 void setNumber(uint32_t AbbrevNumber) { Number = AbbrevNumber; }
372 /// Get abbreviation tag index.
373 uint32_t getNumber() const { return Number; }
374 /// Get DIE Tag.
375 uint32_t getDieTag() const { return DieTag; }
376 /// Used to gather unique data for the abbreviation folding set.
377 LLVM_ABI void Profile(FoldingSetNodeID &ID) const;
378 /// Returns attributes for an abbreviation.
380 return AttrVect;
381 }
382
383private:
385};
386
388 // Symbol for start of the TU section or signature if this is SplitDwarf.
389 std::variant<MCSymbol *, uint64_t> LabelOrSignature;
390 // Unique ID of Type Unit.
391 unsigned UniqueID;
392};
394class DWARF5AccelTable : public AccelTable<DWARF5AccelTableData> {
395 // Symbols to start of all the TU sections that were generated.
396 TUVectorTy TUSymbolsOrHashes;
397
398public:
403 /// Returns type units that were constructed.
404 const TUVectorTy &getTypeUnitsSymbols() { return TUSymbolsOrHashes; }
405 /// Add a type unit start symbol.
407 /// Add a type unit Signature.
409 /// Convert DIE entries to explicit offset.
410 /// Needs to be called after DIE offsets are computed.
412 for (auto &Entry : Entries) {
413 for (auto *Data : Entry.second.getValues<DWARF5AccelTableData *>()) {
414 // For TU we normalize as each Unit is emitted.
415 // So when this is invoked after CU construction we will be in mixed
416 // state.
417 if (!Data->isNormalized())
418 Data->normalizeDIEToOffset();
419 }
420 }
421 }
422
424 for (auto &Entry : Table.getEntries()) {
425 for (auto *Data : Entry.second.getValues<DWARF5AccelTableData *>()) {
426 addName(Entry.second.Name, Data->getDieOffset(),
427 Data->getParentDieOffset(), Data->getDieTag(),
428 Data->getUnitID(), Data->isTU());
429 }
430 }
431 }
432};
433
434LLVM_ABI void
435emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents,
436 StringRef Prefix, const MCSymbol *SecBegin,
438
439/// Emit an Apple Accelerator Table consisting of entries in the specified
440/// AccelTable. The DataT template parameter should be derived from
441/// AppleAccelTableData.
442template <typename DataT>
444 StringRef Prefix, const MCSymbol *SecBegin) {
445 static_assert(std::is_convertible<DataT *, AppleAccelTableData *>::value);
446 emitAppleAccelTableImpl(Asm, Contents, Prefix, SecBegin, DataT::Atoms);
447}
448
449LLVM_ABI void
450emitDWARF5AccelTable(AsmPrinter *Asm, DWARF5AccelTable &Contents,
451 const DwarfDebug &DD,
452 ArrayRef<std::unique_ptr<DwarfCompileUnit>> CUs);
453
454/// Emit a DWARFv5 Accelerator Table consisting of entries in the specified
455/// AccelTable. The \p CUs contains either symbols keeping offsets to the
456/// start of compilation unit, either offsets to the start of compilation
457/// unit themselves.
459 AsmPrinter *Asm, DWARF5AccelTable &Contents,
460 ArrayRef<std::variant<MCSymbol *, uint64_t>> CUs,
461 llvm::function_ref<std::optional<DWARF5AccelTable::UnitIndexAndEncoding>(
462 const DWARF5AccelTableData &)>
463 getIndexForEntry);
464
465/// Accelerator table data implementation for simple Apple accelerator tables
466/// with just a DIE reference.
468public:
470
471 void emit(AsmPrinter *Asm) const override;
472
473 static constexpr Atom Atoms[] = {
474 Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)};
475
476#ifndef NDEBUG
477 void print(raw_ostream &OS) const override;
478#endif
479protected:
480 uint64_t order() const override { return Die.getOffset(); }
481
482 const DIE &Die;
483};
484
485/// Accelerator table data implementation for Apple type accelerator tables.
487public:
489
490 void emit(AsmPrinter *Asm) const override;
491
492 static constexpr Atom Atoms[] = {
493 Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
494 Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
495 Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
496
497#ifndef NDEBUG
498 void print(raw_ostream &OS) const override;
499#endif
500};
501
502/// Accelerator table data implementation for simple Apple accelerator tables
503/// with a DIE offset but no actual DIE pointer.
505public:
507
508 void emit(AsmPrinter *Asm) const override;
509
510 static constexpr Atom Atoms[] = {
511 Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)};
512
513#ifndef NDEBUG
514 void print(raw_ostream &OS) const override;
515#endif
516protected:
517 uint64_t order() const override { return Offset; }
518
520};
521
522/// Accelerator table data implementation for type accelerator tables with
523/// a DIE offset but no actual DIE pointer.
526public:
533
534 void emit(AsmPrinter *Asm) const override;
535
536 static constexpr Atom Atoms[] = {
537 Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
538 Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
539 Atom(5, dwarf::DW_FORM_data1), Atom(6, dwarf::DW_FORM_data4)};
540
541#ifndef NDEBUG
542 void print(raw_ostream &OS) const override;
543#endif
544protected:
545 uint64_t order() const override { return Offset; }
546
550};
551
552} // end namespace llvm
553
554#endif // LLVM_CODEGEN_ACCELTABLE_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
arc branch finalize
This file defines the BumpPtrAllocator interface.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_ABI
Definition Compiler.h:211
This file contains constants used for implementing Dwarf debug support.
Load MIR Sample Profile
This file implements a map that provides insertion order iteration.
#define T
Value * RHS
Value * LHS
uint32_t getUniqueNameCount() const
Definition AccelTable.h:187
std::vector< HashData * > HashList
Definition AccelTable.h:161
std::vector< HashList > BucketList
Definition AccelTable.h:162
BumpPtrAllocator Allocator
Allocator for HashData and Values.
Definition AccelTable.h:166
void operator=(const AccelTableBase &)=delete
LLVM_ABI void computeBucketCount()
uint32_t getUniqueHashCount() const
Definition AccelTable.h:186
LLVM_ABI void print(raw_ostream &OS) const
void dump() const
Definition AccelTable.h:191
AccelTableBase(const AccelTableBase &)=delete
AccelTableBase(HashFn *Hash)
Definition AccelTable.h:180
MapVector< StringRef, HashData > StringEntries
Definition AccelTable.h:168
ArrayRef< HashList > getBuckets() const
Definition AccelTable.h:184
uint32_t getBucketCount() const
Definition AccelTable.h:185
uint32_t(StringRef) HashFn
Definition AccelTable.h:138
StringEntries Entries
Definition AccelTable.h:169
Interface which the different types of accelerator table data have to conform.
Definition AccelTable.h:115
virtual uint64_t order() const =0
virtual ~AccelTableData()=default
virtual void print(raw_ostream &OS) const =0
bool operator<(const AccelTableData &Other) const
Definition AccelTable.h:119
This class holds an abstract representation of an Accelerator Table, consisting of a sequence of buck...
Definition AccelTable.h:203
const StringEntries getEntries() const
Definition AccelTable.h:210
void addName(DwarfStringPoolEntryRef Name, Types &&... Args)
Definition AccelTable.h:215
A base class for different implementations of Data classes for Apple Accelerator Tables.
Definition AccelTable.h:232
virtual void emit(AsmPrinter *Asm) const =0
static uint32_t hash(StringRef Buffer)
Definition AccelTable.h:255
uint64_t order() const override
Definition AccelTable.h:480
AppleAccelTableOffsetData(const DIE &D)
Definition AccelTable.h:469
static constexpr Atom Atoms[]
Definition AccelTable.h:473
AppleAccelTableStaticOffsetData(uint32_t Offset)
Definition AccelTable.h:506
static constexpr Atom Atoms[]
Definition AccelTable.h:510
uint64_t order() const override
Definition AccelTable.h:517
uint64_t order() const override
Definition AccelTable.h:545
static constexpr Atom Atoms[]
Definition AccelTable.h:536
AppleAccelTableStaticTypeData(uint32_t Offset, uint16_t Tag, bool ObjCClassIsImplementation, uint32_t QualifiedNameHash)
Definition AccelTable.h:527
static constexpr Atom Atoms[]
Definition AccelTable.h:492
AppleAccelTableTypeData(const DIE &D)
Definition AccelTable.h:488
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
This class is intended to be used as a driving class for all asm writers.
Definition AsmPrinter.h:95
A structured debug information entry.
Definition DIE.h:835
The Data class implementation for DWARF v5 accelerator table.
Definition AccelTable.h:286
static uint32_t hash(StringRef Name)
Definition AccelTable.h:288
unsigned getDieTag() const
Definition AccelTable.h:311
std::optional< OffsetAndUnitID > getParentDieOffsetAndUnitID() const
Definition AccelTable.h:330
std::optional< uint64_t > getParentDieOffset() const
Definition AccelTable.h:324
std::variant< const DIE *, uint64_t > OffsetVal
Definition AccelTable.h:348
DWARF5AccelTableData(const DIE &Die, const uint32_t UnitID, const bool IsTU)
unsigned getUnitID() const
Definition AccelTable.h:312
void setAbbrevNumber(uint16_t AbbrevNum)
Sets AbbrevIndex for an Entry.
Definition AccelTable.h:338
uint64_t order() const override
Definition AccelTable.h:354
OffsetAndUnitID getDieOffsetAndUnitID() const
Definition AccelTable.h:307
static std::optional< uint64_t > getDefiningParentDieOffset(const DIE &Die)
If Die has a non-null parent and the parent is not a declaration, return its offset.
DWARF5AccelTableData(const uint64_t DieOffset, const std::optional< uint64_t > DefiningParentOffset, const unsigned DieTag, const unsigned UnitID, const bool IsTU)
Definition AccelTable.h:291
uint16_t getAbbrevNumber() const
Returns AbbrevIndex for an Entry.
Definition AccelTable.h:341
uint64_t getDieOffset() const
Definition AccelTable.h:302
std::optional< uint64_t > ParentOffset
Definition AccelTable.h:349
LLVM_ABI void addTypeUnitSignature(DwarfTypeUnit &U)
Add a type unit Signature.
void convertDieToOffset()
Convert DIE entries to explicit offset.
Definition AccelTable.h:411
const TUVectorTy & getTypeUnitsSymbols()
Returns type units that were constructed.
Definition AccelTable.h:404
LLVM_ABI void addTypeUnitSymbol(DwarfTypeUnit &U)
Add a type unit start symbol.
void addTypeEntries(DWARF5AccelTable &Table)
Definition AccelTable.h:423
void addAttribute(const DebugNamesAbbrev::AttributeEncoding &Attr)
Add attribute encoding to an abbreviation.
Definition AccelTable.h:367
void setNumber(uint32_t AbbrevNumber)
Set abbreviation tag index.
Definition AccelTable.h:371
const SmallVector< AttributeEncoding, 1 > & getAttributes() const
Returns attributes for an abbreviation.
Definition AccelTable.h:379
uint32_t getNumber() const
Get abbreviation tag index.
Definition AccelTable.h:373
uint32_t getDieTag() const
Get DIE Tag.
Definition AccelTable.h:375
DebugNamesAbbrev(uint32_t DieTag)
Definition AccelTable.h:365
Collects and handles dwarf debug information.
Definition DwarfDebug.h:352
DwarfStringPoolEntryRef: Dwarf string pool entry reference.
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:162
FoldingSetNode()=default
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
@ DW_ATOM_type_flags
Definition Dwarf.h:1042
@ DW_ATOM_die_tag
Definition Dwarf.h:1041
@ DW_ATOM_die_offset
Marker as the end of a list of atoms.
Definition Dwarf.h:1038
This is an optimization pass for GlobalISel generic memory operations.
SmallVector< TypeUnitMetaInfo, 1 > TUVectorTy
Definition AccelTable.h:393
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:366
LLVM_ABI void emitAppleAccelTableImpl(AsmPrinter *Asm, AccelTableBase &Contents, StringRef Prefix, const MCSymbol *SecBegin, ArrayRef< AppleAccelTableData::Atom > Atoms)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
@ Other
Any other memory.
Definition ModRef.h:68
void emitAppleAccelTable(AsmPrinter *Asm, AccelTable< DataT > &Contents, StringRef Prefix, const MCSymbol *SecBegin)
Emit an Apple Accelerator Table consisting of entries in the specified AccelTable.
Definition AccelTable.h:443
LLVM_ABI uint32_t caseFoldingDjbHash(StringRef Buffer, uint32_t H=5381)
Computes the Bernstein hash after folding the input according to the Dwarf 5 standard case folding ru...
Definition DJB.cpp:72
ArrayRef(const T &OneElt) -> ArrayRef< T >
uint32_t djbHash(StringRef Buffer, uint32_t H=5381)
The Bernstein hash function used by the DWARF accelerator tables.
Definition DJB.h:22
LLVM_ABI void emitDWARF5AccelTable(AsmPrinter *Asm, DWARF5AccelTable &Contents, const DwarfDebug &DD, ArrayRef< std::unique_ptr< DwarfCompileUnit > > CUs)
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition Hashing.h:307
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:391
Represents a group of entries with identical name (and hence, hash value).
Definition AccelTable.h:141
LLVM_ABI void print(raw_ostream &OS) const
auto getValues() const
Get all AccelTableData cast as a T.
Definition AccelTable.h:148
DwarfStringPoolEntryRef Name
Definition AccelTable.h:142
std::vector< AccelTableData * > Values
Definition AccelTable.h:144
An Atom defines the form of the data in an Apple accelerator table.
Definition AccelTable.h:237
const uint16_t Form
DWARF Form.
Definition AccelTable.h:241
LLVM_ABI void print(raw_ostream &OS) const
const uint16_t Type
Atom Type.
Definition AccelTable.h:239
constexpr Atom(uint16_t Type, uint16_t Form)
Definition AccelTable.h:243
DebugNamesAbbrev::AttributeEncoding Encoding
Definition AccelTable.h:401
static bool isEqual(const OffsetAndUnitID &LHS, const OffsetAndUnitID &RHS)
Definition AccelTable.h:276
static unsigned getHashValue(const OffsetAndUnitID &Val)
Definition AccelTable.h:273
An information struct used to provide DenseMap with the various necessary components for a given valu...
Helper class to identify an entry in DWARF5AccelTable based on their DIE offset and UnitID.
Definition AccelTable.h:260
uint32_t unitID() const
Definition AccelTable.h:268
uint64_t offset() const
Definition AccelTable.h:267
OffsetAndUnitID(uint64_t Offset, uint32_t UnitID, bool IsTU)
Definition AccelTable.h:265
std::variant< MCSymbol *, uint64_t > LabelOrSignature
Definition AccelTable.h:389