LLVM: include/llvm/CodeGen/AccelTable.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_CODEGEN_ACCELTABLE_H
14#define LLVM_CODEGEN_ACCELTABLE_H
15
27#include
28#include
29#include
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104namespace llvm {
105
111
112
113
114
116public:
118
122
123
124
125
126#ifndef NDEBUG
128#endif
129protected:
131};
132
133
134
135
137public:
139
140
144 std::vector<AccelTableData *> Values;
146
147
148 template <typename T = AccelTableData *> auto getValues() const {
149 static_assert(std::is_pointer());
150 static_assert(
151 std::is_base_of<AccelTableData, std::remove_pointer_t>());
154 }
155
156#ifndef NDEBUG
159#endif
160 };
161 using HashList = std::vector<HashData *>;
163
164protected:
165
167
170
174
177
179
181
182public:
188
189#ifndef NDEBUG
192#endif
193
196};
197
198
199
200
201
202
204public:
206
207 template <typename... Types>
212};
213
214template
215template <typename... Types>
217 Types &&... Args) {
219
220
221 auto &It = Entries[Name.getString()];
222 if (It.Values.empty()) {
223 It.Name = Name;
224 It.HashValue = Hash(Name.getString());
225 }
226 It.Values.push_back(new (Allocator)
227 AccelTableDataT(std::forward(Args)...));
228}
229
230
231
232
234public:
235
236
237
239
241
243
245
246#ifndef NDEBUG
249#endif
250 };
251
252
253
255
257};
258
259
260
272
284 return LHS.offset() == RHS.offset() && LHS.unitID() == RHS.unitID() &&
286 }
287};
288
289
290
291
292
294public:
296
298 const bool IsTU);
300 const std::optional<uint64_t> DefiningParentOffset,
301 const unsigned DieTag, const unsigned UnitID,
302 const bool IsTU)
305
306#ifndef NDEBUG
308#endif
309
314
318
324 const DIE *Entry = std::get<const DIE *>(OffsetVal);
327 }
329 return std::holds_alternative<uint64_t>(OffsetVal);
330 }
331
334 return OffsetAndId->offset();
335 return {};
336 }
337
339 assert(isNormalized() && "Accessing DIE Offset before normalizing.");
341 return std::nullopt;
343 }
344
345
347
348
350
351
352
353 LLVM_ABI static std::optional<uint64_t>
355
356protected:
357 std::variant<const DIE *, uint64_t> OffsetVal;
364};
365
367public:
375
377 AttrVect.push_back(Attr);
378 }
379
381
383
385
387
389 return AttrVect;
390 }
391
392private:
394};
395
404
406
407public:
412
414
416
418
419
421 for (auto &Entry : Entries) {
423
424
425
426 if (->isNormalized())
427 Data->normalizeDIEToOffset();
428 }
429 }
430 }
431
433 for (auto &Entry : Table.getEntries()) {
435 addName(Entry.second.Name, Data->getDieOffset(),
436 Data->getParentDieOffset(), Data->getDieTag(),
437 Data->getUnitID(), Data->isTU());
438 }
439 }
440 }
441};
442
445 StringRef Prefix, const MCSymbol *SecBegin,
447
448
449
450
451template
454 static_assert(std::is_convertible<DataT *, AppleAccelTableData *>::value);
456}
457
460 const DwarfDebug &DD,
461 ArrayRef<std::unique_ptr> CUs);
462
463
464
465
466
468 AsmPrinter *Asm, DWARF5AccelTable &Contents,
469 ArrayRef<std::variant<MCSymbol *, uint64_t>> CUs,
470 llvm::function_ref<std::optionalDWARF5AccelTable::UnitIndexAndEncoding(
471 const DWARF5AccelTableData &)>
472 getIndexForEntry);
473
474
475
477public:
479
480 void emit(AsmPrinter *Asm) const override;
481
484
485#ifndef NDEBUG
487#endif
488protected:
490
492};
493
494
496public:
498
499 void emit(AsmPrinter *Asm) const override;
500
505
506#ifndef NDEBUG
508#endif
509};
510
511
512
514public:
516
517 void emit(AsmPrinter *Asm) const override;
518
521
522#ifndef NDEBUG
524#endif
525protected:
527
529};
530
531
532
535public:
542
543 void emit(AsmPrinter *Asm) const override;
544
548 Atom(5, dwarf::DW_FORM_data1), Atom(6, dwarf::DW_FORM_data4)};
549
550#ifndef NDEBUG
552#endif
553protected:
555
559};
560
561}
562
563#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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")
This file contains constants used for implementing Dwarf debug support.
This file implements a map that provides insertion order iteration.
BucketList Buckets
Definition AccelTable.h:176
uint32_t getUniqueNameCount() const
Definition AccelTable.h:187
uint32_t BucketCount
Definition AccelTable.h:172
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()
HashFn * Hash
Definition AccelTable.h:171
uint32_t getUniqueHashCount() const
Definition AccelTable.h:186
void print(raw_ostream &OS) const
void dump() const
Definition AccelTable.h:191
AccelTableBase(const AccelTableBase &)=delete
HashList Hashes
Definition AccelTable.h:175
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
uint32_t UniqueHashCount
Definition AccelTable.h:173
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
void clear()
Definition AccelTable.h:209
const StringEntries getEntries() const
Definition AccelTable.h:211
void addEntries(AccelTable< DataT > &Table)
void addName(DwarfStringPoolEntryRef Name, Types &&... Args)
Definition AccelTable.h:216
AccelTable()
Definition AccelTable.h:205
A base class for different implementations of Data classes for Apple Accelerator Tables.
Definition AccelTable.h:233
virtual void emit(AsmPrinter *Asm) const =0
static uint32_t hash(StringRef Buffer)
Definition AccelTable.h:256
uint64_t order() const override
Definition AccelTable.h:489
const DIE & Die
Definition AccelTable.h:491
AppleAccelTableOffsetData(const DIE &D)
Definition AccelTable.h:478
static constexpr Atom Atoms[]
Definition AccelTable.h:482
AppleAccelTableStaticOffsetData(uint32_t Offset)
Definition AccelTable.h:515
uint32_t Offset
Definition AccelTable.h:528
static constexpr Atom Atoms[]
Definition AccelTable.h:519
uint64_t order() const override
Definition AccelTable.h:526
uint32_t QualifiedNameHash
Definition AccelTable.h:556
uint16_t Tag
Definition AccelTable.h:557
bool ObjCClassIsImplementation
Definition AccelTable.h:558
uint64_t order() const override
Definition AccelTable.h:554
static constexpr Atom Atoms[]
Definition AccelTable.h:545
AppleAccelTableStaticTypeData(uint32_t Offset, uint16_t Tag, bool ObjCClassIsImplementation, uint32_t QualifiedNameHash)
Definition AccelTable.h:536
static constexpr Atom Atoms[]
Definition AccelTable.h:501
AppleAccelTableTypeData(const DIE &D)
Definition AccelTable.h:497
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class is intended to be used as a driving class for all asm writers.
A structured debug information entry.
The Data class implementation for DWARF v5 accelerator table.
Definition AccelTable.h:293
uint32_t IsTU
Definition AccelTable.h:361
static uint32_t hash(StringRef Name)
Definition AccelTable.h:295
void print(raw_ostream &OS) const override
unsigned getDieTag() const
Definition AccelTable.h:319
void normalizeDIEToOffset()
Definition AccelTable.h:322
std::optional< OffsetAndUnitID > getParentDieOffsetAndUnitID() const
Definition AccelTable.h:338
uint32_t AbbrevNumber
Definition AccelTable.h:360
std::optional< uint64_t > getParentDieOffset() const
Definition AccelTable.h:332
std::variant< const DIE *, uint64_t > OffsetVal
Definition AccelTable.h:357
LLVM_ABI DWARF5AccelTableData(const DIE &Die, const uint32_t UnitID, const bool IsTU)
unsigned getUnitID() const
Definition AccelTable.h:320
void setAbbrevNumber(uint16_t AbbrevNum)
Sets AbbrevIndex for an Entry.
Definition AccelTable.h:346
uint64_t order() const override
Definition AccelTable.h:363
uint32_t UnitID
Definition AccelTable.h:362
OffsetAndUnitID getDieOffsetAndUnitID() const
Definition AccelTable.h:315
uint32_t DieTag
Definition AccelTable.h:359
static LLVM_ABI 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:299
uint16_t getAbbrevNumber() const
Returns AbbrevIndex for an Entry.
Definition AccelTable.h:349
bool isNormalized() const
Definition AccelTable.h:328
bool isTU() const
Definition AccelTable.h:321
uint64_t getDieOffset() const
Definition AccelTable.h:310
std::optional< uint64_t > ParentOffset
Definition AccelTable.h:358
Definition AccelTable.h:403
LLVM_ABI void addTypeUnitSignature(DwarfTypeUnit &U)
Add a type unit Signature.
void convertDieToOffset()
Convert DIE entries to explicit offset.
Definition AccelTable.h:420
const TUVectorTy & getTypeUnitsSymbols()
Returns type units that were constructed.
Definition AccelTable.h:413
LLVM_ABI void addTypeUnitSymbol(DwarfTypeUnit &U)
Add a type unit start symbol.
void addTypeEntries(DWARF5AccelTable &Table)
Definition AccelTable.h:432
void addAttribute(const DebugNamesAbbrev::AttributeEncoding &Attr)
Add attribute encoding to an abbreviation.
Definition AccelTable.h:376
uint32_t DieTag
Definition AccelTable.h:368
void setNumber(uint32_t AbbrevNumber)
Set abbreviation tag index.
Definition AccelTable.h:380
const SmallVector< AttributeEncoding, 1 > & getAttributes() const
Returns attributes for an abbreviation.
Definition AccelTable.h:388
uint32_t Number
Definition AccelTable.h:369
uint32_t getNumber() const
Get abbreviation tag index.
Definition AccelTable.h:382
uint32_t getDieTag() const
Get DIE Tag.
Definition AccelTable.h:384
DebugNamesAbbrev(uint32_t DieTag)
Definition AccelTable.h:374
Collects and handles dwarf debug information.
DwarfStringPoolEntryRef: Dwarf string pool entry reference.
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
This class implements a map that also provides access to all stored values in a deterministic order.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ DW_ATOM_die_offset
Marker as the end of a list of atoms.
This is an optimization pass for GlobalISel generic memory operations.
SmallVector< TypeUnitMetaInfo, 1 > TUVectorTy
Definition AccelTable.h:402
FoldingSetBase::Node FoldingSetNode
auto map_range(ContainerTy &&C, FuncTy F)
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
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:452
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...
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.
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.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Represents a group of entries with identical name (and hence, hash value).
Definition AccelTable.h:141
void print(raw_ostream &OS) const
uint32_t HashValue
Definition AccelTable.h:143
auto getValues() const
Get all AccelTableData cast as a T.
Definition AccelTable.h:148
MCSymbol * Sym
Definition AccelTable.h:145
void dump() const
Definition AccelTable.h:158
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:238
const uint16_t Form
DWARF Form.
Definition AccelTable.h:242
void dump() const
Definition AccelTable.h:248
void print(raw_ostream &OS) const
const uint16_t Type
Atom Type.
Definition AccelTable.h:240
constexpr Atom(uint16_t Type, uint16_t Form)
Definition AccelTable.h:244
Definition AccelTable.h:408
unsigned Index
Definition AccelTable.h:409
DebugNamesAbbrev::AttributeEncoding Encoding
Definition AccelTable.h:410
Definition AccelTable.h:370
dwarf::Index Index
Definition AccelTable.h:371
dwarf::Form Form
Definition AccelTable.h:372
static bool isEqual(const OffsetAndUnitID &LHS, const OffsetAndUnitID &RHS)
Definition AccelTable.h:283
static OffsetAndUnitID getEmptyKey()
Definition AccelTable.h:274
static unsigned getHashValue(const OffsetAndUnitID &Val)
Definition AccelTable.h:280
static OffsetAndUnitID getTombstoneKey()
Definition AccelTable.h:277
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:261
bool isTU() const
Definition AccelTable.h:270
bool IsTU
Definition AccelTable.h:264
uint64_t Offset
Definition AccelTable.h:262
uint32_t unitID() const
Definition AccelTable.h:269
uint64_t offset() const
Definition AccelTable.h:268
OffsetAndUnitID(uint64_t Offset, uint32_t UnitID, bool IsTU)
Definition AccelTable.h:266
uint32_t UnitID
Definition AccelTable.h:263