Author: sammccall Date: Tue Sep 4 09:19:40 2018 New Revision: 341376 URL: http://llvm.org/viewvc/llvm-project?rev=341376&view=rev Log: [clangd] Load static index asynchronously, add tracing.
Summary: Like D51475 but simplified based on recent patches. While here, clarify that loadIndex() takes a filename, not file content. Reviewers: ioeric Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D51638 Modified: clang-tools-extra/trunk/clangd/index/SymbolYAML.cpp clang-tools-extra/trunk/clangd/index/SymbolYAML.h clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp Modified: clang-tools-extra/trunk/clangd/index/SymbolYAML.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/SymbolYAML.cpp?rev=341376&r1=341375&r2=341376&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/SymbolYAML.cpp (original) +++ clang-tools-extra/trunk/clangd/index/SymbolYAML.cpp Tue Sep 4 09:19:40 2018 @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "SymbolYAML.h" +#include "../Trace.h" #include "Index.h" #include "Serialization.h" #include "dex/DexIndex.h" @@ -183,25 +184,31 @@ std::string SymbolToYAML(Symbol Sym) { return OS.str(); } -std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFile, +std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFilename, bool UseDex) { - auto Buffer = llvm::MemoryBuffer::getFile(SymbolFile); + trace::Span OverallTracer("LoadIndex"); + auto Buffer = llvm::MemoryBuffer::getFile(SymbolFilename); if (!Buffer) { - llvm::errs() << "Can't open " << SymbolFile << "\n"; + llvm::errs() << "Can't open " << SymbolFilename << "\n"; return nullptr; } StringRef Data = Buffer->get()->getBuffer(); llvm::Optional<SymbolSlab> Slab; if (Data.startswith("RIFF")) { // Magic for binary index file. + trace::Span Tracer("ParseRIFF"); if (auto RIFF = readIndexFile(Data)) Slab = std::move(RIFF->Symbols); else llvm::errs() << "Bad RIFF: " << llvm::toString(RIFF.takeError()) << "\n"; } else { + trace::Span Tracer("ParseYAML"); Slab = symbolsFromYAML(Data); } + if (!Slab) + return nullptr; + trace::Span Tracer("BuildIndex"); return UseDex ? dex::DexIndex::build(std::move(*Slab)) : MemIndex::build(std::move(*Slab), RefSlab()); } Modified: clang-tools-extra/trunk/clangd/index/SymbolYAML.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/SymbolYAML.h?rev=341376&r1=341375&r2=341376&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/SymbolYAML.h (original) +++ clang-tools-extra/trunk/clangd/index/SymbolYAML.h Tue Sep 4 09:19:40 2018 @@ -44,7 +44,7 @@ void SymbolsToYAML(const SymbolSlab &Sym // Build an in-memory static index for global symbols from a symbol file. // The size of global symbols should be relatively small, so that all symbols // can be managed in memory. -std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFile, +std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFilename, bool UseDex = true); } // namespace clangd Modified: clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp?rev=341376&r1=341375&r2=341376&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp (original) +++ clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp Tue Sep 4 09:19:40 2018 @@ -281,9 +281,15 @@ int main(int argc, char *argv[]) { Opts.BuildDynamicSymbolIndex = EnableIndex; std::unique_ptr<SymbolIndex> StaticIdx; if (EnableIndex && !YamlSymbolFile.empty()) { - StaticIdx = loadIndex(YamlSymbolFile, UseDex); - Opts.StaticIndex = StaticIdx.get(); + // Load the index asynchronously. Meanwhile SwapIndex returns no results. + SwapIndex *Placeholder; + StaticIdx.reset(Placeholder = new SwapIndex(llvm::make_unique<MemIndex>())); + runAsync<void>([Placeholder] { + if (auto Idx = loadIndex(YamlSymbolFile)) + Placeholder->reset(std::move(Idx)); + }); } + Opts.StaticIndex = StaticIdx.get(); Opts.AsyncThreadsCount = WorkerThreadsCount; clangd::CodeCompleteOptions CCOpts; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits