Index: clangd/index/SymbolYAML.h =================================================================== --- clangd/index/SymbolYAML.h +++ clangd/index/SymbolYAML.h @@ -44,7 +44,7 @@ // 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 loadIndex(llvm::StringRef SymbolFile, +std::unique_ptr loadIndex(llvm::StringRef SymbolFilename, bool UseDex = true); } // namespace clangd Index: clangd/index/SymbolYAML.cpp =================================================================== --- clangd/index/SymbolYAML.cpp +++ clangd/index/SymbolYAML.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "SymbolYAML.h" +#include "../Trace.h" #include "Index.h" #include "dex/DexIndex.h" #include "llvm/ADT/Optional.h" @@ -182,17 +183,24 @@ return OS.str(); } -std::unique_ptr loadIndex(llvm::StringRef SymbolFile, +std::unique_ptr 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; } - auto Slab = symbolsFromYAML(Buffer.get()->getBuffer()); + StringRef Data = Buffer.get()->getBuffer(); + llvm::Optional SymbolSlab; + { + trace::Span Tracer("ParseYAML"); + auto Slab = symbolsFromYAML(Data); + } - return UseDex ? dex::DexIndex::build(std::move(Slab)) - : MemIndex::build(std::move(Slab), RefSlab()); + trace::Span Tracer("BuildIndex"); + return UseDex ? dex::DexIndex::build(std::move(*SymbolSlab)) + : MemIndex::build(std::move(*SymbolSlab), RefSlab()); } } // namespace clangd Index: clangd/tool/ClangdMain.cpp =================================================================== --- clangd/tool/ClangdMain.cpp +++ clangd/tool/ClangdMain.cpp @@ -280,9 +280,15 @@ Opts.BuildDynamicSymbolIndex = EnableIndex; std::unique_ptr 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())); + runAsync([Placeholder] { + if (auto Idx = loadIndex(YamlSymbolFile)) + Placeholder->reset(std::move(Idx)); + }); } + Opts.StaticIndex = StaticIdx.get(); Opts.AsyncThreadsCount = WorkerThreadsCount; clangd::CodeCompleteOptions CCOpts;