0.8.12.16:
[sbcl.git] / src / compiler / dump.lisp
index 398bfca..bb8ff48 100644 (file)
         (dump-byte ',val ,file))
       (error "compiler bug: ~S is not a legal fasload operator." fs))))
 
-;;; Dump a FOP-Code along with an integer argument, choosing the FOP
+;;; Dump a FOP-CODE along with an integer argument, choosing the FOP
 ;;; based on whether the argument will fit in a single byte.
 ;;;
 ;;; FIXME: This, like DUMP-FOP, should be a function with a
      stream)
     (dump-byte +fasl-header-string-stop-char-code+ res)
 
-    ;; Finish the header by outputting fasl file implementation and
-    ;; version in machine-readable form.
-    (let ((implementation +backend-fasl-file-implementation+))
-      (dump-unsigned-32 (length (symbol-name implementation)) res)
-      (dotimes (i (length (symbol-name implementation)))
-       (dump-byte (char-code (aref (symbol-name implementation) i)) res)))
-    (dump-unsigned-32 +fasl-file-version+ res)
+    ;; Finish the header by outputting fasl file implementation,
+    ;; version, and key *FEATURES*.
+    (flet ((dump-counted-string (string)
+            (dump-unsigned-32 (length string) res)
+            (dotimes (i (length string))
+              (dump-byte (char-code (aref string i)) res))))
+      (dump-counted-string (symbol-name +backend-fasl-file-implementation+))
+      (dump-unsigned-32 +fasl-file-version+ res)      
+      (dump-counted-string *features-affecting-fasl-format*))
 
     res))
 
 ;;; tables.
 (defun dump-vector (x file)
   (let ((simple-version (if (array-header-p x)
-                           (coerce x 'simple-array)
+                           (coerce x `(simple-array
+                                       ,(array-element-type x)
+                                       (*)))
                            x)))
     (typecase simple-version
       (simple-base-string
               ;; (SIMPLE-ARRAY (UNSIGNED-BYTE 8) *).) The other cases are only
               ;; needed in the target SBCL, so we let them be handled with
               ;; unportable bit bashing.
-              (cond ((>= size 8) ; easy cases
+              (cond ((>= size 7) ; easy cases
                      (multiple-value-bind (floor rem) (floor size 8)
-                       (aver (zerop rem))
+                       (aver (or (zerop rem) (= rem 7)))
+                       (when (= rem 7)
+                         (setq size (1+ size))
+                         (setq floor (1+ floor)))
                        (dovector (i vec)
                          (dump-integer-as-n-bytes
                           (ecase sb!c:*backend-byte-order*
                 (dump-byte size file))
               (dump-raw-bytes vec bytes file)))
       (etypecase vec
+       #-sb-xc-host
+       ((simple-array nil (*))
+        (dump-unsigned-vector 0 0))
        ;; KLUDGE: What exactly does the (ASH .. -3) stuff do? -- WHN 19990902
        (simple-bit-vector
         (dump-unsigned-vector 1 (ash (+ (the index len) 7) -3)))
        #-sb-xc-host
        ((simple-array (unsigned-byte 4) (*))
         (dump-unsigned-vector 4 (ash (+ (the index (ash len 2)) 7) -3)))
+       #-sb-xc-host
+       ((simple-array (unsigned-byte 7) (*))
+        (dump-unsigned-vector 7 len))
        ((simple-array (unsigned-byte 8) (*))
         (dump-unsigned-vector 8 len))
+       #-sb-xc-host
+       ((simple-array (unsigned-byte 15) (*))
+        (dump-unsigned-vector 15 (* 2 len)))
        ((simple-array (unsigned-byte 16) (*))
         (dump-unsigned-vector 16 (* 2 len)))
+       #-sb-xc-host
+       ((simple-array (unsigned-byte 31) (*))
+        (dump-unsigned-vector 31 (* 4 len)))
        ((simple-array (unsigned-byte 32) (*))
         (dump-unsigned-vector 32 (* 4 len)))
        ((simple-array (signed-byte 8) (*))
         (dump-signed-vector 8 len))
        ((simple-array (signed-byte 16) (*))
         (dump-signed-vector 16 (* 2 len)))
+       ((simple-array (unsigned-byte 29) (*))
+        (dump-signed-vector 29 (* 4 len)))
        ((simple-array (signed-byte 30) (*))
         (dump-signed-vector 30 (* 4 len)))
        ((simple-array (signed-byte 32) (*))
 ;;;  - code object references: don't need a name.
 (defun dump-fixups (fixups fasl-output)
   (declare (list fixups) (type fasl-output fasl-output))
-  (dolist (info fixups)
-    ;; FIXME: Packing data with LIST in NOTE-FIXUP and unpacking them
-    ;; with FIRST, SECOND, and THIRD here is hard to follow and
-    ;; maintain. Perhaps we could define a FIXUP-INFO structure to use
-    ;; instead, and rename *FIXUPS* to *FIXUP-INFO-LIST*?
-    (let* ((kind (first info))
-          (fixup (second info))
+  (dolist (note fixups)
+    (let* ((kind (fixup-note-kind note))
+          (fixup (fixup-note-fixup note))
+          (position (fixup-note-position note))
           (name (fixup-name fixup))
-          (flavor (fixup-flavor fixup))
-          (offset (third info)))
-      ;; FIXME: This OFFSET is not what's called OFFSET in the FIXUP
-      ;; structure, it's what's called POSN in NOTE-FIXUP. (As far as
-      ;; I can tell, FIXUP-OFFSET is not actually an offset, it's an
-      ;; internal label used instead of NAME for :CODE-OBJECT fixups.
-      ;; Notice that in the :CODE-OBJECT case, NAME is ignored.)
+          (flavor (fixup-flavor fixup)))
       (dump-fop 'fop-normal-load fasl-output)
       (let ((*cold-load-dump* t))
        (dump-object kind fasl-output))
       (dump-fop 'fop-maybe-cold-load fasl-output)
       ;; Depending on the flavor, we may have various kinds of
-      ;; noise before the offset.
+      ;; noise before the position.
       (ecase flavor
        (:assembly-routine
         (aver (symbolp name))
        (:code-object
         (aver (null name))
         (dump-fop 'fop-code-object-fixup fasl-output)))
-      ;; No matter what the flavor, we'll always dump the offset.
-      (dump-unsigned-32 offset fasl-output)))
+      ;; No matter what the flavor, we'll always dump the position
+      (dump-unsigned-32 position fasl-output)))
   (values))
 
 ;;; Dump out the constant pool and code-vector for component, push the
       ;; hardwired to be empty. And SBCL doesn't have GENGC (and as
       ;; far as I know no modern CMU CL does either -- WHN
       ;; 2001-10-05). So might we be able to get rid of trace tables?
+      ;;
+      ;; Note that gencgc also does something with the trace table.
 
       ;; Dump the constants, noting any :ENTRY constants that have to
       ;; be patched.
 (defun dump-layout (obj file)
   (when (layout-invalid obj)
     (compiler-error "attempt to dump reference to obsolete class: ~S"
-                   (layout-class obj)))
-  (let ((name (sb!xc:class-name (layout-class obj))))
+                   (layout-classoid obj)))
+  (let ((name (classoid-name (layout-classoid obj))))
     (unless name
       (compiler-error "dumping anonymous layout: ~S" obj))
     (dump-fop 'fop-normal-load file)