hokein updated this revision to Diff 141822.
hokein added a comment.
Update.
Repository:
rC Clang
https://reviews.llvm.org/D45479
Files:
include/clang/Tooling/Execution.h
lib/Tooling/AllTUsExecution.cpp
lib/Tooling/Execution.cpp
Index: lib/Tooling/Execution.cpp
===
--- lib/Tooling/Execution.cpp
+++ lib/Tooling/Execution.cpp
@@ -21,10 +21,19 @@
llvm::cl::init("standalone"));
void InMemoryToolResults::addResult(StringRef Key, StringRef Value) {
- KVResults.push_back({Key.str(), Value.str()});
+ auto Intern = [&](StringRef &V) {
+auto R = Strings.insert(V);
+if (R.second) { // A new entry, create a new string copy.
+ *R.first = StringsPool.save(V);
+}
+V = *R.first;
+ };
+ Intern(Key);
+ Intern(Value);
+ KVResults.push_back({Key, Value});
}
-std::vector>
+std::vector>
InMemoryToolResults::AllKVResults() {
return KVResults;
}
Index: lib/Tooling/AllTUsExecution.cpp
===
--- lib/Tooling/AllTUsExecution.cpp
+++ lib/Tooling/AllTUsExecution.cpp
@@ -36,7 +36,8 @@
Results.addResult(Key, Value);
}
- std::vector> AllKVResults() override {
+ std::vector>
+ AllKVResults() override {
return Results.AllKVResults();
}
Index: include/clang/Tooling/Execution.h
===
--- include/clang/Tooling/Execution.h
+++ include/clang/Tooling/Execution.h
@@ -32,6 +32,7 @@
#include "clang/Tooling/Tooling.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/Registry.h"
+#include "llvm/Support/StringSaver.h"
namespace clang {
namespace tooling {
@@ -45,20 +46,27 @@
public:
virtual ~ToolResults() = default;
virtual void addResult(StringRef Key, StringRef Value) = 0;
- virtual std::vector> AllKVResults() = 0;
+ virtual std::vector>
+ AllKVResults() = 0;
virtual void forEachResult(
llvm::function_ref Callback) = 0;
};
class InMemoryToolResults : public ToolResults {
public:
+ InMemoryToolResults() : StringsPool(Arena) {}
void addResult(StringRef Key, StringRef Value) override;
- std::vector> AllKVResults() override;
+ std::vector>
+ AllKVResults() override;
void forEachResult(llvm::function_ref
Callback) override;
private:
- std::vector> KVResults;
+ llvm::BumpPtrAllocator Arena;
+ llvm::StringSaver StringsPool;
+ llvm::DenseSet Strings;
+
+ std::vector> KVResults;
};
/// \brief The context of an execution, including the information about
Index: lib/Tooling/Execution.cpp
===
--- lib/Tooling/Execution.cpp
+++ lib/Tooling/Execution.cpp
@@ -21,10 +21,19 @@
llvm::cl::init("standalone"));
void InMemoryToolResults::addResult(StringRef Key, StringRef Value) {
- KVResults.push_back({Key.str(), Value.str()});
+ auto Intern = [&](StringRef &V) {
+auto R = Strings.insert(V);
+if (R.second) { // A new entry, create a new string copy.
+ *R.first = StringsPool.save(V);
+}
+V = *R.first;
+ };
+ Intern(Key);
+ Intern(Value);
+ KVResults.push_back({Key, Value});
}
-std::vector>
+std::vector>
InMemoryToolResults::AllKVResults() {
return KVResults;
}
Index: lib/Tooling/AllTUsExecution.cpp
===
--- lib/Tooling/AllTUsExecution.cpp
+++ lib/Tooling/AllTUsExecution.cpp
@@ -36,7 +36,8 @@
Results.addResult(Key, Value);
}
- std::vector> AllKVResults() override {
+ std::vector>
+ AllKVResults() override {
return Results.AllKVResults();
}
Index: include/clang/Tooling/Execution.h
===
--- include/clang/Tooling/Execution.h
+++ include/clang/Tooling/Execution.h
@@ -32,6 +32,7 @@
#include "clang/Tooling/Tooling.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/Registry.h"
+#include "llvm/Support/StringSaver.h"
namespace clang {
namespace tooling {
@@ -45,20 +46,27 @@
public:
virtual ~ToolResults() = default;
virtual void addResult(StringRef Key, StringRef Value) = 0;
- virtual std::vector> AllKVResults() = 0;
+ virtual std::vector>
+ AllKVResults() = 0;
virtual void forEachResult(
llvm::function_ref Callback) = 0;
};
class InMemoryToolResults : public ToolResults {
public:
+ InMemoryToolResults() : StringsPool(Arena) {}
void addResult(StringRef Key, StringRef Value) override;
- std::vector> AllKVResults() override;
+ std::vector>
+ AllKVResults() override;
void forEachResult(llvm::function_ref
Callback) override;
private:
- std::vector> KVResults;
+ llvm::BumpPtrAllocator Arena;
+ llvm::StringSaver StringsPool;
+ llvm::DenseSet Strings;
+
+ std::vector> KVResults;
};
/// \brief The context of an execution, including the information about
___