even more 0.4.0 hacks
This commit is contained in:
		
							parent
							
								
									965a0da2f1
								
							
						
					
					
						commit
						12874c0edd
					
				|  | @ -20,7 +20,7 @@ LDFLAGS_AIX= @LDFLAGS_AIX@ | ||||||
| 
 | 
 | ||||||
| RM	= rm -f | RM	= rm -f | ||||||
| 
 | 
 | ||||||
| AR	= ar cq | AR	= @AR@ | ||||||
| RANLIB	= ranlib | RANLIB	= ranlib | ||||||
| 
 | 
 | ||||||
| SHELL	= /bin/sh | SHELL	= /bin/sh | ||||||
|  |  | ||||||
|  | @ -779,6 +779,9 @@ else | ||||||
|   ENDIAN=big |   ENDIAN=big | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | AR=${AR-"ar cq"} | ||||||
|  | TMPDIR=${TMPDIR-"/usr/tmp"} | ||||||
|  | 
 | ||||||
| case "$host" in | case "$host" in | ||||||
| 
 | 
 | ||||||
|   ## CX/UX |   ## CX/UX | ||||||
|  | @ -936,7 +939,7 @@ else | ||||||
|   ac_save_LIBS="$LIBS" |   ac_save_LIBS="$LIBS" | ||||||
| LIBS="-lm  $LIBS" | LIBS="-lm  $LIBS" | ||||||
| cat > conftest.$ac_ext <<EOF | cat > conftest.$ac_ext <<EOF | ||||||
| #line 940 "configure" | #line 943 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| 
 | 
 | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -975,7 +978,7 @@ else | ||||||
|   ac_save_LIBS="$LIBS" |   ac_save_LIBS="$LIBS" | ||||||
| LIBS="-lgen  $LIBS" | LIBS="-lgen  $LIBS" | ||||||
| cat > conftest.$ac_ext <<EOF | cat > conftest.$ac_ext <<EOF | ||||||
| #line 979 "configure" | #line 982 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| 
 | 
 | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1014,7 +1017,7 @@ else | ||||||
|   ac_save_LIBS="$LIBS" |   ac_save_LIBS="$LIBS" | ||||||
| LIBS="-lnsl  $LIBS" | LIBS="-lnsl  $LIBS" | ||||||
| cat > conftest.$ac_ext <<EOF | cat > conftest.$ac_ext <<EOF | ||||||
| #line 1018 "configure" | #line 1021 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| 
 | 
 | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1053,7 +1056,7 @@ else | ||||||
|   ac_save_LIBS="$LIBS" |   ac_save_LIBS="$LIBS" | ||||||
| LIBS="-lsocket  $LIBS" | LIBS="-lsocket  $LIBS" | ||||||
| cat > conftest.$ac_ext <<EOF | cat > conftest.$ac_ext <<EOF | ||||||
| #line 1057 "configure" | #line 1060 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| 
 | 
 | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1092,7 +1095,7 @@ else | ||||||
|   ac_save_LIBS="$LIBS" |   ac_save_LIBS="$LIBS" | ||||||
| LIBS="-lelf  $LIBS" | LIBS="-lelf  $LIBS" | ||||||
| cat > conftest.$ac_ext <<EOF | cat > conftest.$ac_ext <<EOF | ||||||
| #line 1096 "configure" | #line 1099 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| 
 | 
 | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1131,7 +1134,7 @@ else | ||||||
|   ac_save_LIBS="$LIBS" |   ac_save_LIBS="$LIBS" | ||||||
| LIBS="-lld  $LIBS" | LIBS="-lld  $LIBS" | ||||||
| cat > conftest.$ac_ext <<EOF | cat > conftest.$ac_ext <<EOF | ||||||
| #line 1135 "configure" | #line 1138 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| 
 | 
 | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1170,7 +1173,7 @@ else | ||||||
|   ac_save_LIBS="$LIBS" |   ac_save_LIBS="$LIBS" | ||||||
| LIBS="-ldl  $LIBS" | LIBS="-ldl  $LIBS" | ||||||
| cat > conftest.$ac_ext <<EOF | cat > conftest.$ac_ext <<EOF | ||||||
| #line 1174 "configure" | #line 1177 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| 
 | 
 | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1208,7 +1211,7 @@ if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then | ||||||
