0.pre7.110:
[sbcl.git] / src / compiler / generic / genesis.lisp
index 40478a5..0c575dc 100644 (file)
@@ -12,7 +12,7 @@
 ;;;; for !COLD-INIT to be called at cold load time. !COLD-INIT is
 ;;;; responsible for explicitly initializing anything which has to be
 ;;;; initialized early before it transfers control to the ordinary
-;;;; top-level forms.
+;;;; top level forms.
 ;;;;
 ;;;; (In CMU CL, and in SBCL as of 0.6.9 anyway, functions not defined
 ;;;; by DEFUN aren't set up specially by GENESIS. In particular,
 (defstruct (gspace (:constructor %make-gspace)
                   (:copier nil))
   ;; name and identifier for this GSPACE
-  (name (required-argument) :type symbol :read-only t)
-  (identifier (required-argument) :type fixnum :read-only t)
+  (name (missing-arg) :type symbol :read-only t)
+  (identifier (missing-arg) :type fixnum :read-only t)
   ;; the word address where the data will be loaded
-  (word-address (required-argument) :type unsigned-byte :read-only t)
+  (word-address (missing-arg) :type unsigned-byte :read-only t)
   ;; the data themselves. (Note that in CMU CL this was a pair
   ;; of fields SAP and WORDS-ALLOCATED, but that wasn't very portable.)
   (bytes (make-array target-space-alignment :element-type '(unsigned-byte 8))
         :type (simple-array (unsigned-byte 8) 1))
   ;; the index of the next unwritten word (i.e. chunk of
-  ;; SB!VM:WORD-BYTES bytes) in BYTES, or equivalently the number of
+  ;; SB!VM:N-WORD-BYTES bytes) in BYTES, or equivalently the number of
   ;; words actually written in BYTES. In order to convert to an actual
-  ;; index into BYTES, thus must be multiplied by SB!VM:WORD-BYTES.
+  ;; index into BYTES, thus must be multiplied by SB!VM:N-WORD-BYTES.
   (free-word-index 0))
 
 (defun gspace-byte-address (gspace)
                                     (ash (descriptor-low des)
                                          (- 1 sb!vm:n-lowtag-bits)))))
               (format stream
-                      "for fixnum: ~D"
+                      "for fixnum: ~W"
                       (if (> unsigned #x1FFFFFFF)
                           (- unsigned #x40000000)
                           unsigned))))
     ;; NEW-FREE-WORD-INDEX.
     (do ()
        ((>= (length (gspace-bytes gspace))
-            (* new-free-word-index sb!vm:word-bytes)))
+            (* new-free-word-index sb!vm:n-word-bytes)))
       (expand-gspace-bytes gspace))
     ;; Now that GSPACE is big enough, we can meaningfully grab a chunk of it.
     (setf (gspace-free-word-index gspace) new-free-word-index)
 (defun make-fixnum-descriptor (num)
   (when (>= (integer-length num)
            (1+ (- sb!vm:n-word-bits sb!vm:n-lowtag-bits)))
-    (error "~D is too big for a fixnum." num))
+    (error "~W is too big for a fixnum." num))
   (make-random-descriptor (ash num (1- sb!vm:n-lowtag-bits))))
 
 (defun make-other-immediate-descriptor (data type)
 (defun maybe-byte-swap (word)
   (declare (type (unsigned-byte 32) word))
   (aver (= sb!vm:n-word-bits 32))
-  (aver (= sb!vm:byte-bits 8))
+  (aver (= sb!vm:n-byte-bits 8))
   (if (not *genesis-byte-order-swap-p*)
       word
       (logior (ash (ldb (byte 8 0) word) 24)
 (defun maybe-byte-swap-short (short)
   (declare (type (unsigned-byte 16) short))
   (aver (= sb!vm:n-word-bits 32))
-  (aver (= sb!vm:byte-bits 8))
+  (aver (= sb!vm:n-byte-bits 8))
   (if (not *genesis-byte-order-swap-p*)
       short
       (logior (ash (ldb (byte 8 0) short) 8)
               `(progn
                  (defun ,name (byte-vector byte-index)
   (aver (= sb!vm:n-word-bits 32))
-  (aver (= sb!vm:byte-bits 8))
+  (aver (= sb!vm:n-byte-bits 8))
   (ecase sb!c:*backend-byte-order*
     (:little-endian
                       (logior ,@ash-list))
      (error "stub: no big-endian ports of SBCL (yet?)"))))
                  (defun (setf ,name) (new-value byte-vector byte-index)
   (aver (= sb!vm:n-word-bits 32))
-  (aver (= sb!vm:byte-bits 8))
+  (aver (= sb!vm:n-byte-bits 8))
   (ecase sb!c:*backend-byte-order*
     (:little-endian
                       (setf ,@setf-list))
   "Allocate LENGTH units of ELEMENT-BITS bits plus a header word in GSPACE and
   return an ``other-pointer'' descriptor to them. Initialize the header word
   with the resultant length and TYPE."
-  (let* ((bytes (/ (* element-bits length) sb!vm:byte-bits))
+  (let* ((bytes (/ (* element-bits length) sb!vm:n-byte-bits))
         (des (allocate-cold-descriptor gspace
-                                       (+ bytes sb!vm:word-bytes)
+                                       (+ bytes sb!vm:n-word-bytes)
                                        sb!vm:other-pointer-lowtag)))
     (write-memory des
                  (make-other-immediate-descriptor (ash bytes
   header word with TYPE and the length slot with LENGTH."
   ;; FIXME: Here and in ALLOCATE-UNBOXED-OBJECT, BYTES is calculated using
   ;; #'/ instead of #'CEILING, which seems wrong.
-  (let* ((bytes (/ (* element-bits length) sb!vm:byte-bits))
+  (let* ((bytes (/ (* element-bits length) sb!vm:n-byte-bits))
         (des (allocate-cold-descriptor gspace
-                                       (+ bytes (* 2 sb!vm:word-bytes))
+                                       (+ bytes (* 2 sb!vm:n-word-bytes))
                                        sb!vm:other-pointer-lowtag)))
     (write-memory des (make-other-immediate-descriptor 0 type))
     (write-wordindexed des
   ;; extra null byte at the end to aid in call-out to C.)
   (let* ((length (length string))
         (des (allocate-vector-object gspace
-                                     sb!vm:byte-bits
+                                     sb!vm:n-byte-bits
                                      (1+ length)
                                      sb!vm:simple-string-widetag))
         (bytes (gspace-bytes gspace))
-        (offset (+ (* sb!vm:vector-data-offset sb!vm:word-bytes)
+        (offset (+ (* sb!vm:vector-data-offset sb!vm:n-word-bytes)
                    (descriptor-byte-offset des))))
     (write-wordindexed des
                       sb!vm:vector-length-slot
        ((> index words)
         (unless (zerop (integer-length remainder))
           ;; FIXME: Shouldn't this be a fatal error?
-          (warn "~D words of ~D were written, but ~D bits were left over."
+          (warn "~W words of ~W were written, but ~W bits were left over."
                 words n remainder)))
       (let ((word (ldb (byte sb!vm:n-word-bits 0) remainder)))
        (write-wordindexed handle index
               0))
         (result (make-descriptor (descriptor-high des)
                                  (+ (descriptor-low des)
-                                    (* 2 sb!vm:word-bytes)
+                                    (* 2 sb!vm:n-word-bytes)
                                     (- sb!vm:list-pointer-lowtag
                                        sb!vm:other-pointer-lowtag)))))
     (write-wordindexed des
                              (descriptor-low *nil-descriptor*))))
        (unless (= offset-wanted offset-found)
          ;; FIXME: should be fatal
-         (warn "Offset from ~S to ~S is ~D, not ~D"
+         (warn "Offset from ~S to ~S is ~W, not ~W"
                symbol
                nil
                offset-found
 ;;; intern it.
 (defun finish-symbols ()
 
-  ;; FIXME: Why use SETQ (setting symbol value) instead of just using
-  ;; the function values for these things?? I.e. why do we need this
-  ;; section at all? Is it because all the FDEFINITION stuff gets in
-  ;; the way of reading function values and is too hairy to rely on at
-  ;; cold boot? FIXME: Most of these are in *STATIC-SYMBOLS* in
-  ;; parms.lisp, but %HANDLE-FUN-END-BREAKPOINT is not. Why?
-  ;; Explain.
+  ;; I think the point of setting these functions into SYMBOL-VALUEs
+  ;; here, instead of using SYMBOL-FUNCTION, is that in CMU CL
+  ;; SYMBOL-FUNCTION reduces to FDEFINITION, which is a pretty
+  ;; hairy operation (involving globaldb.lisp etc.) which we don't
+  ;; want to invoke early in cold init. -- WHN 2001-12-05
+  ;;
+  ;; FIXME: So OK, that's a reasonable reason to do something weird like
+  ;; this, but this is still a weird thing to do, and we should change
+  ;; the names to highlight that something weird is going on. Perhaps
+  ;; *MAYBE-GC-FUN*, *INTERNAL-ERROR-FUN*, *HANDLE-BREAKPOINT-FUN*,
+  ;; and *HANDLE-FUN-END-BREAKPOINT-FUN*...
   (macrolet ((frob (symbol)
               `(cold-set ',symbol
                          (cold-fdefinition-object (cold-intern ',symbol)))))
                    (warm-symbol cadr-des))))
           (#.sb!vm:other-pointer-lowtag
            (warm-symbol des)))))
-    (unless (legal-function-name-p result)
+    (unless (legal-fun-name-p result)
       (error "not a legal function name: ~S" result))
     result))
 
                                   sb!vm:word-shift))))
                         (#.sb!vm:closure-header-widetag
                          (make-random-descriptor
-                          (cold-foreign-symbol-address-as-integer "closure_tramp")))))
+                          (cold-foreign-symbol-address-as-integer
+                           "closure_tramp")))))
     fdefn))
 
 (defun initialize-static-fns ()
   (let ((*cold-fdefn-gspace* *static*))
-    (dolist (sym sb!vm:*static-functions*)
+    (dolist (sym sb!vm:*static-funs*)
       (let* ((fdefn (cold-fdefinition-object (cold-intern sym)))
             (offset (- (+ (- (descriptor-low fdefn)
                              sb!vm:other-pointer-lowtag)
-                          (* sb!vm:fdefn-raw-addr-slot sb!vm:word-bytes))
+                          (* sb!vm:fdefn-raw-addr-slot sb!vm:n-word-bytes))
                        (descriptor-low *nil-descriptor*)))
-            (desired (sb!vm:static-function-offset sym)))
+            (desired (sb!vm:static-fun-offset sym)))
        (unless (= offset desired)
          ;; FIXME: should be fatal
-         (warn "Offset from FDEFN ~S to ~S is ~D, not ~D."
+         (warn "Offset from FDEFN ~S to ~S is ~W, not ~W."
                sym nil offset desired))))))
 
 (defun list-all-fdefn-objects ()
            (let ((fixed-up (- (+ value un-fixed-up)
                               gspace-byte-address
                               gspace-byte-offset
-                              sb!vm:word-bytes))) ; length of CALL argument
+                              sb!vm:n-word-bytes))) ; length of CALL argument
              (setf (byte-vector-ref-32 gspace-bytes gspace-byte-offset)
                    fixed-up)
              ;; Note relative fixups that point outside the code
                 (8 sb!vm:simple-array-unsigned-byte-8-widetag)
                 (16 sb!vm:simple-array-unsigned-byte-16-widetag)
                 (32 sb!vm:simple-array-unsigned-byte-32-widetag)
