summaryrefslogtreecommitdiff
path: root/Meta
diff options
context:
space:
mode:
authorAndrew Kaster <akaster@serenityos.org>2022-03-19 14:50:02 -0600
committerAndreas Kling <kling@serenityos.org>2022-05-02 01:46:18 +0200
commit3e32fb911ea68938cbb39c79ab833850ebb05ce7 (patch)
tree6fd9b423245a5330ba5d094e339eaade5055eb28 /Meta
parent0e45b21e4583d4b50b888e907a51d24e1f50ca2c (diff)
downloadserenity-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.
Diffstat (limited to 'Meta')
-rwxr-xr-xMeta/analyze-qemu-coverage.sh74
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