From: Bernhard Urban Date: Thu, 22 Apr 2010 14:01:46 +0000 (+0200) Subject: code: ss09 skripts X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=commitdiff_plain;h=d6e57196e815d2b5e1260a1401d926cf47482730 code: ss09 skripts --- diff --git a/codea/testit/callingconvention.c b/codea/testit/callingconvention.c new file mode 100644 index 0000000..018b1d1 --- /dev/null +++ b/codea/testit/callingconvention.c @@ -0,0 +1,33 @@ +/* gcc -c -fomit-frame-pointer -fno-defer-pop callingconvention.c */ + +#include + +extern int call(void); + +/* geprueft werden callee gesicherte Register: rbx,r12-r15, + * rsp (stackptr), rbp (frameptr) */ + +#define CHECKNUM 0x1234567812345678 +long callchecking() +{ + long ret; + register long x0 asm("%rbx")=CHECKNUM+0; + register long x1 asm("%r12")=CHECKNUM+1; + register long x2 asm("%r13")=CHECKNUM+2; + register long x3 asm("%r14")=CHECKNUM+3; + register long x4 asm("%r15")=CHECKNUM+4; + register long x5 asm("%rbp")=CHECKNUM+5; + static void* origsp; + void*newsp; + asm("movq %%rsp,%0":"=g"(origsp):); + ret=call(); + if(x0!=CHECKNUM+0) exit(11); + if(x1!=CHECKNUM+1) exit(12); + if(x2!=CHECKNUM+2) exit(13); + if(x3!=CHECKNUM+3) exit(14); + if(x4!=CHECKNUM+4) exit(15); + if(x5!=CHECKNUM+5) exit(16); + asm("movq %%rsp,%0":"=g"(newsp):); + if(origsp!=newsp) exit(30); + return ret; +} diff --git a/codea/testit/test b/codea/testit/test new file mode 100755 index 0000000..ab7f102 --- /dev/null +++ b/codea/testit/test @@ -0,0 +1,142 @@ +#! /bin/bash + +beispiel=codea +PROGRAM=./$beispiel + +errnum=0 +prgnum=0 + +#LOC=. +LOC=/usr/ftp/pub/ubvl/test/$beispiel +LOC2=~/test/$beispiel + +/usr/ftp/pub/ublu/test/accounttest || exit 1 +allow_null_glob_expansion=1 + +if [ ! -d ~/abgabe/$beispiel ]; then + echo "Fehler: Verzeichnis ~/abgabe/$beispiel existiert nicht." + exit 1 +else + cd ~/abgabe/$beispiel + echo 'Teste "make clean"' + make clean + /usr/ftp/pub/ubvl/test/cleantest + echo 'Teste "make"' + make +fi + +if test ! -x $PROGRAM +then + echo "Fehler: Kein Programm $PROGRAM" + exit 1 +fi +let prgnum=0 +for i in $LOC/*.0 $LOC2/*.0 +do + if [ -f $i ]; then + let prgnum=prgnum+1 + let errorfound=0 + echo "==========> Eingabe von $i:" + cat $i + echo + RESFILE=test${beispiel}out$$ + $PROGRAM <$i >$RESFILE + retval=$? + echo -n "Übersetzung: " + if test $retval -eq 0 + then + echo "Status korrekt" + else + echo "[Errot] Status=$retval. Erwartet: 0" + let errorfound=1 + fi + echo + echo "Ausgabe:" + cat $RESFILE + mv -f $RESFILE $RESFILE.s + CALLFILE=${i%.*}.call + echo + if [ ! -f $CALLFILE ]; then + echo "Fehler: Datei $CALLFILE existiert nicht, kann Code nicht ausführen..." + exit 1 + else + echo "Übersetze und linke das Testprogramm:" + if cc -g -I. -DCALL=\"$CALLFILE\" $LOC/testmain.c $LOC/callingconvention.o $RESFILE.s; then + echo + echo "Rufe folgendes Codefragment auf:" + cat $CALLFILE + echo + ./a.out + retval=$? + # test callee saved registers + if [ "$retval" -ge 12 ] && [ "$retval" -le 15 ]; then + echo "[Error] Callee-saved register %r$retval modified." + let errorfound=1 + elif [ "$retval" -eq 11 ]; then + echo "[Error] Callee-saved register %rbx modified." + let errorfound=1 + elif [ "$retval" -eq 16 ]; then + echo "[Error] Callee-saved register %rbp modified." + let errorfound=1 + elif [ "$retval" -eq 30 ]; then + echo "[Error] Stack pointer %rsp modified." + let errorfound=1 + else + # test signals + test $retval -gt 127 + retsig=$? + test ${i##*.} = xin + expsig=$? + if test $retsig -eq $expsig; then + if test $retval -eq 1; then + echo "[Error] Das Ergebnis des Aufrufs ist falsch." + let errorfound=1 + elif test $retval -eq 0; then + echo "Das Ergebnis des Ausdrucks ist korrekt." + else + echo "[Error] Erzeugter Code verhaelt sich bzgl. Signalerzeugung anders als erwartet." + let errorfound=1 + fi + else + echo "[Error] Erzeugter Code verhaelt sich bezueglich Signalerzeugung anders als erwartet." + let errorfound=1 + echo "Rueckgabewert = $retval"; + fi + fi + echo + else + echo "[Error] Erzeugter Code konnte nicht assembliert und gelinkt werden." + let errorfound=1 + fi + fi + let errnum=errnum+errorfound + #rm -f a.out $RESFILE $RESFILE.s + fi +done + +for i in $LOC/*.[123] $LOC2/*.[123] +do + if [ -f $i ]; then + let prgnum=prgnum+1 + echo "==========> Eingabe von $i:" + cat $i + echo + echo "Ausgabe:" + $PROGRAM <$i + retval=$? + if test $retval -eq ${i#*.} + then + echo "Status: korrekt" + else + echo "[Error] Status: $retval. Erwartet: ${i#*.}" + let errnum=errnum+1 + fi + echo +fi +done +let corrnum=prgnum-errnum +echo "Statistics: " +echo "===========" +echo " $prgnum Tests total" +echo " $corrnum Tests passed" +echo " $errnum Tests failed" diff --git a/codea/testit/testmain.c b/codea/testit/testmain.c new file mode 100644 index 0000000..6756a64 --- /dev/null +++ b/codea/testit/testmain.c @@ -0,0 +1,30 @@ +#include +#include + +extern long callchecking(); + +#define RET return + +int call(void) +{ +#include CALL +} + +long labs(long); + +#ifdef DEFINE_G +long g(long x, long y) +{ + return h(x*2, y*3)+1; +} +#endif + +int main(int argc, char *argv[]) +{ + long r; + r=callchecking(); + if(r==0 || r==1) + return !r; + return r; +} +