From 9f36c7e704ea7a604a7962452b15dc8646659744 Mon Sep 17 00:00:00 2001 From: Haojian Wu Date: Wed, 11 Apr 2018 08:13:07 +0000 Subject: [Tooling] Optimize memory usage in InMemoryToolResults. Avoid storing duplicated "std::string"s. clangd's global-symbol-builder takes 20+GB memory running across LLVM repository. With this patch, the used memory is ~10GB (running on 48 threads, most of meory are AST-related). Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D45479 llvm-svn: 329784 --- clang/lib/Tooling/Execution.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'clang/lib/Tooling/Execution.cpp') diff --git a/clang/lib/Tooling/Execution.cpp b/clang/lib/Tooling/Execution.cpp index ff68f85adb2..5d6559fb2b4 100644 --- a/clang/lib/Tooling/Execution.cpp +++ b/clang/lib/Tooling/Execution.cpp @@ -21,10 +21,19 @@ static llvm::cl::opt 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; } -- cgit v1.2.3