xref: /aosp_15_r20/external/llvm/tools/llvm-dwp/DWPStringPool.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker #ifndef TOOLS_LLVM_DWP_DWPSTRINGPOOL
2*9880d681SAndroid Build Coastguard Worker #define TOOLS_LLVM_DWP_DWPSTRINGPOOL
3*9880d681SAndroid Build Coastguard Worker 
4*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DenseMap.h"
5*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSection.h"
6*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
7*9880d681SAndroid Build Coastguard Worker #include <cassert>
8*9880d681SAndroid Build Coastguard Worker 
9*9880d681SAndroid Build Coastguard Worker namespace llvm {
10*9880d681SAndroid Build Coastguard Worker class DWPStringPool {
11*9880d681SAndroid Build Coastguard Worker 
12*9880d681SAndroid Build Coastguard Worker   struct CStrDenseMapInfo {
getEmptyKeyCStrDenseMapInfo13*9880d681SAndroid Build Coastguard Worker     static inline const char *getEmptyKey() {
14*9880d681SAndroid Build Coastguard Worker       return reinterpret_cast<const char *>(~static_cast<uintptr_t>(0));
15*9880d681SAndroid Build Coastguard Worker     }
getTombstoneKeyCStrDenseMapInfo16*9880d681SAndroid Build Coastguard Worker     static inline const char *getTombstoneKey() {
17*9880d681SAndroid Build Coastguard Worker       return reinterpret_cast<const char *>(~static_cast<uintptr_t>(1));
18*9880d681SAndroid Build Coastguard Worker     }
getHashValueCStrDenseMapInfo19*9880d681SAndroid Build Coastguard Worker     static unsigned getHashValue(const char *Val) {
20*9880d681SAndroid Build Coastguard Worker       assert(Val != getEmptyKey() && "Cannot hash the empty key!");
21*9880d681SAndroid Build Coastguard Worker       assert(Val != getTombstoneKey() && "Cannot hash the tombstone key!");
22*9880d681SAndroid Build Coastguard Worker       return (unsigned)hash_value(StringRef(Val));
23*9880d681SAndroid Build Coastguard Worker     }
isEqualCStrDenseMapInfo24*9880d681SAndroid Build Coastguard Worker     static bool isEqual(const char *LHS, const char *RHS) {
25*9880d681SAndroid Build Coastguard Worker       if (RHS == getEmptyKey())
26*9880d681SAndroid Build Coastguard Worker         return LHS == getEmptyKey();
27*9880d681SAndroid Build Coastguard Worker       if (RHS == getTombstoneKey())
28*9880d681SAndroid Build Coastguard Worker         return LHS == getTombstoneKey();
29*9880d681SAndroid Build Coastguard Worker       return strcmp(LHS, RHS) == 0;
30*9880d681SAndroid Build Coastguard Worker     }
31*9880d681SAndroid Build Coastguard Worker   };
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker   MCStreamer &Out;
34*9880d681SAndroid Build Coastguard Worker   MCSection *Sec;
35*9880d681SAndroid Build Coastguard Worker   DenseMap<const char *, uint32_t, CStrDenseMapInfo> Pool;
36*9880d681SAndroid Build Coastguard Worker   uint32_t Offset = 0;
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker public:
DWPStringPool(MCStreamer & Out,MCSection * Sec)39*9880d681SAndroid Build Coastguard Worker   DWPStringPool(MCStreamer &Out, MCSection *Sec) : Out(Out), Sec(Sec) {}
40*9880d681SAndroid Build Coastguard Worker 
getOffset(const char * Str,unsigned Length)41*9880d681SAndroid Build Coastguard Worker   uint32_t getOffset(const char *Str, unsigned Length) {
42*9880d681SAndroid Build Coastguard Worker     assert(strlen(Str) + 1 == Length && "Ensure length hint is correct");
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker     auto Pair = Pool.insert(std::make_pair(Str, Offset));
45*9880d681SAndroid Build Coastguard Worker     if (Pair.second) {
46*9880d681SAndroid Build Coastguard Worker       Out.SwitchSection(Sec);
47*9880d681SAndroid Build Coastguard Worker       Out.EmitBytes(StringRef(Str, Length));
48*9880d681SAndroid Build Coastguard Worker       Offset += Length;
49*9880d681SAndroid Build Coastguard Worker     }
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker     return Pair.first->second;
52*9880d681SAndroid Build Coastguard Worker   }
53*9880d681SAndroid Build Coastguard Worker };
54*9880d681SAndroid Build Coastguard Worker }
55*9880d681SAndroid Build Coastguard Worker 
56*9880d681SAndroid Build Coastguard Worker #endif
57