| #!/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 |