1.0.42.11: reinline nested LIST and VECTOR calls in MAKE-ARRAY initial-contents
[sbcl.git] / src / compiler / aliencomp.lisp
index 3635cb4..4321c31 100644 (file)
          (abort-ir1-transform "too many indices for pointer deref: ~W"
                               (length indices)))
        (let ((element-type (alien-pointer-type-to alien-type)))
+         (unless element-type
+           (give-up-ir1-transform "unable to open code deref of wild pointer type"))
          (if indices
              (let ((bits (alien-type-bits element-type))
                    (alignment (alien-type-alignment element-type)))
 (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)))
+  (declare #-sb-xc-host (muffle-conditions compiler-note)
+           (optimize (speed 3)))
+  (let* ((fp-and-pc (cons (%caller-frame)
+                          (sap-int (%caller-pc)))))
+    (declare (truly-dynamic-extent fp-and-pc))
+    (let ((*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 *saved-fp-and-pcs*))
+      (funcall fn))))
 
 (defun find-saved-fp-and-pc (fp)
   (when (boundp '*saved-fp-and-pcs*)
              (int-sap (get-lisp-obj-address (car x))) fp)
         (return (values (car x) (cdr x)))))))
 
-(deftransform alien-funcall ((function &rest args) * * :important t)
+(deftransform alien-funcall ((function &rest args) * * :node node :important t)
   (let ((type (lvar-type function)))
     (unless (alien-type-type-p type)
       (give-up-ir1-transform "can't tell function type at compile time"))
             ;; 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)))
+            (when (policy node (<= speed debug))
+              (setf body `(invoke-with-saved-fp-and-pc (lambda () ,body))))
             (/noshow "returning from DEFTRANSFORM ALIEN-FUNCALL" (params) body)
             `(lambda (function ,@(params))
                ,body)))))))
       (error "Something is broken."))
     (values-specifier-type
      (compute-alien-rep-type
-      (alien-fun-type-result-type type)))))
+      (alien-fun-type-result-type type)
+      :result))))
 
 (defoptimizer (%alien-funcall ltn-annotate)
               ((function type &rest args) node ltn-policy)