1 /* Support for printing Pascal values for GDB, the GNU debugger.
2 Copyright 2000, 2001, 2003
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 /* This file is derived from c-valprint.c */
24 #include "gdb_obstack.h"
27 #include "expression.h"
34 #include "typeprint.h"
44 /* Print data of type TYPE located at VALADDR (within GDB), which came from
45 the inferior at address ADDRESS, onto stdio stream STREAM according to
46 FORMAT (a letter or 0 for natural format). The data at VALADDR is in
49 If the data are a string pointer, returns the number of string characters
52 If DEREF_REF is nonzero, then dereference references, otherwise just print
55 The PRETTY parameter controls prettyprinting. */
59 pascal_val_print (struct type *type, char *valaddr, int embedded_offset,
60 CORE_ADDR address, struct ui_file *stream, int format,
61 int deref_ref, int recurse, enum val_prettyprint pretty)
63 unsigned int i = 0; /* Number of characters printed */
67 int length_pos, length_size, string_pos;
73 switch (TYPE_CODE (type))
76 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
78 elttype = check_typedef (TYPE_TARGET_TYPE (type));
79 eltlen = TYPE_LENGTH (elttype);
80 len = TYPE_LENGTH (type) / eltlen;
81 if (prettyprint_arrays)
83 print_spaces_filtered (2 + 2 * recurse, stream);
85 /* For an array of chars, print with string syntax. */
87 ((TYPE_CODE (elttype) == TYPE_CODE_INT)
88 || ((current_language->la_language == language_m2)
89 && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
90 && (format == 0 || format == 's'))
92 /* If requested, look for the first null char and only print
94 if (stop_print_at_null)
96 unsigned int temp_len;
98 /* Look for a NULL char. */
100 (valaddr + embedded_offset)[temp_len]
101 && temp_len < len && temp_len < print_max;
106 LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0);
111 fprintf_filtered (stream, "{");
112 /* If this is a virtual function table, print the 0th
113 entry specially, and the rest of the members normally. */
114 if (pascal_object_is_vtbl_ptr_type (elttype))
117 fprintf_filtered (stream, "%d vtable entries", len - 1);
123 val_print_array_elements (type, valaddr + embedded_offset, address, stream,
124 format, deref_ref, recurse, pretty, i);
125 fprintf_filtered (stream, "}");
129 /* Array of unspecified length: treat like pointer to first elt. */
131 goto print_unpacked_pointer;
134 if (format && format != 's')
136 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
139 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
141 /* Print the unmangled name if desired. */
142 /* Print vtable entry - we only get here if we ARE using
143 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
144 /* Extract the address, assume that it is unsigned. */
145 print_address_demangle (extract_unsigned_integer (valaddr + embedded_offset, TYPE_LENGTH (type)),
149 elttype = check_typedef (TYPE_TARGET_TYPE (type));
150 if (TYPE_CODE (elttype) == TYPE_CODE_METHOD)
152 pascal_object_print_class_method (valaddr + embedded_offset, type, stream);
154 else if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
156 pascal_object_print_class_member (valaddr + embedded_offset,
157 TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (type)),
162 addr = unpack_pointer (type, valaddr + embedded_offset);
163 print_unpacked_pointer:
164 elttype = check_typedef (TYPE_TARGET_TYPE (type));
166 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
168 /* Try to print what function it points to. */
169 print_address_demangle (addr, stream, demangle);
170 /* Return value is irrelevant except for string pointers. */
174 if (addressprint && format != 's')
176 print_address_numeric (addr, 1, stream);
179 /* For a pointer to char or unsigned char, also print the string
180 pointed to, unless pointer is null. */
181 if (TYPE_LENGTH (elttype) == 1
182 && TYPE_CODE (elttype) == TYPE_CODE_INT
183 && (format == 0 || format == 's')
186 /* no wide string yet */
187 i = val_print_string (addr, -1, 1, stream);
189 /* also for pointers to pascal strings */
190 /* Note: this is Free Pascal specific:
191 as GDB does not recognize stabs pascal strings
192 Pascal strings are mapped to records
193 with lowercase names PM */
194 if (is_pascal_string_type (elttype, &length_pos, &length_size,
195 &string_pos, &char_size, NULL)
198 ULONGEST string_length;
200 buffer = xmalloc (length_size);
201 read_memory (addr + length_pos, buffer, length_size);
202 string_length = extract_unsigned_integer (buffer, length_size);
204 i = val_print_string (addr + string_pos, string_length, char_size, stream);
206 else if (pascal_object_is_vtbl_member (type))
208 /* print vtbl's nicely */
209 CORE_ADDR vt_address = unpack_pointer (type, valaddr + embedded_offset);
211 struct minimal_symbol *msymbol =
212 lookup_minimal_symbol_by_pc (vt_address);
213 if ((msymbol != NULL)
214 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
216 fputs_filtered (" <", stream);
217 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
218 fputs_filtered (">", stream);
220 if (vt_address && vtblprint)
222 struct value *vt_val;
223 struct symbol *wsym = (struct symbol *) NULL;
225 struct block *block = (struct block *) NULL;
229 wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block,
230 VAR_DOMAIN, &is_this_fld, NULL);
234 wtype = SYMBOL_TYPE (wsym);
238 wtype = TYPE_TARGET_TYPE (type);
240 vt_val = value_at (wtype, vt_address, NULL);
241 val_print (VALUE_TYPE (vt_val), VALUE_CONTENTS (vt_val), 0,
242 VALUE_ADDRESS (vt_val), stream, format,
243 deref_ref, recurse + 1, pretty);
246 fprintf_filtered (stream, "\n");
247 print_spaces_filtered (2 + 2 * recurse, stream);
252 /* Return number of characters printed, including the terminating
253 '\0' if we reached the end. val_print_string takes care including
254 the terminating '\0' if necessary. */
259 case TYPE_CODE_MEMBER:
260 error ("not implemented: member type in pascal_val_print");
264 elttype = check_typedef (TYPE_TARGET_TYPE (type));
265 if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
267 pascal_object_print_class_member (valaddr + embedded_offset,
268 TYPE_DOMAIN_TYPE (elttype),
274 fprintf_filtered (stream, "@");
275 /* Extract the address, assume that it is unsigned. */
276 print_address_numeric
277 (extract_unsigned_integer (valaddr + embedded_offset,
278 TARGET_PTR_BIT / HOST_CHAR_BIT),
281 fputs_filtered (": ", stream);
283 /* De-reference the reference. */
286 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
288 struct value *deref_val =
290 (TYPE_TARGET_TYPE (type),
291 unpack_pointer (lookup_pointer_type (builtin_type_void),
292 valaddr + embedded_offset),
294 val_print (VALUE_TYPE (deref_val),
295 VALUE_CONTENTS (deref_val), 0,
296 VALUE_ADDRESS (deref_val), stream, format,
297 deref_ref, recurse + 1, pretty);
300 fputs_filtered ("???", stream);
304 case TYPE_CODE_UNION:
305 if (recurse && !unionprint)
307 fprintf_filtered (stream, "{...}");
311 case TYPE_CODE_STRUCT:
312 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
314 /* Print the unmangled name if desired. */
315 /* Print vtable entry - we only get here if NOT using
316 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
317 /* Extract the address, assume that it is unsigned. */
318 print_address_demangle
319 (extract_unsigned_integer (valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
320 TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))),
325 if (is_pascal_string_type (type, &length_pos, &length_size,
326 &string_pos, &char_size, NULL))
328 len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
329 LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
332 pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
333 recurse, pretty, NULL, 0);
340 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
343 len = TYPE_NFIELDS (type);
344 val = unpack_long (type, valaddr + embedded_offset);
345 for (i = 0; i < len; i++)
348 if (val == TYPE_FIELD_BITPOS (type, i))
355 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
359 print_longest (stream, 'd', 0, val);
366 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
369 /* FIXME, we should consider, at least for ANSI C language, eliminating
370 the distinction made between FUNCs and POINTERs to FUNCs. */
371 fprintf_filtered (stream, "{");
372 type_print (type, "", stream, -1);
373 fprintf_filtered (stream, "} ");
374 /* Try to print what function it points to, and its address. */
375 print_address_demangle (address, stream, demangle);
379 format = format ? format : output_format;
381 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
384 val = unpack_long (type, valaddr + embedded_offset);
386 fputs_filtered ("false", stream);
388 fputs_filtered ("true", stream);
391 fputs_filtered ("true (", stream);
392 fprintf_filtered (stream, "%ld)", (long int) val);
397 case TYPE_CODE_RANGE:
398 /* FIXME: create_range_type does not set the unsigned bit in a
399 range type (I think it probably should copy it from the target
400 type), so we won't print values which are too large to
401 fit in a signed integer correctly. */
402 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
403 print with the target type, though, because the size of our type
404 and the target type might differ). */
408 format = format ? format : output_format;
411 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
415 val_print_type_code_int (type, valaddr + embedded_offset, stream);
420 format = format ? format : output_format;
423 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
427 val = unpack_long (type, valaddr + embedded_offset);
428 if (TYPE_UNSIGNED (type))
429 fprintf_filtered (stream, "%u", (unsigned int) val);
431 fprintf_filtered (stream, "%d", (int) val);
432 fputs_filtered (" ", stream);
433 LA_PRINT_CHAR ((unsigned char) val, stream);
440 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
444 print_floating (valaddr + embedded_offset, type, stream);
448 case TYPE_CODE_BITSTRING:
450 elttype = TYPE_INDEX_TYPE (type);
451 CHECK_TYPEDEF (elttype);
452 if (TYPE_STUB (elttype))
454 fprintf_filtered (stream, "<incomplete type>");
460 struct type *range = elttype;
461 LONGEST low_bound, high_bound;
463 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
467 fputs_filtered ("B'", stream);
469 fputs_filtered ("[", stream);
471 i = get_discrete_bounds (range, &low_bound, &high_bound);
475 fputs_filtered ("<error value>", stream);
479 for (i = low_bound; i <= high_bound; i++)
481 int element = value_bit_index (type, valaddr + embedded_offset, i);
485 goto maybe_bad_bstring;
488 fprintf_filtered (stream, "%d", element);
492 fputs_filtered (", ", stream);
493 print_type_scalar (range, i, stream);
496 if (i + 1 <= high_bound && value_bit_index (type, valaddr + embedded_offset, ++i))
499 fputs_filtered ("..", stream);
500 while (i + 1 <= high_bound
501 && value_bit_index (type, valaddr + embedded_offset, ++i))
503 print_type_scalar (range, j, stream);
509 fputs_filtered ("'", stream);
511 fputs_filtered ("]", stream);
516 fprintf_filtered (stream, "void");
519 case TYPE_CODE_ERROR:
520 fprintf_filtered (stream, "<error type>");
523 case TYPE_CODE_UNDEF:
524 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
525 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
526 and no complete type for struct foo in that file. */
527 fprintf_filtered (stream, "<incomplete type>");
531 error ("Invalid pascal type code %d in symbol table.", TYPE_CODE (type));
538 pascal_value_print (struct value *val, struct ui_file *stream, int format,
539 enum val_prettyprint pretty)
541 struct type *type = VALUE_TYPE (val);
543 /* If it is a pointer, indicate what it points to.
545 Print type also if it is a reference.
547 Object pascal: if it is a member pointer, we will take care
548 of that when we print it. */
549 if (TYPE_CODE (type) == TYPE_CODE_PTR ||
550 TYPE_CODE (type) == TYPE_CODE_REF)
552 /* Hack: remove (char *) for char strings. Their
553 type is indicated by the quoted string anyway. */
554 if (TYPE_CODE (type) == TYPE_CODE_PTR &&
555 TYPE_NAME (type) == NULL &&
556 TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
557 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
563 fprintf_filtered (stream, "(");
564 type_print (type, "", stream, -1);
565 fprintf_filtered (stream, ") ");
568 return val_print (type, VALUE_CONTENTS (val), VALUE_EMBEDDED_OFFSET (val),
569 VALUE_ADDRESS (val) + VALUE_OFFSET (val),
570 stream, format, 1, 0, pretty);
574 /******************************************************************************
575 Inserted from cp-valprint
576 ******************************************************************************/
578 extern int vtblprint; /* Controls printing of vtbl's */
579 extern int objectprint; /* Controls looking up an object's derived type
580 using what we find in its vtables. */
581 static int pascal_static_field_print; /* Controls printing of static fields. */
583 static struct obstack dont_print_vb_obstack;
584 static struct obstack dont_print_statmem_obstack;
586 static void pascal_object_print_static_field (struct type *, struct value *,
587 struct ui_file *, int, int,
588 enum val_prettyprint);
591 pascal_object_print_value (struct type *, char *, CORE_ADDR, struct ui_file *,
592 int, int, enum val_prettyprint, struct type **);
595 pascal_object_print_class_method (char *valaddr, struct type *type,
596 struct ui_file *stream)
599 struct fn_field *f = NULL;
608 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
610 domain = TYPE_DOMAIN_TYPE (target_type);
611 if (domain == (struct type *) NULL)
613 fprintf_filtered (stream, "<unknown>");
616 addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
617 if (METHOD_PTR_IS_VIRTUAL (addr))
619 offset = METHOD_PTR_TO_VOFFSET (addr);
620 len = TYPE_NFN_FIELDS (domain);
621 for (i = 0; i < len; i++)
623 f = TYPE_FN_FIELDLIST1 (domain, i);
624 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
626 check_stub_method_group (domain, i);
627 for (j = 0; j < len2; j++)
629 if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
639 sym = find_pc_function (addr);
642 error ("invalid pointer to member function");
644 len = TYPE_NFN_FIELDS (domain);
645 for (i = 0; i < len; i++)
647 f = TYPE_FN_FIELDLIST1 (domain, i);
648 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
650 check_stub_method_group (domain, i);
651 for (j = 0; j < len2; j++)
653 if (DEPRECATED_STREQ (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
661 char *demangled_name;
663 fprintf_filtered (stream, "&");
664 fputs_filtered (kind, stream);
665 demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
666 DMGL_ANSI | DMGL_PARAMS);
667 if (demangled_name == NULL)
668 fprintf_filtered (stream, "<badly mangled name %s>",
669 TYPE_FN_FIELD_PHYSNAME (f, j));
672 fputs_filtered (demangled_name, stream);
673 xfree (demangled_name);
678 fprintf_filtered (stream, "(");
679 type_print (type, "", stream, -1);
680 fprintf_filtered (stream, ") %d", (int) addr >> 3);
684 /* It was changed to this after 2.4.5. */
685 const char pascal_vtbl_ptr_name[] =
686 {'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
688 /* Return truth value for assertion that TYPE is of the type
689 "pointer to virtual function". */
692 pascal_object_is_vtbl_ptr_type (struct type *type)
694 char *typename = type_name_no_tag (type);
696 return (typename != NULL
697 && strcmp (typename, pascal_vtbl_ptr_name) == 0);
700 /* Return truth value for the assertion that TYPE is of the type
701 "pointer to virtual function table". */
704 pascal_object_is_vtbl_member (struct type *type)
706 if (TYPE_CODE (type) == TYPE_CODE_PTR)
708 type = TYPE_TARGET_TYPE (type);
709 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
711 type = TYPE_TARGET_TYPE (type);
712 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
713 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
715 /* Virtual functions tables are full of pointers
716 to virtual functions. */
717 return pascal_object_is_vtbl_ptr_type (type);
724 /* Mutually recursive subroutines of pascal_object_print_value and c_val_print to
725 print out a structure's fields: pascal_object_print_value_fields and pascal_object_print_value.
727 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
728 same meanings as in pascal_object_print_value and c_val_print.
730 DONT_PRINT is an array of baseclass types that we
731 should not print, or zero if called from top level. */
734 pascal_object_print_value_fields (struct type *type, char *valaddr,
735 CORE_ADDR address, struct ui_file *stream,
736 int format, int recurse,
737 enum val_prettyprint pretty,
738 struct type **dont_print_vb,
739 int dont_print_statmem)
741 int i, len, n_baseclasses;
742 struct obstack tmp_obstack;
743 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
745 CHECK_TYPEDEF (type);
747 fprintf_filtered (stream, "{");
748 len = TYPE_NFIELDS (type);
749 n_baseclasses = TYPE_N_BASECLASSES (type);
751 /* Print out baseclasses such that we don't print
752 duplicates of virtual baseclasses. */
753 if (n_baseclasses > 0)
754 pascal_object_print_value (type, valaddr, address, stream,
755 format, recurse + 1, pretty, dont_print_vb);
757 if (!len && n_baseclasses == 1)
758 fprintf_filtered (stream, "<No data fields>");
763 if (dont_print_statmem == 0)
765 /* If we're at top level, carve out a completely fresh
766 chunk of the obstack and use that until this particular
767 invocation returns. */
768 tmp_obstack = dont_print_statmem_obstack;
769 obstack_finish (&dont_print_statmem_obstack);
772 for (i = n_baseclasses; i < len; i++)
774 /* If requested, skip printing of static fields. */
775 if (!pascal_static_field_print && TYPE_FIELD_STATIC (type, i))
778 fprintf_filtered (stream, ", ");
779 else if (n_baseclasses > 0)
783 fprintf_filtered (stream, "\n");
784 print_spaces_filtered (2 + 2 * recurse, stream);
785 fputs_filtered ("members of ", stream);
786 fputs_filtered (type_name_no_tag (type), stream);
787 fputs_filtered (": ", stream);
794 fprintf_filtered (stream, "\n");
795 print_spaces_filtered (2 + 2 * recurse, stream);
799 wrap_here (n_spaces (2 + 2 * recurse));
803 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
804 fputs_filtered ("\"( ptr \"", stream);
806 fputs_filtered ("\"( nodef \"", stream);
807 if (TYPE_FIELD_STATIC (type, i))
808 fputs_filtered ("static ", stream);
809 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
811 DMGL_PARAMS | DMGL_ANSI);
812 fputs_filtered ("\" \"", stream);
813 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
815 DMGL_PARAMS | DMGL_ANSI);
816 fputs_filtered ("\") \"", stream);
820 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
822 if (TYPE_FIELD_STATIC (type, i))
823 fputs_filtered ("static ", stream);
824 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
826 DMGL_PARAMS | DMGL_ANSI);
827 annotate_field_name_end ();
828 fputs_filtered (" = ", stream);
829 annotate_field_value ();
832 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
836 /* Bitfields require special handling, especially due to byte
838 if (TYPE_FIELD_IGNORE (type, i))
840 fputs_filtered ("<optimized out or zero length>", stream);
844 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
845 unpack_field_as_long (type, valaddr, i));
847 val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
848 stream, format, 0, recurse + 1, pretty);
853 if (TYPE_FIELD_IGNORE (type, i))
855 fputs_filtered ("<optimized out or zero length>", stream);
857 else if (TYPE_FIELD_STATIC (type, i))
859 /* struct value *v = value_static_field (type, i); v4.17 specific */
861 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
862 unpack_field_as_long (type, valaddr, i));
865 fputs_filtered ("<optimized out>", stream);
867 pascal_object_print_static_field (TYPE_FIELD_TYPE (type, i), v,
868 stream, format, recurse + 1,
873 /* val_print (TYPE_FIELD_TYPE (type, i),
874 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
875 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
876 stream, format, 0, recurse + 1, pretty); */
877 val_print (TYPE_FIELD_TYPE (type, i),
878 valaddr, TYPE_FIELD_BITPOS (type, i) / 8,
879 address + TYPE_FIELD_BITPOS (type, i) / 8,
880 stream, format, 0, recurse + 1, pretty);
883 annotate_field_end ();
886 if (dont_print_statmem == 0)
888 /* Free the space used to deal with the printing
889 of the members from top level. */
890 obstack_free (&dont_print_statmem_obstack, last_dont_print);
891 dont_print_statmem_obstack = tmp_obstack;
896 fprintf_filtered (stream, "\n");
897 print_spaces_filtered (2 * recurse, stream);
900 fprintf_filtered (stream, "}");
903 /* Special val_print routine to avoid printing multiple copies of virtual
907 pascal_object_print_value (struct type *type, char *valaddr, CORE_ADDR address,
908 struct ui_file *stream, int format, int recurse,
909 enum val_prettyprint pretty,
910 struct type **dont_print_vb)
912 struct obstack tmp_obstack;
913 struct type **last_dont_print
914 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
915 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
917 if (dont_print_vb == 0)
919 /* If we're at top level, carve out a completely fresh
920 chunk of the obstack and use that until this particular
921 invocation returns. */
922 tmp_obstack = dont_print_vb_obstack;
923 /* Bump up the high-water mark. Now alpha is omega. */
924 obstack_finish (&dont_print_vb_obstack);
927 for (i = 0; i < n_baseclasses; i++)
930 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
931 char *basename = TYPE_NAME (baseclass);
934 if (BASETYPE_VIA_VIRTUAL (type, i))
936 struct type **first_dont_print
937 = (struct type **) obstack_base (&dont_print_vb_obstack);
939 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
943 if (baseclass == first_dont_print[j])
946 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
949 boffset = baseclass_offset (type, i, valaddr, address);
953 fprintf_filtered (stream, "\n");
954 print_spaces_filtered (2 * recurse, stream);
956 fputs_filtered ("<", stream);
957 /* Not sure what the best notation is in the case where there is no
960 fputs_filtered (basename ? basename : "", stream);
961 fputs_filtered ("> = ", stream);
963 /* The virtual base class pointer might have been clobbered by the
964 user program. Make sure that it still points to a valid memory
967 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
969 /* FIXME (alloc): not safe is baseclass is really really big. */
970 base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
971 if (target_read_memory (address + boffset, base_valaddr,
972 TYPE_LENGTH (baseclass)) != 0)
976 base_valaddr = valaddr + boffset;
979 fprintf_filtered (stream, "<invalid address>");
981 pascal_object_print_value_fields (baseclass, base_valaddr, address + boffset,
982 stream, format, recurse, pretty,
983 (struct type **) obstack_base (&dont_print_vb_obstack),
985 fputs_filtered (", ", stream);
991 if (dont_print_vb == 0)
993 /* Free the space used to deal with the printing
994 of this type from top level. */
995 obstack_free (&dont_print_vb_obstack, last_dont_print);
996 /* Reset watermark so that we can continue protecting
997 ourselves from whatever we were protecting ourselves. */
998 dont_print_vb_obstack = tmp_obstack;
1002 /* Print value of a static member.
1003 To avoid infinite recursion when printing a class that contains
1004 a static instance of the class, we keep the addresses of all printed
1005 static member classes in an obstack and refuse to print them more
1008 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
1009 have the same meanings as in c_val_print. */
1012 pascal_object_print_static_field (struct type *type, struct value *val,
1013 struct ui_file *stream, int format,
1014 int recurse, enum val_prettyprint pretty)
1016 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
1018 CORE_ADDR *first_dont_print;
1022 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
1023 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
1028 if (VALUE_ADDRESS (val) == first_dont_print[i])
1030 fputs_filtered ("<same as static member of an already seen type>",
1036 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
1037 sizeof (CORE_ADDR));
1039 CHECK_TYPEDEF (type);
1040 pascal_object_print_value_fields (type, VALUE_CONTENTS (val), VALUE_ADDRESS (val),
1041 stream, format, recurse, pretty, NULL, 1);
1044 val_print (type, VALUE_CONTENTS (val), 0, VALUE_ADDRESS (val),
1045 stream, format, 0, recurse, pretty);
1049 pascal_object_print_class_member (char *valaddr, struct type *domain,
1050 struct ui_file *stream, char *prefix)
1053 /* VAL is a byte offset into the structure type DOMAIN.
1054 Find the name of the field for that offset and
1059 unsigned len = TYPE_NFIELDS (domain);
1060 /* @@ Make VAL into bit offset */
1061 LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
1062 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
1064 int bitpos = TYPE_FIELD_BITPOS (domain, i);
1068 if (val < bitpos && i != 0)
1070 /* Somehow pointing into a field. */
1072 extra = (val - TYPE_FIELD_BITPOS (domain, i));
1083 fputs_filtered (prefix, stream);
1084 name = type_name_no_tag (domain);
1086 fputs_filtered (name, stream);
1088 pascal_type_print_base (domain, stream, 0, 0);
1089 fprintf_filtered (stream, "::");
1090 fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
1092 fprintf_filtered (stream, " + %d bytes", extra);
1094 fprintf_filtered (stream, " (offset in bits)");
1097 fprintf_filtered (stream, "%ld", (long int) (val >> 3));
1100 extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */
1103 _initialize_pascal_valprint (void)
1105 deprecated_add_show_from_set
1106 (add_set_cmd ("pascal_static-members", class_support, var_boolean,
1107 (char *) &pascal_static_field_print,
1108 "Set printing of pascal static members.",
1111 /* Turn on printing of static fields. */
1112 pascal_static_field_print = 1;