blob: 26d277d59bfaed15dcd34dd170d75cbb575cae82 [file] [log] [blame]
#!/bin/bash -u
# -*- coding: utf-8 -*-
# Copyright 2022 The ChromiumOS Authors. All rights reserved.
# 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