57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| #ifndef TOOLS_LLVM_DWP_DWPSTRINGPOOL
 | |
| #define TOOLS_LLVM_DWP_DWPSTRINGPOOL
 | |
| 
 | |
| #include "llvm/ADT/DenseMap.h"
 | |
| #include "llvm/MC/MCSection.h"
 | |
| #include "llvm/MC/MCStreamer.h"
 | |
| #include <cassert>
 | |
| 
 | |
| namespace llvm {
 | |
| class DWPStringPool {
 | |
| 
 | |
|   struct CStrDenseMapInfo {
 | |
|     static inline const char *getEmptyKey() {
 | |
|       return reinterpret_cast<const char *>(~static_cast<uintptr_t>(0));
 | |
|     }
 | |
|     static inline const char *getTombstoneKey() {
 | |
|       return reinterpret_cast<const char *>(~static_cast<uintptr_t>(1));
 | |
|     }
 | |
|     static unsigned getHashValue(const char *Val) {
 | |
|       assert(Val != getEmptyKey() && "Cannot hash the empty key!");
 | |
|       assert(Val != getTombstoneKey() && "Cannot hash the tombstone key!");
 | |
|       return (unsigned)hash_value(StringRef(Val));
 | |
|     }
 | |
|     static bool isEqual(const char *LHS, const char *RHS) {
 | |
|       if (RHS == getEmptyKey())
 | |
|         return LHS == getEmptyKey();
 | |
|       if (RHS == getTombstoneKey())
 | |
|         return LHS == getTombstoneKey();
 | |
|       return strcmp(LHS, RHS) == 0;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   MCStreamer &Out;
 | |
|   MCSection *Sec;
 | |
|   DenseMap<const char *, uint32_t, CStrDenseMapInfo> Pool;
 | |
|   uint32_t Offset = 0;
 | |
| 
 | |
| public:
 | |
|   DWPStringPool(MCStreamer &Out, MCSection *Sec) : Out(Out), Sec(Sec) {}
 | |
| 
 | |
|   uint32_t getOffset(const char *Str, unsigned Length) {
 | |
|     assert(strlen(Str) + 1 == Length && "Ensure length hint is correct");
 | |
| 
 | |
|     auto Pair = Pool.insert(std::make_pair(Str, Offset));
 | |
|     if (Pair.second) {
 | |
|       Out.SwitchSection(Sec);
 | |
|       Out.EmitBytes(StringRef(Str, Length));
 | |
|       Offset += Length;
 | |
|     }
 | |
| 
 | |
|     return Pair.first->second;
 | |
|   }
 | |
| };
 | |
| }
 | |
| 
 | |
| #endif
 |