scripts: fix... damn regex *sigh*
[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      grep '[a-zA-Z0-9_.$]\+:' $TMPNAME.s | sed 's/^\(.*[^a-zA-Z0-9_.$]\)\?\([a-zA-Z0-9_.$]\+\):.*$/\2/g' > $TMPNAME.uniq
57
58      LABEL_ASM=`cat $TMPNAME.uniq`
59
60      # functionidentifiers from CALL-file
61      grep '[a-zA-Z_][a-zA-Z0-9_]*(.*)' ${i%.0}.call | sed 's/.*[^a-zA-Z_]\([a-zA-Z_][a-zA-Z0-9_]*\)(.*)\;/\1/g' | sort | uniq >> $TMPNAME.uniq
62
63      LABEL=`sort $TMPNAME.uniq | uniq -d`
64      rm $TMPNAME.uniq
65
66     rm -f $TMPNAME.trace
67     for j in $LABEL; do
68                 # count instructions
69                 $DUMPINSTR $TMPNAME $j > /dev/null
70                 if [ $? != 0 ]; then
71                         echo "$bi FEHLGESCHLAGEN"
72                         continue
73                 fi
74     done
75
76     MATCHES=0
77         for j in $LABEL_ASM; do
78                 MATCHES="$MATCHES\\|$j"
79         done
80
81     # filter trace
82     grep "<\\($MATCHES\\)\\(+[0-9]*\\)\\?>:" $TMPNAME.trace > $TRACEDIR/$bi.trace
83
84     ni=`cat $TRACEDIR/$bi.trace | wc -l`
85         if [ -f $TEST/${bi}.instr ]; then
86                 ti=`cat $TEST/$bi.instr`
87         else
88                 echo "err: fuer den testfall \"$bi\" existiert noch keine referenzdatei. instruktionen werden verworfen."
89                 ti=0
90         fi
91
92         if [ $ni -gt $ti ]; then
93                 #red
94                 bcolor="\033[01;31m"
95         else
96                 if [ $ni -eq $ti ]; then
97                         #gray
98                         bcolor="\033[01;30m"
99                 else
100                         #green
101                         bcolor="\033[01;32m"
102                 fi
103         fi
104
105     echo -e "$bcolor $bi: $ni (referenz: $ti) \033[0m"
106     echo "$bi $ni" >> $RESULT
107
108         if [ -f $TEST/${bi}.instr ]; then
109                 let gni=gni+$ni
110                 let gti=gti+$ti
111         fi
112
113     # remove waste
114     rm -f $TMPNAME $TMPNAME.s $TMPNAME.trace
115 done
116
117 echo ""
118 echo "Statistik:"
119 echo "=========="
120 echo "  $gni  Instruktionen"
121 echo "  $gti  Referenzinstruktionen"