0.pre7.86.flaky7.1:
[sbcl.git] / src / compiler / debug.lisp
index ae00cdb..fa8bbf3 100644 (file)
@@ -39,8 +39,8 @@
   One of :WARN, :ERROR or :NONE.")
 (declaim (type (member :warn :error :none) *burp-action*))
 
-;;; Called when something funny but possibly correct is noticed. Otherwise
-;;; similar to Barf.
+;;; Called when something funny but possibly correct is noticed.
+;;; Otherwise similar to BARF.
 (declaim (ftype (function (string &rest t) (values)) burp))
 (defun burp (string &rest *args*)
   (ecase *burp-action*
     (:none))
   (values))
 
-;;; *Seen-Blocks* is a hashtable with true values for all blocks which appear
-;;; in the DFO for one of the specified components.
+;;; *SEEN-BLOCKS* is a hashtable with true values for all blocks which
+;;; appear in the DFO for one of the specified components.
+;;;
+;;; *SEEN-FUNCTIONS* is similar, but records all the lambdas we
+;;; reached by recursing on top level functions.
 (defvar *seen-blocks* (make-hash-table :test 'eq))
-
-;;; *Seen-Functions* is similar, but records all the lambdas we reached by
-;;; recursing on top-level functions.
 (defvar *seen-functions* (make-hash-table :test 'eq))
 
-;;; Barf if Node is in a block which wasn't reached during the graph walk.
+;;; Barf if NODE is in a block which wasn't reached during the graph
+;;; walk.
 (declaim (ftype (function (node) (values)) check-node-reached))
 (defun check-node-reached (node)
   (unless (gethash (continuation-block (node-prev node)) *seen-blocks*)
               (unless (or (constant-p v)
                           (and (global-var-p v)
                                (member (global-var-kind v)
-                                       '(:global :special :constant))))
+                                       '(:global :special))))
                 (barf "strange *FREE-VARIABLES* entry: ~S" v))
               (dolist (n (leaf-refs v))
                 (check-node-reached n))
                   (eq functional (optional-dispatch-main-entry ef)))
         (barf ":OPTIONAL ~S is not an e-p for its OPTIONAL-DISPATCH ~S."
               functional ef))))
-    (:top-level
+    (:toplevel
      (unless (eq (functional-entry-function functional) functional)
        (barf "The ENTRY-FUNCTION in ~S isn't a self-pointer." functional)))
     ((nil :escape :cleanup)
      (return-from check-function-stuff)))
 
   (case (functional-kind functional)
-    ((nil :optional :external :top-level :escape :cleanup)
+    ((nil :optional :external :toplevel :escape :cleanup)
      (when (lambda-p functional)
        (dolist (fun (lambda-lets functional))
         (unless (eq (lambda-home fun) functional)
 
 (defun check-function-consistency (components)
   (dolist (c components)
-    (dolist (fun (component-new-functions c))
-      (observe-functional fun))
+    (dolist (new-fun (component-new-funs c))
+      (observe-functional new-fun))
     (dolist (fun (component-lambdas c))
       (when (eq (functional-kind fun) :external)
        (let ((ef (functional-entry-function fun)))
        (observe-functional let))))
 
   (dolist (c components)
-    (dolist (fun (component-new-functions c))
-      (check-function-stuff fun))
+    (dolist (new-fun (component-new-funs c))
+      (check-function-stuff new-fun))
     (dolist (fun (component-lambdas c))
       (when (eq (functional-kind fun) :deleted)
        (barf "deleted lambda ~S in Lambdas for ~S" fun c))
 
 |#
 
-;;; Check a block for consistency at the general flow-graph level, and call
-;;; Check-Node-Consistency on each node to locally check for semantic
-;;; consistency.
+;;; Check a block for consistency at the general flow-graph level, and
+;;; call CHECK-NODE-CONSISTENCY on each node to locally check for
+;;; semantic consistency.
 (declaim (ftype (function (cblock) (values)) check-block-consistency))
 (defun check-block-consistency (block)
 
     (ref
      (let ((leaf (ref-leaf node)))
        (when (functional-p leaf)
-        (if (eq (functional-kind leaf) :top-level-xep)
+        (if (eq (functional-kind leaf) :toplevel-xep)
             (unless (eq (component-kind (block-component (node-block node)))
-                        :top-level)
-              (barf ":TOP-LEVEL-XEP ref in non-top-level component: ~S"
+                        :toplevel)
+              (barf ":TOPLEVEL-XEP ref in non-top-level component: ~S"
                     node))
             (check-function-reached leaf node)))))
     (basic-combination
                   (combination-p node)))
         (barf "flushed arg not in local call: ~S" node))
        (t
-        (let ((fun (ref-leaf (continuation-use
-                              (basic-combination-fun node))))
-              (pos (position arg (basic-combination-args node))))
-          (check-type pos fixnum) ; to suppress warning -- WHN 19990311
-          (when (leaf-refs (elt (lambda-vars fun) pos))
-            (barf "flushed arg for referenced var in ~S" node))))))
-
+        (locally
+          ;; KLUDGE: In sbcl-0.6.11.37, the compiler doesn't like
+          ;; (DECLARE (TYPE INDEX POS)) after the inline expansion of
+          ;; POSITION. It compiles it correctly, but it issues a type
+          ;; mismatch warning because it can't eliminate the
+          ;; possibility that control will flow through the
+          ;; NIL-returning branch. So we punt here. -- WHN 2001-04-15
+          (declare (notinline position))
+          (let ((fun (ref-leaf (continuation-use
+                                (basic-combination-fun node))))
+                (pos (position arg (basic-combination-args node))))
+            (declare (type index pos))
+            (when (leaf-refs (elt (lambda-vars fun) pos))
+              (barf "flushed arg for referenced var in ~S" node)))))))
      (let ((dest (continuation-dest (node-cont node))))
        (when (and (return-p dest)
                  (eq (basic-combination-kind node) :local)
 ;;; full call passing locations.
 (defun check-environment-lifetimes (component)
   (dolist (fun (component-lambdas component))
-    (let* ((env (lambda-environment fun))
-          (2env (environment-info env))
+    (let* ((env (lambda-physenv fun))
+          (2env (physenv-info env))
           (vars (lambda-vars fun))
-          (closure (ir2-environment-environment 2env))
-          (pc (ir2-environment-return-pc-pass 2env))
-          (fp (ir2-environment-old-fp 2env))
+          (closure (ir2-physenv-environment 2env))
+          (pc (ir2-physenv-return-pc-pass 2env))
+          (fp (ir2-physenv-old-fp 2env))
           (2block (block-info
                    (node-block
                     (lambda-bind
-                     (environment-function env))))))
+                     (physenv-function env))))))
       (do ((conf (ir2-block-global-tns 2block)
                 (global-conflicts-next conf)))
          ((null conf))
   (def-frob *tn-id* *tn-ids* *id-tns* tn-id id-tn)
   (def-frob *label-id* *id-labels* *label-ids* label-id id-label))
 
-;;; Print out a terse one-line description of a leaf.
+;;; Print a terse one-line description of LEAF.
 (defun print-leaf (leaf &optional (stream *standard-output*))
   (declare (type leaf leaf) (type stream stream))
   (etypecase leaf
-    (lambda-var (prin1 (leaf-name leaf) stream))
+    (lambda-var (prin1 (leaf-debug-name leaf) stream))
     (constant (format stream "'~S" (constant-value leaf)))
     (global-var
-     (format stream "~S {~A}" (leaf-name leaf) (global-var-kind leaf)))
-    (clambda
-      (format stream "lambda ~S ~S" (leaf-name leaf)
-             (mapcar #'leaf-name (lambda-vars leaf))))
-    (optional-dispatch
-     (format stream "optional-dispatch ~S" (leaf-name leaf)))
+     (format stream "~S {~A}" (leaf-debug-name leaf) (global-var-kind leaf)))
     (functional
-     (assert (eq (functional-kind leaf) :top-level-xep))
-     (format stream "TL-XEP ~S"
-            (let ((info (leaf-info leaf)))
-              (etypecase info
-                (entry-info (entry-info-name info))
-                (byte-lambda-info :byte-compiled-entry)))))))
+     (format stream "~S ~S" (type-of leaf) (functional-debug-name leaf)))))
 
 ;;; Attempt to find a block given some thing that has to do with it.
 (declaim (ftype (function (t) cblock) block-or-lose))
   (format t " c~D" (cont-num cont))
   (values))
 
-;;; Print out the nodes in Block in a format oriented toward representing
-;;; what the code does.
+;;; Print out the nodes in BLOCK in a format oriented toward
+;;; representing what the code does.
 (defun print-nodes (block)
   (setq block (block-or-lose block))
   (format t "~%block start c~D" (cont-num (block-start block)))
     (format t "~D: " number)
     (print-vop vop)))
 
-;;; Like Print-Nodes, but dumps the IR2 representation of the code in Block.
+;;; This is like PRINT-NODES, but dumps the IR2 representation of the
+;;; code in BLOCK.
 (defun print-vops (block)
   (setq block (block-or-lose block))
   (let ((2block (block-info block)))
     (print-ir2-block block))
   (values))
 
-;;; Do a Print-Nodes on Block and all blocks reachable from it by successor
-;;; links.
+;;; Do a PRINT-NODES on BLOCK and all blocks reachable from it by
+;;; successor links.
 (defun print-blocks (block)
   (setq block (block-or-lose block))
   (do-blocks (block (block-component block) :both)
     (walk block))
   (values))
 
-;;; Print all blocks in Block's component in DFO.
+;;; Print all blocks in BLOCK's component in DFO.
 (defun print-all-blocks (thing)
   (do-blocks (block (block-component (block-or-lose thing)))
     (handler-case (print-nodes block)
 
 (defvar *list-conflicts-table* (make-hash-table :test 'eq))
 
-;;; Add all Always-Live TNs in Block to the conflicts. TN is ignored when
+;;; Add all ALWAYS-LIVE TNs in Block to the conflicts. TN is ignored when
 ;;; it appears in the global conflicts.
 (defun add-always-live-tns (block tn)
   (declare (type ir2-block block) (type tn tn))
     (clrhash *list-conflicts-table*)
     (res)))
 
+;;; Return a list of a the TNs that conflict with TN. Sort of, kind
+;;; of. For debugging use only. Probably doesn't work on :COMPONENT TNs.
 (defun list-conflicts (tn)
-  #!+sb-doc
-  "Return a list of a the TNs that conflict with TN. Sort of, kind of. For
-  debugging use only. Probably doesn't work on :COMPONENT TNs."
-  (assert (member (tn-kind tn) '(:normal :environment :debug-environment)))
+  (aver (member (tn-kind tn) '(:normal :environment :debug-environment)))
   (let ((confs (tn-global-conflicts tn)))
     (cond (confs
           (clrhash *list-conflicts-table*)