code: ss09 skripts
authorBernhard Urban <lewurm@gmail.com>
Thu, 22 Apr 2010 14:01:46 +0000 (16:01 +0200)
committerBernhard Urban <lewurm@gmail.com>
Thu, 22 Apr 2010 14:01:46 +0000 (16:01 +0200)
codea/testit/callingconvention.c [new file with mode: 0644]
codea/testit/test [new file with mode: 0755]
codea/testit/testmain.c [new file with mode: 0644]

diff --git a/codea/testit/callingconvention.c b/codea/testit/callingconvention.c
new file mode 100644 (file)
index 0000000..018b1d1
--- /dev/null
@@ -0,0 +1,33 @@
+/* gcc -c -fomit-frame-pointer -fno-defer-pop callingconvention.c */
+
+#include <stdlib.h>
+
+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 (executable)
index 0000000..ab7f102
--- /dev/null
@@ -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 (file)
index 0000000..6756a64
--- /dev/null
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+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;
+}
+