X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fpurify.c;h=992df23c5c4022c5cd36eccb218ece44f2fc32e6;hb=f3f677703e37f5a335b3be7fa64f7748ad969517;hp=480227d70f7ed5c554a9fe286ceb6e24b268e402;hpb=78fa16bf55be44cc16845be84d98023e83fb14bc;p=sbcl.git diff --git a/src/runtime/purify.c b/src/runtime/purify.c index 480227d..992df23 100644 --- a/src/runtime/purify.c +++ b/src/runtime/purify.c @@ -33,6 +33,7 @@ #include "thread.h" #include "genesis/primitive-objects.h" #include "genesis/static-symbols.h" +#include "genesis/layout.h" #define PRINTNOISE @@ -90,7 +91,7 @@ static long later_count = 0; /* FIXME: Shouldn't this be defined in sbcl.h? See also notes in * cheneygc.c */ -#ifdef sparc +#ifdef LISP_FEATURE_SPARC #define FUN_RAW_ADDR_OFFSET 0 #else #define FUN_RAW_ADDR_OFFSET (6*sizeof(lispobj) - FUN_POINTER_LOWTAG) @@ -205,12 +206,18 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) } /* Is it plausible cons? */ if ((is_lisp_pointer(start_addr[0]) - || ((start_addr[0] & 3) == 0) /* fixnum */ + || ((start_addr[0] & FIXNUM_TAG_MASK) == 0) /* fixnum */ || (widetag_of(start_addr[0]) == CHARACTER_WIDETAG) +#if N_WORD_BITS == 64 + || (widetag_of(start_addr[0]) == SINGLE_FLOAT_WIDETAG) +#endif || (widetag_of(start_addr[0]) == UNBOUND_MARKER_WIDETAG)) && (is_lisp_pointer(start_addr[1]) - || ((start_addr[1] & 3) == 0) /* fixnum */ + || ((start_addr[1] & FIXNUM_TAG_MASK) == 0) /* fixnum */ || (widetag_of(start_addr[1]) == CHARACTER_WIDETAG) +#if N_WORD_BITS == 64 + || (widetag_of(start_addr[1]) == SINGLE_FLOAT_WIDETAG) +#endif || (widetag_of(start_addr[1]) == UNBOUND_MARKER_WIDETAG))) { break; } else { @@ -245,7 +252,7 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) return 0; } /* Is it plausible? Not a cons. XXX should check the headers. */ - if (is_lisp_pointer(start_addr[0]) || ((start_addr[0] & 3) == 0)) { + if (is_lisp_pointer(start_addr[0]) || ((start_addr[0] & FIXNUM_TAG_MASK) == 0)) { if (pointer_filter_verbose) { fprintf(stderr,"*Wo2: %x %x %x\n", (unsigned long) pointer, (unsigned long) start_addr, *start_addr); @@ -255,6 +262,9 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) switch (widetag_of(start_addr[0])) { case UNBOUND_MARKER_WIDETAG: case CHARACTER_WIDETAG: +#if N_WORD_BITS == 64 + case SINGLE_FLOAT_WIDETAG: +#endif if (pointer_filter_verbose) { fprintf(stderr,"*Wo3: %x %x %x\n", (unsigned long) pointer, (unsigned long) start_addr, *start_addr); @@ -304,7 +314,9 @@ valid_dynamic_space_pointer(lispobj *pointer, lispobj *start_addr) case FDEFN_WIDETAG: case CODE_HEADER_WIDETAG: case BIGNUM_WIDETAG: +#if N_WORD_BITS != 64 case SINGLE_FLOAT_WIDETAG: +#endif case DOUBLE_FLOAT_WIDETAG: #ifdef LONG_FLOAT_WIDETAG case LONG_FLOAT_WIDETAG: @@ -1043,7 +1055,7 @@ ptrans_otherptr(lispobj thing, lispobj header, boolean constant) #ifdef LISP_FEATURE_X86 return ptrans_vector(thing, 96, 0, 0, constant); #endif -#ifdef sparc +#ifdef LISP_FEATURE_SPARC return ptrans_vector(thing, 128, 0, 0, constant); #endif #endif @@ -1063,7 +1075,7 @@ ptrans_otherptr(lispobj thing, lispobj header, boolean constant) #ifdef LISP_FEATURE_X86 return ptrans_vector(thing, 192, 0, 0, constant); #endif -#ifdef sparc +#ifdef LISP_FEATURE_SPARC return ptrans_vector(thing, 256, 0, 0, constant); #endif #endif @@ -1186,6 +1198,11 @@ pscav(lispobj *addr, long nwords, boolean constant) } count = 1; } +#if N_WORD_BITS == 64 + else if (widetag_of(thing) == SINGLE_FLOAT_WIDETAG) { + count = 1; + } +#endif else if (thing & FIXNUM_TAG_MASK) { /* It's an other immediate. Maybe the header for an unboxed */ /* object. */ @@ -1307,7 +1324,7 @@ pscav(lispobj *addr, long nwords, boolean constant) #ifdef LISP_FEATURE_X86 count = fixnum_value(vector->length)*3+2; #endif -#ifdef sparc +#ifdef LISP_FEATURE_SPARC count = fixnum_value(vector->length)*4+2; #endif break; @@ -1327,7 +1344,7 @@ pscav(lispobj *addr, long nwords, boolean constant) #ifdef LISP_FEATURE_X86 count = fixnum_value(vector->length)*6+2; #endif -#ifdef sparc +#ifdef LISP_FEATURE_SPARC count = fixnum_value(vector->length)*8+2; #endif break; @@ -1376,6 +1393,18 @@ pscav(lispobj *addr, long nwords, boolean constant) count = pscav_fdefn((struct fdefn *)addr); break; + case INSTANCE_HEADER_WIDETAG: + { + struct instance *instance = (struct instance *) addr; + struct layout *layout + = (struct layout *) native_pointer(instance->slots[0]); + long nuntagged = fixnum_value(layout->n_untagged_slots); + long nslots = HeaderValue(*addr); + pscav(addr + 1, nslots - nuntagged, constant); + count = CEILING(1 + nslots, 2); + } + break; + default: count = 1; break; @@ -1583,6 +1612,10 @@ purify(lispobj static_roots, lispobj read_only_roots) #endif #endif + /* Blast away instruction cache */ + os_flush_icache((os_vm_address_t)READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE); + os_flush_icache((os_vm_address_t)STATIC_SPACE_START, STATIC_SPACE_SIZE); + #ifdef PRINTNOISE printf(" done]\n"); fflush(stdout);