|   echo $ac_n "(cached) $ac_c" 1>&6 |   echo $ac_n "(cached) $ac_c" 1>&6 | ||||||
| else | else | ||||||
|   cat > conftest.$ac_ext <<EOF |   cat > conftest.$ac_ext <<EOF | ||||||
| #line 1212 "configure" | #line 1215 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <signal.h> | #include <signal.h> | ||||||
|  | @ -1255,7 +1258,7 @@ else | ||||||
|   # On the NeXT, cc -E runs the code through the compiler's parser, |   # On the NeXT, cc -E runs the code through the compiler's parser, | ||||||
|   # not just through cpp. |   # not just through cpp. | ||||||
|   cat > conftest.$ac_ext <<EOF |   cat > conftest.$ac_ext <<EOF | ||||||
| #line 1259 "configure" | #line 1262 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| Syntax Error | Syntax Error | ||||||
|  | @ -1269,7 +1272,7 @@ else | ||||||
|   rm -rf conftest* |   rm -rf conftest* | ||||||
|   CPP="${CC-cc} -E -traditional-cpp" |   CPP="${CC-cc} -E -traditional-cpp" | ||||||
|   cat > conftest.$ac_ext <<EOF |   cat > conftest.$ac_ext <<EOF | ||||||
| #line 1273 "configure" | #line 1276 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| Syntax Error | Syntax Error | ||||||
|  | @ -1302,7 +1305,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then | ||||||
|   echo $ac_n "(cached) $ac_c" 1>&6 |   echo $ac_n "(cached) $ac_c" 1>&6 | ||||||
| else | else | ||||||
|   cat > conftest.$ac_ext <<EOF |   cat > conftest.$ac_ext <<EOF | ||||||
| #line 1306 "configure" | #line 1309 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <$ac_hdr> | #include <$ac_hdr> | ||||||
| EOF | EOF | ||||||
|  | @ -1337,7 +1340,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then | ||||||
|   echo $ac_n "(cached) $ac_c" 1>&6 |   echo $ac_n "(cached) $ac_c" 1>&6 | ||||||
| else | else | ||||||
|   cat > conftest.$ac_ext <<EOF |   cat > conftest.$ac_ext <<EOF | ||||||
| #line 1341 "configure" | #line 1344 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| /* System header to define __stub macros and hopefully few prototypes, | /* System header to define __stub macros and hopefully few prototypes, | ||||||
|     which can conflict with char $ac_func(); below.  */ |     which can conflict with char $ac_func(); below.  */ | ||||||
|  | @ -1388,7 +1391,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then | ||||||
|   echo $ac_n "(cached) $ac_c" 1>&6 |   echo $ac_n "(cached) $ac_c" 1>&6 | ||||||
| else | else | ||||||
|   cat > conftest.$ac_ext <<EOF |   cat > conftest.$ac_ext <<EOF | ||||||
| #line 1392 "configure" | #line 1395 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| /* System header to define __stub macros and hopefully few prototypes, | /* System header to define __stub macros and hopefully few prototypes, | ||||||
|     which can conflict with char $ac_func(); below.  */ |     which can conflict with char $ac_func(); below.  */ | ||||||
|  | @ -1510,7 +1513,7 @@ EOF | ||||||
| else | else | ||||||
|    |    | ||||||
|     cat > conftest.$ac_ext <<EOF |     cat > conftest.$ac_ext <<EOF | ||||||
| #line 1514 "configure" | #line 1517 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <nlist.h> | #include <nlist.h> | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1545,7 +1548,7 @@ EOF | ||||||
| else | else | ||||||
|    |    | ||||||
|     cat > conftest.$ac_ext <<EOF |     cat > conftest.$ac_ext <<EOF | ||||||
| #line 1549 "configure" | #line 1552 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1580,7 +1583,7 @@ EOF | ||||||
| else | else | ||||||
|    |    | ||||||
|     cat > conftest.$ac_ext <<EOF |     cat > conftest.$ac_ext <<EOF | ||||||
| #line 1584 "configure" | #line 1587 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <time.h> | #include <time.h> | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1614,7 +1617,7 @@ EOF | ||||||
| else | else | ||||||
|    |    | ||||||
|     cat > conftest.$ac_ext <<EOF |     cat > conftest.$ac_ext <<EOF | ||||||
| #line 1618 "configure" | #line 1621 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <time.h> | #include <time.h> | ||||||
| int main() { return 0; } | int main() { return 0; } | ||||||
|  | @ -1649,7 +1652,7 @@ EOF | ||||||
| else | else | ||||||
|    |    | ||||||
|     cat > conftest.$ac_ext <<EOF |     cat > conftest.$ac_ext <<EOF | ||||||
| #line 1653 "configure" | #line 1656 "configure" | ||||||
| #include "confdefs.h" | #include "confdefs.h" | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
|                     #include <unistd.h> |                     #include <unistd.h> | ||||||
|  | @ -1687,6 +1690,9 @@ CFLAGS1=${CFLAGS} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| trap '' 1 2 15 | trap '' 1 2 15 | ||||||
| cat > confcache <<\EOF | cat > confcache <<\EOF | ||||||
| # This file is a shell script that caches the results of configure | # This file is a shell script that caches the results of configure | ||||||
|  | @ -1774,7 +1780,7 @@ done | ||||||
| ac_given_srcdir=$srcdir | ac_given_srcdir=$srcdir | ||||||
| ac_given_INSTALL="$INSTALL" | ac_given_INSTALL="$INSTALL" | ||||||
| 
 | 
 | ||||||
