blob: 47a0afdbc4d32c4beabd50acc63ac1ae1375ecf7 [file] [log] [blame]
#!/bin/bash
# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -o xtrace
set -o nounset
set -o errexit
######################################################################
# SCRIPT CONFIG
######################################################################
readonly CLOBBER=${CLOBBER:-yes}
readonly SCONS_TRUSTED="./scons --mode=opt-host -j8"
readonly SCONS_NACL="./scons --mode=opt-host,nacl -j8"
readonly SPEC_HARNESS=${SPEC_HARNESS:-$(pwd)/out/cpu2000}/
readonly TRYBOT_TESTS="176.gcc 179.art 181.mcf 197.parser 252.eon 254.gap"
readonly TRYBOT_X86_64_ZERO_BASED_SANDBOX_TESTS="176.gcc"
readonly BUILDBOT_PNACL="buildbot/buildbot_pnacl.sh"
readonly UP_DOWN_LOAD="buildbot/file_up_down_load.sh"
readonly SPEC_BASE="tests/spec2k"
readonly ARCHIVE_NAME=$(${SPEC_BASE}/run_all.sh GetTestArchiveName)
readonly NAME_ARM_TRY_UPLOAD=$(${BUILDBOT_PNACL} NAME_ARM_TRY_UPLOAD)
readonly NAME_ARM_TRY_DOWNLOAD=$(${BUILDBOT_PNACL} NAME_ARM_TRY_DOWNLOAD)
readonly NAME_ARM_UPLOAD=$(${BUILDBOT_PNACL} NAME_ARM_UPLOAD)
readonly NAME_ARM_DOWNLOAD=$(${BUILDBOT_PNACL} NAME_ARM_DOWNLOAD)
readonly QEMU_TOOL="$(pwd)/toolchain/linux_x86/arm_trusted/run_under_qemu_arm"
# Note: the tool for updating the canned nexes lives at:
# tools/canned_nexe_tool.sh
readonly CANNED_NEXE_REV=1002
# If true, terminate script when first error is encountered.
readonly FAIL_FAST=${FAIL_FAST:-false}
RETCODE=0
# Print the number of tests being run for the buildbot status output
testcount() {
local tests="$1"
if [[ ${tests} == "all" ]]; then
echo "all"
else
echo ${tests} | wc -w
fi
}
# called when a commands invocation fails
handle-error() {
RETCODE=1
echo "@@@STEP_FAILURE@@@"
if ${FAIL_FAST} ; then
echo "FAIL_FAST enabled"
exit 1
fi
}
######################################################################
# SCRIPT ACTION
######################################################################
clobber-scons() {
if [ "${CLOBBER}" == "yes" ] ; then
rm -rf scons-out
fi
}
clobber-harness() {
if [ "${CLOBBER}" == "yes" ] ; then
rm -rf out
fi
}
clobber() {
clobber-scons
clobber-harness
}
download-spec2k-harness() {
echo "@@@BUILD_STEP Download spec2k harness@@@"
mkdir -p out
${NATIVE_PYTHON} ${GSUTIL} cp -a public-read \
gs://nativeclient-private/cpu2000.tar.bz2 out/cpu2000.tar.bz2
tar xvj -C out -f out/cpu2000.tar.bz2
}
# Make up for the toolchain tarballs not quite being a full SDK
# Also clean the SPEC dir (that step is here because it should
# not be run on hw bots which download rather than build binaries)
build-prerequisites() {
echo "@@@BUILD_STEP build prerequisites [$*] @@@"
pushd ${SPEC_BASE}
./run_all.sh BuildPrerequisites "$@"
./run_all.sh CleanBenchmarks
./run_all.sh PopulateFromSpecHarness "${SPEC_HARNESS}"
popd
}
build-tests() {
local setups="$1"
local tests="$2"
local timed="$3" # Do timing and size measurements
local compile_repetitions="$4"
local count=$(testcount "${tests}")
pushd ${SPEC_BASE}
for setup in ${setups}; do
echo "@@@BUILD_STEP spec2k build [${setup}] [${count} tests]@@@"
MAKEOPTS=-j8 \
SPEC_COMPILE_REPETITIONS=${compile_repetitions} \
./run_all.sh BuildBenchmarks ${timed} ${setup} train ${tests} || \
handle-error
done
popd
}
run-tests() {
local setups="$1"
local tests="$2"
local timed="$3"
local run_repetitions="$4"
local count=$(testcount "${tests}")
pushd ${SPEC_BASE}
for setup in ${setups}; do
echo "@@@BUILD_STEP spec2k run [${setup}] [${count} tests]@@@"
if [ ${timed} == "1" ]; then
SPEC_RUN_REPETITIONS=${run_repetitions} \
./run_all.sh RunTimedBenchmarks ${setup} train ${tests} || \
handle-error
else
./run_all.sh RunBenchmarks ${setup} train ${tests} || \
handle-error
fi
done
popd
}
upload-test-binaries() {
local tests="$1"
local try="$2" # set to "try" if this is a try run
pushd ${SPEC_BASE}
echo "@@@BUILD_STEP spec2k archive@@@"
./run_all.sh PackageArmBinaries ${tests}
popd
echo "@@@BUILD_STEP spec2k upload@@@"
if [[ ${try} == "try" ]]; then
${UP_DOWN_LOAD} UploadArmBinariesForHWBotsTry ${NAME_ARM_TRY_UPLOAD} \
${ARCHIVE_NAME}
else
${UP_DOWN_LOAD} UploadArmBinariesForHWBots ${NAME_ARM_UPLOAD} \
${ARCHIVE_NAME}
fi
}
download-test-binaries() {
local try="$1"
echo "@@@BUILD_STEP spec2k download@@@"
if [[ ${try} == "try" ]]; then
${UP_DOWN_LOAD} DownloadArmBinariesForHWBotsTry ${NAME_ARM_TRY_DOWNLOAD} \
${ARCHIVE_NAME}
else
${UP_DOWN_LOAD} DownloadArmBinariesForHWBots ${NAME_ARM_DOWNLOAD} \
${ARCHIVE_NAME}
fi
echo "@@@BUILD_STEP spec2k untar@@@"
pushd ${SPEC_BASE}
./run_all.sh UnpackArmBinaries
popd
}
download-validator-test-nexes() {
local arch="$1"
echo "@@@BUILD_STEP validator test download@@@"
${UP_DOWN_LOAD} DownloadArchivedNexes ${CANNED_NEXE_REV} \
"${arch}_giant" giant_nexe.tar.bz2
# This generates "CannedNexes/" in the current directory
rm -rf CannedNexes
tar jxf giant_nexe.tar.bz2
}
get-validator() {
local arch="$1"
if [[ ${arch} == "x86-32" ]] ; then
echo "$(pwd)/scons-out/opt-linux-x86-32/staging/ncval_new"
elif [[ ${arch} == "x86-64" ]] ; then
echo "$(pwd)/scons-out/opt-linux-x86-64/staging/ncval_new"
elif [[ ${arch} == "arm" ]] ; then
echo "$(pwd)/scons-out/opt-linux-arm/staging/arm-ncval-core"
else
echo "ERROR: unknown arch"
exit 1
fi
}
LogTimeHelper() {
# This format is recognized by the buildbot system
echo "RESULT $1_$2: $3= $(bc) seconds"
}
LogTimedRun() {
local graph=$1
local benchmark=$2
local variant=$3
shift 3
# S: system mode CPU-seconds used by the process
# U: user mode CPU-seconds used by the process
# We add a plus sign inbetween so that we can pipe the output to "bc"
# Note: the >() magic creates a "fake" file (think named pipe)
# which passes the output of time to LogTimeHelper
/usr/bin/time -f "%U + %S" \
--output >(LogTimeHelper ${graph} ${benchmark} ${variant}) \
"$@"
}
build-validator() {
local arch="$1"
echo "@@@BUILD_STEP build validator [${arch}]@@@"
if [[ ${arch} == "arm" ]] ; then
# TODO(robertm): build the validator
echo "NYI"
elif [[ ${arch} == "x86-32" ]] ; then
${SCONS_NACL} platform=${arch} ncval_new
elif [[ ${arch} == "x86-64" ]] ; then
${SCONS_NACL} platform=${arch} ncval_new
else
echo "ERROR: unknown arch"
exit 1
fi
}
measure-validator-speed() {
local arch="$1"
local validator=$(get-validator ${arch})
echo "@@@BUILD_STEP validator speed test [${arch}]@@@"
if [[ ! -e ${validator} ]] ; then
echo "ERROR: missing validator executable: ${validator}"
handle-error
return
fi
if [[ ${arch} == "arm" && $(uname -p) != arm* ]] ; then
# TODO(robertm): build the validator
validator="${QEMU_TOOL} ${validator}"
fi
for nexe in CannedNexes/* ; do
echo "timing validation of ${nexe}"
ls --size --block-size=1 ${nexe}
LogTimedRun "validationtime" $(basename ${nexe}) "canned" \
${validator} ${nexe}
done
}
######################################################################
# NOTE: trybots only runs a subset of the the spec2k tests
pnacl-trybot-arm-buildonly() {
clobber
download-spec2k-harness
build-prerequisites "arm" "bitcode" "arm-ncval-core"
${BUILDBOT_PNACL} archive-for-hw-bots "${NAME_ARM_TRY_UPLOAD}" try
build-tests SetupPnaclPexeOpt "${TRYBOT_TESTS}" 0 1
upload-test-binaries "${TRYBOT_TESTS}" try
}
pnacl-trybot-arm-hw() {
clobber
${BUILDBOT_PNACL} unarchive-for-hw-bots "${NAME_ARM_TRY_DOWNLOAD}" try
download-test-binaries try
build-tests SetupPnaclTranslatorArmOptHW "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorArmOptHW "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorArmOptSzHW "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorArmOptSzHW "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslator1ThreadArmOptHW "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslator1ThreadArmOptHW "${TRYBOT_TESTS}" 1 1
pushd ${SPEC_BASE};
./run_all.sh TimeValidation SetupPnaclTranslatorArmOptHW "${TRYBOT_TESTS}" ||\
handle-error
popd
build-tests SetupPnaclTranslatorFastArmOptHW "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFastArmOptHW "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFastArmOptSzHW "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFastArmOptSzHW "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFast1ThreadArmOptHW "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFast1ThreadArmOptHW "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFast1ThreadArmOptSzHW "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFast1ThreadArmOptSzHW "${TRYBOT_TESTS}" 1 1
}
pnacl-trybot-x8632() {
clobber
download-spec2k-harness
build-prerequisites "x86-32" "bitcode"
build-tests SetupPnaclX8632Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclX8632Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclX8632OptSz "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclX8632OptSz "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorX8632Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorX8632Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslator1ThreadX8632Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslator1ThreadX8632Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFastX8632Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFastX8632Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFastX8632OptSz "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFastX8632OptSz "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFast1ThreadX8632Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFast1ThreadX8632Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFast1ThreadX8632OptSz "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFast1ThreadX8632OptSz "${TRYBOT_TESTS}" 1 1
build-validator x86-32
download-validator-test-nexes x86-32
measure-validator-speed x86-32
}
pnacl-x86-64-zero-based-sandbox() {
# Clobber scons and rebuild sel_ldr with zero-based sandbox support.
# If sel_ldr was built to a different directory and the test
# runner knew where to find that separate sel_ldr, then we wouldn't
# need to clobber here.
clobber-scons
export NACL_ENABLE_INSECURE_ZERO_BASED_SANDBOX=1
build-prerequisites "x86-64" "bitcode" "x86_64_zero_based_sandbox=1"
build-tests SetupPnaclX8664ZBSOpt \
"${TRYBOT_X86_64_ZERO_BASED_SANDBOX_TESTS}" 1 1
run-tests SetupPnaclX8664ZBSOpt \
"${TRYBOT_X86_64_ZERO_BASED_SANDBOX_TESTS}" 1 1
}
pnacl-trybot-x8664() {
clobber
download-spec2k-harness
build-prerequisites "x86-64" "bitcode"
build-tests SetupPnaclX8664Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclX8664Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclX8664OptSz "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclX8664OptSz "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorX8664Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorX8664Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslator1ThreadX8664Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslator1ThreadX8664Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFastX8664Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFastX8664Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFastX8664OptSz "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFastX8664OptSz "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFast1ThreadX8664Opt "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFast1ThreadX8664Opt "${TRYBOT_TESTS}" 1 1
build-tests SetupPnaclTranslatorFast1ThreadX8664OptSz "${TRYBOT_TESTS}" 1 1
run-tests SetupPnaclTranslatorFast1ThreadX8664OptSz "${TRYBOT_TESTS}" 1 1
pnacl-x86-64-zero-based-sandbox
build-validator x86-64
download-validator-test-nexes x86-64
measure-validator-speed x86-64
}
pnacl-arm-buildonly() {
clobber
download-spec2k-harness
build-prerequisites "arm" "bitcode"
${BUILDBOT_PNACL} archive-for-hw-bots "${NAME_ARM_UPLOAD}" regular
build-tests SetupPnaclPexeOpt all 0 1
upload-test-binaries all regular
}
pnacl-arm-hw() {
clobber
${BUILDBOT_PNACL} unarchive-for-hw-bots "${NAME_ARM_DOWNLOAD}" regular
download-test-binaries regular
build-tests SetupPnaclTranslatorArmOptHW all 1 1
run-tests SetupPnaclTranslatorArmOptHW all 1 2
build-tests SetupPnaclTranslatorArmOptSzHW all 1 1
run-tests SetupPnaclTranslatorArmOptSzHW all 1 2
# Only run 1 thread ARM tests 1x to save some time for now.
# Hopefully perf infrastructure will smooth out flakes.
# Otherwise, we'll bump the runs up to 2x as well.
build-tests SetupPnaclTranslator1ThreadArmOptHW all 1 1
run-tests SetupPnaclTranslator1ThreadArmOptHW all 1 1
build-tests SetupPnaclTranslatorFastArmOptHW all 1 1
run-tests SetupPnaclTranslatorFastArmOptHW all 1 2
# Only run 1 thread ARM tests 1x to save some time for now.
# Hopefully perf infrastructure will smooth out flakes.
# Otherwise, we'll bump the runs up to 2x as well.
build-tests SetupPnaclTranslatorFast1ThreadArmOptHW all 1 1
run-tests SetupPnaclTranslatorFast1ThreadArmOptHW all 1 1
build-tests SetupPnaclTranslatorFast1ThreadArmOptSzHW all 1 1
run-tests SetupPnaclTranslatorFast1ThreadArmOptSzHW all 1 1
}
pnacl-x8664() {
clobber
download-spec2k-harness
build-prerequisites "x86-64" "bitcode"
local setups="SetupPnaclX8664Opt \
SetupPnaclX8664OptSz \
SetupPnaclTranslatorX8664Opt \
SetupPnaclTranslator1ThreadX8664Opt \
SetupPnaclTranslatorFastX8664Opt \
SetupPnaclTranslatorFastX8664OptSz \
SetupPnaclTranslatorFast1ThreadX8664OptSz \
SetupPnaclTranslatorFast1ThreadX8664Opt"
build-tests "${setups}" all 1 3
run-tests "${setups}" all 1 3
pnacl-x86-64-zero-based-sandbox
build-validator x86-64
download-validator-test-nexes x86-64
measure-validator-speed x86-64
}
pnacl-x8632() {
clobber
download-spec2k-harness
build-prerequisites "x86-32" "bitcode"
local setups="SetupPnaclX8632Opt \
SetupPnaclX8632OptSz \
SetupPnaclTranslatorX8632Opt \
SetupPnaclTranslator1ThreadX8632Opt \
SetupPnaclTranslatorFastX8632OptSz \
SetupPnaclTranslatorFastX8632Opt \
SetupPnaclTranslatorFast1ThreadX8632Opt \
SetupPnaclTranslatorFast1ThreadX8632OptSz"
build-tests "${setups}" all 1 3
run-tests "${setups}" all 1 3
build-validator x86-32
download-validator-test-nexes x86-32
measure-validator-speed x86-32
}
nacl-x8632() {
clobber
download-spec2k-harness
build-prerequisites "x86-32" ""
local setups="SetupNaclX8632 \
SetupNaclX8632Opt"
build-tests "${setups}" all 1 3
run-tests "${setups}" all 1 3
build-validator x86-32
download-validator-test-nexes x86-32
measure-validator-speed x86-32
}
nacl-x8664() {
clobber
download-spec2k-harness
build-prerequisites "x86-64" ""
local setups="SetupNaclX8664 \
SetupNaclX8664Opt"
build-tests "${setups}" all 1 3
run-tests "${setups}" all 1 3
build-validator x86-64
download-validator-test-nexes x86-64
measure-validator-speed x86-64
}
######################################################################
# Script assumed to be run in native_client/
if [[ $(pwd) != */native_client ]]; then
echo "ERROR: must be run in native_client!"
exit 1
fi
if [[ $# -eq 0 ]] ; then
echo "you must specify a mode on the commandline:"
exit 1
fi
if [ "$(type -t $1)" != "function" ]; then
Usage
echo "ERROR: unknown mode '$1'." >&2
exit 1
fi
"$@"
if [[ ${RETCODE} != 0 ]]; then
echo "@@@BUILD_STEP summary@@@"
echo There were failed stages.
exit ${RETCODE}
fi