(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)