| trap 'rm -fr `echo "Makefile scsh/regexp/Makefile scsh/network.scm sysdep.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 | trap 'rm -fr `echo "Makefile scsh/regexp/Makefile scsh/endian.scm scsh/static.scm sysdep.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 | ||||||
| 
 | 
 | ||||||
| # Protect against being on the right side of a sed subst in config.status.  | # Protect against being on the right side of a sed subst in config.status.  | ||||||
| sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g;  | sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g;  | ||||||
|  | @ -1800,15 +1806,17 @@ s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g | ||||||
| s%@INSTALL_DATA@%$INSTALL_DATA%g | s%@INSTALL_DATA@%$INSTALL_DATA%g | ||||||
| s%@CPP@%$CPP%g | s%@CPP@%$CPP%g | ||||||
| s%@AIX_P@%$AIX_P%g | s%@AIX_P@%$AIX_P%g | ||||||
|  | s%@AR@%$AR%g | ||||||
| s%@CFLAGS1@%$CFLAGS1%g | s%@CFLAGS1@%$CFLAGS1%g | ||||||
| s%@ENDIAN@%$ENDIAN%g | s%@ENDIAN@%$ENDIAN%g | ||||||
| s%@LDFLAGS_AIX@%$LDFLAGS_AIX%g | s%@LDFLAGS_AIX@%$LDFLAGS_AIX%g | ||||||
|  | s%@TMPDIR@%$TMPDIR%g | ||||||
| 
 | 
 | ||||||
| CEOF | CEOF | ||||||
| EOF | EOF | ||||||
| cat >> $CONFIG_STATUS <<EOF | cat >> $CONFIG_STATUS <<EOF | ||||||
| 
 | 
 | ||||||
| CONFIG_FILES=\${CONFIG_FILES-"Makefile scsh/regexp/Makefile scsh/network.scm"} | CONFIG_FILES=\${CONFIG_FILES-"Makefile scsh/regexp/Makefile scsh/endian.scm scsh/static.scm"} | ||||||
| EOF | EOF | ||||||
| cat >> $CONFIG_STATUS <<\EOF | cat >> $CONFIG_STATUS <<\EOF | ||||||
| for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then | for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then | ||||||
|  | @ -1968,3 +1976,4 @@ chmod +x $CONFIG_STATUS | ||||||
| rm -fr confdefs* $ac_clean_files | rm -fr confdefs* $ac_clean_files | ||||||
| test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 | test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 | ||||||
| 
 | 
 | ||||||
|  | chmod +x scsh/static.scm | ||||||
|  |  | ||||||
|  | @ -199,6 +199,9 @@ else | ||||||
|   ENDIAN=big |   ENDIAN=big | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | AR=${AR-"ar cq"} | ||||||
|  | TMPDIR=${TMPDIR-"/usr/tmp"} | ||||||
|  | 
 | ||||||
| case "$host" in | case "$host" in | ||||||
| 
 | 
 | ||||||
|   ## CX/UX |   ## CX/UX | ||||||
|  | @ -319,10 +322,14 @@ SCSH_CONST_SYS_ERRLIST | ||||||
| CFLAGS1=${CFLAGS} | CFLAGS1=${CFLAGS} | ||||||
| 
 | 
 | ||||||
| AC_SUBST(AIX_P) | AC_SUBST(AIX_P) | ||||||
|  | AC_SUBST(AR) | ||||||
|  | AC_SUBST(CC) | ||||||
| AC_SUBST(CFLAGS) | AC_SUBST(CFLAGS) | ||||||
| AC_SUBST(CFLAGS1) | AC_SUBST(CFLAGS1) | ||||||
| AC_SUBST(ENDIAN) | AC_SUBST(ENDIAN) | ||||||
| AC_SUBST(LDFLAGS) | AC_SUBST(LDFLAGS) | ||||||
| AC_SUBST(LDFLAGS_AIX) | AC_SUBST(LDFLAGS_AIX) | ||||||
|  | AC_SUBST(TMPDIR) | ||||||
| 
 | 
 | ||||||
| AC_OUTPUT(Makefile scsh/regexp/Makefile scsh/endian.scm) | AC_OUTPUT(Makefile scsh/regexp/Makefile scsh/endian.scm scsh/static.scm) | ||||||
|  | chmod +x scsh/static.scm | ||||||
|  |  | ||||||
|  | @ -381,6 +381,24 @@ scheme_value df_scheme_proto_name2proto_info(long nargs, scheme_value *args) | ||||||
|     return ret1; |     return ret1; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | scheme_value df_veclen(long nargs, scheme_value *args) | ||||||
|  | { | ||||||
|  |     extern scheme_value veclen(const long * ); | ||||||
|  |     scheme_value ret1; | ||||||
|  |     scheme_value r1; | ||||||
|  | 
 | ||||||
|  |     cig_check_nargs(1, nargs, "veclen"); | ||||||
|  |     r1 = veclen((const long * )AlienVal(args[0])); | ||||||
|  |     ret1 = r1; | ||||||
|  |     return ret1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | scheme_value df_set_longvec_carriers(long nargs, scheme_value *args) | ||||||
|  | { | ||||||
|  |     extern void set_longvec_carriers(scheme_value , long const * const * ); | ||||||
|  | 
 | ||||||
|  |     cig_check_nargs(2, nargs, "set_longvec_carriers"); | ||||||
|  |     set_longvec_carriers(args[1], (long const * const * )AlienVal(args[0])); | ||||||
|  |     return SCHFALSE; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| Error: end of file inside list -- unbalanced parentheses |  | ||||||
|        #{Input-port} |  | ||||||
|  |  | ||||||
|  | @ -25,6 +25,21 @@ | ||||||
| 	defrec-package | 	defrec-package | ||||||
| 	scsh) | 	scsh) | ||||||
|   (begin |   (begin | ||||||
|  | 
 | ||||||
|  |     (define (scsh-static-linker argl) | ||||||
|  |       (if (not (= (length argl) 3)) | ||||||
|  | 	  (error "usage: ~a input-image-file output-archive-file" (car argl)) | ||||||
|  | 	  (let ((tempdir (or (getenv "TMPDIR") | ||||||
|  | 			     "/usr/tmp")) | ||||||
|  | 		(cc-command (or (getenv "CC") | ||||||
|  | 				"gcc -g -O")) | ||||||
|  | 		(ar-command (or (getenv "AR") | ||||||
|  | 				"ar cq")) | ||||||
|  | 		(infile (cadr argl)) | ||||||
|  | 		(outfile (caddr argl))) | ||||||
|  | 	    (scsh-do-it infile tempdir outfile cc-command ar-command) | ||||||
|  | 	    (exit 0)))) | ||||||
|  | 
 | ||||||
|     ;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- |     ;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||||||
|     (define-record heap |     (define-record heap | ||||||
|       (length    0) |       (length    0) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,675 @@ | ||||||
|  | #!/usr/local/bin/scsh \ | ||||||
|  | -lm /usr/local/lib/scsh/vm/ps-interface.scm -lm /usr/local/lib/scsh/vm/interfaces.scm -lm /usr/local/lib/scsh/vm/package-defs.scm -lm /usr/local/lib/scsh/vm/s48-package-defs.scm -m heap -l /usr/local/lib/scsh/scsh/static-heap.scm -dm -m scsh-static-heap -e scsh-static-linker -s  | ||||||
|  | !# | ||||||
|  | ;;; Package for Static heaps for the Scheme Shell | ||||||
|  | ;;; Copyright (c) 1995 by Brian D. Carlstrom. | ||||||
|  | 
 | ||||||
|  | ;;; based on Scheme48 implementation. | ||||||
|  | ;;; Copyright (c) 1993, 1994 by Richard Kelsey and Jonathan Rees. | ||||||
|  | 
 | ||||||
|  | (define-structure heap-extra (export newspace-begin | ||||||
|  | 			      heap-pointer | ||||||
|  | 			      header-a-units | ||||||
|  | 			      d-vector?  | ||||||
|  | 			      stob-type) | ||||||
|  |   (open scheme heap)) | ||||||
|  | 
 | ||||||
|  | (define-structure scsh-static-heap (export scsh-static-linker) | ||||||
|  |   (open scheme heap memory data stob struct | ||||||
|  | 	heap-extra | ||||||
|  | 	vm-architecture | ||||||
|  | 	formats | ||||||
|  | 	enumerated | ||||||
|  | 	signals | ||||||
|  | 	tables | ||||||
|  | 	defrec-package | ||||||
|  | 	scsh) | ||||||
|  |   (begin | ||||||
|  | 
 | ||||||
|  |     (define (scsh-static-linker argl) | ||||||
|  |       (if (not (= (length argl) 3)) | ||||||
|  | 	  (error "usage: ~a input-image-file output-archive-file" (car argl)) | ||||||
|  | 	  (let ((tempdir (or (getenv "TMPDIR") | ||||||
|  | 			     "@TMPDIR@")) | ||||||
|  | 		(cc-command (or (getenv "CC") | ||||||
|  | 				"@CC@ @CFLAGS@")) | ||||||
|  | 		(ar-command (or (getenv "AR") | ||||||
|  | 				"@AR@")) | ||||||
|  | 		(infile (cadr argl)) | ||||||
|  | 		(outfile (caddr argl))) | ||||||
|  | 	    (scsh-do-it infile tempdir outfile cc-command ar-command) | ||||||
|  | 	    (exit 0)))) | ||||||
|  | 
 | ||||||
|  |     ;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||||||
|  |     (define-record heap | ||||||
|  |       (length    0) | ||||||
|  |       (objects '()) | ||||||
|  |       ) | ||||||
|  |     ;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||||||
|  |     (define (scsh-do-it infile tempdir outfile cc-command ar-command) | ||||||
|  |       (let* ((temp-dir (format #f "~a/scsh~s" tempdir (pid))) | ||||||
|  | 	     (prefix (string-append temp-dir "/static")) | ||||||
|  | 	     (start (read-heap-image infile))) | ||||||
|  | 	(receive (pure impure reloc externs) | ||||||
|  | 	    (create-heaps-and-tables) | ||||||
|  | 	  (if (file-exists? temp-dir) | ||||||
|  | 	      (if (file-directory? temp-dir) | ||||||
|  | 		  (with-cwd temp-dir | ||||||
|  | 			    (map delete-file (directory-files temp-dir #t))) | ||||||
|  | 		  (delete-file temp-dir))) | ||||||
|  | 	  (create-directory temp-dir #o755 #t) | ||||||
|  | 	  (with-cwd temp-dir | ||||||
|  | 		    (write-c-header-file pure impure externs infile outfile prefix) | ||||||
|  | 		    (write-c-image pure impure reloc externs prefix) | ||||||
|  | 		    (write-main-c-file start reloc prefix) | ||||||
|  | 		    (compile-c-files cc-command prefix)) | ||||||
|  | 	  (archive-files ar-command outfile prefix) | ||||||
|  | 	  ))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     (define debug #f) | ||||||
|  | 
 | ||||||
|  |     (define (vm-string->string x) | ||||||
|  |       (cond ((vm-string? x) | ||||||
|  | 	     (let ((len (vm-string-length x))) | ||||||
|  | 	       (let loop ((i 0)  | ||||||
|  | 			  (l '())) | ||||||
|  | 		 (cond ((= i len)  | ||||||
|  | 			(list->string (reverse l))) | ||||||
|  | 		       (else | ||||||
|  | 			(loop (+ i 1) (cons (vm-string-ref x i) l))))))) | ||||||
|  | 	    (else | ||||||
|  | 	     (message x " is not a vm-string")))) | ||||||
|  | 
 | ||||||
|  |     (define (read-heap-image infile) | ||||||
|  |       (let ((bytes (file-info:size (file-info infile)))) | ||||||
|  | 	(init (inexact->exact (floor (* 1.1 bytes))) infile))) | ||||||
|  | 					; XXX need little extra space for find-all-xs | ||||||
|  | 
 | ||||||
|  |     (define (create-heaps-and-tables) | ||||||
|  |       (let* ((n       (nchunks)) | ||||||
|  | 	     (  pure  (make-vector n)) | ||||||
|  | 	     (impure  (make-vector n)) | ||||||
|  | 	     (reloc   (make-vector n)) | ||||||
|  | 	     (externs (make-table   ))) | ||||||
|  | 	;; initialize to blanks | ||||||
|  | 	(let loop ((i 0)) | ||||||
|  | 	  (cond ((not (= i n)) | ||||||
|  | 		 (vector-set!   pure i (make-heap )) | ||||||
|  | 		 (vector-set! impure i (make-heap )) | ||||||
|  | 		 (vector-set!  reloc i (make-table)) | ||||||
|  | 		 (loop (+ i 1))))) | ||||||
|  | 	(scsh-for-each-stored-object | ||||||
|  | 	 (lambda (chunk) | ||||||
|  | 	   (format #t "Reading chunk number ~s" chunk)) | ||||||
|  | 	 (lambda (chunk x len) | ||||||
|  | 	   (if debug | ||||||
|  | 	       (write x)) | ||||||
|  | 	   (let* ((mutable (mutable? x)) | ||||||
|  | 		  (heap (vector-ref (if mutable impure pure) chunk))) | ||||||
|  | 	     (table-set! (vector-ref reloc chunk) x (heap:length heap)) | ||||||
|  | 	     (set-heap:objects heap (cons x (heap:objects heap))) | ||||||
|  | 	     (set-heap:length  heap (+ len  (heap:length  heap))) | ||||||
|  | 	     (cond (debug | ||||||
|  | 		    (display (if mutable "   mutable " " immutable ")) | ||||||
|  | 		    (cond ((d-vector? x)  (display " d-vector")) | ||||||
|  | 			  ((vm-string? x) (display "vm-string")) | ||||||
|  | 			  (else           (display " b-vector"))) | ||||||
|  | 		    (let ((m (heap:length (vector-ref impure chunk))) | ||||||
|  | 			  (i (heap:length (vector-ref   pure chunk)))) | ||||||
|  | 		      (message " m" m "+i" i "=" (+ m i)))))) | ||||||
|  | 	   (if (= (header-type (stob-header x)) (enum stob external)) | ||||||
|  | 	       (table-set! externs  | ||||||
|  | 			   (external-value x)  | ||||||
|  | 			   (vm-string->string (external-name x)))) | ||||||
|  | 	   ) | ||||||
|  | 	 (lambda (chunk)  | ||||||
|  | 	   (newline))) | ||||||
|  | 	(let loop ((i 0)) | ||||||
|  | 	  (cond ((not (= i n)) | ||||||
|  | 		 (let ((p (vector-ref   pure i)) | ||||||
|  | 		       (i (vector-ref impure i))) | ||||||
|  | 		   (set-heap:objects p (reverse (heap:objects p))) | ||||||
|  | 		   (set-heap:objects i (reverse (heap:objects i)))) | ||||||
|  | 		 (loop (+ i 1))))) | ||||||
|  | 	(values pure impure reloc externs))) | ||||||
|  | 
 | ||||||
|  |     (define (write-c-header-file pure impure externs infile outfile prefix) | ||||||
|  |       (message "Writing header file") | ||||||
|  |       (call-with-output-file (string-append prefix ".h") | ||||||
|  | 	(lambda (port) | ||||||
|  | 	  (format port "/* Static Heap File Automatically Generated~%") | ||||||
|  | 	  (format port " * by   scsh/static.scm~%") | ||||||
|  | 	  (format port " * from ~a~%" infile) | ||||||
|  | 	  (format port " * to   ~a~%" outfile) | ||||||
|  | 	  (format port " */~%") | ||||||
|  | 	  (let ((n (nchunks))) | ||||||
|  | 	    (do ((i 0 (+ i 1))) | ||||||
|  | 		((= i n)) | ||||||
|  | 	      (format port "extern const long p~s[~s];~%" i  | ||||||
|  | 		      (quotient (heap:length (vector-ref   pure i)) 4))) | ||||||
|  | 	    (do ((i 0 (+ i 1))) | ||||||
|  | 		((= i n)) | ||||||
|  | 	      (format port "extern long i~s[~s];~%" i | ||||||
|  | 		      (quotient (heap:length (vector-ref impure i)) 4)))) | ||||||
|  | 	  (table-walk | ||||||
|  | 	   (lambda (address name) | ||||||
|  | 	     (format port "const extern ~a();~%" name)) | ||||||
|  | 	   externs) | ||||||
|  | 	  ))) | ||||||
|  | 
 | ||||||
|  |     (define (d-vector-for-each proc d-vector) | ||||||
|  |       (do ((i 0 (+ i 1))) | ||||||
|  | 	  ((>= i (d-vector-length d-vector))) | ||||||
|  | 	(proc (d-vector-ref d-vector i)))) | ||||||
|  | 
 | ||||||
|  |     (define (write-c-image pure impure reloc externs prefix) | ||||||
|  |       (message "Writing   pure c files") | ||||||
|  |       (scsh-write-c-image   pure "p" "const " reloc externs prefix) | ||||||
|  |       (message "Writing impure c files") | ||||||
|  |       (scsh-write-c-image impure "i" ""       reloc externs prefix)) | ||||||
|  | 
 | ||||||
|  |     (define (scsh-write-c-image heap name const reloc externs prefix) | ||||||
|  |       (let ((n (nchunks))) | ||||||
|  | 	(let chunk-loop ((c 0)) | ||||||
|  | 	  (cond ((not (= c n)) | ||||||
|  | 		 (format #t "Writing ~a-~a~s.c~%" prefix name c) | ||||||
|  | 		 (call-with-output-file  | ||||||
|  | 		     (format #f "~a-~a~s.c" prefix name c) | ||||||
|  | 		   (lambda (port)	      | ||||||
|  | 		     (format port "#include \"~a.h\"~%" prefix) | ||||||
|  | 		     (format port "~a long ~a~s[]={~%" const name c) | ||||||
|  | 		     (let ((heap (vector-ref heap c))) | ||||||
|  | 		       (let heap-loop ((l (heap:objects heap))) | ||||||
|  | 			 (cond ((not (null? l)) | ||||||
|  | 				(scsh-emit-initializer (car l) reloc externs port) | ||||||
|  | 				(heap-loop (cdr l)))))) | ||||||
|  | 		     (display "};" port) | ||||||
|  | 		     (newline port))) | ||||||
|  | 		 (chunk-loop (+ 1 c))))))) | ||||||
|  | 
 | ||||||
|  |     (define (write-main-c-file start reloc prefix) | ||||||
|  |       (let ((n (nchunks))) | ||||||
|  | 	(call-with-output-file (string-append prefix ".c") | ||||||
|  | 	  (lambda (port) | ||||||
|  | 	    (format port "#include \"~a.h\"~%" prefix) | ||||||
|  | 	    (format port "const long p_count = ~s;~%" n) | ||||||
|  | 	    (format port "const long i_count = ~s;~%" n) | ||||||
|  | 	     | ||||||
|  | 	    (format port "const long * const p_areas[~s] = {" n) | ||||||
|  | 	    (do ((i 0 (+ i 1))) | ||||||
|  | 		((= i n)) | ||||||
|  | 	      (format port "(const long *) &p~s, " i)) | ||||||
|  | 	    (format port "};~%") | ||||||
|  | 
 | ||||||
|  | 	    (format port "long * const i_areas[~s] = {" n) | ||||||
|  | 	    (do ((i 0 (+ i 1))) | ||||||
|  | 		((= i n)) | ||||||
|  | 	      (format port "(long *) &i~s, " i)) | ||||||
|  | 	    (format port "};~%") | ||||||
|  | 
 | ||||||
|  | 	    (format port "const long p_sizes[~s] = {" n) | ||||||
|  | 	    (do ((i 0 (+ i 1))) | ||||||
|  | 		((= i n)) | ||||||
|  | 	      (format port "sizeof(p~s), " i)) | ||||||
|  | 	    (format port "};~%") | ||||||
|  | 
 | ||||||
|  | 	    (format port "const long i_sizes[~s] = {" n) | ||||||
|  | 	    (do ((i 0 (+ i 1))) | ||||||
|  | 		((= i n)) | ||||||
|  | 	      (format port "sizeof(i~s), " i)) | ||||||
|  | 	    (format port "};~%") | ||||||
|  | 
 | ||||||
|  | 	    (display "const long entry = " port) | ||||||
|  | 	    (scsh-emit-descriptor start reloc port) | ||||||
|  | 	    (write-char #\; port) | ||||||
|  | 	    (newline port))))) | ||||||
|  | 
 | ||||||
|  |     (define (compile-c-files cc-command prefix) | ||||||
|  |       (let ((n (nchunks)) | ||||||
|  | 	    (cc (line->list cc-command))) | ||||||
|  | 	(message "Compiling main C file") | ||||||
|  | 	(run (,@(append cc (list (format #f "~a.c" prefix))))) | ||||||
|  | 	(do ((i 0 (+ i 1))) | ||||||
|  | 	    ((= i n)) | ||||||
|  | 	  (message "Compiling C file for   pure chunk " i) | ||||||
|  | 	  (run (,@(append cc  | ||||||
|  | 			  (list (format #f "~a-p~s.c" prefix i))))) | ||||||
|  | 	  (message "Compiling C file for impure chunk " i) | ||||||
|  | 	  (run (,@(append cc  | ||||||
|  | 			  (list (format #f "~a-i~s.c" prefix i)))))))) | ||||||
|  | 
 | ||||||
|  |     (define (archive-files ar-command outfile prefix) | ||||||
|  |       (let ((n (nchunks)) | ||||||
|  | 	    (ar (line->list ar-command))) | ||||||
|  | 	(message "Archiving object files") | ||||||
|  | 	(run (,@(append  | ||||||
|  | 		 ar | ||||||
|  | 		 (cons  | ||||||
|  | 		  outfile | ||||||
|  | 		  (let loop ((i 0) | ||||||
|  | 			     (l '())) | ||||||
|  | 		    (cond ((not (= i n)) | ||||||
|  | 			   (loop (+ i 1) | ||||||
|  | 				 (cons  | ||||||
|  | 				  (format #f "~a-i~s.o" prefix i) | ||||||
|  | 				  (cons | ||||||
|  | 				   (format #f "~a-p~s.o" prefix i) | ||||||
|  | 				   l)))) | ||||||
|  | 			  (else  | ||||||
|  | 			   (reverse 		 | ||||||
|  | 			    (cons  | ||||||
|  | 			     (string-append prefix ".o") | ||||||
|  | 			     l))))))))))) | ||||||
|  | 
 | ||||||
|  |     (define (scsh-emit-initializer x reloc externs port) | ||||||
|  |       (write-hex port (stob-header x)) | ||||||
|  |       (cond ((d-vector? x) | ||||||
|  | 	     (scsh-emit-d-vector-initializer x reloc port)) | ||||||
|  | 	    ((vm-string? x) | ||||||
|  | 	     (scsh-emit-vm-string-initializer x port)) | ||||||
|  | 	    (else | ||||||
|  | 	     (scsh-emit-b-vector-initializer x reloc externs port))) | ||||||
|  |       (if *comments?* | ||||||
|  | 	  (begin (display " /* " port) | ||||||
|  | 		 (writex x port) | ||||||
|  | 		 (display " */" port))) | ||||||
|  |       (newline port)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     (define (scsh-emit-d-vector-initializer x reloc port) | ||||||
|  |       (let ((len (d-vector-length x))) | ||||||
|  | 	(do ((i 0 (+ i 1))) | ||||||
|  | 	    ((= i len)) | ||||||
|  | 	  (scsh-emit-descriptor (d-vector-ref x i) reloc port) | ||||||
|  | 	  (write-char #\, port)))) | ||||||
|  | 
 | ||||||
|  |     (define (scsh-emit-vm-string-initializer x port) | ||||||
|  |       (let* ((len (vm-string-length x))	; end is jawilson style hack | ||||||
|  | 	     (end (- (cells->bytes (bytes->cells (+ len 1))) 4))) | ||||||
|  | 	(do ((i 0 (+ i 4))) | ||||||
|  | 	    ((= i end)  | ||||||
|  | 	     (case (- len end) | ||||||
|  | 	       ((0) | ||||||
|  | 		(write-hex port 0)) | ||||||
|  | 	       ((1) | ||||||
|  | 		(write-hex | ||||||
|  | 		 port | ||||||
|  | 		 (net-to-host-32 (arithmetic-shift  | ||||||
|  | 				  (char->ascii (vm-string-ref x i)) 24)))) | ||||||
|  | 	       ((2) | ||||||
|  | 		(write-hex  | ||||||
|  | 		 port | ||||||
|  | 		 (net-to-host-32  | ||||||
|  | 		  (bitwise-ior | ||||||
|  | 		   (arithmetic-shift | ||||||
|  | 		    (char->ascii (vm-string-ref x i))       24) | ||||||
|  | 		   (arithmetic-shift | ||||||
|  | 		    (char->ascii (vm-string-ref x (+ i 1))) 16))))) | ||||||
|  | 	       ((3) | ||||||
|  | 		(write-hex | ||||||
|  | 		 port | ||||||
|  | 		 (net-to-host-32 | ||||||
|  | 		  (bitwise-ior | ||||||
|  | 		   (bitwise-ior | ||||||
|  | 		    (arithmetic-shift  | ||||||
|  | 		     (char->ascii (vm-string-ref x i))       24) | ||||||
|  | 		    (arithmetic-shift  | ||||||
|  | 		     (char->ascii (vm-string-ref x (+ i 1))) 16)) | ||||||
|  | 		   (arithmetic-shift   | ||||||
|  | 		    (char->ascii (vm-string-ref x (+ i 2)))  8))))))) | ||||||
|  | 	  (write-hex port | ||||||
|  | 		     (net-to-host-32 (bitwise-ior | ||||||
|  | 				      (bitwise-ior | ||||||
|  | 				       (arithmetic-shift  | ||||||
|  | 					(char->ascii (vm-string-ref x i))       24) | ||||||
|  | 				       (arithmetic-shift  | ||||||
|  | 					(char->ascii (vm-string-ref x (+ i 1))) 16)) | ||||||
|  | 				      (bitwise-ior | ||||||
|  | 				       (arithmetic-shift  | ||||||
|  | 					(char->ascii (vm-string-ref x (+ i 2)))  8) | ||||||
|  | 				       (char->ascii  (vm-string-ref x (+ i 3)))))) | ||||||
|  | 		     )))) | ||||||
|  | 
 | ||||||
|  |     (define (scsh-emit-b-vector-initializer x reloc externs port) | ||||||
|  |       (cond ((and (code-vector? x) | ||||||
|  | 		  (table-ref externs x)) => | ||||||
|  | 		  (lambda (name) | ||||||
|  | 		    (format port "(long) *~a," name))) | ||||||
|  | 	    (else  | ||||||
|  | 	     (let* ((len (b-vector-length x)) ;end is jawilson style hack | ||||||
|  | 		    (end (- (cells->bytes (bytes->cells (+ len 1))) 4))) | ||||||
|  | 	       (do ((i 0 (+ i 4))) | ||||||
|  | 		   ((= i end) | ||||||
|  | 		    (case (- len end) | ||||||
|  | 		      ((1) | ||||||
|  | 		       (write-hex | ||||||
|  | 			port | ||||||
|  | 			(net-to-host-32 (arithmetic-shift (b-vector-ref x i) 24)))) | ||||||
|  | 		      ((2) | ||||||
|  | 		       (write-hex  | ||||||
|  | 			port | ||||||
|  | 			(net-to-host-32 | ||||||
|  | 			 (bitwise-ior | ||||||
|  | 			  (arithmetic-shift (b-vector-ref x i)       24) | ||||||
|  | 			  (arithmetic-shift (b-vector-ref x (+ i 1)) 16))))) | ||||||
|  | 		      ((3) | ||||||
|  | 		       (write-hex | ||||||
|  | 			port | ||||||
|  | 			(net-to-host-32 | ||||||
|  | 			 (bitwise-ior | ||||||
|  | 			  (bitwise-ior | ||||||
|  | 			   (arithmetic-shift (b-vector-ref x i)       24) | ||||||
|  | 			   (arithmetic-shift (b-vector-ref x (+ i 1)) 16)) | ||||||
|  | 			  (arithmetic-shift  (b-vector-ref x (+ i 2))  8))) | ||||||
|  | 			)))) | ||||||
|  | 		 (write-hex  | ||||||
|  | 		  port | ||||||
|  | 		  (net-to-host-32 (bitwise-ior | ||||||
|  | 				   (bitwise-ior | ||||||
|  | 				    (arithmetic-shift (b-vector-ref x i)       24) | ||||||
|  | 				    (arithmetic-shift (b-vector-ref x (+ i 1)) 16)) | ||||||
|  | 				   (bitwise-ior | ||||||
|  | 				    (arithmetic-shift (b-vector-ref x (+ i 2))  8) | ||||||
|  | 				    (b-vector-ref x (+ i 3)))))))) | ||||||
|  | 	     ))) | ||||||
|  | 
 | ||||||
|  |     (define (scsh-emit-descriptor x reloc port) | ||||||
|  |       (if (stob? x) | ||||||
|  | 	  (let ((n (chunk-number x))) | ||||||
|  | 	    (display "(long)(&" port) | ||||||
|  | 	    (if (immutable? x) | ||||||
|  | 		(display "p" port) | ||||||
|  | 		(display "i" port)) | ||||||
|  | 	    (display n port) | ||||||
|  | 	    (display "[" port) | ||||||
|  | 	    (display (quotient (table-ref (vector-ref reloc n) x) 4) port) | ||||||
|  | 	    (display "])+7" port)) | ||||||
|  | 	  (format port  | ||||||
|  | 		  (if (negative? x) "-0x~a" "0x~a") | ||||||
|  | 		  (number->string (abs x) 16)))) | ||||||
|  | 
 | ||||||
|  |     (define (scsh-for-each-stored-object chunk-start proc chunk-end) | ||||||
|  |       (let ((limit (heap-pointer))) | ||||||
|  | 	(let chunk-loop ((addr (newspace-begin)) | ||||||
|  | 			 (i 0) | ||||||
|  | 			 (chunk (+ (newspace-begin) *chunk-size*))) | ||||||
|  | 	  (if (addr< addr limit) | ||||||
|  | 	      (begin (chunk-start i) | ||||||
|  | 		     (let loop ((addr addr)) | ||||||
|  | 		       (if (and (addr< addr limit) | ||||||
|  | 				(addr< addr chunk)) | ||||||
|  | 			   (let* ((d   (fetch addr)) | ||||||
|  | 				  (len (addr1+ (header-a-units d)))) | ||||||
|  | 			     (if (not (header? d)) | ||||||
|  | 				 (warn "heap is in an inconsistent state" d)) | ||||||
|  | 			     (proc i (address->stob-descriptor (addr1+ addr)) len) | ||||||
|  | 			     (loop (addr+ addr len))) | ||||||
|  | 			   (begin (chunk-end i) | ||||||
|  | 				  (chunk-loop addr | ||||||
|  | 					      (+ i 1) | ||||||
|  | 					      (+ chunk *chunk-size*)))))))))) | ||||||
|  | 
 | ||||||
|  |     (define (write-hex port x)  | ||||||
|  |       (format port  | ||||||
|  | 	      (if (negative? x) "-0x~a," "0x~a,") | ||||||
|  | 	      (number->string (abs x) 16))) | ||||||
|  | 
 | ||||||
|  |     ;; takes a string and break it into a list at whitespace | ||||||
|  |     ;; rewrite using scsh stuff? | ||||||
|  |     (define (line->list line) | ||||||
|  |       (let ((len (string-length line))) | ||||||
|  | 	(let loop ((start 0) | ||||||
|  | 		   (end 0) | ||||||
|  | 		   (l '())) | ||||||
|  | 	  (cond ((>= end len) | ||||||
|  | 		 (if (= start end) | ||||||
|  | 		     l | ||||||
|  | 		     (append l (list (substring line start end))))) | ||||||
|  | 		((and (= start end) | ||||||
|  | 		      (or (char=? (string-ref line start) (ascii->char 32)) | ||||||
|  | 			  (char=? (string-ref line start) (ascii->char 9)))) | ||||||
|  | 		 (loop (+ 1 start)  | ||||||
|  | 		       (+ 1 end)  | ||||||
|  | 		       l)) | ||||||
|  | 		((or (char=? (string-ref line end) (ascii->char 32)) | ||||||
|  | 		     (char=? (string-ref line end) (ascii->char 9))) | ||||||
|  | 		 (loop (+ 1 end)  | ||||||
|  | 		       (+ 1 end)  | ||||||
|  | 		       (append l (list (substring line start end))))) | ||||||
|  | 		((< end len) | ||||||
|  | 		 (loop start  | ||||||
|  | 		       (+ 1 end) | ||||||
|  | 		       l)) | ||||||
|  | 		(else (error "unexpected case in line->list")))))) | ||||||
|  | 
 | ||||||
|  | ;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||||||
|  | ;;; Debugging | ||||||
|  | ;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||||||
|  | 
 | ||||||
|  |     (define (bin n) | ||||||
|  |       (number->string n 2)) | ||||||
|  | 
 | ||||||
|  |     (define (oct n) | ||||||
|  |       (number->string n 8)) | ||||||
|  | 
 | ||||||
|  |     (define (dec n) | ||||||
|  |       (number->string n 10)) | ||||||
|  | 
 | ||||||
|  |     (define (hex n) | ||||||
|  |       (number->string n 16)) | ||||||
|  | 
 | ||||||
|  | ;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||||||
|  | 
 | ||||||
|  |     ; For example: | ||||||
|  |     ;   (do-it 100000 "~/s48/debug/little.image" "little-heap.c") | ||||||
|  |     ; | ||||||
|  |     ; The first argument to do-it should be somewhat larger than the size, | ||||||
|  |     ; in bytes, of the image file to be converted (which you can obtain with | ||||||
|  |     ; "ls -l"). | ||||||
|  |     ; | ||||||
|  |     ; If the image contains 0-length stored objects, then the .c file will | ||||||
|  |     ; have to be compiled by gcc, since 0-length arrays aren't allowed in | ||||||
|  |     ; ANSI C.  This wouldn't be difficult to work around. | ||||||
|  |      | ||||||
|  |     (define *comments?* #f) | ||||||
|  |      | ||||||
|  |     ; 800,000 bytes => 200,000 words => at least 100,000 objects | ||||||
|  |     ;   50 chunks => 16,000 bytes per chunk => 2,000 objects per chunk | ||||||
|  |     (define *chunk-size* 10000) | ||||||
|  | 
 | ||||||
|  |     (define (do-it bytes infile outfile) | ||||||
|  |       (let ((start (init bytes infile))) | ||||||
|  | 	(call-with-output-file outfile | ||||||
|  | 	  (lambda (port) | ||||||
|  | 	    (format port "#define D(x) (long)(&x)+7~%") | ||||||
|  | 	    (format port "#define H unsigned long~%") | ||||||
|  | 	    (emit-area-declarations "p" immutable? "const " port) | ||||||
|  | 	    (emit-area-declarations "i" mutable? "" port) | ||||||
|  | 	    (emit-area-initializers "p" immutable? "const " port) | ||||||
|  | 	    (emit-area-initializers "i" mutable? "" port) | ||||||
|  | 	    (display "const long entry = " port) | ||||||
|  | 	    (emit-descriptor start port) | ||||||
|  | 	    (write-char #\; port) | ||||||
|  | 	    (newline port))))) | ||||||
|  | 
 | ||||||
|  |     (define (init bytes infile) | ||||||
|  |       (create-memory (quotient bytes 2) quiescent) ;Output of ls -l | ||||||
|  |       (initialize-heap (memory-begin) (memory-size)) | ||||||
|  |       (let ((start (read-image infile 0))) | ||||||
|  | 	(message (nchunks) | ||||||
|  | 		 " chunks") | ||||||
|  | 	start)) | ||||||
|  | 
 | ||||||
|  |     (define (nchunks) (+ (chunk-number (heap-pointer)) 1)) | ||||||
|  | 
 | ||||||
|  | 					; emit struct declarations for areas | ||||||
|  | 
 | ||||||
|  |     (define (emit-area-declarations name in-area? const port) | ||||||
|  |       (for-each-stored-object | ||||||
|  |        (lambda (chunk) | ||||||
|  | 	 (message name chunk " declaration") | ||||||
|  | 	 (display "struct " port) (display name port) (display chunk port) | ||||||
|  | 	 (display " {" port) (newline port)) | ||||||
|  |        (lambda (x) | ||||||
|  | 	 (if (in-area? x) | ||||||
|  | 	     (emit-declaration x port))) | ||||||
|  |        (lambda (chunk) | ||||||
|  | 	 (display "};" port) | ||||||
|  | 	 (newline port) | ||||||
|  | 	 (display const port) | ||||||
|  | 	 (display "extern struct " port) (display name port) (display chunk port) | ||||||
|  | 	 (write-char #\space port) (display name port) (display chunk port) | ||||||
|  | 	 (write-char #\; port) (newline port) | ||||||
|  | 	 chunk))) | ||||||
|  | 
 | ||||||
|  |     (define (emit-declaration x port) | ||||||
|  |       (display "  H x" port) | ||||||
|  |       (writex x port) | ||||||
|  |       (cond ((d-vector? x) | ||||||
|  | 	     (display "; long d" port) | ||||||
|  | 	     (writex x port) | ||||||
|  | 	     (write-char #\[ port) | ||||||
|  | 	     (write (d-vector-length x) port)) | ||||||
|  | 	    ((vm-string? x) | ||||||
|  | 	     (display "; char d" port) | ||||||
|  | 	     (writex x port) | ||||||
|  | 	     (write-char #\[ port) | ||||||
|  | 	     ;; Ensure alignment (thanks Ian) | ||||||
|  | 	     (write (cells->bytes (bytes->cells (b-vector-length x))) | ||||||
|  | 		    port)) | ||||||
|  | 	    (else | ||||||
|  | 	     (display "; unsigned char d" port) | ||||||
|  | 	     (writex x port) | ||||||
|  | 	     (write-char #\[ port) | ||||||
|  | 	     ;; Ensure alignment | ||||||
|  | 	     (write (cells->bytes (bytes->cells (b-vector-length x))) | ||||||
|  | 		    port))) | ||||||
|  |       (display "];" port) | ||||||
|  |       (if *comments?* | ||||||
|  | 	  (begin (display " /* " port) | ||||||
|  | 		 (display (enumerand->name (stob-type x) stob) port) | ||||||
|  | 		 (display " */" port))) | ||||||
|  |       (newline port)) | ||||||
|  | 
 | ||||||
|  | 					; Emit initializers for areas | ||||||
|  | 
 | ||||||
|  |     (define (emit-area-initializers name in-area? const port) | ||||||
|  |       (for-each-stored-object | ||||||
|  |        (lambda (chunk) | ||||||
|  | 	 (message name chunk " initializer") | ||||||
|  | 
 | ||||||
|  | 	 (display const port) | ||||||
|  | 	 (display "struct " port) (display name port) (write chunk port) | ||||||
|  | 	 (write-char #\space port) (display name port) (write chunk port) | ||||||
|  | 	 (display " =" port) (newline port) | ||||||
|  | 
 | ||||||
|  | 	 (write-char #\{ port) (newline port)) | ||||||
|  |        (lambda (x) | ||||||
|  | 	 (if (in-area? x) | ||||||
|  | 	     (emit-initializer x port))) | ||||||
|  |        (lambda (chunk) | ||||||
|  | 	 (display "};" port) (newline port))) | ||||||
|  | 
 | ||||||
|  |       (let ((n (nchunks))) | ||||||
|  | 	(format port "const long ~a_count = ~s;~%" name n) | ||||||
|  | 	(format port "~a long * const ~a_areas[~s] = {" const name n) | ||||||
|  | 	(do ((i 0 (+ i 1))) | ||||||
|  | 	    ((= i n)) | ||||||
|  | 	  (format port "(~a long *)&~a~s, " const name i)) | ||||||
|  | 	(format port "};~%const long ~a_sizes[~s] = {" name n) | ||||||
|  | 	(do ((i 0 (+ i 1))) | ||||||
|  | 	    ((= i n)) | ||||||
|  | 	  (format port "sizeof(~a~s), " name i)) | ||||||
|  | 	(format port "};~%"))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     (define (message . stuff) | ||||||
|  |       (for-each display stuff) (newline)) | ||||||
|  | 
 | ||||||
|  |     (define (emit-initializer x port) | ||||||
|  |       (display "  " port) | ||||||
|  |       (write (stob-header x) port) | ||||||
|  |       (write-char #\, port) | ||||||
|  |       (cond ((d-vector? x) | ||||||
|  | 	     (emit-d-vector-initializer x port)) | ||||||
|  | 	    ((vm-string? x) | ||||||
|  | 	     (write-char #\" port) | ||||||
|  | 	     (let ((len (vm-string-length x))) | ||||||
|  | 	       (do ((i 0 (+ i 1))) | ||||||
|  | 		   ((= i len) (write-char #\" port)) | ||||||
|  | 		 (let ((c (vm-string-ref x i))) | ||||||
|  | 		   (cond ((or (char=? c #\") (char=? c #\\)) | ||||||
|  | 			  (write-char #\\ port)) | ||||||
|  | 			 ((char=? c #\newline) | ||||||
|  | 			  (display "\\n\\" port))) | ||||||
|  | 		   (write-char c port))))) | ||||||
|  | 	    (else | ||||||
|  | 	     (write-char #\{ port) | ||||||
|  | 	     (let ((len (b-vector-length x))) | ||||||
|  | 	       (do ((i 0 (+ i 1))) | ||||||
|  | 		   ((= i len) (write-char #\} port)) | ||||||
|  | 		 (write (b-vector-ref x i) port) | ||||||
|  | 		 (write-char #\, port))))) | ||||||
|  |       (write-char #\, port) | ||||||
|  |       (if *comments?* | ||||||
|  | 	  (begin (display " /* " port) | ||||||
|  | 		 (writex x port) | ||||||
|  | 		 (display " */" port))) | ||||||
|  |       (newline port)) | ||||||
|  | 
 | ||||||
|  |     (define (emit-d-vector-initializer x port) | ||||||
|  |       (write-char #\{ port) | ||||||
|  |       (let ((len (d-vector-length x))) | ||||||
|  | 	(do ((i 0 (+ i 1))) | ||||||
|  | 	    ((= i len) (write-char #\} port)) | ||||||
|  | 	  (emit-descriptor (d-vector-ref x i) port) | ||||||
|  | 	  (write-char #\, port)))) | ||||||
|  | 
 | ||||||
|  |     (define (emit-descriptor x port) | ||||||
|  |       (if (stob? x) | ||||||
|  | 	  (begin (if (immutable? x) | ||||||
|  | 		     (display "D(p" port) | ||||||
|  | 		     (display "D(i" port)) | ||||||
|  | 		 (display (chunk-number x) port) | ||||||
|  | 		 (display ".x" port) | ||||||
|  | 		 (writex x port) | ||||||
|  | 		 (write-char #\) port)) | ||||||
|  | 	  (write x port))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 					; Foo | ||||||
|  | 
 | ||||||
|  |     (define (writex x port) | ||||||
|  |       (write (quotient (- (- x (memory-begin)) 7) 4) port)) | ||||||
|  | 
 | ||||||
|  |     (define (chunk-number x) | ||||||
|  |       (quotient (- (- x (memory-begin)) 7) *chunk-size*)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 					; Image traversal utility | ||||||
|  | 
 | ||||||
|  |     (define (for-each-stored-object chunk-start proc chunk-end) | ||||||
|  |       (let ((limit (heap-pointer))) | ||||||
|  | 	(let chunk-loop ((addr (newspace-begin)) | ||||||
|  | 			 (i 0) | ||||||
|  | 			 (chunk (+ (newspace-begin) *chunk-size*))) | ||||||
|  | 	  (if (addr< addr limit) | ||||||
|  | 	      (begin (chunk-start i) | ||||||
|  | 		     (let loop ((addr addr)) | ||||||
|  | 		       (if (and (addr< addr limit) | ||||||
|  | 				(addr< addr chunk)) | ||||||
|  | 			   (let ((d (fetch addr))) | ||||||
|  | 			     (if (not (header? d)) | ||||||
|  | 				 (warn "heap is in an inconsistent state" d)) | ||||||
|  | 			     (proc (address->stob-descriptor (addr1+ addr))) | ||||||
|  | 			     (loop (addr1+ (addr+ addr (header-a-units d))))) | ||||||
|  | 			   (begin (chunk-end i) | ||||||
|  | 				  (chunk-loop addr | ||||||
|  | 					      (+ i 1) | ||||||
|  | 					      (+ chunk *chunk-size*)))))))))) | ||||||
|  | 
 | ||||||
|  |     (define (mutable? x) (not (immutable? x))) | ||||||
|  | 
 | ||||||
|  |     ;; End begin | ||||||
|  |     )) | ||||||
		Loading…
	
		Reference in New Issue
	
	 bdc
						bdc