From: Alastair B. <lis...@us...> - 2010-08-07 15:22:03
|
Update of /cvsroot/sbcl/sbcl/src/compiler/ppc In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv25486/src/compiler/ppc Modified Files: static-fn.lisp Log Message: 1.0.41.26: ppc: Calling-convention fixes for static-fun VOPs. * Instead of having the static-fun VOPs work with the fdefn raw-addr slot directly, have them first load reg_FDEFN with the static-fdefinition object and then perform the critical part of the normal call sequence. * This covers the usual race condition, etc. involved in dealing with an fdefn-raw-addr without first loading the function, and allows (PPC only) the use of funcallable instances and closures as static-functions (unlikely as that is). Index: static-fn.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/ppc/static-fn.lisp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- static-fn.lisp 14 Jul 2005 18:48:33 -0000 1.5 +++ static-fn.lisp 7 Aug 2010 15:21:54 -0000 1.6 @@ -19,6 +19,8 @@ (:temporary (:scs (non-descriptor-reg)) temp) (:temporary (:scs (descriptor-reg)) move-temp) (:temporary (:sc descriptor-reg :offset lra-offset) lra) + (:temporary (:sc descriptor-reg :offset fdefn-offset) fdefn) + (:temporary (:scs (descriptor-reg)) function) (:temporary (:sc interior-reg :offset lip-offset) entry-point) (:temporary (:sc any-reg :offset nargs-offset) nargs) (:temporary (:sc any-reg :offset ocfp-offset) old-fp) @@ -78,7 +80,9 @@ (let ((lra-label (gen-label)) (cur-nfp (current-nfp-tn vop))) ,@(moves (temp-names) (arg-names)) - (inst lwz entry-point null-tn (static-fun-offset symbol)) + (inst addi fdefn null-tn (static-fdefn-offset symbol)) + (loadw function fdefn fdefn-fun-slot other-pointer-lowtag) + (loadw entry-point fdefn fdefn-raw-addr-slot other-pointer-lowtag) (inst lr nargs (fixnumize ,num-args)) (when cur-nfp (store-stack-tn nfp-save cur-nfp)) |