From: Juho S. <js...@us...> - 2006-01-06 01:11:26
|
Update of /cvsroot/sbcl/sbcl/src/compiler/x86-64 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26649/src/compiler/x86-64 Modified Files: c-call.lisp parms.lisp Log Message: 0.9.8.14: Fix saving a core with callbacks on x86 and x86-64, as discussed on sbcl-devel "CFFI Callbacks on SBCL" on 2005-12-31. Essentially the problem is that the address of #'ENTER-ALIEN-CALLBACK is hard-coded into the assembly callback wrappers, and the address of the function can change when saving a non-purified core. * Define a static symbol that contains #'ENTER-ALIEN-CALLBACK in the value slot. * Change the x86 / x86-64 wrappers to indirect through the slot. * Add minimal test case * Add a make-config.sh-detected :alien-callbacks feature Index: c-call.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/x86-64/c-call.lisp,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- c-call.lisp 1 Dec 2005 04:16:00 -0000 1.14 +++ c-call.lisp 6 Jan 2006 01:11:10 -0000 1.15 @@ -408,7 +408,15 @@ (bug "Unknown alien floating point type: ~S" type))))) ;; arg0 to FUNCALL3 (function) - (inst mov rdi (get-lisp-obj-address #'enter-alien-callback)) + ;; + ;; Indirect the access to ENTER-ALIEN-CALLBACK through + ;; the symbol-value slot of SB-ALIEN::*ENTER-ALIEN-CALLBACK* + ;; to ensure it'll work even if the GC moves ENTER-ALIEN-CALLBACK. + ;; Skip any SB-THREAD TLS magic, since we don't expecte anyone + ;; to rebind the variable. -- JES, 2006-01-01 + (inst mov rdi (+ nil-value (static-symbol-offset + 'sb!alien::*enter-alien-callback*))) + (loadw rdi rdi symbol-value-slot other-pointer-lowtag) ;; arg0 to ENTER-ALIEN-CALLBACK (trampoline index) (inst mov rsi (fixnumize index)) ;; arg1 to ENTER-ALIEN-CALLBACK (pointer to argument vector) Index: parms.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/x86-64/parms.lisp,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- parms.lisp 14 Dec 2005 03:39:23 -0000 1.16 +++ parms.lisp 6 Jan 2006 01:11:10 -0000 1.17 @@ -225,6 +225,10 @@ ;; For GC-AND-SAVE *restart-lisp-function* + ;; Needed for callbacks to work across saving cores. see + ;; ALIEN-CALLBACK-ASSEMBLER-WRAPPER in c-call.lisp for gory details. + sb!alien::*enter-alien-callback* + ;; The ..SLOT-UNBOUND.. symbol is static in order to optimise the ;; common slot unbound check. ;; |