Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | #ifndef LLVM_DWP_DWPSTRINGPOOL_H |
| 2 | #define LLVM_DWP_DWPSTRINGPOOL_H |
||
| 3 | |||
| 4 | #include "llvm/ADT/DenseMap.h" |
||
| 5 | #include "llvm/MC/MCSection.h" |
||
| 6 | #include "llvm/MC/MCStreamer.h" |
||
| 7 | #include <cassert> |
||
| 8 | |||
| 9 | namespace llvm { |
||
| 10 | class DWPStringPool { |
||
| 11 | |||
| 12 | struct CStrDenseMapInfo { |
||
| 13 | static inline const char *getEmptyKey() { |
||
| 14 | return reinterpret_cast<const char *>(~static_cast<uintptr_t>(0)); |
||
| 15 | } |
||
| 16 | static inline const char *getTombstoneKey() { |
||
| 17 | return reinterpret_cast<const char *>(~static_cast<uintptr_t>(1)); |
||
| 18 | } |
||
| 19 | static unsigned getHashValue(const char *Val) { |
||
| 20 | assert(Val != getEmptyKey() && "Cannot hash the empty key!"); |
||
| 21 | assert(Val != getTombstoneKey() && "Cannot hash the tombstone key!"); |
||
| 22 | return (unsigned)hash_value(StringRef(Val)); |
||
| 23 | } |
||
| 24 | static bool isEqual(const char *LHS, const char *RHS) { |
||
| 25 | if (RHS == getEmptyKey()) |
||
| 26 | return LHS == getEmptyKey(); |
||
| 27 | if (RHS == getTombstoneKey()) |
||
| 28 | return LHS == getTombstoneKey(); |
||
| 29 | return strcmp(LHS, RHS) == 0; |
||
| 30 | } |
||
| 31 | }; |
||
| 32 | |||
| 33 | MCStreamer &Out; |
||
| 34 | MCSection *Sec; |
||
| 35 | DenseMap<const char *, uint32_t, CStrDenseMapInfo> Pool; |
||
| 36 | uint32_t Offset = 0; |
||
| 37 | |||
| 38 | public: |
||
| 39 | DWPStringPool(MCStreamer &Out, MCSection *Sec) : Out(Out), Sec(Sec) {} |
||
| 40 | |||
| 41 | uint32_t getOffset(const char *Str, unsigned Length) { |
||
| 42 | assert(strlen(Str) + 1 == Length && "Ensure length hint is correct"); |
||
| 43 | |||
| 44 | auto Pair = Pool.insert(std::make_pair(Str, Offset)); |
||
| 45 | if (Pair.second) { |
||
| 46 | Out.switchSection(Sec); |
||
| 47 | Out.emitBytes(StringRef(Str, Length)); |
||
| 48 | Offset += Length; |
||
| 49 | } |
||
| 50 | |||
| 51 | return Pair.first->second; |
||
| 52 | } |
||
| 53 | }; |
||
| 54 | } // namespace llvm |
||
| 55 | |||
| 56 | #endif // LLVM_DWP_DWPSTRINGPOOL_H |