[llvm] [BOLT] Exit early when prepareToParse fails on buildid (PR #161151)

Paschalis Mpeis via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 7 10:51:19 PDT 2025


https://github.com/paschalis-mpeis updated https://github.com/llvm/llvm-project/pull/161151

>From bfd0874983c11bbf263e3fd3574df8ea8a602838 Mon Sep 17 00:00:00 2001
From: Paschalis Mpeis <paschalis.mpeis at arm.com>
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<StringRef> FileName = getFileNameForBuildID(FileBuildID);
   if (FileName && *FileName == sys::path::filename(BC->getFilename())) {

>From 066ebeec884bc167c8db36dd863e4ccdae5326c0 Mon Sep 17 00:00:00 2001
From: Paschalis Mpeis <paschalis.mpeis at arm.com>
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<StringRef> 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<std::unique_ptr<MemoryBuffer>> 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);



More information about the llvm-commits mailing list