X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fsave.c;h=da7334949a7179b748c650b58e9e653fd5ca0278;hb=a8161e77843ee18a99ec30dd57f796264dfac05a;hp=3336639dc5cea856a07e1ee84b9945a3d840512d;hpb=9c1b233ee05cb343e74e3ec16143cfc4b0161d20;p=sbcl.git diff --git a/src/runtime/save.c b/src/runtime/save.c index 3336639..da73349 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -9,6 +9,7 @@ * files for more information. */ +#include #include #include #include @@ -22,10 +23,7 @@ #include "dynbind.h" #include "lispregs.h" #include "validate.h" - -#ifdef GENCGC -#include "gencgc.h" -#endif +#include "gc-internal.h" static long write_bytes(FILE *file, char *addr, long bytes) @@ -104,52 +102,72 @@ save(char *filename, lispobj init_function) printf("done]\n"); fflush(stdout); - /* (Now we can actually start copying ourselves into the - * output file.) */ + /* (Now we can actually start copying ourselves into the output file.) */ printf("[saving current Lisp image into %s:\n", filename); fflush(stdout); putw(CORE_MAGIC, file); - putw(CORE_VERSION, file); + putw(VERSION_CORE_ENTRY_TYPE_CODE, file); putw(3, file); putw(SBCL_CORE_VERSION_INTEGER, file); - putw(CORE_NDIRECTORY, file); - putw((5*3)+2, file); + putw(BUILD_ID_CORE_ENTRY_TYPE_CODE, file); + putw(/* (We're writing the word count of the entry here, and the 2 + * term is one word for the leading BUILD_ID_CORE_ENTRY_TYPE_CODE + * word and one word where we store the count itself.) */ + 2 + strlen(build_id), + file); + { + char *p; + for (p = build_id; *p; ++p) + putw(*p, file); + } + putw(NEW_DIRECTORY_CORE_ENTRY_TYPE_CODE, file); + putw(/* (word count = 3 spaces described by 5 words each, plus the + * entry type code, plus this count itself) */ + (5*3)+2, file); output_space(file, - READ_ONLY_SPACE_ID, + READ_ONLY_CORE_SPACE_ID, (lispobj *)READ_ONLY_SPACE_START, (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); output_space(file, - STATIC_SPACE_ID, + STATIC_CORE_SPACE_ID, (lispobj *)STATIC_SPACE_START, (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER)); #ifdef reg_ALLOC output_space(file, - DYNAMIC_SPACE_ID, + DYNAMIC_CORE_SPACE_ID, (lispobj *)current_dynamic_space, dynamic_space_free_pointer); #else -#ifdef GENCGC +#ifdef LISP_FEATURE_GENCGC + /* I don't know too much about the circumstances in which we could + * end up here. It may be that current_region_free_pointer is + * guaranteed to be relevant and we could skip these slightly + * paranoid checks. TRT would be to rid the code of + * current_region_foo completely - dan 2002.09.17 */ + if((boxed_region.free_pointer < current_region_free_pointer) && + (boxed_region.end_addr == current_region_end_addr)) + boxed_region.free_pointer = current_region_free_pointer; /* Flush the current_region, updating the tables. */ gc_alloc_update_page_tables(0,&boxed_region); gc_alloc_update_page_tables(1,&unboxed_region); update_x86_dynamic_space_free_pointer(); #endif output_space(file, - DYNAMIC_SPACE_ID, + DYNAMIC_CORE_SPACE_ID, (lispobj *)DYNAMIC_SPACE_START, (lispobj *)SymbolValue(ALLOCATION_POINTER)); #endif - putw(CORE_INITIAL_FUNCTION, file); + putw(INITIAL_FUN_CORE_ENTRY_TYPE_CODE, file); putw(3, file); putw(init_function, file); - putw(CORE_END, file); + putw(END_CORE_ENTRY_TYPE_CODE, file); fclose(file); printf("done]\n");