#!/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 # GOODGIT # BADGIT # TARGET # CPU # FPU # MODE # SIMU # TARGETBOARD: additional test flags # Sample usage: # EXP=advsimd-intrinsics.exp TESTNAME=vduph_lane.c TARGET=aarch64-linux-gnu GOODGIT=242941 BADGIT=242954 ./abe-bisect.sh # Check if the variable NAME is set check_set() { name=$1 local val eval val=\$${name} [ x$val = x ] && echo $1 not set && exit 1 } check_set EXP check_set TESTNAME check_set GOODGIT check_set BADGIT 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}" || exit mydir="$(pwd)" cd ${rundir} || exit MAILBODY=${rundir}/mail-body.txt rm -f $MAILBODY echo "Please check console output at ${BUILD_URL} to view the results." > $MAILBODY 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 || exit git bisect reset git reset --hard git pull git bisect start --no-checkout [ "x$GOODGIT" != "x" ] && GOODSHA1=`git log --format=format:"%H" -n1 ${GOODGIT}` [ "x$BADGIT" != "x" ] && BADSHA1=`git log --format=format:"%H" -n1 ${BADGIT}` echo GOOD: $GOODSHA1 echo BAD: $BADSHA1 [ x"$GOODSHA1" = x ] && (echo "ERROR: Could not find good commit ($GOODGIT)" | tee -a $MAILBODY) && exit 1 [ x"$BADSHA1" = x ] && (echo "ERROR: Could not find bad commit ($BADGIT)" | tee -a $MAILBODY) && 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} || exit ${ABE}/abe.sh --target ${TARGET} \ gcc=gcc.git@${GOODSHA1} \ ${GCC_OVERRIDE_CONFIGURE} \ --build all &> gcc-${GOODSHA1}.log if [ $? -ne 0 ]; then echo "ERROR: failure while building GOOD ($GOODGIT}" | tee -a $MAILBODY exit 1 fi ${ABE}/abe.sh --target ${TARGET} \ gcc=gcc.git@${GOODSHA1} \ --set runtestflags="${EXP}=${TESTNAME}" \ ${GCC_OVERRIDE_CONFIGURE} \ --disable parallel \ --disable update \ --build all \ --check gcc \ --excludecheck gdb &>> gcc-${GOODSHA1}.log if [ $? -ne 0 ]; then echo "ERROR: failure while testing GOOD ($GOODGIT}" | tee -a $MAILBODY exit 1 fi goodsums=`find builds/*/${TARGET}/*gcc.git~master_rev_${GOODSHA1}-stage2/ -name "*.sum"` if [ "x$goodsums" = "x" ]; then echo "ERROR: failure while testing GOOD ($GOODGIT}" | tee -a $MAILBODY tail gcc-${GOODSHA1}.log exit 1 fi good_nb_fail=$(cat $goodsums | grep -wc FAIL) good_nb_pass=$(cat $goodsums | grep -wc PASS) ${ABE}/abe.sh --target ${TARGET} \ gcc=gcc.git@${BADSHA1} \ ${GCC_OVERRIDE_CONFIGURE} \ --build all &> gcc-${BADSHA1}.log if [ $? -ne 0 ]; then echo "ERROR: failure while building BAD ($BADGIT}" | tee -a $MAILBODY exit 1 fi ${ABE}/abe.sh --target ${TARGET} \ gcc=gcc.git@${BADSHA1} \ --set runtestflags="${EXP}=${TESTNAME}" \ ${GCC_OVERRIDE_CONFIGURE} \ --disable parallel \ --disable update \ --build all \ --check gcc \ --excludecheck gdb &>> gcc-${BADSHA1}.log if [ $? -ne 0 ]; then echo "ERROR: failure while testing BAD ($BADGIT}" | tee -a $MAILBODY exit 1 fi badsums=`find builds/*/${TARGET}/*gcc.git~master_rev_${BADSHA1}-stage2/ -name "*.sum"` if [ "x$badsums" = "x" ]; then echo "ERROR: failure while testing BAD ($BADGIT}" | tee -a $MAILBODY tail gcc-${BADSHA1}.log exit 1 fi bad_nb_fail=$(cat $badsums | grep -wc FAIL) bad_nb_pass=$(cat $badsums | grep -wc PASS) # make sure BAD has more failures than GOOD if [ $bad_nb_fail -le $good_nb_fail ]; then echo "ERROR: BAD ($BADGIT) does not have more failures ($bad_nb_fail) than GOOD ($GOODGIT) ($good_nb_fail)" | tee -a $MAILBODY goodlogs=$(echo $goodsums | sed 's/.sum/.log/g') echo "Contents of GOOD .log ($goodlogs)" cat $goodlogs badlogs=$(echo $badsums | sed 's/.sum/.log/g') echo "Contents of BAD .log ($badlogs)" cat $badlogs exit 1 fi popd || exit 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 | tee bisect.log git bisect visualize | tee -a $MAILBODY