+ /* Check that the object pointed to is consistent with the pointer
+ * low tag. */
+ switch (lowtag_of((lispobj)pointer)) {
+ case FUN_POINTER_LOWTAG:
+ /* Start_addr should be the enclosing code object, or a closure
+ * header. */
+ switch (widetag_of(*start_addr)) {
+ case CODE_HEADER_WIDETAG:
+ /* This case is probably caught above. */
+ break;
+ case CLOSURE_HEADER_WIDETAG:
+ case FUNCALLABLE_INSTANCE_HEADER_WIDETAG:
+ if ((int)pointer != ((int)start_addr+FUN_POINTER_LOWTAG)) {
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wf2: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+ }
+ break;
+ default:
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wf3: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+ }
+ break;
+ case LIST_POINTER_LOWTAG:
+ if ((int)pointer != ((int)start_addr+LIST_POINTER_LOWTAG)) {
+ if (pointer_filter_verbose)
+ fprintf(stderr,"*Wl1: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ return 0;
+ }
+ /* Is it plausible cons? */
+ if ((is_lisp_pointer(start_addr[0])
+ || ((start_addr[0] & 3) == 0) /* fixnum */
+ || (widetag_of(start_addr[0]) == CHARACTER_WIDETAG)
+ || (widetag_of(start_addr[0]) == UNBOUND_MARKER_WIDETAG))
+ && (is_lisp_pointer(start_addr[1])
+ || ((start_addr[1] & 3) == 0) /* fixnum */
+ || (widetag_of(start_addr[1]) == CHARACTER_WIDETAG)
+ || (widetag_of(start_addr[1]) == UNBOUND_MARKER_WIDETAG))) {
+ break;
+ } else {
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wl2: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+ }
+ case INSTANCE_POINTER_LOWTAG:
+ if ((int)pointer != ((int)start_addr+INSTANCE_POINTER_LOWTAG)) {
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wi1: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+ }
+ if (widetag_of(start_addr[0]) != INSTANCE_HEADER_WIDETAG) {
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wi2: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+ }
+ break;
+ case OTHER_POINTER_LOWTAG:
+ if ((int)pointer != ((int)start_addr+OTHER_POINTER_LOWTAG)) {
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wo1: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *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 (pointer_filter_verbose) {
+ fprintf(stderr,"*Wo2: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+ }
+ switch (widetag_of(start_addr[0])) {
+ case UNBOUND_MARKER_WIDETAG:
+ case CHARACTER_WIDETAG:
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wo3: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+
+ /* only pointed to by function pointers? */
+ case CLOSURE_HEADER_WIDETAG:
+ case FUNCALLABLE_INSTANCE_HEADER_WIDETAG:
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wo4: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+
+ case INSTANCE_HEADER_WIDETAG:
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wo5: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+
+ /* the valid other immediate pointer objects */
+ case SIMPLE_VECTOR_WIDETAG:
+ case RATIO_WIDETAG:
+ case COMPLEX_WIDETAG:
+#ifdef COMPLEX_SINGLE_FLOAT_WIDETAG
+ case COMPLEX_SINGLE_FLOAT_WIDETAG:
+#endif
+#ifdef COMPLEX_DOUBLE_FLOAT_WIDETAG
+ case COMPLEX_DOUBLE_FLOAT_WIDETAG:
+#endif
+#ifdef COMPLEX_LONG_FLOAT_WIDETAG
+ case COMPLEX_LONG_FLOAT_WIDETAG:
+#endif
+ case SIMPLE_ARRAY_WIDETAG:
+ case COMPLEX_BASE_STRING_WIDETAG:
+#ifdef COMPLEX_CHARACTER_STRING_WIDETAG
+ case COMPLEX_CHARACTER_STRING_WIDETAG:
+#endif
+ case COMPLEX_VECTOR_NIL_WIDETAG:
+ case COMPLEX_BIT_VECTOR_WIDETAG:
+ case COMPLEX_VECTOR_WIDETAG:
+ case COMPLEX_ARRAY_WIDETAG:
+ case VALUE_CELL_HEADER_WIDETAG:
+ case SYMBOL_HEADER_WIDETAG:
+ case FDEFN_WIDETAG:
+ case CODE_HEADER_WIDETAG:
+ case BIGNUM_WIDETAG:
+ case SINGLE_FLOAT_WIDETAG:
+ case DOUBLE_FLOAT_WIDETAG:
+#ifdef LONG_FLOAT_WIDETAG
+ case LONG_FLOAT_WIDETAG:
+#endif
+ case SIMPLE_ARRAY_NIL_WIDETAG:
+ case SIMPLE_BASE_STRING_WIDETAG:
+#ifdef SIMPLE_CHARACTER_STRING_WIDETAG
+ case SIMPLE_CHARACTER_STRING_WIDETAG:
+#endif
+ case SIMPLE_BIT_VECTOR_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG:
+ case SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG:
+#ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG
+ case SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG:
+#endif
+#ifdef SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG
+ case SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG:
+#endif
+#ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG
+ case SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG:
+#endif
+#ifdef SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG
+ case SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG:
+#endif
+ case SIMPLE_ARRAY_SINGLE_FLOAT_WIDETAG:
+ case SIMPLE_ARRAY_DOUBLE_FLOAT_WIDETAG:
+#ifdef SIMPLE_ARRAY_LONG_FLOAT_WIDETAG
+ case SIMPLE_ARRAY_LONG_FLOAT_WIDETAG:
+#endif
+#ifdef SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG
+ case SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG:
+#endif
+#ifdef SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG
+ case SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG:
+#endif
+#ifdef SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG
+ case SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG:
+#endif
+ case SAP_WIDETAG:
+ case WEAK_POINTER_WIDETAG:
+ break;
+
+ default:
+ if (pointer_filter_verbose) {
+ fprintf(stderr,"*Wo6: %x %x %x\n", (unsigned int) pointer,
+ (unsigned int) start_addr, *start_addr);
+ }
+ return 0;
+ }
+ break;
+ default: