13#include "llvm/ADT/StringMap.h"
14#include "llvm/ADT/iterator.h"
15#include "llvm/Support/Allocator.h"
16#include "llvm/Support/DJB.h"
17#include "llvm/Support/FormatProviders.h"
18#include "llvm/Support/RWMutex.h"
19#include "llvm/Support/Threading.h"
62 typedef llvm::StringMap<StringPoolValueType, Allocator>
StringPool;
67 return StringPoolEntryType::GetStringMapEntryFromKeyData(keyData);
71 if (ccstr !=
nullptr) {
75 return entry.getKey().size();
81 if (ccstr !=
nullptr) {
82 const uint8_t h =
hash(llvm::StringRef(ccstr));
83 llvm::sys::SmartScopedReader<false> rlock(
m_string_pools[h].m_mutex);
102 if (string_ref.data()) {
103 const uint8_t h =
hash(string_ref);
106 llvm::sys::SmartScopedReader<false> rlock(
m_string_pools[h].m_mutex);
109 return it->getKeyData();
112 llvm::sys::SmartScopedWriter<false> wlock(
m_string_pools[h].m_mutex);
115 .m_string_map.insert(std::make_pair(string_ref,
nullptr))
117 return entry.getKeyData();
124 const char *mangled_ccstr) {
125 const char *demangled_ccstr =
nullptr;
128 const uint8_t h =
hash(demangled);
129 llvm::sys::SmartScopedWriter<false> wlock(
m_string_pools[h].m_mutex);
135 entry.second = mangled_ccstr;
138 demangled_ccstr = entry.getKeyData();
144 const uint8_t h =
hash(llvm::StringRef(mangled_ccstr));
145 llvm::sys::SmartScopedWriter<false> wlock(
m_string_pools[h].m_mutex);
150 return demangled_ccstr;
155 if (cstr !=
nullptr) {
156 const size_t trimmed_len = strnlen(cstr, cstr_len);
165 llvm::sys::SmartScopedReader<false> rlock(pool.m_mutex);
166 const Allocator &alloc = pool.m_string_map.getAllocator();
168 stats.
bytes_used += alloc.getBytesAllocated();
174 uint8_t
hash(llvm::StringRef s)
const {
175 uint32_t h = llvm::djbHash(s);
176 return ((h >> 24) ^ (h >> 16) ^ (h >> 8) ^ h) & 0xff;
180 mutable llvm::sys::SmartRWMutex<false>
m_mutex;
196 static llvm::once_flag g_pool_initialization_flag;
197 static Pool *g_string_pool =
nullptr;
199 llvm::call_once(g_pool_initialization_flag,
200 []() { g_string_pool =
new Pool(); });
202 return *g_string_pool;
206 : m_string(
StringPool().GetConstCString(cstr)) {}
209 : m_string(
StringPool().GetConstCStringWithLength(cstr, cstr_len)) {}
212 : m_string(
StringPool().GetConstCStringWithStringRef(s)) {}
222 if (lhs_string_ref.data() && rhs_string_ref.data())
223 return lhs_string_ref < rhs_string_ref;
226 return lhs_string_ref.data() ==
nullptr;
242 const bool case_sensitive) {
255 return lhs_string_ref.equals_insensitive(rhs_string_ref);
259 const bool case_sensitive) {
261 const char *lhs_cstr = lhs.
m_string;
262 const char *rhs_cstr = rhs.
m_string;
263 if (lhs_cstr == rhs_cstr)
265 if (lhs_cstr && rhs_cstr) {
269 if (case_sensitive) {
270 return lhs_string_ref.compare(rhs_string_ref);
272 return lhs_string_ref.compare_insensitive(rhs_string_ref);
284 const char *cstr =
AsCString(fail_value);
294 const char *parens = cstr ?
"\"" :
"";
295 s->
Printf(
"%*p: ConstString, string = %s%s%s, length = %" PRIu64,
296 static_cast<int>(
sizeof(
void *) * 2),
297 static_cast<const void *
>(
this), parens, cstr, parens,
298 static_cast<uint64_t
>(cstr_len));
317 return (
bool)counterpart;
333void llvm::format_provider<ConstString>::format(
const ConstString &CS,
334 llvm::raw_ostream &
OS,
static Pool & StringPool()
StringPoolValueType GetMangledCounterpart(const char *ccstr) const
static const size_t SizeThreshold
static StringPoolEntryType & GetStringMapEntryFromKeyData(const char *keyData)
const char * GetConstCStringWithStringRef(llvm::StringRef string_ref)
static const size_t AllocatorSlabSize
The default BumpPtrAllocatorImpl slab size.
llvm::StringMap< StringPoolValueType, Allocator > StringPool
const char * GetConstCStringWithLength(const char *cstr, size_t cstr_len)
const char * GetConstTrimmedCStringWithLength(const char *cstr, size_t cstr_len)
ConstString::MemoryStats GetMemoryStats() const
llvm::BumpPtrAllocatorImpl< llvm::MallocAllocator, AllocatorSlabSize, SizeThreshold, AllocatorGrowthDelay > Allocator
std::array< PoolEntry, 256 > m_string_pools
const char * GetConstCStringAndSetMangledCounterPart(llvm::StringRef demangled, const char *mangled_ccstr)
llvm::StringMapEntry< StringPoolValueType > StringPoolEntryType
const char * GetConstCString(const char *cstr)
static const size_t AllocatorGrowthDelay
Every Pool has its own allocator which receives an equal share of the ConstString allocations.
const char * StringPoolValueType
uint8_t hash(llvm::StringRef s) const
static size_t GetConstCStringLength(const char *ccstr)
A uniqued constant string class.
bool GetMangledCounterpart(ConstString &counterpart) const
Retrieve the mangled or demangled counterpart for a mangled or demangled ConstString.
static MemoryStats GetMemoryStats()
void SetCStringWithLength(const char *cstr, size_t cstr_len)
Set the C string value with length.
void SetCString(const char *cstr)
Set the C string value.
static int Compare(ConstString lhs, ConstString rhs, const bool case_sensitive=true)
Compare two string objects.
ConstString()=default
Default constructor.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
void Dump(Stream *s, const char *value_if_empty=nullptr) const
Dump the object description to a stream.
static bool Equals(ConstString lhs, ConstString rhs, const bool case_sensitive=true)
Equal to operator.
void DumpDebug(Stream *s) const
Dump the object debug description to a stream.
void SetTrimmedCStringWithLength(const char *cstr, size_t fixed_cstr_len)
Set the C string value with the minimum length between fixed_cstr_len and the actual length of the C ...
size_t GetLength() const
Get the length in bytes of string value.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
void SetString(llvm::StringRef s)
bool operator<(ConstString rhs) const
const char * GetCString() const
Get the string value as a C string.
void SetStringWithMangledCounterpart(llvm::StringRef demangled, ConstString mangled)
Set the C string value and its mangled counterpart.
A command line option parsing protocol class.
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
A class that represents a running process on the host machine.
Stream & operator<<(Stream &s, const Mangled &obj)
llvm::sys::SmartRWMutex< false > m_mutex