3 This code was written as part of the CMU Common Lisp project at
4 Carnegie Mellon University, and has been placed in the public domain.
13 #include "internals.h"
18 static int max_lines = 20, cur_lines = 0;
19 static int max_depth = 5, brief_depth = 2, cur_depth = 0;
20 static int max_length = 5;
21 static boolean dont_decend = FALSE, skip_newline = FALSE;
22 static int cur_clock = 0;
24 static void print_obj(char *prefix, lispobj obj);
26 #define NEWLINE if (continue_p(TRUE)) newline(NULL); else return;
28 char *lowtag_Names[] = {
31 "other immediate [0]",
35 "other immediate [1]",
39 char *subtype_Names[] = {
49 #ifdef type_DoubleDoubleFloat
50 "double-double float",
53 #ifdef type_ComplexSingleFloat
54 "complex single float",
56 #ifdef type_ComplexDoubleFloat
57 "complex double float",
59 #ifdef type_ComplexLongFloat
62 #ifdef type_ComplexDoubleDoubleFloat
63 "complex double-double float",
69 "(simple-array (unsigned-byte 2) (*))",
70 "(simple-array (unsigned-byte 4) (*))",
71 "(simple-array (unsigned-byte 8) (*))",
72 "(simple-array (unsigned-byte 16) (*))",
73 "(simple-array (unsigned-byte 32) (*))",
74 #ifdef type_SimpleArraySignedByte8
75 "(simple-array (signed-byte 8) (*))",
77 #ifdef type_SimpleArraySignedByte16
78 "(simple-array (signed-byte 16) (*))",
80 #ifdef type_SimpleArraySignedByte30
81 "(simple-array fixnum (*))",
83 #ifdef type_SimpleArraySignedByte32
84 "(simple-array (signed-byte 32) (*))",
86 "(simple-array single-float (*))",
87 "(simple-array double-float (*))",
88 #ifdef type_SimpleArrayLongFloat
89 "(simple-array long-float (*))",
91 #ifdef type_SimpleArrayDoubleDoubleFloat
92 "(simple-array double-double-float (*))",
94 #ifdef type_SimpleArrayComplexSingleFloat
95 "(simple-array (complex single-float) (*))",
97 #ifdef type_SimpleArrayComplexDoubleFloat
98 "(simple-array (complex double-float) (*))",
100 #ifdef type_SimpleArrayComplexLongFloat
101 "(simple-array (complex long-float) (*))",
103 #ifdef type_SimpleArrayComplexDoubleDoubleFloat
104 "(simple-array (complex double-double-float) (*))",
107 "complex-bit-vector",
113 "funcallable-instance header",
114 "byte code function",
116 /* "unused function header 3",*/
117 "closure function header",
127 #ifdef type_ScavengerHook
135 static char *spaces =
140 fputs(spaces, stdout);
144 fputs(spaces + 64 - in, stdout);
148 continue_p(boolean newline)
152 if (cur_depth >= max_depth || dont_decend)
157 skip_newline = FALSE;
161 if (cur_lines >= max_lines) {
163 printf("More? [y] ");
166 result = fgets(buffer, sizeof(buffer), stdin);
168 if (result == NULL || buffer[0] == 'n' || buffer[0] == 'N')
183 fputs(label, stdout);
185 indent(cur_depth * 2);
190 brief_fixnum(lispobj obj)
193 printf("%ld", ((long) obj) >> 2);
195 printf("%d", ((s32) obj) >> 2);
200 print_fixnum(lispobj obj)
203 printf(": %ld", ((long) obj) >> 2);
205 printf(": %d", ((s32) obj) >> 2);
210 brief_otherimm(lispobj obj)
218 c = (obj >> 8) & 0xff;
224 printf("#\\Newline");
227 printf("#\\Backspace");
233 strcpy(buffer, "#\\");
235 strcat(buffer, "m-");
239 strcat(buffer, "c-");
242 printf("%s%c", buffer, c);
247 case type_UnboundMarker:
248 printf("<unbound marker>");
253 if (idx < (sizeof(subtype_Names) / sizeof(char *)))
254 printf("%s", subtype_Names[idx]);
257 printf("unknown type (0x%0x)", type);
263 print_otherimm(lispobj obj)
270 if (idx < (sizeof(subtype_Names) / sizeof(char *)))
271 printf(", %s", subtype_Names[idx]);
274 printf(", unknown type (0x%0x)", type);
276 switch (TypeOf(obj)) {
283 case type_UnboundMarker:
287 printf(": data=%ld", (obj >> 8) & 0xffffff);
293 brief_list(lispobj obj)
298 if (!valid_addr((os_vm_address_t) obj))
299 printf("(invalid address)");
304 while (LowtagOf(obj) == type_ListPointer) {
305 struct cons *cons = (struct cons *) PTR(obj);
309 if (++length >= max_length) {
314 print_obj(NULL, cons->car);
322 print_obj(NULL, obj);
329 print_list(lispobj obj)
331 if (!valid_addr((os_vm_address_t) obj))
332 printf("(invalid address)");
336 struct cons *cons = (struct cons *) PTR(obj);
338 print_obj("car: ", cons->car);
339 print_obj("cdr: ", cons->cdr);
344 brief_struct(lispobj obj)
346 printf("#<ptr to 0x%08lx instance>",
347 ((struct instance *) PTR(obj))->slots[0]);
351 print_struct(lispobj obj)
353 struct instance *instance = (struct instance *) PTR(obj);
357 print_obj("type: ", ((struct instance *) PTR(obj))->slots[0]);
358 for (i = 1; i < HeaderValue(instance->header); i++) {
359 sprintf(buffer, "slot %d: ", i);
360 print_obj(buffer, instance->slots[i]);
365 print_string(struct vector* vector)
370 for (charptr = (char *) vector->data; *charptr != '\0'; charptr++) {
376 uint16_t *charptr = (uint16_t *) vector->data;
377 int len = fixnum_value(vector->length);
379 utf16_output(charptr, len);
384 brief_otherptr(lispobj obj)
386 lispobj *ptr, header;
388 struct symbol *symbol;
389 struct vector *vector;
391 ptr = (lispobj *) PTR(obj);
393 if (!valid_addr((os_vm_address_t) obj)) {
394 printf("(invalid address)");
399 type = TypeOf(header);
401 case type_SymbolHeader:
402 symbol = (struct symbol *) ptr;
403 vector = (struct vector *) PTR(symbol->name);
404 print_string(vector);
407 case type_SimpleString:
408 vector = (struct vector *) ptr;
410 print_string(vector);
416 brief_otherimm(header);
422 print_slots(char **slots, int count, lispobj * ptr)
426 print_obj(*slots++, *ptr++);
428 print_obj("???: ", *ptr++);
431 static char *symbol_slots[] = { "value: ", "hash: ",
432 "plist: ", "name: ", "package: ", NULL
434 static char *ratio_slots[] = { "numer: ", "denom: ", NULL };
435 static char *complex_slots[] = { "real: ", "imag: ", NULL };
436 static char *code_slots[] = { "words: ", "entry: ", "debug: ", NULL };
437 static char *array_slots[] = { "fill-pointer: ",
443 /* Some reasonable number of dimensions */
454 static char *simple_array_slots[] = { "length: ",
458 #if (defined(i386) || defined(__x86_64))
459 static char *fn_slots[] =
460 { "inst start: ", "next: ", "name: ", "arglist: ", "type: ", NULL };
462 static char *fn_slots[] =
463 { "self: ", "next: ", "name: ", "arglist: ", "type: ", NULL };
466 static char *closure_slots[] = { "fn: ", NULL };
467 static char *funcallable_instance_slots[] =
468 { "fn: ", "lexenv: ", "layout: ", NULL };
469 static char *weak_pointer_slots[] = { "value: ", "broken: ",
475 static char *fdefn_slots[] = { "name: ", "function: ", "raw_addr: ", NULL };
476 static char *value_cell_slots[] = { "value: ", NULL };
478 #ifdef type_ScavengerHook
479 static char *scavenger_hook_slots[] =
481 { "value: ", "function: ", "next: ", NULL };
485 print_otherptr(lispobj obj)
487 if (!valid_addr((os_vm_address_t) obj))
488 printf("(invalid address)");
492 unsigned long header;
493 unsigned long length;
499 int count, type, index;
503 ptr = (unsigned long *) PTR(obj);
504 if (ptr == (unsigned long *) NULL) {
506 ptr = (u32 *) PTR(obj);
507 if (ptr == (u32 *) NULL) {
509 printf(" (NULL Pointer)");
514 length = fixnum_value(*ptr);
516 type = TypeOf(header);
518 print_obj("header: ", header);
519 if (LowtagOf(header) != type_OtherImmediate0
520 && LowtagOf(header) != type_OtherImmediate1) {
522 printf("(invalid header object)");
532 printf("%08lx", *--ptr);
536 print_slots(ratio_slots, count, ptr);
540 print_slots(complex_slots, count, ptr);
543 case type_SymbolHeader:
544 print_slots(symbol_slots, count, ptr);
547 case type_SingleFloat:
549 printf("%g", ((struct single_float *) PTR(obj))->value);
552 case type_DoubleFloat:
554 printf("%.15lg", ((struct double_float *) PTR(obj))->value);
557 #ifdef type_LongFloat
560 printf("%Lg", ((struct long_float *) PTR(obj))->value);
564 #ifdef type_DoubleDoubleFloat
565 case type_DoubleDoubleFloat:
567 printf("%.15lg %.15lg", ((struct double_double_float *) PTR(obj))->hi,
568 ((struct double_double_float *) PTR(obj))->lo);
572 #ifdef type_ComplexSingleFloat
573 case type_ComplexSingleFloat:
575 printf("%g", ((struct complex_single_float *) PTR(obj))->real);
577 printf("%g", ((struct complex_single_float *) PTR(obj))->imag);
581 #ifdef type_ComplexDoubleFloat
582 case type_ComplexDoubleFloat:
584 printf("%.15lg", ((struct complex_double_float *) PTR(obj))->real);
586 printf("%.15lg", ((struct complex_double_float *) PTR(obj))->imag);
590 #ifdef type_ComplexLongFloat
591 case type_ComplexLongFloat:
593 printf("%Lg", ((struct complex_long_float *) PTR(obj))->real);
595 printf("%Lg", ((struct complex_long_float *) PTR(obj))->imag);
599 #ifdef type_ComplexDoubleDoubleFloat
600 case type_ComplexDoubleDoubleFloat:
602 printf("%.15lg %.15lg", ((struct complex_double_double_float *) PTR(obj))->real_hi,
603 ((struct complex_double_double_float *) PTR(obj))->real_lo);
605 printf("%.15lg %.15lg", ((struct complex_double_double_float *) PTR(obj))->imag_hi,
606 ((struct complex_double_double_float *) PTR(obj))->imag_lo);
611 case type_SimpleString:
614 /* Need to back up one to get the start of the vector */
615 print_string((struct vector*) (ptr - 1));
619 case type_SimpleVector:
621 printf("length = %ld", length);
624 while (length-- > 0) {
625 sprintf(buffer, "%d: ", index++);
626 print_obj(buffer, *ptr++);
630 case type_InstanceHeader:
632 printf("length = %d", count);
634 while (count-- > 0) {
635 sprintf(buffer, "%d: ", index++);
636 print_obj(buffer, *ptr++);
640 case type_SimpleArray:
641 case type_SimpleBitVector:
642 case type_SimpleArrayUnsignedByte2:
643 case type_SimpleArrayUnsignedByte4:
644 case type_SimpleArrayUnsignedByte8:
645 case type_SimpleArrayUnsignedByte16:
646 case type_SimpleArrayUnsignedByte32:
647 #ifdef type_SimpleArraySignedByte8
648 case type_SimpleArraySignedByte8:
650 #ifdef type_SimpleArraySignedByte16
651 case type_SimpleArraySignedByte16:
653 #ifdef type_SimpleArraySignedByte30
654 case type_SimpleArraySignedByte30:
656 #ifdef type_SimpleArraySignedByte32
657 case type_SimpleArraySignedByte32:
659 case type_SimpleArraySingleFloat:
660 case type_SimpleArrayDoubleFloat:
661 #ifdef type_SimpleArrayLongFloat
662 case type_SimpleArrayLongFloat:
664 #ifdef type_SimpleArrayDoubleDoubleFloat
665 case type_SimpleArrayDoubleDoubleFloat:
667 #ifdef type_SimpleArrayComplexSingleFloat
668 case type_SimpleArrayComplexSingleFloat:
670 #ifdef type_SimpleArrayComplexDoubleFloat
671 case type_SimpleArrayComplexDoubleFloat:
673 #ifdef type_SimpleArrayComplexLongFloat
674 case type_SimpleArrayComplexLongFloat:
676 #ifdef type_SimpleArrayComplexDoubleDoubleFloat
677 case type_SimpleArrayComplexDoubleDoubleFloat:
679 print_slots(simple_array_slots, 1, ptr);
681 case type_ComplexString:
682 case type_ComplexBitVector:
683 case type_ComplexVector:
684 case type_ComplexArray:
685 print_slots(array_slots, count, ptr);
688 case type_CodeHeader:
689 print_slots(code_slots, count - 1, ptr);
692 case type_FunctionHeader:
693 case type_ClosureFunctionHeader:
694 print_slots(fn_slots, 5, ptr);
697 case type_ReturnPcHeader:
698 print_obj("code: ", obj - (count * 4));
701 case type_ClosureHeader:
702 print_slots(closure_slots, count, ptr);
705 case type_FuncallableInstanceHeader:
706 print_slots(funcallable_instance_slots, count, ptr);
709 case type_ValueCellHeader:
710 print_slots(value_cell_slots, 1, ptr);
716 printf("0x%08lx", *ptr);
718 printf("0x%016lx", *(long *) (ptr + 1));
722 case type_WeakPointer:
723 print_slots(weak_pointer_slots, 3, ptr);
727 case type_UnboundMarker:
729 printf("pointer to an immediate?");
733 print_slots(fdefn_slots, count, ptr);
736 #ifdef type_ScavengerHook
737 case type_ScavengerHook:
738 print_slots(scavenger_hook_slots, count, ptr);
744 printf("Unknown header object?");
751 print_obj(char *prefix, lispobj obj)
753 static void (*verbose_fns[]) (lispobj obj)
754 = { print_fixnum, print_otherptr, print_otherimm, print_list,
755 print_fixnum, print_struct, print_otherimm, print_otherptr
757 static void (*brief_fns[]) (lispobj obj)
758 = { brief_fixnum, brief_otherptr, brief_otherimm, brief_list,
759 brief_fixnum, brief_struct, brief_otherimm, brief_otherptr
761 int type = LowtagOf(obj);
762 struct var *var = lookup_by_obj(obj);
764 boolean verbose = cur_depth < brief_depth;
767 if (!continue_p(verbose))
770 if (var != NULL && var_clock(var) == cur_clock)
774 && (obj & type_FunctionPointer & type_ListPointer & type_InstancePointer
775 & type_OtherPointer) != 0)
776 var = define_var(NULL, obj, FALSE);
779 var_setclock(var, cur_clock);
784 sprintf(buffer, "$%s=", var_name(var));
788 printf("%s0x%08lx: ", prefix, obj);
789 if (cur_depth < brief_depth) {
790 fputs(lowtag_Names[type], stdout);
791 (*verbose_fns[type]) (obj);
793 (*brief_fns[type]) (obj);
796 printf("$%s", var_name(var));
799 printf("$%s=", var_name(var));
800 (*brief_fns[type]) (obj);
829 brief_print(lispobj obj)