From: Stas B. <sta...@gm...> - 2014-03-29 09:02:14
|
Stas Boukarev <sta...@gm...> writes: > Stas Boukarev <sta...@gm...> writes: > >> Stas Boukarev <sta...@gm...> writes: >> >>> Douglas Katzman <do...@go...> writes: >>> >>>> I'm out of my league on this, but I minimized it further. >>>> Something pretty low-level is going wrong. >>>> If the MOCK-REHASH function below is changed not to read the INFO-ENV-COUNT >>>> slot, then no crash. Otherwise crash. >>> I reduced it to: >>> >>> (defstruct x >>> (c 0 :type (unsigned-byte 32))) >>> >>> (defun test () >>> (ceiling (x-c (make-x)) .5)) >>> >>> (sb-thread:make-thread #'test) >> A bit more: >> >> (defstruct x >> (c 0 :type (unsigned-byte 32))) >> >> (defun foo (number divisor) >> (declare (fixnum number) >> (single-float divisor)) >> (/ number divisor)) >> >> (defun test () >> (let ((number (x-c (make-x)))) >> (multiple-value-bind (tru rem) (foo number .5) >> (if (plusp number) >> rem >> tru)))) >> >> (sb-thread:make-thread #'test) >> I'm not quite sure what's happening, the stack is getting corrupted >> causing unaligned access or something like that. > Digging further: > > (defun foo (number divisor) > (declare (fixnum number) > (single-float divisor)) > (plusp (/ number divisor))) > > (defun test (x) > (declare (fixnum x)) > ;; force NUMBER to be saved on the number-stack during the call to FOO > (let ((number (* x 2))) > (foo 0 .5) > number)) > > (defun test2 () > (test 0)) > > (sb-thread:make-thread #'test2) > > It seems to be that there has to be something saved on the number stack > and a floating point operation of some sort. > > gdb says that the fault happens during C_FULL_EPILOG in call_into_lisp > from ppc-assem.S, that's where registers are restored. And it also needs (declaim (optimize (debug 2))) to get triggered. -- With best regards, Stas. |