[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