[wasm] Add a --runtime-arg= argument to runtime-tests.js to allow setting runtime...
[mono-project.git] / mono / mini / test_op_il_seq_point.sh
blobcdcd2bebf2bd10730a34f837b28de3917d296e90
1 #!/bin/bash -e
3 DEFAULT_PROFILE=$1
4 TEST_FILE=$2
5 USE_AOT=$3
7 TMP_FILE_PREFIX=$(basename $0).tmp
8 BASEDIR=$(dirname $0)
10 case "$(uname -s)" in
11 CYGWIN*)
12 PLATFORM_PATH_SEPARATOR=';'
13 PLATFORM_AOT_ARGUMENT=--aot=asmonly
16 PLATFORM_PATH_SEPARATOR=':'
17 PLATFORM_AOT_ARGUMENT=--aot
19 esac
21 MONO_PATH=$BASEDIR/../../mcs/class/lib/$DEFAULT_PROFILE$PLATFORM_PATH_SEPARATOR$BASEDIR
22 RUNTIME=$BASEDIR/../../runtime/mono-wrapper
24 trap "rm -rf ${TMP_FILE_PREFIX}*" EXIT
26 tmp_file () {
27 mktemp ./${TMP_FILE_PREFIX}XXXXXX
30 clean_aot () {
31 rm -rf *.exe.so *.exe.dylib *.exe.dylib.dSYM *.exe.dll *.exe.s
34 # The test compares the generated native code size between a compilation with and without seq points.
35 # In some architectures ie:amd64 when possible 32bit instructions and registers are used instead of 64bit ones.
36 # Using MONO_DEBUG=single-imm-size avoids 32bit optimizations thus mantaining the native code size between compilations.
38 get_methods () {
39 if [ -z $4 ]; then
40 MONO_PATH=$1 $2 -v --compile-all=1 $3 | grep '^Method .*code length' | sed 's/emitted[^()]*//' | sort
41 return ${PIPESTATUS[0]}
42 else
43 clean_aot
44 MONO_PATH=$1 $2 -v $PLATFORM_AOT_ARGUMENT $3 | grep '^Method .*code length' | sed 's/emitted[^()]*//' | sort
45 return ${PIPESTATUS[0]}
49 get_method () {
50 if [ -z $5 ]; then
51 MONO_VERBOSE_METHOD="$4" MONO_PATH=$1 $2 --compile-all=1 $3 | sed 's/0x[0-9a-fA-F]*/0x0/g'
52 return ${PIPESTATUS[0]}
53 else
54 clean_aot
55 MONO_VERBOSE_METHOD="$4" MONO_PATH=$1 $2 $PLATFORM_AOT_ARGUMENT $3 | sed 's/0x[0-9a-fA-F]*/0x0/g'
56 return ${PIPESTATUS[0]}
60 diff_methods () {
61 TMP_FILE1=$(tmp_file)
62 TMP_FILE2=$(tmp_file)
63 echo "$(MONO_DEBUG=no-compact-seq-points,single-imm-size get_methods $1 $2 $3 $4 || echo Non-zero exit code for file1: $?)" >$TMP_FILE1
64 echo "$(MONO_DEBUG=single-imm-size get_methods $1 $2 $3 $4 || echo Non-zero exit code for file2: $?)" >$TMP_FILE2
65 diff $TMP_FILE1 $TMP_FILE2
68 diff_method () {
69 TMP_FILE1=$(tmp_file)
70 TMP_FILE2=$(tmp_file)
71 echo "$(MONO_DEBUG=no-compact-seq-points,single-imm-size get_method $1 $2 $3 $4 $5)" >$TMP_FILE1
72 echo "$(MONO_DEBUG=single-imm-size get_method $1 $2 $3 $4 $5 | grep -Ev il_seq_point)" >$TMP_FILE2
73 sdiff -w 150 $TMP_FILE1 $TMP_FILE2
76 get_method_name () {
77 echo $1 | sed -E 's/.*Method (\([^)]*\) )?([^ ]*).*/\2/g'
80 get_method_length () {
81 echo $1 | sed 's/.*code length \([0-9]*\).*/\1/'
84 if [ -z $USE_AOT ]; then
85 echo "Checking unintended native code changes in $TEST_FILE without AOT"
86 else
87 echo "Checking unintended native code changes in $TEST_FILE with AOT"
90 TMP_FILE=$(tmp_file)
92 echo "$(diff_methods $MONO_PATH $RUNTIME $TEST_FILE $USE_AOT)" > $TMP_FILE
94 CHANGES=0
95 FAIL=0
96 METHOD=""
97 MIN_SIZE=10000
99 while read line; do
100 if [ "$line" != "" ]; then
101 echo $line
102 if [[ "$line" == *"Non-zero exit code"* ]]; then
103 FAIL=1
104 elif [[ ${line:0:1} == "<" ]]; then
105 CHANGES=$((CHANGES+1))
106 SIZE=$(get_method_length "$line")
107 if [[ SIZE -lt MIN_SIZE ]]; then
108 MIN_SIZE=$SIZE
109 METHOD="$line"
113 done < $TMP_FILE
115 TESTRESULT_FILE=TestResult-op_il_seq_point.tmp
117 echo -n " <test-case name=\"MonoTests.op_il_seq_point.${TEST_FILE}${USE_AOT}\" executed=\"True\" time=\"0\" asserts=\"0\" success=\"" >> $TESTRESULT_FILE
119 if [ $FAIL != 0 ]
120 then
121 echo "False\">" >> $TESTRESULT_FILE
122 echo " <failure>" >> $TESTRESULT_FILE
123 echo -n " <message><![CDATA[" >> $TESTRESULT_FILE
124 echo "Mono failed on $TEST_FILE" >> $TESTRESULT_FILE
125 echo "]]></message>" >> $TESTRESULT_FILE
126 echo " <stack-trace>" >> $TESTRESULT_FILE
127 echo " </stack-trace>" >> $TESTRESULT_FILE
128 echo " </failure>" >> $TESTRESULT_FILE
129 echo " </test-case>" >> $TESTRESULT_FILE
130 exit 1
131 elif [ $CHANGES != 0 ]
132 then
133 METHOD_NAME=$(get_method_name "$METHOD")
135 echo "False\">" >> $TESTRESULT_FILE
136 echo " <failure>" >> $TESTRESULT_FILE
137 echo -n " <message><![CDATA[" >> $TESTRESULT_FILE
138 echo "Detected OP_IL_SEQ_POINT incompatibility on $TEST_FILE" >> $TESTRESULT_FILE
139 echo " $CHANGES methods differ when sequence points are enabled." >> $TESTRESULT_FILE
140 echo ' This is probably caused by a runtime optimization that is not handling OP_IL_SEQ_POINT' >> $TESTRESULT_FILE
141 echo '' >> $TESTRESULT_FILE
142 echo "Diff $METHOD_NAME" >> $TESTRESULT_FILE
143 echo "Without IL_OP_SEQ_POINT With IL_OP_SEQ_POINT" >> $TESTRESULT_FILE
144 echo -n "$(diff_method $MONO_PATH $RUNTIME $TEST_FILE $METHOD_NAME $USE_AOT)" >> $TESTRESULT_FILE
145 echo "]]></message>" >> $TESTRESULT_FILE
146 echo " <stack-trace>" >> $TESTRESULT_FILE
147 echo " </stack-trace>" >> $TESTRESULT_FILE
148 echo " </failure>" >> $TESTRESULT_FILE
149 echo " </test-case>" >> $TESTRESULT_FILE
151 echo ''
152 echo "Detected OP_IL_SEQ_POINT incompatibility on $TEST_FILE"
153 echo " $CHANGES methods differ when sequence points are enabled."
154 echo ' This is probably caused by a runtime optimization that is not handling OP_IL_SEQ_POINT'
156 echo ''
157 echo "Diff $METHOD_NAME"
158 echo "Without IL_OP_SEQ_POINT With IL_OP_SEQ_POINT"
159 echo "$(diff_method $MONO_PATH $RUNTIME $TEST_FILE $METHOD_NAME $USE_AOT)"
160 exit 1
161 else
162 echo "True\" />" >> $TESTRESULT_FILE