File indexing completed on 2026-05-10 08:43:28
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H
0010 #define LLVM_CODEGEN_DWARFSTRINGPOOLENTRY_H
0011
0012 #include "llvm/ADT/PointerUnion.h"
0013 #include "llvm/ADT/StringMap.h"
0014
0015 namespace llvm {
0016
0017 class MCSymbol;
0018
0019
0020 struct DwarfStringPoolEntry {
0021 static constexpr unsigned NotIndexed = -1;
0022
0023 MCSymbol *Symbol = nullptr;
0024 uint64_t Offset = 0;
0025 unsigned Index = 0;
0026
0027 bool isIndexed() const { return Index != NotIndexed; }
0028 };
0029
0030
0031 struct DwarfStringPoolEntryWithExtString : public DwarfStringPoolEntry {
0032 StringRef String;
0033 };
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 class DwarfStringPoolEntryRef {
0050
0051 using ByValStringEntryPtr = const StringMapEntry<DwarfStringPoolEntry> *;
0052
0053
0054 using ExtStringEntryPtr = const DwarfStringPoolEntryWithExtString *;
0055
0056
0057 PointerUnion<ByValStringEntryPtr, ExtStringEntryPtr> MapEntry = nullptr;
0058
0059 public:
0060 DwarfStringPoolEntryRef() = default;
0061
0062
0063
0064 DwarfStringPoolEntryRef(const StringMapEntry<DwarfStringPoolEntry> &Entry)
0065 : MapEntry(&Entry) {}
0066
0067
0068
0069 DwarfStringPoolEntryRef(const DwarfStringPoolEntryWithExtString &Entry)
0070 : MapEntry(&Entry) {}
0071
0072 explicit operator bool() const { return !MapEntry.isNull(); }
0073
0074
0075 MCSymbol *getSymbol() const {
0076 assert(getEntry().Symbol && "No symbol available!");
0077 return getEntry().Symbol;
0078 }
0079
0080
0081 uint64_t getOffset() const { return getEntry().Offset; }
0082
0083
0084 unsigned getIndex() const {
0085 assert(getEntry().isIndexed() && "Index is not set!");
0086 return getEntry().Index;
0087 }
0088
0089
0090 StringRef getString() const {
0091 if (isa<ByValStringEntryPtr>(MapEntry))
0092 return cast<ByValStringEntryPtr>(MapEntry)->first();
0093
0094 return cast<ExtStringEntryPtr>(MapEntry)->String;
0095 }
0096
0097
0098 const DwarfStringPoolEntry &getEntry() const {
0099 if (isa<ByValStringEntryPtr>(MapEntry))
0100 return cast<ByValStringEntryPtr>(MapEntry)->second;
0101
0102 return *cast<ExtStringEntryPtr>(MapEntry);
0103 }
0104
0105 bool operator==(const DwarfStringPoolEntryRef &X) const {
0106 return MapEntry.getOpaqueValue() == X.MapEntry.getOpaqueValue();
0107 }
0108
0109 bool operator!=(const DwarfStringPoolEntryRef &X) const {
0110 return MapEntry.getOpaqueValue() != X.MapEntry.getOpaqueValue();
0111 }
0112 };
0113
0114 }
0115
0116 #endif