llvm-project/libcxx/utils/libcxx-benchmark-json
2025-01-07 12:37:11 -05:00

58 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
PROGNAME="$(basename "${0}")"
MONOREPO_ROOT="$(realpath $(dirname "${PROGNAME}"))"
function usage() {
cat <<EOF
Usage:
${PROGNAME} [-h|--help] <build-directory> benchmarks...
Print the path to the JSON files containing benchmark results for the given benchmarks.
This requires those benchmarks to have already been run, i.e. this only resolves the path
to the benchmark .json file within the build directory.
<build-directory> The path to the build directory.
benchmarks... Paths of the benchmarks to extract the results for. Those paths are relative to '<monorepo-root>'.
Example
=======
$ cmake -S runtimes -B build/ -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi"
$ libcxx-lit build/ -sv libcxx/test/benchmarks/algorithms/for_each.bench.cpp
$ less \$(${PROGNAME} build/ libcxx/test/benchmarks/algorithms/for_each.bench.cpp)
EOF
}
if [[ "${1}" == "-h" || "${1}" == "--help" ]]; then
usage
exit 0
fi
if [[ $# -lt 1 ]]; then
usage
exit 1
fi
build_dir="${1}"
shift
for benchmark in ${@}; do
# Normalize the paths by turning all benchmarks paths into absolute ones and then making them
# relative to the root of the monorepo.
benchmark="$(realpath ${benchmark})"
relative=$(python -c "import os; import sys; print(os.path.relpath(sys.argv[1], sys.argv[2]))" "${benchmark}" "${MONOREPO_ROOT}")
# Extract components of the benchmark path
directory="$(dirname ${relative})"
file="$(basename ${relative})"
# Reconstruct the (slightly weird) path to the benchmark json file. This should be kept in sync
# whenever the test suite changes.
json="${build_dir}/${directory}/Output/${file}.dir/benchmark-result.json"
if [[ -f "${json}" ]]; then
echo "${json}"
fi
done