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