From: Stas B. <sta...@gm...> - 2014-03-29 08:43:03
|
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. -- With best regards, Stas. |