-                (t (error "losing element size: ~D" sizebits))))
+                (t (error "losing element size: ~W" sizebits))))
         (result (allocate-vector-object *dynamic* sizebits len type))
         (start (+ (descriptor-byte-offset result)
                   (ash sb!vm:vector-data-offset sb!vm:word-shift)))
         (end (+ start
                 (ceiling (* len sizebits)
-                         sb!vm:byte-bits))))
+                         sb!vm:n-byte-bits))))
     (read-sequence-or-die (descriptor-bytes result)
                          *fasl-input-stream*
                          :start start
                  sb!vm:simple-array-single-float-widetag))
         (start (+ (descriptor-byte-offset result)
                   (ash sb!vm:vector-data-offset sb!vm:word-shift)))
-        (end (+ start (* len sb!vm:word-bytes))))
+        (end (+ start (* len sb!vm:n-word-bytes))))
     (read-sequence-or-die (descriptor-bytes result)
                          *fasl-input-stream*
                          :start start
         #!+sb-show
         (when *show-pre-fixup-code-p*
           (format *trace-output*
-                  "~&/raw code from code-fop ~D ~D:~%"
+                  "~&/raw code from code-fop ~W ~W:~%"
                   nconst
                   code-size)
-          (do ((i start (+ i sb!vm:word-bytes)))
+          (do ((i start (+ i sb!vm:n-word-bytes)))
               ((>= i end))
             (format *trace-output*
                     "/#X~8,'0x: #X~8,'0x~%"
          (format t "#define ~A_~A_OFFSET ~D~%"
                  (substitute #\_ #\- (string name))
                  (substitute #\_ #\- (string (sb!vm:slot-name slot)))
-                 (- (* (sb!vm:slot-offset slot) sb!vm:word-bytes) lowtag)))
+                 (- (* (sb!vm:slot-offset slot) sb!vm:n-word-bytes) lowtag)))
        (terpri))))
     (format t "#endif /* LANGUAGE_ASSEMBLY */~2%"))
 
              (descriptor-bits (cold-intern symbol))
              ;; We didn't run GENESIS, so guess at the address.
              (+ sb!vm:static-space-start
-                sb!vm:word-bytes
+                sb!vm:n-word-bytes
                 sb!vm:other-pointer-lowtag
                 (if symbol (sb!vm:static-symbol-offset symbol) 0)))))
 
