From cb51d01140fa8ed901ce3c4b2ca460556836df0c Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Fri, 10 Apr 2026 21:01:31 -0700 Subject: [PATCH 1/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.4 [skip ci] --- llvm/tools/llvm-profgen/PerfReader.cpp | 15 +++++++++------ llvm/tools/llvm-profgen/PerfReader.h | 9 +++++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/llvm/tools/llvm-profgen/PerfReader.cpp b/llvm/tools/llvm-profgen/PerfReader.cpp index 1dc59321fd91f..bbfde1256f2cc 100644 --- a/llvm/tools/llvm-profgen/PerfReader.cpp +++ b/llvm/tools/llvm-profgen/PerfReader.cpp @@ -365,9 +365,11 @@ PerfReaderBase::create(ProfiledBinary *Binary, PerfInputFile &PerfInput, PerfInput.Content = PerfScriptReader::checkPerfScriptType(PerfInput.InputFile); - if (PerfInput.Content == PerfContent::LBRStack) { - PerfReader.reset( - new HybridPerfReader(Binary, PerfInput.InputFile, PIDFilter)); + if (PerfInput.Content == PerfContent::LBRStack || + PerfInput.Content == PerfContent::AggLBRStack) { + auto *Reader = new HybridPerfReader(Binary, PerfInput.InputFile, PIDFilter); + Reader->setIsPreAggregated(PerfInput.Content == PerfContent::AggLBRStack); + PerfReader.reset(Reader); } else if (PerfInput.Content == PerfContent::LBR) { PerfReader.reset(new LBRPerfReader(Binary, PerfInput.InputFile, PIDFilter)); } else { @@ -1191,8 +1193,9 @@ PerfContent PerfScriptReader::checkPerfScriptType(StringRef FileName) { TraceStream TraceIt(FileName); uint64_t FrameAddr = 0; while (!TraceIt.isAtEoF()) { - // Skip the aggregated count - if (!TraceIt.getCurrentLine().getAsInteger(10, FrameAddr)) + // Skip the aggregated count and detect pre-aggregated input. + bool HasAggCount = !TraceIt.getCurrentLine().getAsInteger(10, FrameAddr); + if (HasAggCount) TraceIt.advance(); // Detect sample with call stack @@ -1205,7 +1208,7 @@ PerfContent PerfScriptReader::checkPerfScriptType(StringRef FileName) { if (!TraceIt.isAtEoF()) { if (isLBRSample(TraceIt.getCurrentLine())) { if (Count > 0) - return PerfContent::LBRStack; + return HasAggCount ? PerfContent::AggLBRStack : PerfContent::LBRStack; else return PerfContent::LBR; } diff --git a/llvm/tools/llvm-profgen/PerfReader.h b/llvm/tools/llvm-profgen/PerfReader.h index 2a4c7594d3a93..83c4fb0447c5c 100644 --- a/llvm/tools/llvm-profgen/PerfReader.h +++ b/llvm/tools/llvm-profgen/PerfReader.h @@ -69,8 +69,9 @@ enum PerfFormat { // The type of perfscript content. enum PerfContent { UnknownContent = 0, - LBR = 1, // Only LBR sample. - LBRStack = 2, // Hybrid sample including call stack and LBR stack. + LBR = 1, // Only LBR sample. + LBRStack = 2, // Hybrid sample including call stack and LBR stack. + AggLBRStack = 3, // Pre-aggregated hybrid sample. }; struct PerfInputFile { @@ -631,6 +632,8 @@ class PerfScriptReader : public PerfReaderBase { // receiving signals. static SmallVector TempFileCleanups; + void setIsPreAggregated(bool V) { IsPreAggregated = V; } + protected: // Check whether a given line is LBR sample static bool isLBRSample(StringRef Line); @@ -676,6 +679,8 @@ class PerfScriptReader : public PerfReaderBase { std::set InvalidReturnAddresses; // PID for the process of interest std::optional PIDFilter; + // Whether the input is pre-aggregated + bool IsPreAggregated = false; }; /* From 97678ade1c3cf0cd84d814ef0e849a681e2297e0 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Fri, 10 Apr 2026 21:10:08 -0700 Subject: [PATCH 2/4] HasPrefix Created using spr 1.3.4 --- llvm/tools/llvm-profgen/PerfReader.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/tools/llvm-profgen/PerfReader.cpp b/llvm/tools/llvm-profgen/PerfReader.cpp index 9dda11a7ade50..0d90a77fca185 100644 --- a/llvm/tools/llvm-profgen/PerfReader.cpp +++ b/llvm/tools/llvm-profgen/PerfReader.cpp @@ -657,7 +657,7 @@ void HybridPerfReader::unwindSamples() { } /// Parse a hex address from \p Str. -static bool parseAddress(StringRef Str, uint64_t &Addr, bool HasPrefix = false) { +static bool parseAddress(StringRef Str, uint64_t &Addr, bool HasPrefix) { if (Str.consume_front("0x") != HasPrefix) return false; return Str.getAsInteger(16, Addr); @@ -681,7 +681,7 @@ bool PerfScriptReader::extractLBRStack(TraceStream &TraceIt, size_t Index = 0; uint64_t LeadingAddr; if (!Records.empty() && !Records[0].contains('/')) { - if (parseAddress(Records[0], LeadingAddr)) { + if (parseAddress(Records[0], LeadingAddr, false)) { WarnInvalidLBR(TraceIt); TraceIt.advance(); return false; @@ -740,7 +740,7 @@ bool PerfScriptReader::extractCallstack(TraceStream &TraceIt, while (!TraceIt.isAtEoF() && !TraceIt.getCurrentLine().starts_with(" 0x")) { StringRef FrameStr = TraceIt.getCurrentLine().ltrim(); uint64_t FrameAddr = 0; - if (parseAddress(FrameStr, FrameAddr)) { + if (parseAddress(FrameStr, FrameAddr, false)) { // We might parse a non-perf sample line like empty line and comments, // skip it TraceIt.advance(); @@ -1208,7 +1208,7 @@ PerfContent PerfScriptReader::checkPerfScriptType(StringRef FileName) { // Detect sample with call stack int32_t Count = 0; while (!TraceIt.isAtEoF() && - !parseAddress(TraceIt.getCurrentLine().ltrim(), FrameAddr)) { + !parseAddress(TraceIt.getCurrentLine().ltrim(), FrameAddr, false)) { Count++; TraceIt.advance(); } From f06cb0d66fcaa4ec041e4807dcb58d23241f589b Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Fri, 10 Apr 2026 22:44:09 -0700 Subject: [PATCH 3/4] Update llvm/tools/llvm-profgen/PerfReader.cpp --- llvm/tools/llvm-profgen/PerfReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/tools/llvm-profgen/PerfReader.cpp b/llvm/tools/llvm-profgen/PerfReader.cpp index 0d90a77fca185..2b4b868efb4fd 100644 --- a/llvm/tools/llvm-profgen/PerfReader.cpp +++ b/llvm/tools/llvm-profgen/PerfReader.cpp @@ -659,7 +659,7 @@ void HybridPerfReader::unwindSamples() { /// Parse a hex address from \p Str. static bool parseAddress(StringRef Str, uint64_t &Addr, bool HasPrefix) { if (Str.consume_front("0x") != HasPrefix) - return false; + return true; return Str.getAsInteger(16, Addr); } From ccd3465eaf9ba2de503e0105889bf1f531293cda Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Fri, 1 May 2026 16:08:00 -0700 Subject: [PATCH 4/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20introduced=20through=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.4 [skip ci] --- llvm/tools/llvm-profgen/PerfReader.cpp | 15 ++++++--------- llvm/tools/llvm-profgen/PerfReader.h | 9 ++------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/llvm/tools/llvm-profgen/PerfReader.cpp b/llvm/tools/llvm-profgen/PerfReader.cpp index bbfde1256f2cc..1dc59321fd91f 100644 --- a/llvm/tools/llvm-profgen/PerfReader.cpp +++ b/llvm/tools/llvm-profgen/PerfReader.cpp @@ -365,11 +365,9 @@ PerfReaderBase::create(ProfiledBinary *Binary, PerfInputFile &PerfInput, PerfInput.Content = PerfScriptReader::checkPerfScriptType(PerfInput.InputFile); - if (PerfInput.Content == PerfContent::LBRStack || - PerfInput.Content == PerfContent::AggLBRStack) { - auto *Reader = new HybridPerfReader(Binary, PerfInput.InputFile, PIDFilter); - Reader->setIsPreAggregated(PerfInput.Content == PerfContent::AggLBRStack); - PerfReader.reset(Reader); + if (PerfInput.Content == PerfContent::LBRStack) { + PerfReader.reset( + new HybridPerfReader(Binary, PerfInput.InputFile, PIDFilter)); } else if (PerfInput.Content == PerfContent::LBR) { PerfReader.reset(new LBRPerfReader(Binary, PerfInput.InputFile, PIDFilter)); } else { @@ -1193,9 +1191,8 @@ PerfContent PerfScriptReader::checkPerfScriptType(StringRef FileName) { TraceStream TraceIt(FileName); uint64_t FrameAddr = 0; while (!TraceIt.isAtEoF()) { - // Skip the aggregated count and detect pre-aggregated input. - bool HasAggCount = !TraceIt.getCurrentLine().getAsInteger(10, FrameAddr); - if (HasAggCount) + // Skip the aggregated count + if (!TraceIt.getCurrentLine().getAsInteger(10, FrameAddr)) TraceIt.advance(); // Detect sample with call stack @@ -1208,7 +1205,7 @@ PerfContent PerfScriptReader::checkPerfScriptType(StringRef FileName) { if (!TraceIt.isAtEoF()) { if (isLBRSample(TraceIt.getCurrentLine())) { if (Count > 0) - return HasAggCount ? PerfContent::AggLBRStack : PerfContent::LBRStack; + return PerfContent::LBRStack; else return PerfContent::LBR; } diff --git a/llvm/tools/llvm-profgen/PerfReader.h b/llvm/tools/llvm-profgen/PerfReader.h index 83c4fb0447c5c..2a4c7594d3a93 100644 --- a/llvm/tools/llvm-profgen/PerfReader.h +++ b/llvm/tools/llvm-profgen/PerfReader.h @@ -69,9 +69,8 @@ enum PerfFormat { // The type of perfscript content. enum PerfContent { UnknownContent = 0, - LBR = 1, // Only LBR sample. - LBRStack = 2, // Hybrid sample including call stack and LBR stack. - AggLBRStack = 3, // Pre-aggregated hybrid sample. + LBR = 1, // Only LBR sample. + LBRStack = 2, // Hybrid sample including call stack and LBR stack. }; struct PerfInputFile { @@ -632,8 +631,6 @@ class PerfScriptReader : public PerfReaderBase { // receiving signals. static SmallVector TempFileCleanups; - void setIsPreAggregated(bool V) { IsPreAggregated = V; } - protected: // Check whether a given line is LBR sample static bool isLBRSample(StringRef Line); @@ -679,8 +676,6 @@ class PerfScriptReader : public PerfReaderBase { std::set InvalidReturnAddresses; // PID for the process of interest std::optional PIDFilter; - // Whether the input is pre-aggregated - bool IsPreAggregated = false; }; /*