(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)
;; 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"
;; 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
;;; 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)
;; it looks as though it's never interesting to get debug names
;; from them, so it's moot. -- WHN)
(leaf-source-name leaf)))
+(defun leaf-%debug-name (leaf)
+ (when (functional-p leaf)
+ (functional-%debug-name leaf)))
;;; The CONSTANT structure is used to represent known constant values.
;;; If NAME is not null, then it is the name of the named constant
;; the value of the constant
(value nil :type t))
(defprinter (constant :identity t)
- (%source-name :test %source-name)
value)
;;; The BASIC-VAR structure represents information common to all
;; 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)
+ ;; True if this functional was created from an inline expansion
+ (inline-expanded nil :type boolean))
(defprinter (functional :identity t)
%source-name
%debug-name
;; 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
(call-lexenv nil :type (or lexenv null))
;; list of embedded lambdas
(children nil :type list)
- (parent nil :type (or clambda null)))
+ (parent nil :type (or clambda null))
+ (allow-instrumenting *allow-instrumenting* :type boolean))
(defprinter (clambda :conc-name lambda- :identity t)
%source-name
%debug-name
;; 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))
+ ;; Initial type of a LET variable as last seen by PROPAGATE-FROM-SETS.
+ (last-initial-type *universal-type* :type ctype)
+ ;; 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
(def!struct (ref (:include valued-node (reoptimize nil))
(:constructor make-ref
(leaf
+ &optional (%source-name '.anonymous.)
&aux (leaf-type (leaf-type leaf))
(derived-type
(make-single-value-type leaf-type))))
(:copier nil))
;; The leaf referenced.
- (leaf nil :type leaf))
+ (leaf nil :type leaf)
+ ;; CONSTANT nodes are always anonymous, since we wish to coalesce named and
+ ;; unnamed constants that are equivalent, we need to keep track of the
+ ;; reference name for XREF.
+ (%source-name (missing-arg) :type symbol :read-only t))
(defprinter (ref :identity t)
#!+sb-show id
+ %source-name
leaf)
;;; Naturally, the IF node always appears at the end of a block.