(when nfp
(inst addi val nfp (bytes-needed-for-non-descriptor-stack-frame))))))
+;;; Accessing a slot from an earlier stack frame is definite hackery.
+(define-vop (ancestor-frame-ref)
+ (:args (frame-pointer :scs (descriptor-reg))
+ (variable-home-tn :load-if nil))
+ (:results (value :scs (descriptor-reg any-reg)))
+ (:policy :fast-safe)
+ (:generator 4
+ (aver (sc-is variable-home-tn control-stack))
+ (loadw value frame-pointer (tn-offset variable-home-tn))))
+(define-vop (ancestor-frame-set)
+ (:args (frame-pointer :scs (descriptor-reg))
+ (value :scs (descriptor-reg any-reg)))
+ (:results (variable-home-tn :load-if nil))
+ (:policy :fast-safe)
+ (:generator 4
+ (aver (sc-is variable-home-tn control-stack))
+ (storew value frame-pointer (tn-offset variable-home-tn))))
+
(define-vop (xep-allocate-frame)
(:info start-lab copy-more-arg-follows)
(:ignore copy-more-arg-follows)
nvals)
(:temporary (:scs (non-descriptor-reg)) temp))
+\f
+;;; This hook in the codegen pass lets us insert code before fall-thru entry
+;;; points, local-call entry points, and tail-call entry points. The default
+;;; does nothing.
+(defun emit-block-header (start-label trampoline-label fall-thru-p alignp)
+ (declare (ignore fall-thru-p alignp))
+ (when trampoline-label
+ (emit-label trampoline-label))
+ (emit-label start-label))
\f
;;;; Local call with unknown values convention return:
:from (:argument ,(if (eq return :tail) 0 1))
:to :eval)
lexenv))
- ,@(unless named
- '((:temporary (:scs (descriptor-reg) :from (:argument 0) :to :eval)
- function)))
+ (:temporary (:scs (descriptor-reg) :from (:argument 0) :to :eval)
+ function)
(:temporary (:sc any-reg :offset nargs-offset :to :eval)
nargs-pass)
;; Conditionally insert a conditional trap:
(when step-instrumenting
;; Get the symbol-value of SB!IMPL::*STEPPING*
- (loadw stepping
- null-tn
- (+ symbol-value-slot
- (truncate (static-symbol-offset 'sb!impl::*stepping*)
- n-word-bytes))
- other-pointer-lowtag)
+ #!-sb-thread
+ (load-symbol-value stepping sb!impl::*stepping*)
+ #!+sb-thread
+ (loadw stepping thread-base-tn thread-stepping-slot)
(inst cmpw stepping null-tn)
;; If it's not null, trap.
(inst beq step-done-label)
;; FUNCTION is loaded, but before ENTRY-POINT is
;; calculated.
(insert-step-instrumenting name-pass)
- (loadw entry-point name-pass fdefn-raw-addr-slot
- other-pointer-lowtag)
+ ;; The raw-addr (ENTRY-POINT) will be one of:
+ ;; closure_tramp, undefined_tramp, or somewhere
+ ;; within a simple-fun object. If the latter, then
+ ;; it is essential (due to it being an interior
+ ;; pointer) that the function itself be in a
+ ;; register before the raw-addr is loaded.
+ (sb!assem:without-scheduling ()
+ (loadw function name-pass fdefn-fun-slot
+ other-pointer-lowtag)
+ (loadw entry-point name-pass fdefn-raw-addr-slot
+ other-pointer-lowtag))
(do-next-filler))
`((sc-case arg-fun
(descriptor-reg (move lexenv arg-fun))
(:vop-var vop)
(:generator 3
;; Get the symbol-value of SB!IMPL::*STEPPING*
- (loadw stepping
- null-tn
- (+ symbol-value-slot
- (truncate (static-symbol-offset 'sb!impl::*stepping*)
- n-word-bytes))
- other-pointer-lowtag)
+ #!-sb-thread
+ (load-symbol-value stepping sb!impl::*stepping*)
+ #!+sb-thread
+ (loadw stepping thread-base-tn thread-stepping-slot)
(inst cmpw stepping null-tn)
;; If it's not null, trap.
(inst beq DONE)