git: e2bedc7d6992 - main - Extend the script to collect gprof data

From: George V. Neville-Neil <gnn_at_FreeBSD.org>
Date: Thu, 08 Jan 2026 04:14:57 UTC
The branch main has been updated by gnn:

URL: https://cgit.FreeBSD.org/src/commit/?id=e2bedc7d69926426a710d035df51e0a0812d38b1

commit e2bedc7d69926426a710d035df51e0a0812d38b1
Author:     George V. Neville-Neil <gnn@FreeBSD.org>
AuthorDate: 2026-01-08 04:13:04 +0000
Commit:     George V. Neville-Neil <gnn@FreeBSD.org>
CommitDate: 2026-01-08 04:14:52 +0000

    Extend the script to collect gprof data
    
    While we're at it, switch to simple waiting from communicate() calls.
---
 tools/test/hwpmc/pmctest.py | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/tools/test/hwpmc/pmctest.py b/tools/test/hwpmc/pmctest.py
index 588fe6d79e83..ba20306f1d68 100755
--- a/tools/test/hwpmc/pmctest.py
+++ b/tools/test/hwpmc/pmctest.py
@@ -26,6 +26,7 @@ from subprocess import PIPE
 import argparse
 import tempfile
 from pathlib import Path
+import os
 
 def gather_counters():
     """Run program and return output as array of lines."""
@@ -75,20 +76,42 @@ def main():
                 p = subprocess.Popen(["pmcstat",
                                       "-p", counter, args.program],
                                      text=True, stderr=file, stdout=file)
-                result = p.communicate()[1]
+                result = p.wait()
                 print(result)
         elif args.sample == True:
+            pmcout = tmpdir + "/" + program + "-" + counter + ".pmc"
             p = subprocess.Popen(["pmcstat",
-                                  "-O", tmpdir + "/" + program + "-" + counter + ".pmc",
+                                  "-O", pmcout,
                                   "-P", counter, args.program],
                                  text=True, stderr=PIPE)
-            result = p.communicate()[1]
+            result = p.wait()
+            resdir = tmpdir + "/" + program + "-" + counter + ".results"
+            os.makedirs(resdir)
+            p = subprocess.Popen(["pmcstat",
+                                  "-R", pmcout,
+                                  "-g"],
+                                 cwd=resdir,
+                                 text=True, stderr=PIPE)
+            result = p.wait()
+            gmondir = resdir + "/" + counter
+            if Path(gmondir).is_dir():
+                with open(gmondir + "/" + "gprof.out", "w") as file:
+                    p = subprocess.Popen(["gprof",
+                                          args.program,
+                                          program + ".gmon"],
+                                         cwd=gmondir,
+                                         text=True,
+                                         stdout=file,
+                                         stderr=subprocess.STDOUT)
+                    result = p.wait()
+            else:
+                print ("Failed to get gmon data for ", counter)
             print(result)
 
         else:
             p = subprocess.Popen(["pmcstat", "-p", counter, args.program],
                              text=True, stderr=PIPE)
-            result = p.communicate()[1]
+            result = p.wait()
             print(result)
             if (args.wait == True):
                 try: