diff options
Diffstat (limited to 'llvm_tools/llvm_local_bisection.sh')
-rwxr-xr-x | llvm_tools/llvm_local_bisection.sh | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/llvm_tools/llvm_local_bisection.sh b/llvm_tools/llvm_local_bisection.sh new file mode 100755 index 00000000..e319080c --- /dev/null +++ b/llvm_tools/llvm_local_bisection.sh @@ -0,0 +1,109 @@ +#!/bin/bash -u +# -*- coding: utf-8 -*- +# Copyright 2022 The ChromiumOS Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# llvm_bisection_template.sh +# +# This script is meant to be run inside a `git bisect` process, like so: +# +# $ cd <your llvm-project dir> +# $ git bisect start +# $ git bisect bad <your bad ref> +# $ git bisect good <your good ref> +# $ git bisect run ~/chromimuos/src/scripts/llvm_bisection_template.sh +# +# This template exists as a "batteries included" LLVM bisection script, +# which will modify the LLVM_NEXT hash to help the mage track down issues +# locally. +# +# Modify the fixme sections below to customize to your bisection use-case. + +# FIXME: Replace this for the location of your llvm clone within the chroot. +# We need this for the git history. +LLVM_CLONE_PATH="${HOME}/chromiumos/src/third_party/llvm-project" + +main () { + # Note this builds with USE="llvm-next debug -thinlto -llvm_pgo_use continue-on-patch-failure" + build_llvm || exit + + # FIXME: Write your actual bisection command here which uses + # LLVM_NEXT here. + # + # Example bisection command: + # + # build_pkg efitools || exit 1 + # + # You can use build_pkg if you want to emerge a package and print + # out diagnostics along the way + # + # Fail Example: build_pkg "${MY_PACKAGE}" || exit 1 + # Skip Example: build_pkg "${MY_PACKAGE}" || exit 125 + # +} + +# --------------------------------------------------------------------- + +# Current LLVM_NEXT_HASH we're using. Does not need to be set. +CURRENT='UNKNOWN' + +logdo () { + local cmd="${1}" + shift + printf '%1 $ %2' "$(date '+%T')" "${cmd}" + for i in "$@"; do + printf "'%1'" "${i}" + done + printf "\n" + "${cmd}" "$@" +} + +log () { + echo "$(date '+%T') | $*" +} + +build_llvm () { + cd "${LLVM_CLONE_PATH}" || exit 2 # Exit with error + local llvm_ebuild_path + llvm_ebuild_path="$(readlink -f "$(equery which llvm)")" + CURRENT="$(git rev-parse --short HEAD)" + log "Current hash=${CURRENT}" + NEW_LINE="LLVM_NEXT_HASH=\"${CURRENT}\"" + sed -i "s/^LLVM_NEXT_HASH=\".*\"/${NEW_LINE}/" "${llvm_ebuild_path}" + + local logfile="/tmp/build-llvm.${CURRENT}.out" + log "Writing logs to ${logfile}" + log "sudo USE='llvm-next debug -thinlto -llvm_use_pgo continue-on-patch-failure'" \ + " emerge sys-devel/llvm" + logdo sudo USE='llvm-next debug -thinlto -llvm_use_pgo continue-on-patch-failure' emerge \ + sys-devel/llvm \ + &> "${logfile}" + local emerge_exit_code="$?" + if [[ "${emerge_exit_code}" -ne 0 ]]; then + log "FAILED to build llvm with hash=${CURRENT}" + log 'Skipping this hash' + return 125 # 125 is the "skip" exit code. + fi + log "Succesfully built LLVM with hash=${CURRENT}" + return 0 # Explicitly returning 0 for "good" even if a command errors out +} + +build_pkg () { + local pkg="${1}" + + local logfile="/tmp/build-${pkg}.${CURRENT}.out" + log "Writing logs to ${logfile}" + log "sudo emerge ${pkg}" + logdo sudo emerge "${pkg}" \ + &> "${logfile}" + local emerge_exit_code="$?" + if [[ "${emerge_exit_code}" -ne 0 ]]; then + log "FAILED to build ${pkg} with hash=${CURRENT}" + return 1 # 1 here isn't for bisection, but for chaining with `||` + fi + log "Successfully built ${pkg} with hash=${CURRENT}" + return 0 # Explicitly returning 0 for "good" even if a command errors out +} + +main |