From c6989d6f14dfbd5cd3e7fac3f04942d379b8b818 Mon Sep 17 00:00:00 2001 From: Alastair Bridgewater Date: Wed, 23 Jun 2010 20:24:16 -0400 Subject: [PATCH] Unwind-to-frame-and-call-VOP doesn't need static symbols. * 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 | 14 +++++++------- src/compiler/x86-64/parms.lisp | 3 --- src/compiler/x86/nlx.lisp | 14 +++++++------- src/compiler/x86/parms.lisp | 3 --- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/compiler/x86-64/nlx.lisp b/src/compiler/x86-64/nlx.lisp index b7b3e70..6cd885f 100644 --- a/src/compiler/x86-64/nlx.lisp +++ b/src/compiler/x86-64/nlx.lisp @@ -239,17 +239,17 @@ (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)) @@ -270,8 +270,8 @@ (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) diff --git a/src/compiler/x86-64/parms.lisp b/src/compiler/x86-64/parms.lisp index 4d4cebb..89017d3 100644 --- a/src/compiler/x86-64/parms.lisp +++ b/src/compiler/x86-64/parms.lisp @@ -177,9 +177,6 @@ ;; 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. diff --git a/src/compiler/x86/nlx.lisp b/src/compiler/x86/nlx.lisp index 96d2ca4..b31e635 100644 --- a/src/compiler/x86/nlx.lisp +++ b/src/compiler/x86/nlx.lisp @@ -260,17 +260,17 @@ (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)) @@ -289,8 +289,8 @@ (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) diff --git a/src/compiler/x86/parms.lisp b/src/compiler/x86/parms.lisp index 8bf3674..9246094 100644 --- a/src/compiler/x86/parms.lisp +++ b/src/compiler/x86/parms.lisp @@ -352,9 +352,6 @@ ;; 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. -- 1.7.10.4