Skip to content

Commit a15d798

Browse files
committed
[clangd] Improve serialization error messages. NFC
1 parent 6aab27b commit a15d798

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

Diff for: clang-tools-extra/clangd/RIFF.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,29 @@
88

99
#include "RIFF.h"
1010
#include "llvm/Support/Endian.h"
11+
#include "llvm/Support/Error.h"
1112

1213
namespace clang {
1314
namespace clangd {
1415
namespace riff {
1516

16-
static llvm::Error makeError(const char *Msg) {
17-
return llvm::createStringError(llvm::inconvertibleErrorCode(), Msg);
17+
static llvm::Error makeError(const llvm::Twine &Msg) {
18+
return llvm::make_error<llvm::StringError>(Msg,
19+
llvm::inconvertibleErrorCode());
1820
}
1921

2022
llvm::Expected<Chunk> readChunk(llvm::StringRef &Stream) {
2123
if (Stream.size() < 8)
22-
return makeError("incomplete chunk header");
24+
return makeError("incomplete chunk header: " + llvm::Twine(Stream.size()) +
25+
" bytes available");
2326
Chunk C;
2427
std::copy(Stream.begin(), Stream.begin() + 4, C.ID.begin());
2528
Stream = Stream.drop_front(4);
2629
uint32_t Len = llvm::support::endian::read32le(Stream.take_front(4).begin());
2730
Stream = Stream.drop_front(4);
2831
if (Stream.size() < Len)
29-
return makeError("truncated chunk");
32+
return makeError("truncated chunk: want " + llvm::Twine(Len) + ", got " +
33+
llvm::Twine(Stream.size()));
3034
C.Data = Stream.take_front(Len);
3135
Stream = Stream.drop_front(Len);
3236
if (Len % 2 & !Stream.empty()) { // Skip padding byte.
@@ -53,7 +57,7 @@ llvm::Expected<File> readFile(llvm::StringRef Stream) {
5357
if (!RIFF)
5458
return RIFF.takeError();
5559
if (RIFF->ID != fourCC("RIFF"))
56-
return makeError("not a RIFF container");
60+
return makeError("not a RIFF container: root is " + fourCCStr(RIFF->ID));
5761
if (RIFF->Data.size() < 4)
5862
return makeError("RIFF chunk too short");
5963
File F;

Diff for: clang-tools-extra/clangd/RIFF.h

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ using FourCC = std::array<char, 4>;
4444
inline constexpr FourCC fourCC(const char (&Literal)[5]) {
4545
return FourCC{{Literal[0], Literal[1], Literal[2], Literal[3]}};
4646
}
47+
inline constexpr llvm::StringRef fourCCStr(const FourCC &Data) {
48+
return llvm::StringRef(&Data[0], Data.size());
49+
}
4750
// A chunk is a section in a RIFF container.
4851
struct Chunk {
4952
FourCC ID;

Diff for: clang-tools-extra/clangd/index/Serialization.cpp

+13-8
Original file line numberDiff line numberDiff line change
@@ -426,20 +426,25 @@ llvm::Expected<IndexFileIn> readRIFF(llvm::StringRef Data) {
426426
if (!RIFF)
427427
return RIFF.takeError();
428428
if (RIFF->Type != riff::fourCC("CdIx"))
429-
return makeError("wrong RIFF type");
429+
return makeError("wrong RIFF filetype: " + riff::fourCCStr(RIFF->Type));
430430
llvm::StringMap<llvm::StringRef> Chunks;
431431
for (const auto &Chunk : RIFF->Chunks)
432432
Chunks.try_emplace(llvm::StringRef(Chunk.ID.data(), Chunk.ID.size()),
433433
Chunk.Data);
434434

435-
for (llvm::StringRef RequiredChunk : {"meta", "stri"})
435+
if (!Chunks.count("meta"))
436+
return makeError("missing meta chunk");
437+
Reader Meta(Chunks.lookup("meta"));
438+
auto SeenVersion = Meta.consume32();
439+
if (SeenVersion != Version)
440+
return makeError("wrong version: want " + llvm::Twine(Version) + ", got " +
441+
llvm::Twine(SeenVersion));
442+
443+
// meta chunk is checked above, as we prefer the "version mismatch" error.
444+
for (llvm::StringRef RequiredChunk : {"stri"})
436445
if (!Chunks.count(RequiredChunk))
437446
return makeError("missing required chunk " + RequiredChunk);
438447

439-
Reader Meta(Chunks.lookup("meta"));
440-
if (Meta.consume32() != Version)
441-
return makeError("wrong version");
442-
443448
auto Strings = readStringTable(Chunks.lookup("stri"));
444449
if (!Strings)
445450
return Strings.takeError();
@@ -665,7 +670,7 @@ std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFilename,
665670
trace::Span OverallTracer("LoadIndex");
666671
auto Buffer = llvm::MemoryBuffer::getFile(SymbolFilename);
667672
if (!Buffer) {
668-
elog("Can't open {0}", SymbolFilename);
673+
elog("Can't open {0}: {1}", SymbolFilename, Buffer.getError().message());
669674
return nullptr;
670675
}
671676

@@ -682,7 +687,7 @@ std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFilename,
682687
if (I->Relations)
683688
Relations = std::move(*I->Relations);
684689
} else {
685-
elog("Bad Index: {0}", I.takeError());
690+
elog("Bad index file: {0}", I.takeError());
686691
return nullptr;
687692
}
688693
}

0 commit comments

Comments
 (0)