================
@@ -370,6 +375,65 @@ PerfReaderBase::create(ProfiledBinary *Binary, 
PerfInputFile &PerfInput,
   return PerfReader;
 }
 
+Error PerfReaderBase::parseDataAccessPerfTraces(
+    StringRef DataAccessPerfTraceFile, std::optional<int32_t> PIDFilter) {
+  // A perf_record_sample line is like
+  // . 1282514022939813 0x87b0 [0x60]: PERF_RECORD_SAMPLE(IP, 0x4002):
+  // 3446532/3446532: 0x2608a2 period: 233 addr: 0x3b3fb0
+  constexpr static const char *const DataAccessSamplePattern =
+      "PERF_RECORD_SAMPLE\\([A-Za-z]+, 0x[0-9a-fA-F]+\\): "
+      "([0-9]+)\\/[0-9]+: (0x[0-9a-fA-F]+) period: [0-9]+ addr: "
+      "(0x[0-9a-fA-F]+)";
+
+  llvm::Regex logRegex(DataAccessSamplePattern);
+
+  auto BufferOrErr = MemoryBuffer::getFile(DataAccessPerfTraceFile);
+  std::error_code EC = BufferOrErr.getError();
+  if (EC)
+    return make_error<StringError>("Failed to open perf trace file: " +
+                                       DataAccessPerfTraceFile,
+                                   inconvertibleErrorCode());
+
+  assert(!SampleCounters.empty() && "Sample counters should not be empty!");
+  SampleCounter &Counter = SampleCounters.begin()->second;
+  line_iterator LineIt(*BufferOrErr.get(), true);
+  for (; !LineIt.is_at_eof(); ++LineIt) {
+    StringRef Line = *LineIt;
+
+    MMapEvent MMap;
+    if (Line.contains("PERF_RECORD_MMAP2")) {
+      if (PerfScriptReader::extractMMapEventForBinary(Binary, Line, MMap)) {
+        if (!MMap.MemProtectionFlag.contains("x")) {
+          Binary->addMMapNonTextEvent(MMap);
+        }
+      }
+      continue;
+    }
+
+    SmallVector<StringRef> Fields;
+    if (logRegex.match(Line, &Fields)) {
+      int32_t PID = 0;
+      Fields[1].getAsInteger(0, PID);
+      if (PIDFilter.has_value() && *PIDFilter != PID) {
+        continue;
+      }
+
+      uint64_t DataAddress = 0;
+      Fields[3].getAsInteger(0, DataAddress);
+
+      StringRef DataSymbol = Binary->symbolizeDataAddress(
----------------
paschalis-mpeis wrote:

Maybe it's worth adding a comment that the memory accesses pointing to the 
vtables (based on the ABI convention) are recorded?

https://github.com/llvm/llvm-project/pull/148013
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to