bench.sh zaehlt nur dann die Instruktionen, wenn eine Referenzdatei existiert.
[testub10.git] / scripts / bench.sh
1 #!/bin/bash
2 cd `dirname "$_"`
3 CURDIR="$PWD"
4
5 if [ "$1" == "" ]; then
6     echo "Verwendung: $0 <abgabe>"
7     echo "z.B. $0 codea"
8     exit 1
9 fi
10
11 TESTMAIN="$CURDIR/testmain.c"
12 DUMPINSTR="$CURDIR/dumpinstr.sh"
13 TRACEDIR="$CURDIR/traces"
14 RESULT="$TRACEDIR/result.txt"
15 CALLCONV="$CURDIR/callingconvention.o"
16
17 ABG=~/abgabe/$1
18 TEST=~/test/$1
19
20 if [ ! -d $ABG ]; then
21     echo "Abgabeverzeichnis $ABG nicht gefunden!"
22 fi
23
24 if [ ! -d $TEST ]; then
25     echo "Testverzeichnis $TEST nicht gefunden!"
26 fi
27
28 cd $ABG
29 make clean; make
30
31 TMPNAME=tmp$$
32
33 if [ ! -d $TRACEDIR ]; then
34     echo "creating $TRACEDIR"
35     mkdir $TRACEDIR
36 fi
37
38 rm -f $RESULT
39
40 let gni=0
41 let gti=0
42 for i in $TEST/*.0; do
43     bi=`basename $i`
44     bi=${bi%.0}
45
46     # generate .s file and ignore output on stderr
47     ./$1 < $i > $TMPNAME.s 2> /dev/null
48     # create executable
49     gcc -DCALL=\"${i%.0}.call\" -o $TMPNAME $TMPNAME.s $TESTMAIN $CALLCONV
50     
51     
52     # extract the exported symbols from the .s file
53     #LABEL=`grep '.globl' $TMPNAME.s | sed 's/^.*\\.globl *\\([a-zA-Z0-9_]\\+\\).*$/\1/g'`
54
55     # this won't work, we need all actual labels
56     LABEL=`grep '[a-zA-Z0-9_.$]\\+:' $TMPNAME.s | sed 's/^\\(.*[^a-zA-Z0-9_.$]\\)\\?\\([a-zA-Z0-9_.$]\\+\\):.*$/\2/g'`
57
58     rm -f $TMPNAME.trace
59     MATCHES=0
60     for j in $LABEL; do
61                 MATCHES="$MATCHES\\|$j"
62                 # count instructions
63                 $DUMPINSTR $TMPNAME $j > /dev/null
64                 if [ $? != 0 ]; then
65                         echo "$bi FEHLGESCHLAGEN"
66                         continue
67                 fi
68     done
69
70     # filter trace
71     grep "<\\($MATCHES\\)\\(+[0-9]*\\)\\?>:" $TMPNAME.trace > $TRACEDIR/$bi.trace
72
73     ni=`cat $TRACEDIR/$bi.trace | wc -l`
74         if [ -f $TEST/${bi}.instr ]; then
75                 ti=`cat $TEST/$bi.instr`
76         else
77                 echo "err: fuer den testfall \"$bi\" existiert noch keine referenzdatei. instruktionen werden verworfen."
78                 ti=0
79         fi
80
81         if [ $ni -gt $ti ]; then
82                 #red
83                 bcolor="\033[01;31m"
84         else
85                 if [ $ni -eq $ti ]; then
86                         #gray
87                         bcolor="\033[01;30m"
88                 else
89                         #green
90                         bcolor="\033[01;32m"
91                 fi
92         fi
93
94     echo -e "$bcolor $bi: $ni (referenz: $ti) \033[0m"
95     echo "$bi $ni" >> $RESULT
96
97         if [ -f $TEST/${bi}.instr ]; then
98                 let gni=gni+$ni
99                 let gti=gti+$ti
100         fi
101
102     # remove waste
103     rm -f $TMPNAME $TMPNAME.s $TMPNAME.trace
104 done
105
106 echo ""
107 echo "Statistik:"
108 echo "=========="
109 echo "  $gni  Instruktionen"
110 echo "  $gti  Referenzinstruktionen"