disassemble: Better annotation of static functions and safepoints.
[sbcl.git] / src / compiler / backend.lisp
index 915dec0..2d1a88c 100644 (file)
 (defvar *backend-meta-sc-names* (make-hash-table :test 'eq))
 (defvar *backend-meta-sb-names* (make-hash-table :test 'eq))
 (declaim (type hash-table
-              *backend-sc-names*
-              *backend-sb-names*
-              *backend-meta-sc-names*
-              *backend-meta-sb-names*))
+               *backend-sc-names*
+               *backend-sb-names*
+               *backend-meta-sc-names*
+               *backend-meta-sb-names*))
 
 
 ;;; like *SC-NUMBERS*, but updated at meta-compile time
 (defvar *backend-instruction-flavors* (make-hash-table :test 'equal))
 (defvar *backend-special-arg-types* (make-hash-table :test 'eq))
 (declaim (type hash-table
-              *backend-instruction-formats*
-              *backend-instruction-flavors*
-              *backend-special-arg-types*))
+               *backend-instruction-formats*
+               *backend-instruction-flavors*
+               *backend-special-arg-types*))
 
 ;;; mappings between CTYPE structures and the corresponding predicate.
 ;;; The type->predicate mapping is implemented as an alist because
 (defvar *backend-support-routines*)
 
 (macrolet ((def-vm-support-routines (&rest routines)
-            `(progn
-               (eval-when (:compile-toplevel :load-toplevel :execute)
-                 (defparameter *vm-support-routines* ',routines))
-               (defstruct (vm-support-routines (:copier nil))
-                 ,@(mapcar (lambda (routine)
-                             `(,routine nil :type (or function null)))
-                           routines))
-               ,@(mapcar
-                  (lambda (name)
-                    `(defun ,name (&rest args)
-                       (apply (or (,(symbolicate "VM-SUPPORT-ROUTINES-"
-                                                 name)
-                                   *backend-support-routines*)
-                                  (error "machine-specific support ~S ~
+             `(progn
+                (eval-when (:compile-toplevel :load-toplevel :execute)
+                  (defparameter *vm-support-routines* ',routines))
+                (defstruct (vm-support-routines (:copier nil))
+                  ,@(mapcar (lambda (routine)
+                              `(,routine nil :type (or function null)))
+                            routines))
+                ,@(mapcar
+                   (lambda (name)
+                     `(defun ,name (&rest args)
+                        (apply (or (,(symbolicate "VM-SUPPORT-ROUTINES-"
+                                                  name)
+                                    *backend-support-routines*)
+                                   (error "machine-specific support ~S ~
                                            routine undefined"
-                                         ',name))
-                              args)))
-                  routines))))
+                                          ',name))
+                               args)))
+                   routines))))
 
   (def-vm-support-routines
 
     ;; from vm.lisp
     immediate-constant-sc
     location-print-name
+    combination-implementation-style
+    boxed-immediate-sc-p
 
     ;; from primtype.lisp
     primitive-type-of
     make-dynamic-state-tns
     make-nlx-entry-arg-start-location
 
+    ;; from pred.lisp
+    convert-conditional-move-p
+
     ;; from support.lisp
     generate-call-sequence
     generate-return-sequence
 
 (defmacro !def-vm-support-routine (name ll &body body)
   (unless (member (intern (string name) (find-package "SB!C"))
-                 *vm-support-routines*)
+                  *vm-support-routines*)
     (warn "unknown VM support routine: ~A" name))
   (let ((local-name (symbolicate "IMPL-OF-VM-SUPPORT-ROUTINE-" name)))
     `(progn
        (defun ,local-name ,ll ,@body)
        (setf (,(intern (concatenate 'simple-string
-                                   "VM-SUPPORT-ROUTINES-"
-                                   (string name))
-                      (find-package "SB!C"))
-             *backend-support-routines*)
-            #',local-name))))
+                                    "VM-SUPPORT-ROUTINES-"
+                                    (string name))
+                       (find-package "SB!C"))
+              *backend-support-routines*)
+             #',local-name))))
 
 ;;; the VM support routines
 (defvar *backend-support-routines* (make-vm-support-routines))
@@ -242,9 +247,9 @@ SPARC code in CMUCL,
                    (NOT (BACKEND-FEATUREP :SPARC-64)))))
   ...)
 
-and at the IR2 translation stage, the function #'`(LAMBDA () ,GUARD) would be called. 
+and at the IR2 translation stage, the function #'`(LAMBDA () ,GUARD) would be called.
 
-Until SBCL-0.7pre57, this is translated as 
+Until SBCL-0.7pre57, this is translated as
   (:GUARD #!+(OR :SPARC-V8 (AND :SPARC-V9 (NOT :SPARC-64))) T
           #!-(OR :SPARC-V8 (AND :SPARC-V9 (NOT :SPARC-64))) NIL)
 which means that whether this VOP will ever be used is determined at
@@ -262,7 +267,8 @@ conditionalization.
 ;;; The default value of NIL means use only unguarded VOPs. The
 ;;; initial value is customizeable via
 ;;; customize-backend-subfeatures.lisp
-(defvar *backend-subfeatures* '#.sb-cold:*shebang-backend-subfeatures*)
+(defvar *backend-subfeatures*
+  '#.(sort (copy-list sb-cold:*shebang-backend-subfeatures*) #'string<))
 
 ;;; possible *BACKEND-SUBFEATURES* values:
 ;;;