[PATCH] D49596: [Support] Add a UniqueStringSaver: like StringSaver, but deduplicating.
Sam McCall via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 23 03:44:55 PDT 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL337677: [Support] Add a UniqueStringSaver: like StringSaver, but deduplicating. (authored by sammccall, committed by ).
Repository:
rL LLVM
https://reviews.llvm.org/D49596
Files:
llvm/trunk/include/llvm/Support/StringSaver.h
llvm/trunk/lib/Support/StringSaver.cpp
Index: llvm/trunk/lib/Support/StringSaver.cpp
===================================================================
--- llvm/trunk/lib/Support/StringSaver.cpp
+++ llvm/trunk/lib/Support/StringSaver.cpp
@@ -17,3 +17,10 @@
P[S.size()] = '\0';
return StringRef(P, S.size());
}
+
+StringRef UniqueStringSaver::save(StringRef S) {
+ auto R = Unique.insert(S);
+ if (R.second) // cache miss, need to actually save the string
+ *R.first = Strings.save(S); // safe replacement with equal value
+ return *R.first;
+}
Index: llvm/trunk/include/llvm/Support/StringSaver.h
===================================================================
--- llvm/trunk/include/llvm/Support/StringSaver.h
+++ llvm/trunk/include/llvm/Support/StringSaver.h
@@ -10,23 +10,49 @@
#ifndef LLVM_SUPPORT_STRINGSAVER_H
#define LLVM_SUPPORT_STRINGSAVER_H
+#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/Allocator.h"
namespace llvm {
-/// Saves strings in the inheritor's stable storage and returns a
+/// Saves strings in the provided stable storage and returns a
/// StringRef with a stable character pointer.
class StringSaver final {
BumpPtrAllocator &Alloc;
public:
StringSaver(BumpPtrAllocator &Alloc) : Alloc(Alloc) {}
+
+ // All returned strings are null-terminated: *save(S).end() == 0.
StringRef save(const char *S) { return save(StringRef(S)); }
StringRef save(StringRef S);
StringRef save(const Twine &S) { return save(StringRef(S.str())); }
StringRef save(const std::string &S) { return save(StringRef(S)); }
};
+
+/// Saves strings in the provided stable storage and returns a StringRef with a
+/// stable character pointer. Saving the same string yields the same StringRef.
+///
+/// Compared to StringSaver, it does more work but avoids saving the same string
+/// multiple times.
+///
+/// Compared to StringPool, it performs fewer allocations but doesn't support
+/// refcounting/deletion.
+class UniqueStringSaver final {
+ StringSaver Strings;
+ llvm::DenseSet<llvm::StringRef> Unique;
+
+public:
+ UniqueStringSaver(BumpPtrAllocator &Alloc) : Strings(Alloc) {}
+
+ // All returned strings are null-terminated: *save(S).end() == 0.
+ StringRef save(const char *S) { return save(StringRef(S)); }
+ StringRef save(StringRef S);
+ StringRef save(const Twine &S) { return save(StringRef(S.str())); }
+ StringRef save(const std::string &S) { return save(StringRef(S)); }
+};
+
}
#endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49596.156736.patch
Type: text/x-patch
Size: 2505 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180723/5823cc0d/attachment.bin>
More information about the llvm-commits
mailing list