@@ -2705,19 +2710,9 @@ that they were called before the out-of-line definition is installed,
 as is fairly common for structure accessors.)
 initially undefined function references:~2%")
 
-      (setf undefs (sort undefs #'string< :key #'function-name-block-name))
+      (setf undefs (sort undefs #'string< :key #'fun-name-block-name))
       (dolist (name undefs)
-        (format t "~S" name)
-       ;; FIXME: This ACCESSOR-FOR stuff should go away when the
-       ;; code has stabilized. (It's only here to help me
-       ;; categorize the flood of undefined functions caused by
-       ;; completely rewriting the bootstrap process. Hopefully any
-       ;; future maintainers will mostly have small numbers of
-       ;; undefined functions..)
-       (let ((accessor-for (info :function :accessor-for name)))
-         (when accessor-for
-           (format t " (accessor for ~S)" accessor-for)))
-       (format t "~%")))
+        (format t "~S~%" name)))
 
     (format t "~%~|~%layout names:~2%")
     (collect ((stuff))
@@ -2766,7 +2761,7 @@ initially undefined function references:~2%")
 (defun output-gspace (gspace)
   (force-output *core-file*)
   (let* ((posn (file-position *core-file*))
-        (bytes (* (gspace-free-word-index gspace) sb!vm:word-bytes))
+        (bytes (* (gspace-free-word-index gspace) sb!vm:n-word-bytes))
         (pages (ceiling bytes sb!c:*backend-page-size*))
         (total-bytes (* pages sb!c:*backend-page-size*)))