X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fforeign.test.sh;h=039d1210f576fc49d74d437b78c2fc4dbc0a0d5a;hb=6a0601ab48635465ad3400c290e5cfbca28e5367;hp=69702f68606250b333c020d789467966fb5d08f4;hpb=e5f24ebc38e38c986df830fd1e4035d16bea4e5c;p=sbcl.git diff --git a/tests/foreign.test.sh b/tests/foreign.test.sh index 69702f6..039d121 100644 --- a/tests/foreign.test.sh +++ b/tests/foreign.test.sh @@ -1,6 +1,7 @@ #!/bin/sh -# tests related to foreign function interface and LOAD-FOREIGN +# tests related to foreign function interface and loading of shared +# libraries # This software is part of the SBCL system. See the README file for # more information. @@ -8,33 +9,327 @@ # While most of SBCL is derived from the CMU CL system, the test # files (like this one) were written from scratch after the fork # from CMU CL. -# +# # This software is in the public domain and is provided with # absolutely no warranty. See the COPYING and CREDITS files for # more information. -testfilestem=$TMPDIR/sbcl-foreign-test-$$ +echo //entering foreign.test.sh + +# simple way to make sure we're not punting by accident: +# setting PUNT to anything other than 104 will make non-dlopen +# and non-linkage-table platforms fail this +PUNT=104 + +testfiledir=sbcl-foreign-test-$$ +testfilestem=`pwd`/$testfiledir/sbcl-foreign-test + +mkdir $testfiledir +## Make some shared object files to test with. + +build_so() { + echo building $1.so + if [ "`uname -m`" = x86_64 -o "`uname -m`" = amd64 -o \ + "`uname -m`" = mips -o "`uname -m`" = mips64 ]; then + CFLAGS="$CFLAGS -fPIC" + fi + if [ "`uname`" = Darwin ]; then + SO_FLAGS="-bundle" + else + SO_FLAGS="-shared" + fi + cc -c $1.c -o $1.o $CFLAGS + ld $SO_FLAGS -o $1.so $1.o +} + +cat > $testfilestem.c < $testfilestem-b.c +echo 'int bar() { return 42; }' >> $testfilestem-b.c +build_so $testfilestem-b + +echo 'int foo = 42;' > $testfilestem-b2.c +echo 'int bar() { return 13; }' >> $testfilestem-b2.c +build_so $testfilestem-b2 + +echo 'int late_foo = 43;' > $testfilestem-c.c +echo 'int late_bar() { return 14; }' >> $testfilestem-c.c +build_so $testfilestem-c + +## Foreign definitions & load + +cat > $testfilestem.base.lisp < $testfilestem.c -make $testfilestem.o -ld -shared -o $testfilestem.so $testfilestem.o + (define-alien-routine long-test8 int (int1 int) (int2 int) (int3 int) (int4 int) (int5 int) (int6 int) (int7 int) (long1 (integer 64))) + (define-alien-routine long-test9 int (int1 int) (int2 int) (int3 int) (int4 int) (int5 int) (int6 int) (int7 int) (long1 (integer 64)) (int8 int)) + (define-alien-routine long-test2 int (int1 int) (int2 int) (int3 int) (int4 int) (int5 int) (int6 int) (int7 int) (int8 int) (int9 int) (long1 (integer 64)) (long2 (integer 64))) + (define-alien-routine return-long-long (integer 64)) + + ;; compiling this gets us the FOP-FOREIGN-DATAREF-FIXUP on + ;; linkage-table ports + (defvar *extern* (extern-alien "negative_short" short)) + + ;; Test that loading an object file didn't screw up our records + ;; of variables visible in runtime. (This was a bug until + ;; Nikodemus Siivola's patch in sbcl-0.8.5.50.) + ;; + ;; This cannot be tested in a saved core, as there is no guarantee + ;; that the location will be the same. + (assert (= (sb-sys:sap-int (alien-sap *environ*)) + (sb-sys:sap-int (alien-sap environ)))) + + ;; automagic restarts + (setf *invoke-debugger-hook* + (lambda (condition hook) + (princ condition) + (let ((cont (find-restart 'continue condition))) + (when cont + (invoke-restart cont))) + (print :fell-through) + (invoke-debugger condition))) +EOF + +echo "(declaim (optimize speed))" > $testfilestem.fast.lisp +cat $testfilestem.base.lisp >> $testfilestem.fast.lisp + +echo "(declaim (optimize space))" > $testfilestem.small.lisp +cat $testfilestem.base.lisp >> $testfilestem.small.lisp + +# Test code +cat > $testfilestem.test.lisp <