[llvm] [llvm-profgen] Detect pre-aggregated format (PR #191593)
Amir Ayupov via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 10 21:00:51 PDT 2026
https://github.com/aaupov created https://github.com/llvm/llvm-project/pull/191593
None
>From b9998b1f104aa0fd0a443ac91932debef595893a Mon Sep 17 00:00:00 2001
From: Amir Ayupov <aaupov at fb.com>
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<CleanupInstaller, 2> 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<uint64_t> InvalidReturnAddresses;
// PID for the process of interest
std::optional<int32_t> PIDFilter;
+ // Whether the input is pre-aggregated
+ bool IsPreAggregated = false;
};
/*
More information about the llvm-commits
mailing list