diff options
author | Andrew Kaster <akaster@serenityos.org> | 2022-03-19 14:50:02 -0600 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-05-02 01:46:18 +0200 |
commit | 3e32fb911ea68938cbb39c79ab833850ebb05ce7 (patch) | |
tree | 6fd9b423245a5330ba5d094e339eaade5055eb28 | |
parent | 0e45b21e4583d4b50b888e907a51d24e1f50ca2c (diff) | |
download | serenity-3e32fb911ea68938cbb39c79ab833850ebb05ce7.zip |
Meta: Add script to analyze coverage data from an existing disk image
The analyze-qemu-coverage.sh script cracks open the _disk_image for the
given SERENITY_ARCH and SERENITY_TOOLCHAIN and extracts llvm profile
data into a local directory owned by the current user. It then calls a
coverage artifact script from llvm to create a nice html report for all
the source files referenced by the profile data files.
We currently grab a script from llvm via wget. In the future a custom
script to call llvm-cov and llvm-profdata should probably be used.
-rwxr-xr-x | Meta/analyze-qemu-coverage.sh | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/Meta/analyze-qemu-coverage.sh b/Meta/analyze-qemu-coverage.sh new file mode 100755 index 0000000000..10ee9f1d91 --- /dev/null +++ b/Meta/analyze-qemu-coverage.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +set -eo pipefail + +SCRIPT_DIR="$(dirname "${0}")" + +if [ -z "$SERENITY_ARCH" ]; then + SERENITY_ARCH="i686" +fi + +toolchain_suffix= +if [ "$SERENITY_TOOLCHAIN" = "Clang" ]; then + toolchain_suffix="clang" +fi + +BUILD_DIR="${SCRIPT_DIR}/../Build/${SERENITY_ARCH}${toolchain_suffix}" +TEMP_PROFDATA="$BUILD_DIR/tmp_profile_data" + +mkdir -p "$TEMP_PROFDATA" +mkdir -p "$BUILD_DIR/mnt" + +[ -z "${ELEVATE+x}" ] && ELEVATE="sudo" +echo "ELEVATE is $ELEVATE" + +echo "[ELEVATED] Mounting _disk_image into $BUILD_DIR/mnt, this requires elevated privileges..." +"$ELEVATE" mount "$BUILD_DIR/_disk_image" "$BUILD_DIR/mnt" +echo "[ELEVATED] Copying profile data files out of $BUILD_DIR/mnt, this requires elevated privileges..." +"$ELEVATE" cp -r "$BUILD_DIR/mnt/home/anon/profiles" "$TEMP_PROFDATA/" +echo "[ELEVATED] Unmounting _disk_image, this requires elevated privileges..." +"$ELEVATE" umount "$BUILD_DIR/mnt" +echo "[ELEVATED] Making sure profile data files are owned by the current user, this requires elevated privileges..." +"$ELEVATE" chown -R "$(id -u)":"$(id -g)" "$TEMP_PROFDATA/" + + +echo "Moving profile data into $TEMP_PROFDATA directly..." +mv "$TEMP_PROFDATA"/profiles/* "$TEMP_PROFDATA/" + +echo "Discovering all binaries and shared libraries in $BUILD_DIR/Root" +# shellcheck disable=SC2156 # The recommended fix on the Shellcheck github page for this warning causes the script to not find any files at all +mapfile -d '\n' all_binaries < <(find "$BUILD_DIR"/Root -type f -exec sh -c "file {} | grep -vi relocatable | grep -Eiq ': elf (32|64)-bit'" \; -print | grep -Ev '(usr\/Tests|usr\/local|boot\/|Loader.so)') + +# FIXME: Come up with our own coverage prep script instead of using llvm's +COVERAGE_PREPARE="$BUILD_DIR/prepare-code-coverage-artifact.py" +if [ ! -f "$COVERAGE_PREPARE" ]; then + # Download coverage prep script from github + LLVM_14_RELEASE_HASH=329fda39c507e8740978d10458451dcdb21563be + SHA256_SUM=2cf1019d1df9a10c87234e0ec9c984dbb97d5543688b7f4a7387cb377ced7f21 + URL=https://raw.githubusercontent.com/llvm/llvm-project/${LLVM_14_RELEASE_HASH}/llvm/utils/prepare-code-coverage-artifact.py + + echo "Downloading prepare-code-coverage-artifact.py from ${URL}" + wget "$URL" -P "$BUILD_DIR" + + # Verify hash matches for integrity + echo "Expecting sha256sum: $SHA256_SUM" + CALC_SUM="$(sha256sum "${COVERAGE_PREPARE}" | cut -f1 -d' ')" + echo "sha256sum($COVERAGE_PREPARE) = '$CALC_SUM'" + if [ "$CALC_SUM" != "$SHA256_SUM" ]; then + # remove downloaded file to re-download on next run + rm -f "$COVERAGE_PREPARE" + echo "sha256sums mismatching, removed erroneous download. Please re-try." + exit 1 + fi +fi + +CLANG_BINDIR="${SCRIPT_DIR}/../Toolchain/Local/clang/bin" + +# shellcheck disable=SC2128,SC2086 # all_binaries variable needs expanded to space separated string, not newline separated string +python3 "$COVERAGE_PREPARE" \ + --unified-report \ + -C "$SCRIPT_DIR/.." \ + "$CLANG_BINDIR/llvm-profdata" "$CLANG_BINDIR/llvm-cov" \ + "$TEMP_PROFDATA/" \ + "$BUILD_DIR/reports/" \ + $all_binaries |