[llvm] [llvm-exegesis] Debug generated disassembly (PR #142540)

Lakshay Kumar via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 3 01:50:59 PDT 2025


================
@@ -588,6 +594,99 @@ class SubProcessFunctionExecutorImpl
   const std::optional<int> BenchmarkProcessCPU;
 };
 #endif // __linux__
+
+// Helper function to print generated assembly snippets
+void printGeneratedAssembly(
+    const std::vector<std::pair<std::string, std::pair<uint64_t, std::string>>>
+        &Instructions,
+    bool Preview, size_t PreviewFirst = 10, size_t PreviewLast = 3) {
+  dbgs() << "```\n";
+  size_t N = Instructions.size();
+  // Print first "PreviewFirst" lines or all if less
+  for (size_t i = 0; i < std::min(size_t(PreviewFirst), N); ++i) {
+    dbgs() << format_hex_no_prefix(Instructions[i].second.first, 0) << ":\t"
+           << Instructions[i].second.second << Instructions[i].first << '\n';
+  }
+  if (N > (PreviewFirst + PreviewLast)) {
+    if (Preview) {
+      dbgs() << "...\t(" << (N - PreviewFirst - PreviewLast)
+             << " more instructions)\n";
+    } else {
+      // Print all middle lines
+      for (size_t i = PreviewFirst; i < N - PreviewLast; ++i) {
+        dbgs() << format_hex_no_prefix(Instructions[i].second.first, 0) << ":\t"
+               << Instructions[i].second.second << Instructions[i].first
+               << '\n';
+      }
+    }
+    // Print last "PreviewLast" lines
+    for (size_t i = N - PreviewLast; i < N; ++i) {
+      dbgs() << format_hex_no_prefix(Instructions[i].second.first, 0) << ":\t"
+             << Instructions[i].second.second << Instructions[i].first << '\n';
+    }
+  }
+  dbgs() << "```\n";
+}
+
+// Function to extract and print assembly from snippet
+void printAssembledSnippet(const LLVMState &State,
+                           const SmallString<0> &Snippet) {
+  // Extract the actual function bytes from the object file
+  std::vector<uint8_t> FunctionBytes;
+  if (auto Err = getBenchmarkFunctionBytes(Snippet, FunctionBytes)) {
+    dbgs() << "Failed to extract function bytes: " << toString(std::move(Err))
----------------
lakshayk-nv wrote:

> @boomanaiden154 : Why the preference for a soft failure here?
>>
> Printing generating assembly as we agreed, quite an optional feature, orthogonal to getting hardware measurement. Thus, didn't want to interfere with default functioning of exegesis and simple print out any error/warning in this flow and continue with soft failure
>>
Introduced `ExitWithError(...)` instead of soft failure, because i guess if there is problem in generated snippet we can figure it out here rather than at execution of snippet.

https://github.com/llvm/llvm-project/pull/142540


More information about the llvm-commits mailing list