diff options
author | Jessica Paquette <jpaquette@apple.com> | 2023-04-27 10:32:36 -0700 |
---|---|---|
committer | Jessica Paquette <jpaquette@apple.com> | 2023-04-27 14:51:38 -0700 |
commit | 17cfd2e025cb3aa929ad219c6ed0974d6198bf5b (patch) | |
tree | c6db1ce7931fdceaa6649e2e4981a368952cad91 /llvm/tools/llvm-profdata/llvm-profdata.cpp | |
parent | 43ba32109657b697c6dd31a30563a66dade5f254 (diff) | |
download | llvm-17cfd2e025cb3aa929ad219c6ed0974d6198bf5b.zip llvm-17cfd2e025cb3aa929ad219c6ed0974d6198bf5b.tar.gz llvm-17cfd2e025cb3aa929ad219c6ed0974d6198bf5b.tar.bz2 |
[profiling] Improve error message for raw profile header mismatches
When a user uses a mismatched clang + llvm-profdata, they didn't get a very
informative error message. It would just say "unsupported version".
As a result, users are often confused as to what they are supposed to do and
tend to assume that it's a bug in the profiling runtime.
This patch improves the error message by:
- Adding a new class of error (`raw_profile_version_mismatch`) to make it clear
that, specifically, the *raw profile* version is unsupported because of a
tool mismatch.
- Adding an error message that tells the user which raw profile version was
encountered, which version was expected, and instructs them to align their
tool versions.
To support this, this patch also updates `InstrProfError::take` to also
propagate the optional error message.
Differential Revision: https://reviews.llvm.org/D149361
Diffstat (limited to 'llvm/tools/llvm-profdata/llvm-profdata.cpp')
-rw-r--r-- | llvm/tools/llvm-profdata/llvm-profdata.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp index 3db5479..e14bfd8 100644 --- a/llvm/tools/llvm-profdata/llvm-profdata.cpp +++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp @@ -233,9 +233,10 @@ static void overlapInput(const std::string &BaseFilename, auto ReaderOrErr = InstrProfReader::create(TestFilename, *FS); if (Error E = ReaderOrErr.takeError()) { // Skip the empty profiles by returning sliently. - instrprof_error IPE = InstrProfError::take(std::move(E)); - if (IPE != instrprof_error::empty_raw_profile) - WC->Errors.emplace_back(make_error<InstrProfError>(IPE), TestFilename); + auto [ErrorCode, Msg] = InstrProfError::take(std::move(E)); + if (ErrorCode != instrprof_error::empty_raw_profile) + WC->Errors.emplace_back(make_error<InstrProfError>(ErrorCode, Msg), + TestFilename); return; } @@ -280,8 +281,9 @@ static void loadInput(const WeightedFile &Input, SymbolRemapper *Remapper, } auto MemProfError = [&](Error E) { - instrprof_error IPE = InstrProfError::take(std::move(E)); - WC->Errors.emplace_back(make_error<InstrProfError>(IPE), Filename); + auto [ErrorCode, Msg] = InstrProfError::take(std::move(E)); + WC->Errors.emplace_back(make_error<InstrProfError>(ErrorCode, Msg), + Filename); }; // Add the frame mappings into the writer context. @@ -306,9 +308,10 @@ static void loadInput(const WeightedFile &Input, SymbolRemapper *Remapper, auto ReaderOrErr = InstrProfReader::create(Input.Filename, *FS, Correlator); if (Error E = ReaderOrErr.takeError()) { // Skip the empty profiles by returning silently. - instrprof_error IPE = InstrProfError::take(std::move(E)); - if (IPE != instrprof_error::empty_raw_profile) - WC->Errors.emplace_back(make_error<InstrProfError>(IPE), Filename); + auto [ErrCode, Msg] = InstrProfError::take(std::move(E)); + if (ErrCode != instrprof_error::empty_raw_profile) + WC->Errors.emplace_back(make_error<InstrProfError>(ErrCode, Msg), + Filename); return; } @@ -335,11 +338,11 @@ static void loadInput(const WeightedFile &Input, SymbolRemapper *Remapper, } Reported = true; // Only show hint the first time an error occurs. - instrprof_error IPE = InstrProfError::take(std::move(E)); + auto [ErrCode, Msg] = InstrProfError::take(std::move(E)); std::unique_lock<std::mutex> ErrGuard{WC->ErrLock}; - bool firstTime = WC->WriterErrorCodes.insert(IPE).second; - handleMergeWriterError(make_error<InstrProfError>(IPE), Input.Filename, - FuncName, firstTime); + bool firstTime = WC->WriterErrorCodes.insert(ErrCode).second; + handleMergeWriterError(make_error<InstrProfError>(ErrCode, Msg), + Input.Filename, FuncName, firstTime); }); } @@ -370,11 +373,11 @@ static void mergeWriterContexts(WriterContext *Dst, WriterContext *Src) { exitWithError(std::move(E)); Dst->Writer.mergeRecordsFromWriter(std::move(Src->Writer), [&](Error E) { - instrprof_error IPE = InstrProfError::take(std::move(E)); + auto [ErrorCode, Msg] = InstrProfError::take(std::move(E)); std::unique_lock<std::mutex> ErrGuard{Dst->ErrLock}; - bool firstTime = Dst->WriterErrorCodes.insert(IPE).second; + bool firstTime = Dst->WriterErrorCodes.insert(ErrorCode).second; if (firstTime) - warn(toString(make_error<InstrProfError>(IPE))); + warn(toString(make_error<InstrProfError>(ErrorCode, Msg))); }); } |