Unwind-to-frame-and-call-VOP doesn't need static symbols.
authorAlastair Bridgewater <nyef_sbcl@lisphacker.com>
Thu, 24 Jun 2010 00:24:16 +0000 (20:24 -0400)
committerAlastair Bridgewater <nyef@virtdev-1.lisphacker.com>
Sat, 22 Oct 2011 17:33:03 +0000 (13:33 -0400)
  * The UNWIND procedure takes as parameters a target block and an
unknown-values start/count pair.  The old implementation was passing
the block, a zero count, and a garbage start.  Pass the function to
call as the start, instead of storing it as a static symbol value as
is done now or reserving an extra stack slot somewhere relative to
the unwind block.

  * Delete the static symbol formerly used for this.

  * This has been done for both x86 and x86-64.

src/compiler/x86-64/nlx.lisp
src/compiler/x86-64/parms.lisp
src/compiler/x86/nlx.lisp
src/compiler/x86/parms.lisp

index b7b3e70..6cd885f 100644 (file)
 (define-vop (unwind-to-frame-and-call)
     (:args (ofp :scs (descriptor-reg))
            (uwp :scs (descriptor-reg))
-           (function :scs (descriptor-reg)))
+           (function :scs (descriptor-reg) :to :load :target saved-function))
   (:arg-types system-area-pointer system-area-pointer t)
   (:temporary (:sc sap-reg) temp)
+  (:temporary (:sc descriptor-reg :offset rbx-offset) saved-function)
   (:temporary (:sc unsigned-reg :offset rax-offset) block)
   (:generator 22
     ;; Store the function into a non-stack location, since we'll be
     ;; unwinding the stack and destroying register contents before we
-    ;; use it.
-    (store-tl-symbol-value function
-                           *unwind-to-frame-function*
-                           temp)
+    ;; use it.  It turns out that RBX is preserved as part of the
+    ;; normal multiple-value handling of an unwind, so use that.
+    (move saved-function function)
 
     ;; Allocate space for magic UWP block.
     (inst sub rsp-tn (* unwind-block-size n-word-bytes))
     (inst jmp temp-reg-tn)
     ENTRY-LABEL
 
-    ;; Load function from symbol
-    (load-tl-symbol-value block *unwind-to-frame-function*)
+    ;; Move our saved function to where we want it now.
+    (move block saved-function)
 
     ;; No parameters
     (zeroize rcx-tn)
index 4d4cebb..89017d3 100644 (file)
      ;; For GC-AND-SAVE
      *restart-lisp-function*
 
-     ;; For the UNWIND-TO-FRAME-AND-CALL VOP
-     *unwind-to-frame-function*
-
      ;; Needed for callbacks to work across saving cores. see
      ;; ALIEN-CALLBACK-ASSEMBLER-WRAPPER in c-call.lisp for gory
      ;; details.
index 96d2ca4..b31e635 100644 (file)
 (define-vop (unwind-to-frame-and-call)
     (:args (ofp :scs (descriptor-reg))
            (uwp :scs (descriptor-reg))
-           (function :scs (descriptor-reg)))
+           (function :scs (descriptor-reg) :to :load :target saved-function))
   (:arg-types system-area-pointer system-area-pointer t)
   (:temporary (:sc sap-reg) temp)
+  (:temporary (:sc descriptor-reg :offset ebx-offset) saved-function)
   (:temporary (:sc unsigned-reg :offset eax-offset) block)
   (:generator 22
     ;; Store the function into a non-stack location, since we'll be
     ;; unwinding the stack and destroying register contents before we
-    ;; use it.
-    (store-tl-symbol-value function
-                           *unwind-to-frame-function*
-                           temp)
+    ;; use it.  It turns out that EBX is preserved as part of the
+    ;; normal multiple-value handling of an unwind, so use that.
+    (move saved-function function)
 
     ;; Allocate space for magic UWP block.
     (inst sub esp-tn (* unwind-block-size n-word-bytes))
     (inst jmp (make-fixup 'unwind :assembly-routine))
     ENTRY-LABEL
 
-    ;; Load function from symbol
-    (load-tl-symbol-value block *unwind-to-frame-function*)
+    ;; Move our saved function to where we want it now.
+    (move block saved-function)
 
     ;; No parameters
     (inst xor ecx-tn ecx-tn)
index 8bf3674..9246094 100644 (file)
      ;; For GC-AND-SAVE
      *restart-lisp-function*
 
-     ;; For the UNWIND-TO-FRAME-AND-CALL VOP
-     *unwind-to-frame-function*
-
      ;; Needed for callbacks to work across saving cores. see
      ;; ALIEN-CALLBACK-ASSEMBLER-WRAPPER in c-call.lisp for gory
      ;; details.