1#!/bin/bash 2# 3# Script that checks that critical functions in TSan runtime have correct number 4# of push/pop/rsp instructions to verify that runtime is efficient enough. 5 6set -u 7 8if [[ "$#" != 1 ]]; then 9 echo "Usage: $0 /path/to/binary/built/with/tsan" 10 exit 1 11fi 12 13SCRIPTDIR=$(dirname $0) 14RES=$(${SCRIPTDIR}/analyze_libtsan.sh $1) 15PrintRes() { 16 printf "%s\n" "$RES" 17} 18 19PrintRes 20 21check() { 22 res=$(PrintRes | egrep "$1 .* $2 $3; ") 23 if [ "$res" == "" ]; then 24 echo FAILED $1 must contain $2 $3 25 exit 1 26 fi 27} 28 29for f in write1; do 30 check $f rsp 1 31 check $f push 2 32 check $f pop 2 33done 34 35for f in write2 write4 write8; do 36 check $f rsp 1 37 check $f push 3 38 check $f pop 3 39done 40 41for f in read1 read2 read4 read8; do 42 check $f rsp 1 43 check $f push 5 44 check $f pop 5 45done 46 47for f in func_entry func_exit; do 48 check $f rsp 0 49 check $f push 0 50 check $f pop 0 51 check $f call 1 # TraceSwitch() 52done 53 54echo LGTM 55