4973e7b2e9261da2faf64e0d912b0cffad48a83c
[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     # count instructions
52     $DUMPINSTR $TMPNAME call >/dev/null
53     if [ $? != 0 ]; then
54         echo "$bi FEHLGESCHLAGEN"
55         continue
56     fi
57     
58     # extract the exported symbols from the .s file
59     #LABEL=`grep '.globl' $TMPNAME.s | sed 's/^.*\\.globl *\\([a-zA-Z0-9_]\\+\\).*$/\1/g'`
60
61     # this won't work, we need all actual labels
62     LABEL=`grep '[a-zA-Z0-9_.$]\\+:' $TMPNAME.s | sed 's/^\\(.*[^a-zA-Z0-9_.$]\\)\\?\\([a-zA-Z0-9_.$]\\+\\):.*$/\2/g'`
63
64     MATCHES=0
65     for j in $LABEL; do
66         MATCHES="$MATCHES\\|$j"
67     done
68
69     # filter trace
70     grep "<\\($MATCHES\\)\\(+[0-9]*\\)\\?>:" $TMPNAME.trace > $TRACEDIR/$bi.trace
71
72     ni=`cat $TRACEDIR/$bi.trace | wc -l`
73         if [ -f $TEST/${bi}.instr ]; then
74                 ti=`cat $TEST/$bi.instr`
75         else
76                 echo "err: fuer den testfall \"$bi\" existiert noch keine referenzdatei"
77                 ti=0
78         fi
79     echo "$bi: $ni (referenz: $ti)"
80     echo "$bi $ni" >> $RESULT
81
82         let gni=gni+$ni
83         let gti=gti+$ti
84
85     # remove waste
86     rm -f $TMPNAME $TMPNAME.s $TMPNAME.trace
87 done
88
89 echo ""
90 echo "Statistik:"
91 echo "=========="
92 echo "  $gni  Instruktionen"
93 echo "  $gti  Referenzinstruktionen"