From: Gabor M. <me...@us...> - 2009-04-21 11:26:01
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv26473/src/runtime Modified Files: backtrace.c x86-64-assem.S x86-assem.S Log Message: 1.0.27.14: bias x86oid frame pointer Forward port of Alastair Bridgewater's patch. Duplicate it on x86-64. Make it so that fp points to ocfp just as if the call had been made by CALL to a function with the standard prologue "PUSH EBP; MOV ESP, EBP". Fix the debugger. Index: backtrace.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/backtrace.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- backtrace.c 21 Apr 2009 10:24:15 -0000 1.44 +++ backtrace.c 21 Apr 2009 11:25:53 -0000 1.45 @@ -324,55 +324,21 @@ static int x86_call_context (void *fp, void **ra, void **ocfp) { - void *lisp_ocfp; - void *lisp_ra; void *c_ocfp; void *c_ra; - int lisp_valid_p, c_valid_p; + int c_valid_p; if (!stack_pointer_p(fp)) return 0; c_ocfp = *((void **) fp); c_ra = *((void **) fp + 1); - lisp_ocfp = *((void **) fp - 2); - lisp_ra = *((void **) fp - 1); - lisp_valid_p = (lisp_ocfp > fp - && stack_pointer_p(lisp_ocfp) - && ra_pointer_p(lisp_ra)); c_valid_p = (c_ocfp > fp && stack_pointer_p(c_ocfp) && ra_pointer_p(c_ra)); - if (lisp_valid_p && c_valid_p) { - void *lisp_path_fp; - void *c_path_fp; - void *dummy; - - int lisp_path_p = x86_call_context(lisp_ocfp, &lisp_path_fp, &dummy); - int c_path_p = x86_call_context(c_ocfp, &c_path_fp, &dummy); - - if (lisp_path_p && c_path_p) { -#if defined __FreeBSD__ && __FreeBSD_version > 400000 - if (lisp_ocfp > c_ocfp) - *ra = lisp_ra, *ocfp = lisp_ocfp; - else - *ra = c_ra, *ocfp = c_ocfp; -#else - *ra = lisp_ra, *ocfp = lisp_ocfp; -#endif - } - else if (lisp_path_p) - *ra = lisp_ra, *ocfp = lisp_ocfp; - else if (c_path_p) - *ra = c_ra, *ocfp = c_ocfp; - else - return 0; - } - else if (lisp_valid_p) - *ra = lisp_ra, *ocfp = lisp_ocfp; - else if (c_valid_p) + if (c_valid_p) *ra = c_ra, *ocfp = c_ocfp; else return 0; Index: x86-64-assem.S =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-64-assem.S,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- x86-64-assem.S 21 Apr 2009 10:24:15 -0000 1.26 +++ x86-64-assem.S 21 Apr 2009 11:25:53 -0000 1.27 @@ -209,11 +209,10 @@ xor %rbx,%rbx # available /* Alloc new frame. */ - mov %rsp,%rbx # The current sp marks start of new frame. - push %rbp # dummy for return address - push %rbp # fp in save location S0 + push %rbp # Dummy for return address + push %rbp # fp in save location S1 + mov %rsp,%rbp # The current sp marks start of new frame. sub $8,%rsp # Ensure 3 slots are allocated, two above. - mov %rbx,%rbp # Switch to new frame. Lcall: call *CLOSURE_FUN_OFFSET(%rax) Index: x86-assem.S =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-assem.S,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- x86-assem.S 21 Apr 2009 10:24:15 -0000 1.53 +++ x86-assem.S 21 Apr 2009 11:25:53 -0000 1.54 @@ -272,11 +272,10 @@ #endif /* Alloc new frame. */ - mov %esp,%ebx # The current sp marks start of new frame. - push %ebp # dummy for return address + push %ebp # Dummy for return address push %ebp # fp in save location S1 + mov %esp,%ebp # The current sp marks start of new frame. sub $4,%esp # Ensure 3 slots are allocated, two above. - mov %ebx,%ebp # Switch to new frame. call *CLOSURE_FUN_OFFSET(%eax) |