0.9.1.38:
[sbcl.git] / src / runtime / purify.c
index 480227d..992df23 100644 (file)
@@ -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);