[libcxx-commits] [libcxx] d002ce5 - [runtimes] Add a qemu-system executor script (#68643)
via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Nov 9 13:09:10 PST 2023
Author: Alexander Richardson
Date: 2023-11-09T21:09:06Z
New Revision: d002ce55f237626680f14fceecdd3c444810321b
URL: https://github.com/llvm/llvm-project/commit/d002ce55f237626680f14fceecdd3c444810321b
DIFF: https://github.com/llvm/llvm-project/commit/d002ce55f237626680f14fceecdd3c444810321b.diff
LOG: [runtimes] Add a qemu-system executor script (#68643)
This is useful when trying to test libc++/libc++abi/libunwind against a
baremetal enviroment (e.g. picolibc).
See also https://reviews.llvm.org/D155521
Added:
libcxx/utils/qemu_baremetal.py
Modified:
Removed:
################################################################################
diff --git a/libcxx/utils/qemu_baremetal.py b/libcxx/utils/qemu_baremetal.py
new file mode 100755
index 000000000000000..c509c8b4aea54cd
--- /dev/null
+++ b/libcxx/utils/qemu_baremetal.py
@@ -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
+#
+# ===----------------------------------------------------------------------===##
+
+"""qemu_baremetal.py is a utility for running a program with QEMU's system mode.
+
+It is able to pass command line arguments to the program and forward input and
+output (if the underlying baremetal enviroment supports QEMU semihosting).
+"""
+
+import argparse
+import os
+import platform
+import subprocess
+import sys
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--qemu", type=str, required=True)
+ parser.add_argument("--cpu", type=str, required=False)
+ parser.add_argument("--machine", type=str, default="virt")
+ parser.add_argument(
+ "--qemu-arg", dest="qemu_args", type=str, action="append", default=[]
+ )
+ parser.add_argument("--semihosting", action="store_true", default=True)
+ parser.add_argument("--no-semihosting", dest="semihosting", action="store_false")
+ parser.add_argument("--execdir", type=str, required=True)
+ parser.add_argument("test_binary")
+ parser.add_argument("test_args", nargs=argparse.ZERO_OR_MORE, default=[])
+ args = parser.parse_args()
+ if not os.path.exists(args.test_binary):
+ sys.exit(f"Expected argument to be a test executable: '{args.test_binary}'")
+ qemu_commandline = [
+ args.qemu,
+ "-chardev",
+ "stdio,mux=on,id=stdio0",
+ "-monitor",
+ "none",
+ "-serial",
+ "none",
+ "-machine",
+ f"{args.machine},accel=tcg",
+ "-device",
+ f"loader,file={args.test_binary},cpu-num=0",
+ "-nographic",
+ *args.qemu_args,
+ ]
+ if args.cpu:
+ qemu_commandline += ["-cpu", args.cpu]
+
+ if args.semihosting:
+ # Use QEMU's semihosting support to pass argv (supported by picolibc)
+ semihosting_config = f"enable=on,chardev=stdio0,arg={args.test_binary}"
+ for arg in args.test_args:
+ semihosting_config += f",arg={arg}"
+ qemu_commandline += ["-semihosting-config", semihosting_config]
+ elif args.test_args:
+ sys.exit(
+ "Got non-empty test arguments but do no know how to pass them to "
+ "QEMU without semihosting support"
+ )
+ os.execvp(qemu_commandline[0], qemu_commandline)
+
+
+if __name__ == "__main__":
+ exit(main())
More information about the libcxx-commits
mailing list