From a15d798594ae340b037efec2cdba5ec77221e7e7 Mon Sep 17 00:00:00 2001 From: Sam McCall Date: Wed, 8 Jul 2020 17:30:24 +0200 Subject: [PATCH] [clangd] Improve serialization error messages. NFC --- clang-tools-extra/clangd/RIFF.cpp | 14 +++++++++----- clang-tools-extra/clangd/RIFF.h | 3 +++ clang-tools-extra/clangd/index/Serialization.cpp | 21 +++++++++++++-------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/clang-tools-extra/clangd/RIFF.cpp b/clang-tools-extra/clangd/RIFF.cpp index cdbae4f..b87c2d5 100644 --- a/clang-tools-extra/clangd/RIFF.cpp +++ b/clang-tools-extra/clangd/RIFF.cpp @@ -8,25 +8,29 @@ #include "RIFF.h" #include "llvm/Support/Endian.h" +#include "llvm/Support/Error.h" namespace clang { namespace clangd { namespace riff { -static llvm::Error makeError(const char *Msg) { - return llvm::createStringError(llvm::inconvertibleErrorCode(), Msg); +static llvm::Error makeError(const llvm::Twine &Msg) { + return llvm::make_error(Msg, + llvm::inconvertibleErrorCode()); } llvm::Expected readChunk(llvm::StringRef &Stream) { if (Stream.size() < 8) - return makeError("incomplete chunk header"); + return makeError("incomplete chunk header: " + llvm::Twine(Stream.size()) + + " bytes available"); Chunk C; std::copy(Stream.begin(), Stream.begin() + 4, C.ID.begin()); Stream = Stream.drop_front(4); uint32_t Len = llvm::support::endian::read32le(Stream.take_front(4).begin()); Stream = Stream.drop_front(4); if (Stream.size() < Len) - return makeError("truncated chunk"); + return makeError("truncated chunk: want " + llvm::Twine(Len) + ", got " + + llvm::Twine(Stream.size())); C.Data = Stream.take_front(Len); Stream = Stream.drop_front(Len); if (Len % 2 & !Stream.empty()) { // Skip padding byte. @@ -53,7 +57,7 @@ llvm::Expected readFile(llvm::StringRef Stream) { if (!RIFF) return RIFF.takeError(); if (RIFF->ID != fourCC("RIFF")) - return makeError("not a RIFF container"); + return makeError("not a RIFF container: root is " + fourCCStr(RIFF->ID)); if (RIFF->Data.size() < 4) return makeError("RIFF chunk too short"); File F; diff --git a/clang-tools-extra/clangd/RIFF.h b/clang-tools-extra/clangd/RIFF.h index d827a90..96d8ab5 100644 --- a/clang-tools-extra/clangd/RIFF.h +++ b/clang-tools-extra/clangd/RIFF.h @@ -44,6 +44,9 @@ using FourCC = std::array; inline constexpr FourCC fourCC(const char (&Literal)[5]) { return FourCC{{Literal[0], Literal[1], Literal[2], Literal[3]}}; } +inline constexpr llvm::StringRef fourCCStr(const FourCC &Data) { + return llvm::StringRef(&Data[0], Data.size()); +} // A chunk is a section in a RIFF container. struct Chunk { FourCC ID; diff --git a/clang-tools-extra/clangd/index/Serialization.cpp b/clang-tools-extra/clangd/index/Serialization.cpp index 06527a6..11d70b5 100644 --- a/clang-tools-extra/clangd/index/Serialization.cpp +++ b/clang-tools-extra/clangd/index/Serialization.cpp @@ -426,20 +426,25 @@ llvm::Expected readRIFF(llvm::StringRef Data) { if (!RIFF) return RIFF.takeError(); if (RIFF->Type != riff::fourCC("CdIx")) - return makeError("wrong RIFF type"); + return makeError("wrong RIFF filetype: " + riff::fourCCStr(RIFF->Type)); llvm::StringMap Chunks; for (const auto &Chunk : RIFF->Chunks) Chunks.try_emplace(llvm::StringRef(Chunk.ID.data(), Chunk.ID.size()), Chunk.Data); - for (llvm::StringRef RequiredChunk : {"meta", "stri"}) + if (!Chunks.count("meta")) + return makeError("missing meta chunk"); + Reader Meta(Chunks.lookup("meta")); + auto SeenVersion = Meta.consume32(); + if (SeenVersion != Version) + return makeError("wrong version: want " + llvm::Twine(Version) + ", got " + + llvm::Twine(SeenVersion)); + + // meta chunk is checked above, as we prefer the "version mismatch" error. + for (llvm::StringRef RequiredChunk : {"stri"}) if (!Chunks.count(RequiredChunk)) return makeError("missing required chunk " + RequiredChunk); - Reader Meta(Chunks.lookup("meta")); - if (Meta.consume32() != Version) - return makeError("wrong version"); - auto Strings = readStringTable(Chunks.lookup("stri")); if (!Strings) return Strings.takeError(); @@ -665,7 +670,7 @@ std::unique_ptr loadIndex(llvm::StringRef SymbolFilename, trace::Span OverallTracer("LoadIndex"); auto Buffer = llvm::MemoryBuffer::getFile(SymbolFilename); if (!Buffer) { - elog("Can't open {0}", SymbolFilename); + elog("Can't open {0}: {1}", SymbolFilename, Buffer.getError().message()); return nullptr; } @@ -682,7 +687,7 @@ std::unique_ptr loadIndex(llvm::StringRef SymbolFilename, if (I->Relations) Relations = std::move(*I->Relations); } else { - elog("Bad Index: {0}", I.takeError()); + elog("Bad index file: {0}", I.takeError()); return nullptr; } } -- 2.7.4