[libcxx-commits] [libcxx] 7723549 - [libc++] Split benchmark generation and submission into two scripts (#191211)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Apr 9 08:09:52 PDT 2026


Author: Louis Dionne
Date: 2026-04-09T11:09:46-04:00
New Revision: 772354979ffa7e61b0e85b68fbe2aa1a5e597aef

URL: https://github.com/llvm/llvm-project/commit/772354979ffa7e61b0e85b68fbe2aa1a5e597aef
DIFF: https://github.com/llvm/llvm-project/commit/772354979ffa7e61b0e85b68fbe2aa1a5e597aef.diff

LOG: [libc++] Split benchmark generation and submission into two scripts (#191211)

This makes it easier to locally replicate perf CI setups locally without
actually making submissions to the LNT instance.

Added: 
    libcxx/utils/ci/lnt/submit-benchmarks

Modified: 
    libcxx/utils/ci/lnt/README.md
    libcxx/utils/ci/lnt/run-benchmarks
    libcxx/utils/ci/lnt/runners/apple-m5-clang21
    libcxx/utils/ci/lnt/runners/apple-m5-xcode26

Removed: 
    


################################################################################
diff  --git a/libcxx/utils/ci/lnt/README.md b/libcxx/utils/ci/lnt/README.md
index 2f2f42e89d6db..ffca01c70e606 100644
--- a/libcxx/utils/ci/lnt/README.md
+++ b/libcxx/utils/ci/lnt/README.md
@@ -22,10 +22,13 @@ libcxx/utils/ci/lnt/commit-watch --lnt-url http://localhost:8000 --test-suite li
     while read commit; do                                                                                       \
         libcxx/utils/ci/lnt/run-benchmarks                                                                      \
             --test-suite-commit abcdef09                                                                        \
-            --lnt-url http://localhost:8000                                                                     \
             --machine my-laptop                                                                                 \
-            --test-suite libcxx                                                                                 \
             --compiler clang++                                                                                  \
             --benchmark-commit ${commit}                                                                        \
+            --output results.json                                                                               \
+        && libcxx/utils/ci/lnt/submit-benchmarks                                                                \
+            --lnt-url http://localhost:8000                                                                     \
+            --test-suite libcxx                                                                                 \
+            results.json                                                                                        \
     done
 ```

diff  --git a/libcxx/utils/ci/lnt/run-benchmarks b/libcxx/utils/ci/lnt/run-benchmarks
index ad2175b380fd4..e0d2c153f4f27 100755
--- a/libcxx/utils/ci/lnt/run-benchmarks
+++ b/libcxx/utils/ci/lnt/run-benchmarks
@@ -63,7 +63,7 @@ def dict_to_params(d):
 def main(argv):
     parser = argparse.ArgumentParser(
         prog='run-benchmarks',
-        description='Benchmark libc++ at the given commit and submit to LNT.')
+        description='Benchmark libc++ at the given commit and produce a LNT JSON report.')
     parser.add_argument('--benchmark-commit', type=str, required=True,
         help='The SHA representing the version of the library to benchmark.')
     parser.add_argument('--test-suite-commit', type=str, required=True,
@@ -72,10 +72,8 @@ def main(argv):
         help='Path to the compiler to use for testing.')
     parser.add_argument('--machine', type=str, required=True,
         help='The name of the machine for reporting LNT results.')
-    parser.add_argument('--test-suite', type=str, required=True,
-        help='The name of the test suite for reporting LNT results.')
-    parser.add_argument('--lnt-url', type=str, required=True,
-        help='The URL of the LNT instance to submit results to.')
+    parser.add_argument('--output', type=pathlib.Path, required=True,
+        help='Path where the resulting LNT JSON report is written. The file is overwritten if it already exists.')
     parser.add_argument('--filter', type=str, required=False,
         help="Optional test filter to pass to lit when running the benchmarks. This allows "
              "running only a subset of the benchmarks.")
@@ -123,7 +121,7 @@ def main(argv):
         build_dir = pathlib.Path(build_dir)
 
         logging.info('Installing LNT')
-        run(['python', '-m', 'venv', build_dir / '.venv'])
+        run(['python3', '-m', 'venv', build_dir / '.venv'])
         run([build_dir / '.venv/bin/pip', 'install', 'llvm-lnt'])
 
         logging.info(f'Building libc++ at commit {args.benchmark_commit}')
@@ -161,13 +159,10 @@ def main(argv):
             importreport += ['--run-info', arg]
         for arg in dict_to_params(gather_machine_information(args)):
             importreport += ['--machine-info', arg]
-        importreport += [build_dir / 'benchmarks.lnt', build_dir / 'benchmarks.json']
+        output = args.output.resolve()
+        importreport += [build_dir / 'benchmarks.lnt', output]
         run(importreport)
-
-        logging.info(f'Submitting results to {args.lnt_url}')
-        submission_url = f'{args.lnt_url}/db_default/v4/{args.test_suite}/submitRun'
-        run([build_dir / '.venv/bin/lnt', 'submit', '--ignore-regressions', '--merge', 'append',
-                                                    submission_url, build_dir / 'benchmarks.json'])
+        logging.info(f'Report written to {output}')
 
 
 if __name__ == '__main__':

diff  --git a/libcxx/utils/ci/lnt/runners/apple-m5-clang21 b/libcxx/utils/ci/lnt/runners/apple-m5-clang21
index 9b5bc44f720a2..01e4027fcb4be 100755
--- a/libcxx/utils/ci/lnt/runners/apple-m5-clang21
+++ b/libcxx/utils/ci/lnt/runners/apple-m5-clang21
@@ -25,11 +25,17 @@ run_benchmarks() {
     ${MONOREPO_DIR}/libcxx/utils/ci/lnt/run-benchmarks                                                          \
         --test-suite-commit 0eefb2682bf8c04954c46e91916b5164d8424702                                            \
         --git-repo ${MONOREPO_DIR}                                                                              \
-        --lnt-url http://lnt.llvm.org                                                                           \
-        --test-suite libcxx2                                                                                    \
         --machine apple-m5-clang21                                                                              \
         --compiler ${COMPILER}                                                                                  \
-        --benchmark-commit ${1}
+        --benchmark-commit ${1}                                                                                 \
+        --output benchmarks.json
+
+    ${MONOREPO_DIR}/libcxx/utils/ci/lnt/submit-benchmarks                                                       \
+        --lnt-url http://lnt.llvm.org                                                                           \
+        --test-suite libcxx2                                                                                    \
+        benchmarks.json
+
+    rm benchmarks.json
 }
 
 if [ ${#COMMITS[@]} -gt 0 ]; then

diff  --git a/libcxx/utils/ci/lnt/runners/apple-m5-xcode26 b/libcxx/utils/ci/lnt/runners/apple-m5-xcode26
index 6120b71e5595a..18ecc2cafc8f0 100755
--- a/libcxx/utils/ci/lnt/runners/apple-m5-xcode26
+++ b/libcxx/utils/ci/lnt/runners/apple-m5-xcode26
@@ -21,11 +21,17 @@ run_benchmarks() {
     ${MONOREPO_DIR}/libcxx/utils/ci/lnt/run-benchmarks                                                          \
         --test-suite-commit 0eefb2682bf8c04954c46e91916b5164d8424702                                            \
         --git-repo ${MONOREPO_DIR}                                                                              \
-        --lnt-url http://lnt.llvm.org                                                                           \
-        --test-suite libcxx2                                                                                    \
         --machine apple-m5-xcode26                                                                              \
         --compiler clang++                                                                                      \
-        --benchmark-commit ${1}
+        --benchmark-commit ${1}                                                                                 \
+        --output benchmarks.json
+
+    ${MONOREPO_DIR}/libcxx/utils/ci/lnt/submit-benchmarks                                                       \
+        --lnt-url http://lnt.llvm.org                                                                           \
+        --test-suite libcxx2                                                                                    \
+        benchmarks.json
+
+    rm benchmarks.json
 }
 
 if [ ${#COMMITS[@]} -gt 0 ]; then

diff  --git a/libcxx/utils/ci/lnt/submit-benchmarks b/libcxx/utils/ci/lnt/submit-benchmarks
new file mode 100755
index 0000000000000..5f25e6fef9fc3
--- /dev/null
+++ b/libcxx/utils/ci/lnt/submit-benchmarks
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+# ===----------------------------------------------------------------------===##
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+# ===----------------------------------------------------------------------===##
+
+import argparse
+import logging
+import pathlib
+import subprocess
+import sys
+import tempfile
+
+
+def main(argv):
+    parser = argparse.ArgumentParser(
+        prog='submit-benchmarks',
+        description='Submit a LNT JSON report to a LNT server.')
+    parser.add_argument('report', type=pathlib.Path,
+        help='Path to the LNT JSON report to submit.')
+    parser.add_argument('--lnt-url', type=str, required=True,
+        help='The URL of the LNT instance to submit results to.')
+    parser.add_argument('--test-suite', type=str, required=True,
+        help='The name of the test suite for reporting LNT results.')
+    parser.add_argument('--dry-run', action='store_true',
+        help='Do not actually perform any action. Use with -vv to see what would be executed.')
+    parser.add_argument('-v', '--verbose', action='count', default=0,
+        help='Verbosity level: passing the option multiple times increases the level.')
+    args = parser.parse_args(argv)
+
+    if args.verbose == 0:
+        logging.basicConfig(level=logging.INFO)
+    elif args.verbose >= 1:
+        logging.basicConfig(level=logging.DEBUG)
+
+    def run(command, **kwargs):
+        command = [str(c) for c in command]
+        logging.debug(f'$ {" ".join(command)}')
+        if args.dry_run:
+            return
+        try:
+            if not args.verbose:
+                if 'stdout' not in kwargs:
+                    kwargs['stdout'] = subprocess.PIPE
+                if 'stderr' not in kwargs:
+                    kwargs['stderr'] = subprocess.PIPE
+            subprocess.run(command, check=True, **kwargs)
+        except subprocess.CalledProcessError as e:
+            if e.stdout:
+                sys.stdout.write(e.stdout.decode())
+            if e.stderr:
+                sys.stderr.write(e.stderr.decode())
+            raise
+
+    with tempfile.TemporaryDirectory() as tmp:
+        tmp = pathlib.Path(tmp)
+
+        logging.info('Installing LNT')
+        run(['python3', '-m', 'venv', tmp / '.venv'])
+        run([tmp / '.venv/bin/pip', 'install', 'llvm-lnt'])
+
+        logging.info(f'Submitting results to {args.lnt_url}')
+        submission_url = f'{args.lnt_url}/db_default/v4/{args.test_suite}/submitRun'
+        run([tmp / '.venv/bin/lnt', 'submit', '--ignore-regressions', '--merge', 'append',
+                                               submission_url, args.report.resolve()])
+
+
+if __name__ == '__main__':
+    main(sys.argv[1:])


        


More information about the libcxx-commits mailing list