From bfd0874983c11bbf263e3fd3574df8ea8a602838 Mon Sep 17 00:00:00 2001 From: Paschalis Mpeis Date: Mon, 29 Sep 2025 09:04:41 +0100 Subject: [PATCH 1/2] [BOLT] Exit early when prepareToParse fails on buildid --- bolt/lib/Profile/DataAggregator.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp index 3604fdd3a94b4..50012c8e25361 100644 --- a/bolt/lib/Profile/DataAggregator.cpp +++ b/bolt/lib/Profile/DataAggregator.cpp @@ -295,8 +295,10 @@ void DataAggregator::processFileBuildID(StringRef FileBuildID) { PerfProcessInfo BuildIDProcessInfo; launchPerfProcess("buildid list", BuildIDProcessInfo, "buildid-list"); - if (prepareToParse("buildid", BuildIDProcessInfo, WarningCallback)) - return; + int ErrCode = prepareToParse("buildid", BuildIDProcessInfo, WarningCallback); + if (ErrCode != 0) { + exit(ErrCode); + } std::optional FileName = getFileNameForBuildID(FileBuildID); if (FileName && *FileName == sys::path::filename(BC->getFilename())) { From 066ebeec884bc167c8db36dd863e4ccdae5326c0 Mon Sep 17 00:00:00 2001 From: Paschalis Mpeis Date: Tue, 7 Oct 2025 18:26:54 +0100 Subject: [PATCH 2/2] Avoid prepareToParse crash I stumbled upon a case where perpareToParse return an error message on 'buildid', but then on a subsequent call for 'mmap events' it crashed with: > Assertion `!HasError && "Cannot get value when an error exists!"' failed. This was due to an Error while reading the error message (ErrorMB). --- bolt/lib/Profile/DataAggregator.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp index 50012c8e25361..07f21187b5edd 100644 --- a/bolt/lib/Profile/DataAggregator.cpp +++ b/bolt/lib/Profile/DataAggregator.cpp @@ -295,10 +295,8 @@ void DataAggregator::processFileBuildID(StringRef FileBuildID) { PerfProcessInfo BuildIDProcessInfo; launchPerfProcess("buildid list", BuildIDProcessInfo, "buildid-list"); - int ErrCode = prepareToParse("buildid", BuildIDProcessInfo, WarningCallback); - if (ErrCode != 0) { - exit(ErrCode); - } + if (prepareToParse("buildid", BuildIDProcessInfo, WarningCallback)) + return; std::optional FileName = getFileNameForBuildID(FileBuildID); if (FileName && *FileName == sys::path::filename(BC->getFilename())) { @@ -434,7 +432,18 @@ int DataAggregator::prepareToParse(StringRef Name, PerfProcessInfo &Process, if (PI.ReturnCode != 0) { ErrorOr> ErrorMB = MemoryBuffer::getFileOrSTDIN(Process.StderrPath.data()); - StringRef ErrBuf = (*ErrorMB)->getBuffer(); + std::string ErrMsg; + StringRef ErrBuf; + if (std::error_code EC = ErrorMB.getError()) { + ErrMsg = "PERF2BOLT: cannot open "; + ErrMsg += Process.StderrPath.data(); + ErrMsg += ": "; + ErrMsg += EC.message(); + ErrMsg += '\n'; + ErrBuf = ErrMsg; + } else { + ErrBuf = (*ErrorMB)->getBuffer(); + } deleteTempFiles(); Callback(PI.ReturnCode, ErrBuf);