X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fnode.lisp;h=134a60879b2e927c0fbebef34d5ee05387be0d95;hb=fe962ba01d267b92f638c8f0d19be41054219f04;hp=de4ecf7eb17f8863338aedd0741e49c3dcfa473a;hpb=b34a3535ed7950a17e5dfe940285dcc10a814cb6;p=sbcl.git diff --git a/src/compiler/node.lisp b/src/compiler/node.lisp index de4ecf7..134a608 100644 --- a/src/compiler/node.lisp +++ b/src/compiler/node.lisp @@ -86,6 +86,7 @@ (format stream "~D" (cont-num x)))) (def!struct (node (:constructor nil) + (:include sset-element (number (incf *compiler-sset-counter*))) (:copier nil)) ;; unique ID for debugging #!+sb-show (id (new-object-id) :read-only t) @@ -246,7 +247,12 @@ ;; entire initial component just to clear the flags. (flag nil) ;; some kind of info used by the back end - (info nil)) + (info nil) + ;; what macroexpansions happened "in" this block, used for xref + (macroexpands nil :type list) + ;; Cache the physenv of a block during lifetime analysis. :NONE if + ;; no cached value has been stored yet. + (physenv-cache :none :type (or null physenv (member :none)))) (def!method print-object ((cblock cblock) stream) (print-unreadable-object (cblock stream :type t :identity t) (format stream "~W :START c~W" @@ -389,7 +395,9 @@ ;; this is filled by physical environment analysis (dx-lvars nil :type list) ;; The default LOOP in the component. - (outer-loop (missing-arg) :type cloop)) + (outer-loop (missing-arg) :type cloop) + ;; The current sset index + (sset-number 0 :type fixnum)) (defprinter (component :identity t) name #!+sb-show id @@ -583,6 +591,7 @@ ;;; allows us to easily substitute one for the other without actually ;;; hacking the flow graph. (def!struct (leaf (:make-load-form-fun ignore-it) + (:include sset-element (number (incf *compiler-sset-counter*))) (:constructor nil)) ;; unique ID for debugging #!+sb-show (id (new-object-id) :read-only t) @@ -851,7 +860,10 @@ ;; sure that no closure is needed. (allocator nil :type (or null combination)) ;; various rare miscellaneous info that drives code generation & stuff - (plist () :type list)) + (plist () :type list) + ;; xref information for this functional (only used for functions with an + ;; XEP) + (xref () :type list)) (defprinter (functional :identity t) %source-name %debug-name @@ -927,7 +939,7 @@ ;; objects (closed-over LAMBDA-VARs and XEPs) which this lambda ;; depends on in such a way that DFO shouldn't put them in separate ;; components. - (calls-or-closes nil :type list) + (calls-or-closes (make-sset) :type (or null sset)) ;; the TAIL-SET that this LAMBDA is in. This is null during creation. ;; ;; In CMU CL, and old SBCL, this was also NILed out when LET @@ -1095,7 +1107,10 @@ ;; propagation. This is left null by the lambda pre-pass if it ;; determine that this is a set closure variable, and is thus not a ;; good subject for flow analysis. - (constraints nil :type (or sset null))) + (constraints nil :type (or sset null)) + ;; The FOP handle of the lexical variable represented by LAMBDA-VAR + ;; in the fopcompiler. + (fop-value nil)) (defprinter (lambda-var :identity t) %source-name #!+sb-show id @@ -1189,7 +1204,8 @@ ;; if a call to a known global function, contains the FUN-INFO. (fun-info nil :type (or fun-info null)) ;; some kind of information attached to this node by the back end - (info nil)) + (info nil) + (step-info)) ;;; The COMBINATION node represents all normal function calls, ;;; including FUNCALL. This is distinct from BASIC-COMBINATION so that