#!/bin/bash # # Script that checks that critical functions in TSan runtime have correct number # of push/pop/rsp instructions to verify that runtime is efficient enough. # # This test can fail when backend code generation changes the output for various # tsan interceptors. When such a change happens, you can ensure that the # performance has not regressed by running the following benchmarks before and # after the breaking change to verify that the values in this file are safe to # update: # ./projects/compiler-rt/lib/tsan/tests/rtl/TsanRtlTest # --gtest_also_run_disabled_tests --gtest_filter=DISABLED_BENCH.Mop* set -u if [[ "$#" != 1 ]]; then echo "Usage: $0 /path/to/binary/built/with/tsan" exit 1 fi SCRIPTDIR=$(dirname $0) RES=$(${SCRIPTDIR}/analyze_libtsan.sh $1) PrintRes() { printf "%s\n" "$RES" } PrintRes check() { res=$(PrintRes | egrep "$1 .* $2 $3; ") if [ "$res" == "" ]; then echo FAILED $1 must contain $2 $3 exit 1 fi } for f in write1 write2 write4 write8; do check $f rsp 1 check $f push 2 check $f pop 12 done for f in read1 read2 read4 read8; do check $f rsp 1 check $f push 3 check $f pop 18 done for f in func_entry func_exit; do check $f rsp 0 check $f push 0 check $f pop 0 check $f call 1 # TraceSwitch() done echo LGTM