X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir1final.lisp;h=94240a0f4b0b7866d1d871a1d93faf0eb42a87f2;hb=2d3cb6dba6461e98744eca2a1df4f770cea468ca;hp=c843505170a4c1d3b90433f6c778ee0df13c63a7;hpb=6c765578c8dc4bcc7798e37c9918715f198b30da;p=sbcl.git diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index c843505..94240a0 100644 --- a/src/compiler/ir1final.lisp +++ b/src/compiler/ir1final.lisp @@ -20,7 +20,7 @@ (defun note-failed-optimization (node failures) (declare (type combination node) (list failures)) (unless (or (node-deleted node) - (not (function-info-p (combination-kind node)))) + (not (fun-info-p (combination-kind node)))) (let ((*compiler-error-context* node)) (dolist (failure failures) (let ((what (cdr failure)) @@ -29,16 +29,16 @@ ((consp what) (compiler-note "~@" note (first what) (rest what))) - ((valid-function-use node what - :argument-test #'types-equal-or-intersect - :result-test #'values-types-equal-or-intersect) + ((valid-fun-use node what + :argument-test #'types-equal-or-intersect + :result-test #'values-types-equal-or-intersect) (collect ((messages)) - (flet ((frob (string &rest stuff) + (flet ((give-grief (string &rest stuff) (messages string) (messages stuff))) - (valid-function-use node what - :warning-function #'frob - :error-function #'frob)) + (valid-fun-use node what + :unwinnage-fun #'give-grief + :lossage-fun #'give-grief)) (compiler-note "~@" - (type-specifier declared-ftype) - (type-specifier defined-ftype))))) - (:defined - (when global-p - (setf (info :function :type name) defined-ftype))))))) + (when (leaf-has-source-name-p leaf) + (let ((source-name (leaf-source-name leaf))) + (let* ((where (info :function :where-from source-name)) + (*compiler-error-context* (lambda-bind (main-entry leaf))) + (global-def (gethash source-name *free-funs*)) + (global-p (defined-fun-p global-def))) + (note-name-defined source-name :function) + (when global-p + (remhash source-name *free-funs*)) + (ecase where + (:assumed + (let ((approx-type (info :function :assumed-type source-name))) + (when (and approx-type (fun-type-p defined-ftype)) + (valid-approximate-type approx-type defined-ftype)) + (setf (info :function :type source-name) defined-ftype) + (setf (info :function :assumed-type source-name) nil)) + (setf (info :function :where-from source-name) :defined)) + (:declared + (let ((declared-ftype (info :function :type source-name))) + (unless (defined-ftype-matches-declared-ftype-p + defined-ftype declared-ftype) + (compiler-style-warn + "~@" + (type-specifier declared-ftype) + (type-specifier defined-ftype))))) + (:defined + (when global-p + (setf (info :function :type source-name) defined-ftype)))))))) (values)) ;;; Find all calls in COMPONENT to assumed functions and update the @@ -96,17 +96,17 @@ ;;; types. (defun note-assumed-types (component name var) (when (and (eq (leaf-where-from var) :assumed) - (not (and (defined-function-p var) - (eq (defined-function-inlinep var) :notinline))) + (not (and (defined-fun-p var) + (eq (defined-fun-inlinep var) :notinline))) (eq (info :function :where-from name) :assumed) (eq (info :function :kind name) :function)) (let ((atype (info :function :assumed-type name))) (dolist (ref (leaf-refs var)) (let ((dest (continuation-dest (node-cont ref)))) - (when (and (eq (block-component (node-block ref)) component) + (when (and (eq (node-component ref) component) (combination-p dest) (eq (continuation-use (basic-combination-fun dest)) ref)) - (setq atype (note-function-use dest atype))))) + (setq atype (note-fun-use dest atype))))) (setf (info :function :assumed-type name) atype)))) ;;; Do miscellaneous things that we want to do once all optimization @@ -127,7 +127,7 @@ (maphash #'note-failed-optimization (component-failed-optimizations component)) - (maphash #'(lambda (k v) - (note-assumed-types component k v)) - *free-functions*) + (maphash (lambda (k v) + (note-assumed-types component k v)) + *free-funs*) (values))