1 /* Support for printing Pascal values for GDB, the GNU debugger.
3 Copyright 2000, 2001, 2003, 2005 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"
40 #include "cp-support.h"
45 /* Print data of type TYPE located at VALADDR (within GDB), which came from
46 the inferior at address ADDRESS, onto stdio stream STREAM according to
47 FORMAT (a letter or 0 for natural format). The data at VALADDR is in
50 If the data are a string pointer, returns the number of string characters
53 If DEREF_REF is nonzero, then dereference references, otherwise just print
56 The PRETTY parameter controls prettyprinting. */
60 pascal_val_print (struct type *type, const bfd_byte *valaddr,
61 int embedded_offset, CORE_ADDR address,
62 struct ui_file *stream, int format, int deref_ref,
63 int recurse, enum val_prettyprint pretty)
65 unsigned int i = 0; /* Number of characters printed */
69 int length_pos, length_size, string_pos;
75 switch (TYPE_CODE (type))
78 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
80 elttype = check_typedef (TYPE_TARGET_TYPE (type));
81 eltlen = TYPE_LENGTH (elttype);
82 len = TYPE_LENGTH (type) / eltlen;
83 if (prettyprint_arrays)
85 print_spaces_filtered (2 + 2 * recurse, stream);
87 /* For an array of chars, print with string syntax. */
89 ((TYPE_CODE (elttype) == TYPE_CODE_INT)
90 || ((current_language->la_language == language_m2)
91 && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
92 && (format == 0 || format == 's'))
94 /* If requested, look for the first null char and only print
96 if (stop_print_at_null)
98 unsigned int temp_len;
100 /* Look for a NULL char. */
102 (valaddr + embedded_offset)[temp_len]
103 && temp_len < len && temp_len < print_max;
108 LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0);
113 fprintf_filtered (stream, "{");
114 /* If this is a virtual function table, print the 0th
115 entry specially, and the rest of the members normally. */
116 if (pascal_object_is_vtbl_ptr_type (elttype))
119 fprintf_filtered (stream, "%d vtable entries", len - 1);
125 val_print_array_elements (type, valaddr + embedded_offset, address, stream,
126 format, deref_ref, recurse, pretty, i);
127 fprintf_filtered (stream, "}");
131 /* Array of unspecified length: treat like pointer to first elt. */
133 goto print_unpacked_pointer;
136 if (format && format != 's')
138 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
141 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
143 /* Print the unmangled name if desired. */
144 /* Print vtable entry - we only get here if we ARE using
145 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
146 /* Extract the address, assume that it is unsigned. */
147 print_address_demangle (extract_unsigned_integer (valaddr + embedded_offset, TYPE_LENGTH (type)),
151 elttype = check_typedef (TYPE_TARGET_TYPE (type));
152 if (TYPE_CODE (elttype) == TYPE_CODE_METHOD)
154 pascal_object_print_class_method (valaddr + embedded_offset, type, stream);
156 else if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
158 pascal_object_print_class_member (valaddr + embedded_offset,
159 TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (type)),
164 addr = unpack_pointer (type, valaddr + embedded_offset);
165 print_unpacked_pointer:
166 elttype = check_typedef (TYPE_TARGET_TYPE (type));
168 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
170 /* Try to print what function it points to. */
171 print_address_demangle (addr, stream, demangle);
172 /* Return value is irrelevant except for string pointers. */
176 if (addressprint && format != 's')
178 deprecated_print_address_numeric (addr, 1, stream);
181 /* For a pointer to char or unsigned char, also print the string
182 pointed to, unless pointer is null. */
183 if (TYPE_LENGTH (elttype) == 1
184 && TYPE_CODE (elttype) == TYPE_CODE_INT
185 && (format == 0 || format == 's')
188 /* no wide string yet */
189 i = val_print_string (addr, -1, 1, stream);
191 /* also for pointers to pascal strings */
192 /* Note: this is Free Pascal specific:
193 as GDB does not recognize stabs pascal strings
194 Pascal strings are mapped to records
195 with lowercase names PM */
196 if (is_pascal_string_type (elttype, &length_pos, &length_size,
197 &string_pos, &char_size, NULL)
200 ULONGEST string_length;
202 buffer = xmalloc (length_size);
203 read_memory (addr + length_pos, buffer, length_size);
204 string_length = extract_unsigned_integer (buffer, length_size);
206 i = val_print_string (addr + string_pos, string_length, char_size, stream);
208 else if (pascal_object_is_vtbl_member (type))
210 /* print vtbl's nicely */
211 CORE_ADDR vt_address = unpack_pointer (type, valaddr + embedded_offset);
213 struct minimal_symbol *msymbol =
214 lookup_minimal_symbol_by_pc (vt_address);
215 if ((msymbol != NULL)
216 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
218 fputs_filtered (" <", stream);
219 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
220 fputs_filtered (">", stream);
222 if (vt_address && vtblprint)
224 struct value *vt_val;
225 struct symbol *wsym = (struct symbol *) NULL;
227 struct block *block = (struct block *) NULL;
231 wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block,
232 VAR_DOMAIN, &is_this_fld, NULL);
236 wtype = SYMBOL_TYPE (wsym);
240 wtype = TYPE_TARGET_TYPE (type);
242 vt_val = value_at (wtype, vt_address);
243 val_print (value_type (vt_val), value_contents (vt_val), 0,
244 VALUE_ADDRESS (vt_val), stream, format,
245 deref_ref, recurse + 1, pretty);
248 fprintf_filtered (stream, "\n");
249 print_spaces_filtered (2 + 2 * recurse, stream);
254 /* Return number of characters printed, including the terminating
255 '\0' if we reached the end. val_print_string takes care including
256 the terminating '\0' if necessary. */
261 case TYPE_CODE_MEMBER:
262 error (_("not implemented: member type in pascal_val_print"));
266 elttype = check_typedef (TYPE_TARGET_TYPE (type));
267 if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
269 pascal_object_print_class_member (valaddr + embedded_offset,
270 TYPE_DOMAIN_TYPE (elttype),
276 fprintf_filtered (stream, "@");
277 /* Extract the address, assume that it is unsigned. */
278 deprecated_print_address_numeric
279 (extract_unsigned_integer (valaddr + embedded_offset,
280 TARGET_PTR_BIT / HOST_CHAR_BIT),
283 fputs_filtered (": ", stream);
285 /* De-reference the reference. */
288 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
290 struct value *deref_val =
292 (TYPE_TARGET_TYPE (type),
293 unpack_pointer (lookup_pointer_type (builtin_type_void),
294 valaddr + embedded_offset));
295 val_print (value_type (deref_val),
296 value_contents (deref_val), 0,
297 VALUE_ADDRESS (deref_val), stream, format,
298 deref_ref, recurse + 1, pretty);
301 fputs_filtered ("???", stream);
305 case TYPE_CODE_UNION:
306 if (recurse && !unionprint)
308 fprintf_filtered (stream, "{...}");
312 case TYPE_CODE_STRUCT:
313 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
315 /* Print the unmangled name if desired. */
316 /* Print vtable entry - we only get here if NOT using
317 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
318 /* Extract the address, assume that it is unsigned. */
319 print_address_demangle
320 (extract_unsigned_integer (valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
321 TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))),
326 if (is_pascal_string_type (type, &length_pos, &length_size,
327 &string_pos, &char_size, NULL))
329 len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
330 LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
333 pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
334 recurse, pretty, NULL, 0);
341 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
344 len = TYPE_NFIELDS (type);
345 val = unpack_long (type, valaddr + embedded_offset);
346 for (i = 0; i < len; i++)
349 if (val == TYPE_FIELD_BITPOS (type, i))
356 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
360 print_longest (stream, 'd', 0, val);
367 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
370 /* FIXME, we should consider, at least for ANSI C language, eliminating
371 the distinction made between FUNCs and POINTERs to FUNCs. */
372 fprintf_filtered (stream, "{");
373 type_print (type, "", stream, -1);
374 fprintf_filtered (stream, "} ");
375 /* Try to print what function it points to, and its address. */
376 print_address_demangle (address, stream, demangle);
380 format = format ? format : output_format;
382 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
385 val = unpack_long (type, valaddr + embedded_offset);
387 fputs_filtered ("false", stream);
389 fputs_filtered ("true", stream);
392 fputs_filtered ("true (", stream);
393 fprintf_filtered (stream, "%ld)", (long int) val);
398 case TYPE_CODE_RANGE:
399 /* FIXME: create_range_type does not set the unsigned bit in a
400 range type (I think it probably should copy it from the target
401 type), so we won't print values which are too large to
402 fit in a signed integer correctly. */
403 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
404 print with the target type, though, because the size of our type
405 and the target type might differ). */
409 format = format ? format : output_format;
412 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
416 val_print_type_code_int (type, valaddr + embedded_offset, stream);
421 format = format ? format : output_format;
424 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
428 val = unpack_long (type, valaddr + embedded_offset);
429 if (TYPE_UNSIGNED (type))
430 fprintf_filtered (stream, "%u", (unsigned int) val);
432 fprintf_filtered (stream, "%d", (int) val);
433 fputs_filtered (" ", stream);
434 LA_PRINT_CHAR ((unsigned char) val, stream);
441 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
445 print_floating (valaddr + embedded_offset, type, stream);
449 case TYPE_CODE_BITSTRING:
451 elttype = TYPE_INDEX_TYPE (type);
452 CHECK_TYPEDEF (elttype);
453 if (TYPE_STUB (elttype))
455 fprintf_filtered (stream, "<incomplete type>");
461 struct type *range = elttype;
462 LONGEST low_bound, high_bound;
464 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
468 fputs_filtered ("B'", stream);
470 fputs_filtered ("[", stream);
472 i = get_discrete_bounds (range, &low_bound, &high_bound);
476 fputs_filtered ("<error value>", stream);
480 for (i = low_bound; i <= high_bound; i++)
482 int element = value_bit_index (type, valaddr + embedded_offset, i);
486 goto maybe_bad_bstring;
489 fprintf_filtered (stream, "%d", element);
493 fputs_filtered (", ", stream);
494 print_type_scalar (range, i, stream);
497 if (i + 1 <= high_bound && value_bit_index (type, valaddr + embedded_offset, ++i))
500 fputs_filtered ("..", stream);
501 while (i + 1 <= high_bound
502 && value_bit_index (type, valaddr + embedded_offset, ++i))
504 print_type_scalar (range, j, stream);
510 fputs_filtered ("'", stream);
512 fputs_filtered ("]", stream);
517 fprintf_filtered (stream, "void");
520 case TYPE_CODE_ERROR:
521 fprintf_filtered (stream, "<error type>");
524 case TYPE_CODE_UNDEF:
525 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
526 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
527 and no complete type for struct foo in that file. */
528 fprintf_filtered (stream, "<incomplete type>");
532 error (_("Invalid pascal type code %d in symbol table."), TYPE_CODE (type));
539 pascal_value_print (struct value *val, struct ui_file *stream, int format,
540 enum val_prettyprint pretty)
542 struct type *type = value_type (val);
544 /* If it is a pointer, indicate what it points to.
546 Print type also if it is a reference.
548 Object pascal: if it is a member pointer, we will take care
549 of that when we print it. */
550 if (TYPE_CODE (type) == TYPE_CODE_PTR ||
551 TYPE_CODE (type) == TYPE_CODE_REF)
553 /* Hack: remove (char *) for char strings. Their
554 type is indicated by the quoted string anyway. */
555 if (TYPE_CODE (type) == TYPE_CODE_PTR &&
556 TYPE_NAME (type) == NULL &&
557 TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
558 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
564 fprintf_filtered (stream, "(");
565 type_print (type, "", stream, -1);
566 fprintf_filtered (stream, ") ");
569 return val_print (type, value_contents (val), value_embedded_offset (val),
570 VALUE_ADDRESS (val) + value_offset (val),
571 stream, format, 1, 0, pretty);
575 /******************************************************************************
576 Inserted from cp-valprint
577 ******************************************************************************/
579 extern int vtblprint; /* Controls printing of vtbl's */
580 extern int objectprint; /* Controls looking up an object's derived type
581 using what we find in its vtables. */
582 static int pascal_static_field_print; /* Controls printing of static fields. */
584 show_pascal_static_field_print (struct ui_file *file, int from_tty,
585 struct cmd_list_element *c, const char *value)
587 fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
591 static struct obstack dont_print_vb_obstack;
592 static struct obstack dont_print_statmem_obstack;
594 static void pascal_object_print_static_field (struct type *, struct value *,
595 struct ui_file *, int, int,
596 enum val_prettyprint);
598 static void pascal_object_print_value (struct type *, const bfd_byte *,
599 CORE_ADDR, struct ui_file *,
600 int, int, enum val_prettyprint,
604 pascal_object_print_class_method (const bfd_byte *valaddr, struct type *type,
605 struct ui_file *stream)
608 struct fn_field *f = NULL;
617 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
619 domain = TYPE_DOMAIN_TYPE (target_type);
620 if (domain == (struct type *) NULL)
622 fprintf_filtered (stream, "<unknown>");
625 addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
626 if (METHOD_PTR_IS_VIRTUAL (addr))
628 offset = METHOD_PTR_TO_VOFFSET (addr);
629 len = TYPE_NFN_FIELDS (domain);
630 for (i = 0; i < len; i++)
632 f = TYPE_FN_FIELDLIST1 (domain, i);
633 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
635 check_stub_method_group (domain, i);
636 for (j = 0; j < len2; j++)
638 if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
648 sym = find_pc_function (addr);
651 error (_("invalid pointer to member function"));
653 len = TYPE_NFN_FIELDS (domain);
654 for (i = 0; i < len; i++)
656 f = TYPE_FN_FIELDLIST1 (domain, i);
657 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
659 check_stub_method_group (domain, i);
660 for (j = 0; j < len2; j++)
662 if (DEPRECATED_STREQ (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
670 char *demangled_name;
672 fprintf_filtered (stream, "&");
673 fputs_filtered (kind, stream);
674 demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
675 DMGL_ANSI | DMGL_PARAMS);
676 if (demangled_name == NULL)
677 fprintf_filtered (stream, "<badly mangled name %s>",
678 TYPE_FN_FIELD_PHYSNAME (f, j));
681 fputs_filtered (demangled_name, stream);
682 xfree (demangled_name);
687 fprintf_filtered (stream, "(");
688 type_print (type, "", stream, -1);
689 fprintf_filtered (stream, ") %d", (int) addr >> 3);
693 /* It was changed to this after 2.4.5. */
694 const char pascal_vtbl_ptr_name[] =
695 {'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
697 /* Return truth value for assertion that TYPE is of the type
698 "pointer to virtual function". */
701 pascal_object_is_vtbl_ptr_type (struct type *type)
703 char *typename = type_name_no_tag (type);
705 return (typename != NULL
706 && strcmp (typename, pascal_vtbl_ptr_name) == 0);
709 /* Return truth value for the assertion that TYPE is of the type
710 "pointer to virtual function table". */
713 pascal_object_is_vtbl_member (struct type *type)
715 if (TYPE_CODE (type) == TYPE_CODE_PTR)
717 type = TYPE_TARGET_TYPE (type);
718 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
720 type = TYPE_TARGET_TYPE (type);
721 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
722 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
724 /* Virtual functions tables are full of pointers
725 to virtual functions. */
726 return pascal_object_is_vtbl_ptr_type (type);
733 /* Mutually recursive subroutines of pascal_object_print_value and
734 c_val_print to print out a structure's fields:
735 pascal_object_print_value_fields and pascal_object_print_value.
737 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
738 same meanings as in pascal_object_print_value and c_val_print.
740 DONT_PRINT is an array of baseclass types that we
741 should not print, or zero if called from top level. */
744 pascal_object_print_value_fields (struct type *type, const bfd_byte *valaddr,
745 CORE_ADDR address, struct ui_file *stream,
746 int format, int recurse,
747 enum val_prettyprint pretty,
748 struct type **dont_print_vb,
749 int dont_print_statmem)
751 int i, len, n_baseclasses;
752 struct obstack tmp_obstack;
753 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
755 CHECK_TYPEDEF (type);
757 fprintf_filtered (stream, "{");
758 len = TYPE_NFIELDS (type);
759 n_baseclasses = TYPE_N_BASECLASSES (type);
761 /* Print out baseclasses such that we don't print
762 duplicates of virtual baseclasses. */
763 if (n_baseclasses > 0)
764 pascal_object_print_value (type, valaddr, address, stream,
765 format, recurse + 1, pretty, dont_print_vb);
767 if (!len && n_baseclasses == 1)
768 fprintf_filtered (stream, "<No data fields>");
773 if (dont_print_statmem == 0)
775 /* If we're at top level, carve out a completely fresh
776 chunk of the obstack and use that until this particular
777 invocation returns. */
778 tmp_obstack = dont_print_statmem_obstack;
779 obstack_finish (&dont_print_statmem_obstack);
782 for (i = n_baseclasses; i < len; i++)
784 /* If requested, skip printing of static fields. */
785 if (!pascal_static_field_print && TYPE_FIELD_STATIC (type, i))
788 fprintf_filtered (stream, ", ");
789 else if (n_baseclasses > 0)
793 fprintf_filtered (stream, "\n");
794 print_spaces_filtered (2 + 2 * recurse, stream);
795 fputs_filtered ("members of ", stream);
796 fputs_filtered (type_name_no_tag (type), stream);
797 fputs_filtered (": ", stream);
804 fprintf_filtered (stream, "\n");
805 print_spaces_filtered (2 + 2 * recurse, stream);
809 wrap_here (n_spaces (2 + 2 * recurse));
813 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
814 fputs_filtered ("\"( ptr \"", stream);
816 fputs_filtered ("\"( nodef \"", stream);
817 if (TYPE_FIELD_STATIC (type, i))
818 fputs_filtered ("static ", stream);
819 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
821 DMGL_PARAMS | DMGL_ANSI);
822 fputs_filtered ("\" \"", stream);
823 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
825 DMGL_PARAMS | DMGL_ANSI);
826 fputs_filtered ("\") \"", stream);
830 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
832 if (TYPE_FIELD_STATIC (type, i))
833 fputs_filtered ("static ", stream);
834 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
836 DMGL_PARAMS | DMGL_ANSI);
837 annotate_field_name_end ();
838 fputs_filtered (" = ", stream);
839 annotate_field_value ();
842 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
846 /* Bitfields require special handling, especially due to byte
848 if (TYPE_FIELD_IGNORE (type, i))
850 fputs_filtered ("<optimized out or zero length>", stream);
854 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
855 unpack_field_as_long (type, valaddr, i));
857 val_print (TYPE_FIELD_TYPE (type, i), value_contents (v), 0, 0,
858 stream, format, 0, recurse + 1, pretty);
863 if (TYPE_FIELD_IGNORE (type, i))
865 fputs_filtered ("<optimized out or zero length>", stream);
867 else if (TYPE_FIELD_STATIC (type, i))
869 /* struct value *v = value_static_field (type, i); v4.17 specific */
871 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
872 unpack_field_as_long (type, valaddr, i));
875 fputs_filtered ("<optimized out>", stream);
877 pascal_object_print_static_field (TYPE_FIELD_TYPE (type, i), v,
878 stream, format, recurse + 1,
883 /* val_print (TYPE_FIELD_TYPE (type, i),
884 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
885 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
886 stream, format, 0, recurse + 1, pretty); */
887 val_print (TYPE_FIELD_TYPE (type, i),
888 valaddr, TYPE_FIELD_BITPOS (type, i) / 8,
889 address + TYPE_FIELD_BITPOS (type, i) / 8,
890 stream, format, 0, recurse + 1, pretty);
893 annotate_field_end ();
896 if (dont_print_statmem == 0)
898 /* Free the space used to deal with the printing
899 of the members from top level. */
900 obstack_free (&dont_print_statmem_obstack, last_dont_print);
901 dont_print_statmem_obstack = tmp_obstack;
906 fprintf_filtered (stream, "\n");
907 print_spaces_filtered (2 * recurse, stream);
910 fprintf_filtered (stream, "}");
913 /* Special val_print routine to avoid printing multiple copies of virtual
917 pascal_object_print_value (struct type *type, const bfd_byte *valaddr,
918 CORE_ADDR address, struct ui_file *stream,
919 int format, int recurse,
920 enum val_prettyprint pretty,
921 struct type **dont_print_vb)
923 struct obstack tmp_obstack;
924 struct type **last_dont_print
925 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
926 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
928 if (dont_print_vb == 0)
930 /* If we're at top level, carve out a completely fresh
931 chunk of the obstack and use that until this particular
932 invocation returns. */
933 tmp_obstack = dont_print_vb_obstack;
934 /* Bump up the high-water mark. Now alpha is omega. */
935 obstack_finish (&dont_print_vb_obstack);
938 for (i = 0; i < n_baseclasses; i++)
941 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
942 char *basename = TYPE_NAME (baseclass);
943 const bfd_byte *base_valaddr;
945 if (BASETYPE_VIA_VIRTUAL (type, i))
947 struct type **first_dont_print
948 = (struct type **) obstack_base (&dont_print_vb_obstack);
950 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
954 if (baseclass == first_dont_print[j])
957 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
960 boffset = baseclass_offset (type, i, valaddr, address);
964 fprintf_filtered (stream, "\n");
965 print_spaces_filtered (2 * recurse, stream);
967 fputs_filtered ("<", stream);
968 /* Not sure what the best notation is in the case where there is no
971 fputs_filtered (basename ? basename : "", stream);
972 fputs_filtered ("> = ", stream);
974 /* The virtual base class pointer might have been clobbered by the
975 user program. Make sure that it still points to a valid memory
978 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
980 /* FIXME (alloc): not safe is baseclass is really really big. */
981 bfd_byte *buf = alloca (TYPE_LENGTH (baseclass));
983 if (target_read_memory (address + boffset, buf,
984 TYPE_LENGTH (baseclass)) != 0)
988 base_valaddr = valaddr + boffset;
991 fprintf_filtered (stream, "<invalid address>");
993 pascal_object_print_value_fields (baseclass, base_valaddr, address + boffset,
994 stream, format, recurse, pretty,
995 (struct type **) obstack_base (&dont_print_vb_obstack),
997 fputs_filtered (", ", stream);
1003 if (dont_print_vb == 0)
1005 /* Free the space used to deal with the printing
1006 of this type from top level. */
1007 obstack_free (&dont_print_vb_obstack, last_dont_print);
1008 /* Reset watermark so that we can continue protecting
1009 ourselves from whatever we were protecting ourselves. */
1010 dont_print_vb_obstack = tmp_obstack;
1014 /* Print value of a static member.
1015 To avoid infinite recursion when printing a class that contains
1016 a static instance of the class, we keep the addresses of all printed
1017 static member classes in an obstack and refuse to print them more
1020 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
1021 have the same meanings as in c_val_print. */
1024 pascal_object_print_static_field (struct type *type, struct value *val,
1025 struct ui_file *stream, int format,
1026 int recurse, enum val_prettyprint pretty)
1028 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
1030 CORE_ADDR *first_dont_print;
1034 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
1035 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
1040 if (VALUE_ADDRESS (val) == first_dont_print[i])
1042 fputs_filtered ("<same as static member of an already seen type>",
1048 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
1049 sizeof (CORE_ADDR));
1051 CHECK_TYPEDEF (type);
1052 pascal_object_print_value_fields (type, value_contents (val), VALUE_ADDRESS (val),
1053 stream, format, recurse, pretty, NULL, 1);
1056 val_print (type, value_contents (val), 0, VALUE_ADDRESS (val),
1057 stream, format, 0, recurse, pretty);
1061 pascal_object_print_class_member (const bfd_byte *valaddr, struct type *domain,
1062 struct ui_file *stream, char *prefix)
1065 /* VAL is a byte offset into the structure type DOMAIN.
1066 Find the name of the field for that offset and
1071 unsigned len = TYPE_NFIELDS (domain);
1072 /* @@ Make VAL into bit offset */
1073 LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
1074 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
1076 int bitpos = TYPE_FIELD_BITPOS (domain, i);
1080 if (val < bitpos && i != 0)
1082 /* Somehow pointing into a field. */
1084 extra = (val - TYPE_FIELD_BITPOS (domain, i));
1095 fputs_filtered (prefix, stream);
1096 name = type_name_no_tag (domain);
1098 fputs_filtered (name, stream);
1100 pascal_type_print_base (domain, stream, 0, 0);
1101 fprintf_filtered (stream, "::");
1102 fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
1104 fprintf_filtered (stream, " + %d bytes", extra);
1106 fprintf_filtered (stream, " (offset in bits)");
1109 fprintf_filtered (stream, "%ld", (long int) (val >> 3));
1112 extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */
1115 _initialize_pascal_valprint (void)
1117 add_setshow_boolean_cmd ("pascal_static-members", class_support,
1118 &pascal_static_field_print, _("\
1119 Set printing of pascal static members."), _("\
1120 Show printing of pascal static members."), NULL,
1122 show_pascal_static_field_print,
1123 &setprintlist, &showprintlist);
1124 /* Turn on printing of static fields. */
1125 pascal_static_field_print = 1;