X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fpolicy.lisp;h=2e19378ac3a3e9d1bf8db8b5b6081b40f9a8f586;hb=a572ab7de4266dec958d50612a8376df6bb45226;hp=0e7a4ebe08e2e58c75d64427a5e5aa1d4e40c4e5;hpb=30479182014bc1e02f54d330643ca45605e3530d;p=sbcl.git diff --git a/src/compiler/policy.lisp b/src/compiler/policy.lisp index 0e7a4eb..2e19378 100644 --- a/src/compiler/policy.lisp +++ b/src/compiler/policy.lisp @@ -14,6 +14,41 @@ ;;; a value for an optimization declaration (def!type policy-quality () '(integer 0 3)) +;;; global policy restrictions +(defvar *policy-restrictions* nil) + +(defun restrict-compiler-policy (&optional quality (min 0)) + #!+sb-doc + "Assing a minimum value to an optimization quality. QUALITY is the name of +the optimization quality to restrict, and MIN (defaulting to zero) is the +minimum allowed value. + +Returns the alist describing the current policy restrictions. + +If QUALITY is NIL or not given, nothing is done. + +Otherwise, if MIN is zero or not given, any existing restrictions of QUALITY +are removed. If MIN is between one and three inclusive, it becomes the new +minimum value for the optimization quality: any future proclamations or +declarations of the quality with a value less then MIN behave as if the value +was MIN instead. + +This is intended to be used interactively, to facilitate recompiling large +bodies of code with eg. a known minimum safety. + +EXPERIMENTAL INTERFACE: Subject to change." + (declare (type policy-quality min)) + (when quality + (aver (policy-quality-name-p quality)) + (if (zerop min) + (setf *policy-restrictions* + (remove quality *policy-restrictions* :key #'car)) + (let ((cell (assoc quality *policy-restrictions*))) + (if cell + (setf (cdr cell) min) + (push (cons quality min) *policy-restrictions*))))) + *policy-restrictions*) + ;;; CMU CL used a special STRUCTURE-OBJECT type POLICY to represent ;;; the state of optimization policy at any point in compilation. This ;;; was a natural choice, but in SBCL it became a little troublesome @@ -72,6 +107,7 @@ ;; value, we do. (cons name 1)) *policy-qualities*)) + (setf *policy-restrictions* nil) ;; not actually POLICY, but very similar (setf *handled-conditions* nil *disabled-package-locks* nil)) @@ -86,9 +122,13 @@ ;;; it's an error if it's called for a quality which isn't defined. (defun policy-quality (policy quality-name) (aver (policy-quality-name-p quality-name)) + (%policy-quality policy quality-name)) + +(defun %policy-quality (policy quality-name) (let* ((acons (assoc quality-name policy)) + (min (or (cdr (assoc quality-name *policy-restrictions*)) 0)) (result (or (cdr acons) 1))) - result)) + (max result min))) ;;; syntactic sugar for querying optimization policy qualities ;;; @@ -114,16 +154,19 @@ ;;; Dependent qualities (defmacro define-optimization-quality - (name expression &optional documentation) + (name expression &optional values-documentation documentation) + (declare (ignorable documentation)) `(eval-when (:compile-toplevel :load-toplevel :execute) (let ((acons (assoc ',name *policy-dependent-qualities*)) (item (make-policy-dependent-quality :name ',name :expression ',expression :getter (lambda (policy) (policy policy ,expression)) - :values-documentation ',documentation))) + :values-documentation ',values-documentation))) (if acons (setf (cdr acons) item) (setf *policy-dependent-qualities* (nconc *policy-dependent-qualities* (list `(,',name . ,item)))))) + #-sb-xc-host + ,@(when documentation `((setf (fdocumentation ',name 'optimize) ,documentation))) ',name))