[PATCH] D111902: [llvm-profgen] Warn and filter out invalid range
Lei Wang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 15 11:16:49 PDT 2021
wlei created this revision.
Herald added subscribers: hoy, wenlei, lxfind.
wlei requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D111902
Files:
llvm/tools/llvm-profgen/PerfReader.cpp
llvm/tools/llvm-profgen/PerfReader.h
llvm/tools/llvm-profgen/ProfileGenerator.cpp
Index: llvm/tools/llvm-profgen/ProfileGenerator.cpp
===================================================================
--- llvm/tools/llvm-profgen/ProfileGenerator.cpp
+++ llvm/tools/llvm-profgen/ProfileGenerator.cpp
@@ -343,17 +343,9 @@
uint64_t RangeEnd = I.first.second;
// Find the function offset range the current range begin belongs to.
auto FuncRange = Binary->findFuncOffsetRange(RangeBegin);
- if (FuncRange.second == 0)
- WithColor::warning()
- << "[" << format("%8" PRIx64, RangeBegin) << " - "
- << format("%8" PRIx64, RangeEnd)
- << "]: Invalid range or disassembling error in profiled binary.\n";
- else if (RangeEnd > FuncRange.second)
- WithColor::warning() << "[" << format("%8" PRIx64, RangeBegin) << " - "
- << format("%8" PRIx64, RangeEnd)
- << "]: Range is across different functions.\n";
- else
- Ranges[FuncRange] += 0;
+ assert((FuncRange.second && RangeEnd <= FuncRange.second) &&
+ "Invalid range should be filtered out.");
+ Ranges[FuncRange] += 0;
}
RangeSample DisjointRanges;
findDisjointRanges(DisjointRanges, Ranges);
Index: llvm/tools/llvm-profgen/PerfReader.h
===================================================================
--- llvm/tools/llvm-profgen/PerfReader.h
+++ llvm/tools/llvm-profgen/PerfReader.h
@@ -562,6 +562,8 @@
void warnIfMissingMMap();
// Emit accumulate warnings.
void warnTruncatedStack();
+ // Check if the sample range is larger than the function size.
+ void warnAndFilterInvalidRange();
// Extract call stack from the perf trace lines
bool extractCallstack(TraceStream &TraceIt,
SmallVectorImpl<uint64_t> &CallStack);
Index: llvm/tools/llvm-profgen/PerfReader.cpp
===================================================================
--- llvm/tools/llvm-profgen/PerfReader.cpp
+++ llvm/tools/llvm-profgen/PerfReader.cpp
@@ -30,6 +30,10 @@
IgnoreStackSamples("ignore-stack-samples", cl::init(false), cl::ZeroOrMore,
cl::desc("Ignore call stack samples for hybrid samples "
"and produce context-insensitive profile."));
+static cl::opt<bool> SkipCheckInvalidRange(
+ "skip-check-invalid-range", cl::init(false), cl::ZeroOrMore,
+ cl::desc(
+ "Skip the check of fitering out invalid range and warning message."));
extern cl::opt<std::string> PerfTraceFilename;
extern cl::opt<bool> ShowDisassemblyOnly;
@@ -1021,6 +1025,37 @@
}
}
+void PerfReaderBase::warnAndFilterInvalidRange() {
+ if (SkipCheckInvalidRange)
+ return;
+
+ for (auto &CI : SampleCounters) {
+ SmallVector<RangeSample::iterator> RangeToBeRemoved;
+ RangeSample &Ranges = CI.second.RangeCounter;
+ for (auto I = Ranges.begin(); I != Ranges.end(); I++) {
+ uint64_t RangeBegin = I->first.first;
+ uint64_t RangeEnd = I->first.second;
+ // Find the function offset range the current range begin belongs to.
+ auto FuncRange = Binary->findFuncOffsetRange(RangeBegin);
+ if (FuncRange.second == 0) {
+ WithColor::warning()
+ << "[" << format("%8" PRIx64, RangeBegin) << ","
+ << format("%8" PRIx64, RangeEnd)
+ << "]: Invalid range or disassembling error in profiled binary.\n";
+ RangeToBeRemoved.push_back(I);
+ } else if (RangeEnd > FuncRange.second) {
+ WithColor::warning() << "[" << format("%8" PRIx64, RangeBegin) << ","
+ << format("%8" PRIx64, RangeEnd)
+ << "]: Range is across different functions.\n";
+ RangeToBeRemoved.push_back(I);
+ }
+ for (auto &I : RangeToBeRemoved) {
+ Ranges.erase(I);
+ }
+ }
+ }
+}
+
void PerfReaderBase::parsePerfTraces() {
// Parse perf traces and do aggregation.
parseAndAggregateTrace();
@@ -1028,6 +1063,7 @@
// Generate unsymbolized profile.
warnTruncatedStack();
generateRawProfile();
+ warnAndFilterInvalidRange();
if (SkipSymbolization)
writeRawProfile(OutputFilename);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111902.380069.patch
Type: text/x-patch
Size: 4121 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211015/ddc302d6/attachment.bin>
More information about the llvm-commits
mailing list