From b9998b1f104aa0fd0a443ac91932debef595893a Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Fri, 10 Apr 2026 21:00:38 -0700 Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?= =?UTF-8?q?l=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.4 --- 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; }; /*