*/
#include <stdio.h>
+#include <string.h>
#include "sbcl.h"
#include "print.h"
#define NEWLINE_OR_RETURN if (continue_p(1)) newline(NULL); else return;
+/* FIXME: This should be auto-generated by whatever generates
+ constants.h so we don't have to maintain this twice! */
+#ifdef LISP_FEATURE_X86_64
+char *lowtag_Names[] = {
+ "even fixnum",
+ "instance pointer",
+ "other immediate [0]",
+ "unknown [3]",
+ "unknown [4]",
+ "unknown [5]",
+ "other immediate [1]",
+ "list pointer",
+ "odd fixnum",
+ "function pointer",
+ "other immediate [2]",
+ "unknown [11]",
+ "unknown [12]",
+ "unknown [13]",
+ "other immediate [3]",
+ "other pointer"
+};
+#else
char *lowtag_Names[] = {
"even fixnum",
"instance pointer",
"other immediate [1]",
"other pointer"
};
+#endif
/* FIXME: Yikes! This table implicitly depends on the values in sbcl.h,
* but doesn't actually depend on them, so if they change, it gets
static void brief_fixnum(lispobj obj)
{
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
printf("%ld", ((long)obj)>>2);
#else
printf("%d", ((s32)obj)>>2);
static void print_fixnum(lispobj obj)
{
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
printf(": %ld", ((long)obj)>>2);
#else
printf(": %d", ((s32)obj)>>2);
break;
default:
- idx = type >> 2;
- if (idx < (sizeof(lowtag_Names) / sizeof(char *)))
- printf("%s", lowtag_Names[idx]);
- else
- printf("unknown type (0x%0x)", type);
+ idx = type >> 2;
+ if (idx < (sizeof(lowtag_Names) / sizeof(char *)))
+ printf("%s", lowtag_Names[idx]);
+ else
+ printf("unknown type (0x%0x)", type);
break;
}
}
idx = type >> 2;
if (idx < (sizeof(lowtag_Names) / sizeof(char *)))
- printf(", %s", lowtag_Names[idx]);
+ printf(", %s", lowtag_Names[idx]);
else
- printf(", unknown type (0x%0x)", type);
+ printf(", unknown type (0x%0x)", type);
switch (widetag_of(obj)) {
case CHARACTER_WIDETAG:
int length = 0;
if (!is_valid_lisp_addr((os_vm_address_t)native_pointer(obj)))
- printf("(invalid Lisp-level address)");
+ printf("(invalid Lisp-level address)");
else if (obj == NIL)
printf("NIL");
else {
}
}
+static void print_unknown(lispobj obj)
+{
+ printf("unknown object: %p", (void *)obj);
+}
+
+static void print_unknown(lispobj obj)
+{
+ printf("unknown object: %p", (void *)obj);
+}
+
static void print_list(lispobj obj)
{
if (!is_valid_lisp_addr((os_vm_address_t)native_pointer(obj))) {
- printf("(invalid address)");
+ printf("(invalid address)");
} else if (obj == NIL) {
printf(" (NIL)");
} else {
char buffer[16];
print_obj("type: ", ((struct instance *)native_pointer(obj))->slots[0]);
for (i = 1; i < HeaderValue(instance->header); i++) {
- sprintf(buffer, "slot %d: ", i);
- print_obj(buffer, instance->slots[i]);
+ sprintf(buffer, "slot %d: ", i);
+ print_obj(buffer, instance->slots[i]);
}
}
ptr = (lispobj *) native_pointer(obj);
if (!is_valid_lisp_addr((os_vm_address_t)obj)) {
- printf("(invalid address)");
- return;
+ printf("(invalid address)");
+ return;
}
header = *ptr;
print_obj(*slots++, *ptr++);
} else {
print_obj("???: ", *ptr++);
- }
+ }
}
}
/* FIXME: Yikes again! This, like subtype_Names[], needs to depend
* on the values in sbcl.h (or perhaps be generated automatically
* by GENESIS as part of sbcl.h). */
-static char *symbol_slots[] = {"value: ", "unused: ",
+static char *symbol_slots[] = {"value: ", "hash: ",
"plist: ", "name: ", "package: ",
#ifdef LISP_FEATURE_SB_THREAD
"tls-index: " ,
-#endif
+#endif
NULL};
static char *ratio_slots[] = {"numer: ", "denom: ", NULL};
static char *complex_slots[] = {"real: ", "imag: ", NULL};
static void print_otherptr(lispobj obj)
{
if (!is_valid_lisp_addr((os_vm_address_t)obj)) {
- printf("(invalid address)");
+ printf("(invalid address)");
} else {
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
lispobj *ptr;
unsigned long header;
unsigned long length;
int count, type, index;
char *cptr, buffer[16];
- ptr = (lispobj*) native_pointer(obj);
- if (ptr == NULL) {
- printf(" (NULL Pointer)");
- return;
- }
+ ptr = (lispobj*) native_pointer(obj);
+ if (ptr == NULL) {
+ printf(" (NULL Pointer)");
+ return;
+ }
- header = *ptr++;
- length = (*ptr) >> 2;
- count = header>>8;
- type = widetag_of(header);
+ header = *ptr++;
+ length = (*ptr) >> 2;
+ count = header>>8;
+ type = widetag_of(header);
print_obj("header: ", header);
if (lowtag_of(header) != OTHER_IMMEDIATE_0_LOWTAG &&
- lowtag_of(header) != OTHER_IMMEDIATE_1_LOWTAG) {
+ lowtag_of(header) != OTHER_IMMEDIATE_1_LOWTAG) {
NEWLINE_OR_RETURN;
printf("(invalid header object)");
return;
print_slots(symbol_slots, count, ptr);
break;
+#if N_WORD_BITS == 32
case SINGLE_FLOAT_WIDETAG:
NEWLINE_OR_RETURN;
printf("%g", ((struct single_float *)native_pointer(obj))->value);
break;
-
+#endif
case DOUBLE_FLOAT_WIDETAG:
NEWLINE_OR_RETURN;
printf("%g", ((struct double_float *)native_pointer(obj))->value);
case SIMPLE_BASE_STRING_WIDETAG:
#ifdef SIMPLE_CHARACTER_STRING_WIDETAG
- case SIMPLE_CHARACTER_STRING_WIDETAG: /* FIXME */
+ case SIMPLE_CHARACTER_STRING_WIDETAG: /* FIXME */
#endif
NEWLINE_OR_RETURN;
cptr = (char *)(ptr+1);
case SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG:
case SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG:
#ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG
- case 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:
+ case SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG:
#endif
#ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG
- case 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:
+ case SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG:
#endif
case SIMPLE_ARRAY_SINGLE_FLOAT_WIDETAG:
case SIMPLE_ARRAY_DOUBLE_FLOAT_WIDETAG:
case SIMPLE_ARRAY_LONG_FLOAT_WIDETAG:
#endif
#ifdef SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG
- case 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:
+ case SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG:
#endif
#ifdef SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG
- case SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG:
+ case SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG:
#endif
case COMPLEX_BASE_STRING_WIDETAG:
#ifdef COMPLEX_CHARACTER_STRING_WIDETAG
- case COMPLEX_CHARACTER_STRING_WIDETAG:
+ case COMPLEX_CHARACTER_STRING_WIDETAG:
#endif
case COMPLEX_VECTOR_NIL_WIDETAG:
case COMPLEX_BIT_VECTOR_WIDETAG:
break;
case VALUE_CELL_HEADER_WIDETAG:
- print_slots(value_cell_slots, 1, ptr);
+ print_slots(value_cell_slots, 1, ptr);
break;
case SAP_WIDETAG:
NEWLINE_OR_RETURN;
-#ifndef alpha
+#ifndef LISP_FEATURE_ALPHA
printf("0x%08lx", (unsigned long) *ptr);
#else
printf("0x%016lx", *(lispobj*)(ptr+1));
break;
case WEAK_POINTER_WIDETAG:
- print_slots(weak_pointer_slots, 1, ptr);
+ print_slots(weak_pointer_slots, 1, ptr);
break;
case CHARACTER_WIDETAG:
printf("pointer to an immediate?");
break;
- case FDEFN_WIDETAG:
- print_slots(fdefn_slots, count, ptr);
- break;
-
+ case FDEFN_WIDETAG:
+ print_slots(fdefn_slots, count, ptr);
+ break;
+
default:
NEWLINE_OR_RETURN;
printf("Unknown header object?");
static void print_obj(char *prefix, lispobj obj)
{
+#ifdef LISP_FEATURE_X86_64
+ static void (*verbose_fns[])(lispobj obj)
+ = {print_fixnum, print_struct, print_otherimm, print_unknown,
+ print_unknown, print_unknown, print_otherimm, print_list,
+ print_fixnum, print_otherptr, print_otherimm, print_unknown,
+ print_unknown, print_unknown, print_otherimm, print_otherptr};
+ static void (*brief_fns[])(lispobj obj)
+ = {brief_fixnum, brief_struct, brief_otherimm, print_unknown,
+ print_unknown, print_unknown, brief_otherimm, brief_list,
+ brief_fixnum, brief_otherptr, brief_otherimm, print_unknown,
+ print_unknown, print_unknown,brief_otherimm, brief_otherptr};
+#else
static void (*verbose_fns[])(lispobj obj)
- = {print_fixnum, print_struct, print_otherimm, print_list,
- print_fixnum, print_otherptr, print_otherimm, print_otherptr};
+ = {print_fixnum, print_struct, print_otherimm, print_list,
+ print_fixnum, print_otherptr, print_otherimm, print_otherptr};
static void (*brief_fns[])(lispobj obj)
- = {brief_fixnum, brief_struct, brief_otherimm, brief_list,
- brief_fixnum, brief_otherptr, brief_otherimm, brief_otherptr};
+ = {brief_fixnum, brief_struct, brief_otherimm, brief_list,
+ brief_fixnum, brief_otherptr, brief_otherimm, brief_otherptr};
+#endif
int type = lowtag_of(obj);
struct var *var = lookup_by_obj(obj);
char buffer[256];
dont_descend = 1;
if (var == NULL &&
- /* FIXME: What does this "x & y & z & .." expression mean? */
- (obj & FUN_POINTER_LOWTAG & LIST_POINTER_LOWTAG & INSTANCE_POINTER_LOWTAG & OTHER_POINTER_LOWTAG) != 0)
+ /* FIXME: What does this "x & y & z & .." expression mean? */
+ (obj & FUN_POINTER_LOWTAG & LIST_POINTER_LOWTAG & INSTANCE_POINTER_LOWTAG & OTHER_POINTER_LOWTAG) != 0)
var = define_var(NULL, obj, 0);
if (var != NULL)
{
printf("lispobj 0x%lx\n", (unsigned long)obj);
}
-
+
#endif /* defined(LISP_FEATURE_SB_LDB) */