xref: /aosp_15_r20/external/compiler-rt/lib/tsan/check_analyze.sh (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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