X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmain.lisp;h=8b63af8356de67d774b668b0bc5c22ac276d5d3e;hb=98a76d4426660876dec6649b1e228d2e5b47f579;hp=e8e62a696fa4a70ee4fcfb3aab4f869c59822d1c;hpb=9ce73d3eeef7ed9dda2f8029c5f42cc17798ad51;p=sbcl.git diff --git a/src/compiler/main.lisp b/src/compiler/main.lisp index e8e62a6..8b63af8 100644 --- a/src/compiler/main.lisp +++ b/src/compiler/main.lisp @@ -30,6 +30,10 @@ *last-source-form* *last-format-string* *last-format-args* *last-message-count* *lexenv*)) +;;; Whether call of a function which cannot be defined causes a full +;;; warning. +(defvar *flame-on-necessarily-undefined-function* nil) + (defvar *check-consistency* nil) (defvar *all-components*) @@ -87,6 +91,11 @@ ;;; normally causes nested uses to be no-ops). (defvar *in-compilation-unit* nil) +;;; This lock is siezed in the same situation: the compiler is not +;;; presently thread-safe +(defvar *big-compiler-lock* + (sb!thread:make-mutex :name "big compiler lock")) + ;;; Count of the number of compilation units dynamically enclosed by ;;; the current active WITH-COMPILATION-UNIT that were unwound out of. (defvar *aborted-compilation-unit-count*) @@ -127,7 +136,7 @@ ;; Inside another WITH-COMPILATION-UNIT, a WITH-COMPILATION-UNIT is ;; ordinarily (unless OVERRIDE) basically a no-op. (unwind-protect - (multiple-value-prog1 (funcall fn) (setf succeeded-p t)) + (multiple-value-prog1 (funcall fn) (setf succeeded-p t)) (unless succeeded-p (incf *aborted-compilation-unit-count*))) ;; FIXME: Now *COMPILER-FOO-COUNT* stuff is bound in more than @@ -140,16 +149,17 @@ (*compiler-note-count* 0) (*undefined-warnings* nil) (*in-compilation-unit* t)) - (handler-bind ((parse-unknown-type - (lambda (c) - (note-undefined-reference - (parse-unknown-type-specifier c) - :type)))) - (unwind-protect - (multiple-value-prog1 (funcall fn) (setf succeeded-p t)) - (unless succeeded-p - (incf *aborted-compilation-unit-count*)) - (summarize-compilation-unit (not succeeded-p)))))))) + (sb!thread:with-recursive-lock (*big-compiler-lock*) + (handler-bind ((parse-unknown-type + (lambda (c) + (note-undefined-reference + (parse-unknown-type-specifier c) + :type)))) + (unwind-protect + (multiple-value-prog1 (funcall fn) (setf succeeded-p t)) + (unless succeeded-p + (incf *aborted-compilation-unit-count*)) + (summarize-compilation-unit (not succeeded-p))))))))) ;;; This is to be called at the end of a compilation unit. It signals ;;; any residual warnings about unknown stuff, then prints the total @@ -173,14 +183,20 @@ (warnings (undefined-warning-warnings undef)) (undefined-warning-count (undefined-warning-count undef))) (dolist (*compiler-error-context* warnings) - (compiler-style-warn "undefined ~(~A~): ~S" kind name)) + (if #-sb-xc-host (and (eq kind :function) + (symbolp name) ; FIXME: (SETF CL:fo) + (eq (symbol-package name) *cl-package*) + *flame-on-necessarily-undefined-function*) + #+sb-xc-host nil + (compiler-warn "undefined ~(~A~): ~S" kind name) + (compiler-style-warn "undefined ~(~A~): ~S" kind name))) (let ((warn-count (length warnings))) (when (and warnings (> undefined-warning-count warn-count)) (let ((more (- undefined-warning-count warn-count))) (compiler-style-warn "~W more use~:P of undefined ~(~A~) ~S" more kind name)))))) - + (dolist (kind '(:variable :function :type)) (let ((summary (mapcar #'undefined-warning-name (remove kind undefs :test-not #'eq @@ -871,7 +887,7 @@ (setf (component-name component) (debug-namify "~S initial component" name)) (setf (component-kind component) :initial) - (let* ((locall-fun (ir1-convert-lambda + (let* ((locall-fun (ir1-convert-lambdalike definition :debug-name (debug-namify "top level local call ~S" name)