#!/bin/bash set -x # This script is a helper to bisect GCC regressions. # Inputs (as env. variables): # EXP: name of .exp file to run # TESTNAME: name of test to run # GOOD # BAD # TARGET # CPU # FPU # MODE # SIMU # TARGETBOARD: additional test flags # Sample usage: # EXP=advsimd-intrinsics.exp TESTNAME=vduph_lane.c TARGET=aarch64-linux-gnu GOOD=242941 BAD=242954 ./abe-bisect.sh # Check if the variable NAME is set check_set() { name=$1 eval val=\$${name} [ x$val = x ] && echo $1 not set && exit 1 } check_set EXP check_set TESTNAME check_set GOOD check_set BAD check_set TARGET #check_set CPU #check_set FPU #check_set MODE #check_set SIMU #check_set TARGETBOARD rundir=`pwd -P` mydir="$(dirname $0)" cd "${mydir}" mydir="$(pwd)" cd ${rundir} rm -rf abe git clone http://git.linaro.org/toolchain/abe.git ABE=${rundir}/abe ${ABE}/configure --with-git-reference-dir=/home/tcwg-buildslave/snapshots-ref # Checkout GCC master ${ABE}/abe.sh --target $TARGET --retrieve all rm -rf gcc-bisect-dir git-new-workdir ./snapshots/gcc.git gcc-bisect-dir cd gcc-bisect-dir git bisect reset git reset --hard git pull git bisect start --no-checkout GOODSHA1=`git log --format=format:"%H" --grep=trunk@${GOOD} master` BADSHA1=`git log --format=format:"%H" --grep=trunk@${BAD} master` echo GOOD: $GOODSHA1 echo BAD: $BADSHA1 [ x"$GOODSHA1" = x ] && echo "ERROR: Could not find good commit ($GOOD)" && exit 1 [ x"$BADSHA1" = x ] && echo "ERROR: Could not find bad commit ($BAD)" && exit 1 # Build list of gcc configure options depending on cpu/fpu/mode GCC_OVERRIDE_CONFIGURE= if [ x"${CPU}" != x ]; then GCC_OVERRIDE_CONFIGURE="${GCC_OVERRIDE_CONFIGURE} --set gcc_override_configure=--with-cpu=${CPU}" fi if [ x"${FPU}" != x ]; then GCC_OVERRIDE_CONFIGURE="${GCC_OVERRIDE_CONFIGURE} --set gcc_override_configure=--with-fpu=${FPU}" fi if [ x"${MODE}" != x ]; then GCC_OVERRIDE_CONFIGURE="${GCC_OVERRIDE_CONFIGURE} --set gcc_override_configure=--with-mode=${MODE}" fi # Sanity checks on the number of passes/fails in GOOD and BAD pushd ${rundir} ${ABE}/abe.sh --target ${TARGET} \ gcc=gcc.git@${GOODSHA1} \ --set runtestflags="${EXP}=${TESTNAME}" \ ${GCC_OVERRIDE_CONFIGURE} \ --build all \ --check gcc \ --excludecheck gdb >& gcc-${GOODSHA1}.log if [ $? -ne 0 ]; then echo "ERROR: failure while building/testing GOOD ($GOOD}" exit 1 fi sums=`find builds/*/${TARGET}/gcc.git~master_rev_${GOODSHA1}-stage2/ -name "*.sum"` good_nb_fail=$(grep ${TESTNAME} $sums | grep -c FAIL) good_nb_pass=$(grep ${TESTNAME} $sums | grep -c PASS) ${ABE}/abe.sh --target ${TARGET} \ gcc=gcc.git@${BADSHA1} \ --set runtestflags="${EXP}=${TESTNAME}" \ ${GCC_OVERRIDE_CONFIGURE} \ --build all \ --check gcc \ --excludecheck gdb >& gcc-${BADSHA1}.log if [ $? -ne 0 ]; then echo "ERROR: failure while building/testing BAD ($BAD}" exit 1 fi sums=`find builds/*/${TARGET}/gcc.git~master_rev_${BADSHA1}-stage2/ -name "*.sum"` bad_nb_fail=$(grep ${TESTNAME} $sums | grep -c FAIL) bad_nb_pass=$(grep ${TESTNAME} $sums | grep -c PASS) # make sure BAD has more failures than GOOD if [ $bad_nb_fail -le $good_nb_fail ]; then echo "ERROR: BAD ($BAD) does not have more failures ($bad_nb_fail) than GOOD ($GOOD) ($good_nb_fail)" exit 1 fi popd git bisect good ${GOODSHA1} git bisect bad ${BADSHA1} RUNDIR=${rundir} ABE=${ABE} EXP=${EXP} TESTNAME=${TESTNAME} TARGET=${TARGET} CPU=${CPU} FPU=${FPU} MODE=${MODE} SIMU=${SIMU} TARGETBOARD=${TARGETBOARD} GOODPASS=${good_nb_pass} GOODFAIL=${good_nb_fail} BADPASS=${bad_nb_pass} BADFAIL=${bad_nb_fail} git bisect run ${mydir}/abe-bisect-helper.sh