From: Gábor M. <me...@us...> - 2008-10-20 12:01:07
|
Update of /cvsroot/sbcl/sbcl/src/code In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv26384/src/code Modified Files: debug-int.lisp target-thread.lisp Log Message: 1.0.21.32: hack around truncated backtraces with lost frames On :C-STACK-IS-THE-CONTROL-STACK platforms when calling an alien function stash the current frame pointer and return address away so that no matter how the alien stack frames are laid out the debugger can find its way back to lisp land. Index: debug-int.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/debug-int.lisp,v retrieving revision 1.120 retrieving revision 1.121 diff -u -d -r1.120 -r1.121 --- debug-int.lisp 4 Sep 2008 13:04:48 -0000 1.120 +++ debug-int.lisp 20 Oct 2008 12:00:53 -0000 1.121 @@ -674,6 +674,11 @@ ((not (frame-p frame))) (setf (frame-number frame) number))) +(defun find-saved-frame-down (fp up-frame) + (multiple-value-bind (saved-fp saved-pc) (sb!c:find-saved-fp-and-pc fp) + (when saved-fp + (compute-calling-frame (descriptor-sap saved-fp) saved-pc up-frame)))) + ;;; Return the frame immediately below FRAME on the stack; or when ;;; FRAME is the bottom of the stack, return NIL. (defun frame-down (frame) @@ -703,8 +708,9 @@ (when (control-stack-pointer-valid-p fp) #!+(or x86 x86-64) (multiple-value-bind (ok ra ofp) (x86-call-context fp) - (and ok - (compute-calling-frame ofp ra frame))) + (if ok + (compute-calling-frame ofp ra frame) + (find-saved-frame-down fp frame))) #!-(or x86 x86-64) (compute-calling-frame #!-alpha Index: target-thread.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/code/target-thread.lisp,v retrieving revision 1.94 retrieving revision 1.95 diff -u -d -r1.94 -r1.95 --- target-thread.lisp 19 Sep 2008 14:55:53 -0000 1.94 +++ target-thread.lisp 20 Oct 2008 12:00:53 -0000 1.95 @@ -731,6 +731,7 @@ (*restart-clusters* nil) (*handler-clusters* (sb!kernel::initial-handler-clusters)) (*condition-restarts* nil) + (sb!c::*saved-fp-and-pcs* ()) (sb!impl::*deadline* nil) (sb!impl::*step-out* nil) ;; internal printer variables |