microcode/unix: fix continue_from_trap to freak out (force GC) less
authorMatt Birkholz <puck@birchwood-abbey.net>
Wed, 27 Aug 2014 05:27:38 +0000 (22:27 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Wed, 27 Aug 2014 05:27:38 +0000 (22:27 -0700)
The classify_pc function returns pcl_unknown for traps in shared
libraries, e.g. in feraiseexcept (in the raise-float-exceptions
primitive) or any callout (in the c-call primitive).  This new
continue_from_trap function is less conservative, ignoring the
pcl_unknown result from classify_pc when the stack_pointer, Free and
PRIMITIVE registers all look good.  This eliminated all complaints
during `make check' about "resetting bogus Free" (not the actual
problem), representing 14 unnecessarily forced GCs.

Also, fix the murmur about "resetting bogus Free".  Correct it for
accuracy and so that it must be turned on with the
((make-primitive-procedure 'SET-DEBUG-FLAGS! 2) 9 #t)

src/microcode/uxtrap.c

index 511f112e2abb4932cab396eb6e3d4a7fe603132a..6e7db83ba3d2fa343bf34b8cf8d5b8e10d79201c 100644 (file)
@@ -391,6 +391,23 @@ continue_from_trap (int signo, SIGINFO_T info, SIGCONTEXT_T * scp)
 #endif
 
     case pcl_unknown:
+      if (((OBJECT_TYPE (primitive)) == TC_PRIMITIVE)
+         && (ADDRESS_IN_STACK_P (stack_pointer)) && (ALIGNED_P (stack_pointer))
+         && (ADDRESS_IN_HEAP_P (Free)) && (ALIGNED_P (Free)))
+       {
+#ifdef ENABLE_DEBUGGING_TOOLS
+         if (GC_Debug == true)
+           {
+             /* Note where this presumption is employed. */
+             outf_error (";Warning: trap at 0x%lx assumed a primitive\n", pc);
+             outf_flush_error ();
+           }
+#endif
+         new_sp = stack_pointer;
+         SET_RECOVERY_INFO
+           (STATE_PRIMITIVE, primitive, (ULONG_TO_FIXNUM (GET_LEXPR_ACTUALS)));
+         break;
+       }
       new_sp = 0;
       SET_RECOVERY_INFO
        (STATE_UNKNOWN,
@@ -409,8 +426,13 @@ continue_from_trap (int signo, SIGINFO_T info, SIGCONTEXT_T * scp)
        && (ALIGNED_P (Free))))
     {
 #ifdef ENABLE_DEBUGGING_TOOLS
-      outf_error ("Resetting bogus Free in continue_from_trap.\n");
-      outf_flush_error ();
+      if (GC_Debug == true)
+       {
+         outf_error ((new_sp == 0)
+                     ? ";Warning: bogus stack_pointer in continue_from_trap\n"
+                     : ";Warning: bogus Free in continue_from_trap\n");
+         outf_flush_error ();
+       }
 #endif
       Free = heap_alloc_limit;
     }