X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Ftarget-dump.lisp;h=dda58b4f286e88b33d24c1c84ed254ef80731441;hb=8e4ec430504f0f563280be26034af590dff50d34;hp=913822ef09e878363123403a12d2c2cb382b31b6;hpb=a530bbe337109d898d5b4a001fc8f1afa3b5dc39;p=sbcl.git diff --git a/src/compiler/target-dump.lisp b/src/compiler/target-dump.lisp index 913822e..dda58b4 100644 --- a/src/compiler/target-dump.lisp +++ b/src/compiler/target-dump.lisp @@ -11,122 +11,76 @@ ;;;; provided with absolutely no warranty. See the COPYING and CREDITS ;;;; files for more information. -(in-package "SB!C") +(in-package "SB!FASL") -(file-comment - "$Header$") +;;; a helper function shared by DUMP-SIMPLE-CHARACTER-STRING and +;;; DUMP-SYMBOL (in the target compiler: the cross-compiler uses the +;;; portability knowledge and always dumps BASE-STRINGS). +#!+sb-unicode +(defun dump-characters-of-string (s fasl-output) + (declare (type string s) (type fasl-output fasl-output)) + (dovector (c s) + (dump-unsigned-byte-32 (char-code c) fasl-output)) + (values)) +#!+sb-unicode +(defun dump-simple-character-string (s file) + (declare (type (simple-array character (*)) s)) + (dump-fop* (length s) fop-small-character-string fop-character-string file) + (dump-characters-of-string s file) + (values)) ;;; Dump the first N bytes of VEC out to FILE. VEC is some sort of unboxed ;;; vector-like thing that we can BLT from. -(defun dump-raw-bytes (vec n fasl-file) - (declare (type index n) (type fasl-file fasl-file)) - (sb!sys:output-raw-bytes (fasl-file-stream fasl-file) vec 0 n) +(defun dump-raw-bytes (vec n fasl-output) + (declare (type index n) (type fasl-output fasl-output)) + ;; FIXME: Why not WRITE-SEQUENCE? + (sb!impl::buffer-output (fasl-output-stream fasl-output) vec 0 n) (values)) ;;; Dump a multi-dimensional array. Note: any displacements are folded out. ;;; ;;; This isn't needed at cross-compilation time because SBCL doesn't -;;; use multi-dimensional arrays internally. It's hard to implement -;;; at cross-compilation time because it uses WITH-ARRAY-DATA. If it ever -;;; becomes necessary to implement it at cross-compilation time, it might -;;; possible to use ROW-MAJOR-AREF stuff to do it portably. +;;; use multi-dimensional arrays internally. And it's hard to +;;; implement at cross-compilation time because it uses +;;; WITH-ARRAY-DATA. If it ever becomes necessary to implement it at +;;; cross-compilation time, it might possible to use ROW-MAJOR-AREF +;;; stuff to do it portably. (defun dump-multi-dim-array (array file) (let ((rank (array-rank array))) (dotimes (i rank) (dump-integer (array-dimension array i) file)) - (sb!impl::with-array-data ((vector array) (start) (end)) + (with-array-data ((vector array) (start) (end)) (if (and (= start 0) (= end (length vector))) - (sub-dump-object vector file) - (sub-dump-object (subseq vector start end) file))) - (dump-fop 'sb!impl::fop-array file) - (dump-unsigned-32 rank file) + (sub-dump-object vector file) + (sub-dump-object (subseq vector start end) file))) + (dump-fop 'fop-array file) + (dump-word rank file) (eq-save-object array file))) -(defun dump-single-float-vector (vec file) - (let ((length (length vec))) - (dump-fop 'sb!impl::fop-single-float-vector file) - (dump-unsigned-32 length file) - (dump-raw-bytes vec (* length sb!vm:word-bytes) file))) - -(defun dump-double-float-vector (vec file) - (let ((length (length vec))) - (dump-fop 'sb!impl::fop-double-float-vector file) - (dump-unsigned-32 length file) - (dump-raw-bytes vec (* length sb!vm:word-bytes 2) file))) - -#!+long-float -(defun dump-long-float-vector (vec file) - (let ((length (length vec))) - (dump-fop 'sb!impl::fop-long-float-vector file) - (dump-unsigned-32 length file) - (dump-raw-bytes vec (* length sb!vm:word-bytes #!+x86 3 #!+sparc 4) file))) - -(defun dump-complex-single-float-vector (vec file) - (let ((length (length vec))) - (dump-fop 'sb!impl::fop-complex-single-float-vector file) - (dump-unsigned-32 length file) - (dump-raw-bytes vec (* length sb!vm:word-bytes 2) file))) - -(defun dump-complex-double-float-vector (vec file) - (let ((length (length vec))) - (dump-fop 'sb!impl::fop-complex-double-float-vector file) - (dump-unsigned-32 length file) - (dump-raw-bytes vec (* length sb!vm:word-bytes 2 2) file))) - -#!+long-float -(defun dump-complex-long-float-vector (vec file) - (let ((length (length vec))) - (dump-fop 'sb!impl::fop-complex-long-float-vector file) - (dump-unsigned-32 length file) - (dump-raw-bytes vec (* length sb!vm:word-bytes #!+x86 3 #!+sparc 4 2) file))) - #!+(and long-float x86) (defun dump-long-float (float file) (declare (long-float float)) (let ((exp-bits (long-float-exp-bits float)) - (high-bits (long-float-high-bits float)) - (low-bits (long-float-low-bits float))) - (dump-unsigned-32 low-bits file) - (dump-unsigned-32 high-bits file) + (high-bits (long-float-high-bits float)) + (low-bits (long-float-low-bits float))) + ;; We could get away with DUMP-WORD here, since the x86 has 4-byte words, + ;; but we prefer to make things as explicit as possible. + ;; --njf, 2004-08-16 + (dump-integer-as-n-bytes low-bits 4 file) + (dump-integer-as-n-bytes high-bits 4 file) (dump-integer-as-n-bytes exp-bits 2 file))) #!+(and long-float sparc) (defun dump-long-float (float file) (declare (long-float float)) (let ((exp-bits (long-float-exp-bits float)) - (high-bits (long-float-high-bits float)) - (mid-bits (long-float-mid-bits float)) - (low-bits (long-float-low-bits float))) - (dump-unsigned-32 low-bits file) - (dump-unsigned-32 mid-bits file) - (dump-unsigned-32 high-bits file) + (high-bits (long-float-high-bits float)) + (mid-bits (long-float-mid-bits float)) + (low-bits (long-float-low-bits float))) + ;; We could get away with DUMP-WORD here, since the sparc has 4-byte + ;; words, but we prefer to make things as explicit as possible. + ;; --njf, 2004-08-16 + (dump-integer-as-n-bytes low-bits 4 file) + (dump-integer-as-n-bytes mid-bits 4 file) + (dump-integer-as-n-bytes high-bits 4 file) (dump-integer-as-n-bytes exp-bits 4 file))) - -;;; Or a complex... - -(defun dump-complex (x file) - (typecase x - ((complex single-float) - (dump-fop 'sb!impl::fop-complex-single-float file) - (dump-integer-as-n-bytes (single-float-bits (realpart x)) 4 file) - (dump-integer-as-n-bytes (single-float-bits (imagpart x)) 4 file)) - ((complex double-float) - (dump-fop 'sb!impl::fop-complex-double-float file) - (let ((re (realpart x))) - (declare (double-float re)) - (dump-unsigned-32 (double-float-low-bits re) file) - (dump-integer-as-n-bytes (double-float-high-bits re) 4 file)) - (let ((im (imagpart x))) - (declare (double-float im)) - (dump-unsigned-32 (double-float-low-bits im) file) - (dump-integer-as-n-bytes (double-float-high-bits im) 4 file))) - #!+long-float - ((complex long-float) - (dump-fop 'sb!impl::fop-complex-long-float file) - (dump-long-float (realpart x) file) - (dump-long-float (imagpart x) file)) - (t - (sub-dump-object (realpart x) file) - (sub-dump-object (imagpart x) file) - (dump-fop 'sb!impl::fop-complex file)))) -