(deftransform %heap-alien-addr ((info) * * :important t)
(multiple-value-bind (sap type) (heap-alien-sap-and-type info)
(/noshow "in DEFTRANSFORM %HEAP-ALIEN-ADDR, creating %SAP-ALIEN")
- `(%sap-alien ,sap ',type)))
+ `(%sap-alien ,sap ',(make-alien-pointer-type :to type))))
+
\f
;;;; support for local (stack or register) aliens
(/noshow (local-alien-info-force-to-memory-p info))
(/noshow alien-type (unparse-alien-type alien-type) (alien-type-bits alien-type))
(if (local-alien-info-force-to-memory-p info)
- #!+(or x86 x86-64)
- `(truly-the system-area-pointer
- (%primitive alloc-alien-stack-space
- ,(ceiling (alien-type-bits alien-type)
- sb!vm:n-byte-bits)))
- #!-(or x86 x86-64)
- `(truly-the system-area-pointer
- (%primitive alloc-number-stack-space
- ,(ceiling (alien-type-bits alien-type)
- sb!vm:n-byte-bits)))
- (let* ((alien-rep-type-spec (compute-alien-rep-type alien-type))
- (alien-rep-type (specifier-type alien-rep-type-spec)))
- (cond ((csubtypep (specifier-type 'system-area-pointer)
- alien-rep-type)
- '(int-sap 0))
- ((ctypep 0 alien-rep-type) 0)
- ((ctypep 0.0f0 alien-rep-type) 0.0f0)
- ((ctypep 0.0d0 alien-rep-type) 0.0d0)
- (t
- (compiler-error
- "Aliens of type ~S cannot be represented immediately."
- (unparse-alien-type alien-type))))))))
+ #!+(or x86 x86-64)
+ `(%primitive alloc-alien-stack-space
+ ,(ceiling (alien-type-bits alien-type)
+ sb!vm:n-byte-bits))
+ #!-(or x86 x86-64)
+ `(%primitive alloc-number-stack-space
+ ,(ceiling (alien-type-bits alien-type)
+ sb!vm:n-byte-bits))
+ (let* ((alien-rep-type-spec (compute-alien-rep-type alien-type))
+ (alien-rep-type (specifier-type alien-rep-type-spec)))
+ (cond ((csubtypep (specifier-type 'system-area-pointer)
+ alien-rep-type)
+ '(int-sap 0))
+ ((ctypep 0 alien-rep-type) 0)
+ ((ctypep 0.0f0 alien-rep-type) 0.0f0)
+ ((ctypep 0.0d0 alien-rep-type) 0.0d0)
+ (t
+ (compiler-error
+ "Aliens of type ~S cannot be represented immediately."
+ (unparse-alien-type alien-type))))))))
(deftransform note-local-alien-type ((info var) * * :important t)
;; FIXME: This test and error occur about a zillion times. They
(count-low-order-zeros (lvar-uses thing))))
(combination
(case (let ((name (lvar-fun-name (combination-fun thing))))
- (or (modular-version-info name :unsigned) name))
+ (or (modular-version-info name :untagged nil) name))
((+ -)
(let ((min most-positive-fixnum)
(itype (specifier-type 'integer)))
(give-up-ir1-transform))
(let ((inside-fun-name (lvar-fun-name (combination-fun value-node))))
(multiple-value-bind (prototype width)
- (modular-version-info inside-fun-name :unsigned)
+ (modular-version-info inside-fun-name :untagged nil)
(unless (eq (or prototype inside-fun-name) 'ash)
(give-up-ir1-transform))
(when (and width (not (constant-lvar-p amount)))
`(lambda (function ,@names)
(alien-funcall (deref function) ,@names))))
+;;; Frame pointer, program counter conses. In each thread it's bound
+;;; locally or not bound at all.
+(defvar *saved-fp-and-pcs*)
+
+#!+:c-stack-is-control-stack
+(declaim (inline invoke-with-saved-fp-and-pc))
+#!+:c-stack-is-control-stack
+(defun invoke-with-saved-fp-and-pc (fn)
+ (let* ((fp-and-pc (multiple-value-bind (fp pc)
+ (%caller-frame-and-pc)
+ (cons fp pc)))
+ (*saved-fp-and-pcs* (if (boundp '*saved-fp-and-pcs*)
+ (cons fp-and-pc *saved-fp-and-pcs*)
+ (list fp-and-pc))))
+ (declare (truly-dynamic-extent fp-and-pc *saved-fp-and-pcs*))
+ (funcall fn)))
+
+(defun find-saved-fp-and-pc (fp)
+ (when (boundp '*saved-fp-and-pcs*)
+ (dolist (x *saved-fp-and-pcs*)
+ (when (#!+:stack-grows-downward-not-upward
+ sap>
+ #!-:stack-grows-downward-not-upward
+ sap<
+ (int-sap (get-lisp-obj-address (car x))) fp)
+ (return (values (car x) (cdr x)))))))
+
(deftransform alien-funcall ((function &rest args) * * :important t)
(let ((type (lvar-type function)))
(unless (alien-type-type-p type)
`(multiple-value-bind ,(temps) ,body
(values ,@(results)))))
(setf body `(naturalize ,body ',return-type)))
+ ;; Remember this frame to make sure that we can get back
+ ;; to it later regardless of how the foreign stack looks
+ ;; like.
+ #!+:c-stack-is-control-stack
+ (setf body `(invoke-with-saved-fp-and-pc (lambda () ,body)))
(/noshow "returning from DEFTRANSFORM ALIEN-FUNCALL" (params) body)
`(lambda (function ,@(params))
,body)))))))