summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/index/Serialization.cpp
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2018-10-04 14:09:55 +0000
committerSam McCall <sam.mccall@gmail.com>2018-10-04 14:09:55 +0000
commitcc21779c3c0f7affde7a64a97ae33faf1b0901e5 (patch)
treea8691e5c35655aa7220f1543f73285ca69022442 /clang-tools-extra/clangd/index/Serialization.cpp
parent2ec5a10db3c4b843db864fb6702e2b675887a6e8 (diff)
downloadbcm5719-llvm-cc21779c3c0f7affde7a64a97ae33faf1b0901e5.tar.gz
bcm5719-llvm-cc21779c3c0f7affde7a64a97ae33faf1b0901e5.zip
[clangd] clangd-indexer gathers refs and stores them in index files.
Reviewers: ioeric Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D52531 llvm-svn: 343778
Diffstat (limited to 'clang-tools-extra/clangd/index/Serialization.cpp')
-rw-r--r--clang-tools-extra/clangd/index/Serialization.cpp64
1 files changed, 63 insertions, 1 deletions
diff --git a/clang-tools-extra/clangd/index/Serialization.cpp b/clang-tools-extra/clangd/index/Serialization.cpp
index 2ebd2041ff5..8784d73ee17 100644
--- a/clang-tools-extra/clangd/index/Serialization.cpp
+++ b/clang-tools-extra/clangd/index/Serialization.cpp
@@ -298,17 +298,47 @@ Symbol readSymbol(Reader &Data, ArrayRef<StringRef> Strings) {
return Sym;
}
+// REFS ENCODING
+// A refs section has data grouped by Symbol. Each symbol has:
+// - SymbolID: 20 bytes
+// - NumRefs: varint
+// - Ref[NumRefs]
+// Fields of Ref are encoded in turn, see implementation.
+
+void writeRefs(const SymbolID &ID, ArrayRef<Ref> Refs,
+ const StringTableOut &Strings, raw_ostream &OS) {
+ OS << ID.raw();
+ writeVar(Refs.size(), OS);
+ for (const auto &Ref : Refs) {
+ OS.write(static_cast<unsigned char>(Ref.Kind));
+ writeLocation(Ref.Location, Strings, OS);
+ }
+}
+
+std::pair<SymbolID, std::vector<Ref>> readRefs(Reader &Data,
+ ArrayRef<StringRef> Strings) {
+ std::pair<SymbolID, std::vector<Ref>> Result;
+ Result.first = Data.consumeID();
+ Result.second.resize(Data.consumeVar());
+ for (auto &Ref : Result.second) {
+ Ref.Kind = static_cast<RefKind>(Data.consume8());
+ Ref.Location = readLocation(Data, Strings);
+ }
+ return Result;
+}
+
// FILE ENCODING
// A file is a RIFF chunk with type 'CdIx'.
// It contains the sections:
// - meta: version number
// - stri: string table
// - symb: symbols
+// - refs: references to symbols
// The current versioning scheme is simple - non-current versions are rejected.
// If you make a breaking change, bump this version number to invalidate stored
// data. Later we may want to support some backward compatibility.
-constexpr static uint32_t Version = 4;
+constexpr static uint32_t Version = 5;
Expected<IndexFileIn> readRIFF(StringRef Data) {
auto RIFF = riff::readFile(Data);
@@ -342,6 +372,18 @@ Expected<IndexFileIn> readRIFF(StringRef Data) {
return makeError("malformed or truncated symbol");
Result.Symbols = std::move(Symbols).build();
}
+ if (Chunks.count("refs")) {
+ Reader RefsReader(Chunks.lookup("refs"));
+ RefSlab::Builder Refs;
+ while (!RefsReader.eof()) {
+ auto RefsBundle = readRefs(RefsReader, Strings->Strings);
+ for (const auto &Ref : RefsBundle.second) // FIXME: bulk insert?
+ Refs.insert(RefsBundle.first, Ref);
+ }
+ if (RefsReader.err())
+ return makeError("malformed or truncated refs");
+ Result.Refs = std::move(Refs).build();
+ }
return std::move(Result);
}
@@ -363,6 +405,14 @@ void writeRIFF(const IndexFileOut &Data, raw_ostream &OS) {
Symbols.emplace_back(Sym);
visitStrings(Symbols.back(), [&](StringRef &S) { Strings.intern(S); });
}
+ std::vector<std::pair<SymbolID, std::vector<Ref>>> Refs;
+ if (Data.Refs) {
+ for (const auto &Sym : *Data.Refs) {
+ Refs.emplace_back(Sym);
+ for (auto &Ref : Refs.back().second)
+ Strings.intern(Ref.Location.FileURI);
+ }
+ }
std::string StringSection;
{
@@ -379,6 +429,16 @@ void writeRIFF(const IndexFileOut &Data, raw_ostream &OS) {
}
RIFF.Chunks.push_back({riff::fourCC("symb"), SymbolSection});
+ std::string RefsSection;
+ if (Data.Refs) {
+ {
+ raw_string_ostream RefsOS(RefsSection);
+ for (const auto &Sym : Refs)
+ writeRefs(Sym.first, Sym.second, Strings, RefsOS);
+ }
+ RIFF.Chunks.push_back({riff::fourCC("refs"), RefsSection});
+ }
+
OS << RIFF;
}
@@ -428,6 +488,8 @@ std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFilename,
if (auto I = readIndexFile(Buffer->get()->getBuffer())) {
if (I->Symbols)
Symbols = std::move(*I->Symbols);
+ if (I->Refs)
+ Refs = std::move(*I->Refs);
} else {
llvm::errs() << "Bad Index: " << llvm::toString(I.takeError()) << "\n";
return nullptr;
OpenPOWER on IntegriCloud