1 /* Support for printing Pascal values for GDB, the GNU debugger.
3 Copyright (C) 2000-2019 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 3 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, see <http://www.gnu.org/licenses/>. */
20 /* This file is derived from c-valprint.c */
23 #include "gdb_obstack.h"
26 #include "expression.h"
33 #include "typeprint.h"
39 #include "cp-support.h"
41 #include "common/byte-vector.h"
44 /* Decorations for Pascal. */
46 static const struct generic_val_print_decorations p_decorations =
58 /* See val_print for a description of the various parameters of this
59 function; they are identical. */
62 pascal_val_print (struct type *type,
63 int embedded_offset, CORE_ADDR address,
64 struct ui_file *stream, int recurse,
65 struct value *original_value,
66 const struct value_print_options *options)
68 struct gdbarch *gdbarch = get_type_arch (type);
69 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
70 unsigned int i = 0; /* Number of characters printed */
74 int length_pos, length_size, string_pos;
75 struct type *char_type;
78 const gdb_byte *valaddr = value_contents_for_printing (original_value);
80 type = check_typedef (type);
81 switch (TYPE_CODE (type))
85 LONGEST low_bound, high_bound;
87 if (get_array_bounds (type, &low_bound, &high_bound))
89 len = high_bound - low_bound + 1;
90 elttype = check_typedef (TYPE_TARGET_TYPE (type));
91 eltlen = TYPE_LENGTH (elttype);
92 if (options->prettyformat_arrays)
94 print_spaces_filtered (2 + 2 * recurse, stream);
96 /* If 's' format is used, try to print out as string.
97 If no format is given, print as string if element type
98 is of TYPE_CODE_CHAR and element size is 1,2 or 4. */
99 if (options->format == 's'
100 || ((eltlen == 1 || eltlen == 2 || eltlen == 4)
101 && TYPE_CODE (elttype) == TYPE_CODE_CHAR
102 && options->format == 0))
104 /* If requested, look for the first null char and only print
105 elements up to it. */
106 if (options->stop_print_at_null)
108 unsigned int temp_len;
110 /* Look for a NULL char. */
112 extract_unsigned_integer (valaddr + embedded_offset +
113 temp_len * eltlen, eltlen,
115 && temp_len < len && temp_len < options->print_max;
120 LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type),
121 valaddr + embedded_offset, len, NULL, 0,
127 fprintf_filtered (stream, "{");
128 /* If this is a virtual function table, print the 0th
129 entry specially, and the rest of the members normally. */
130 if (pascal_object_is_vtbl_ptr_type (elttype))
133 fprintf_filtered (stream, "%d vtable entries", len - 1);
139 val_print_array_elements (type, embedded_offset,
140 address, stream, recurse,
141 original_value, options, i);
142 fprintf_filtered (stream, "}");
146 /* Array of unspecified length: treat like pointer to first elt. */
147 addr = address + embedded_offset;
149 goto print_unpacked_pointer;
152 if (options->format && options->format != 's')
154 val_print_scalar_formatted (type, embedded_offset,
155 original_value, options, 0, stream);
158 if (options->vtblprint && pascal_object_is_vtbl_ptr_type (type))
160 /* Print the unmangled name if desired. */
161 /* Print vtable entry - we only get here if we ARE using
162 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
163 /* Extract the address, assume that it is unsigned. */
164 addr = extract_unsigned_integer (valaddr + embedded_offset,
165 TYPE_LENGTH (type), byte_order);
166 print_address_demangle (options, gdbarch, addr, stream, demangle);
169 check_typedef (TYPE_TARGET_TYPE (type));
171 addr = unpack_pointer (type, valaddr + embedded_offset);
172 print_unpacked_pointer:
173 elttype = check_typedef (TYPE_TARGET_TYPE (type));
175 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
177 /* Try to print what function it points to. */
178 print_address_demangle (options, gdbarch, addr, stream, demangle);
182 if (options->addressprint && options->format != 's')
184 fputs_filtered (paddress (gdbarch, addr), stream);
188 /* For a pointer to char or unsigned char, also print the string
189 pointed to, unless pointer is null. */
190 if (((TYPE_LENGTH (elttype) == 1
191 && (TYPE_CODE (elttype) == TYPE_CODE_INT
192 || TYPE_CODE (elttype) == TYPE_CODE_CHAR))
193 || ((TYPE_LENGTH (elttype) == 2 || TYPE_LENGTH (elttype) == 4)
194 && TYPE_CODE (elttype) == TYPE_CODE_CHAR))
195 && (options->format == 0 || options->format == 's')
199 fputs_filtered (" ", stream);
200 /* No wide string yet. */
201 i = val_print_string (elttype, NULL, addr, -1, stream, options);
203 /* Also for pointers to pascal strings. */
204 /* Note: this is Free Pascal specific:
205 as GDB does not recognize stabs pascal strings
206 Pascal strings are mapped to records
207 with lowercase names PM. */
208 if (is_pascal_string_type (elttype, &length_pos, &length_size,
209 &string_pos, &char_type, NULL)
212 ULONGEST string_length;
216 fputs_filtered (" ", stream);
217 buffer = (gdb_byte *) xmalloc (length_size);
218 read_memory (addr + length_pos, buffer, length_size);
219 string_length = extract_unsigned_integer (buffer, length_size,
222 i = val_print_string (char_type, NULL,
223 addr + string_pos, string_length,
226 else if (pascal_object_is_vtbl_member (type))
228 /* Print vtbl's nicely. */
229 CORE_ADDR vt_address = unpack_pointer (type,
230 valaddr + embedded_offset);
231 struct bound_minimal_symbol msymbol =
232 lookup_minimal_symbol_by_pc (vt_address);
234 /* If 'symbol_print' is set, we did the work above. */
235 if (!options->symbol_print
236 && (msymbol.minsym != NULL)
237 && (vt_address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
240 fputs_filtered (" ", stream);
241 fputs_filtered ("<", stream);
242 fputs_filtered (MSYMBOL_PRINT_NAME (msymbol.minsym), stream);
243 fputs_filtered (">", stream);
246 if (vt_address && options->vtblprint)
248 struct value *vt_val;
249 struct symbol *wsym = NULL;
251 struct block *block = NULL;
254 fputs_filtered (" ", stream);
256 if (msymbol.minsym != NULL)
258 const char *search_name
259 = MSYMBOL_SEARCH_NAME (msymbol.minsym);
260 wsym = lookup_symbol_search_name (search_name, block,
266 wtype = SYMBOL_TYPE (wsym);
270 wtype = TYPE_TARGET_TYPE (type);
272 vt_val = value_at (wtype, vt_address);
273 common_val_print (vt_val, stream, recurse + 1, options,
275 if (options->prettyformat)
277 fprintf_filtered (stream, "\n");
278 print_spaces_filtered (2 + 2 * recurse, stream);
287 case TYPE_CODE_FLAGS:
289 case TYPE_CODE_RANGE:
293 case TYPE_CODE_ERROR:
294 case TYPE_CODE_UNDEF:
297 generic_val_print (type, embedded_offset, address,
298 stream, recurse, original_value, options,
302 case TYPE_CODE_UNION:
303 if (recurse && !options->unionprint)
305 fprintf_filtered (stream, "{...}");
309 case TYPE_CODE_STRUCT:
310 if (options->vtblprint && pascal_object_is_vtbl_ptr_type (type))
312 /* Print the unmangled name if desired. */
313 /* Print vtable entry - we only get here if NOT using
314 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
315 /* Extract the address, assume that it is unsigned. */
316 print_address_demangle
318 extract_unsigned_integer (valaddr + embedded_offset
319 + TYPE_FIELD_BITPOS (type,
320 VTBL_FNADDR_OFFSET) / 8,
321 TYPE_LENGTH (TYPE_FIELD_TYPE (type,
322 VTBL_FNADDR_OFFSET)),
328 if (is_pascal_string_type (type, &length_pos, &length_size,
329 &string_pos, &char_type, NULL))
331 len = extract_unsigned_integer (valaddr + embedded_offset
332 + length_pos, length_size,
334 LA_PRINT_STRING (stream, char_type,
335 valaddr + embedded_offset + string_pos,
336 len, NULL, 0, options);
339 pascal_object_print_value_fields (type, valaddr, embedded_offset,
340 address, stream, recurse,
341 original_value, options,
347 elttype = TYPE_INDEX_TYPE (type);
348 elttype = check_typedef (elttype);
349 if (TYPE_STUB (elttype))
351 fprintf_filtered (stream, "<incomplete type>");
357 struct type *range = elttype;
358 LONGEST low_bound, high_bound;
361 fputs_filtered ("[", stream);
363 int bound_info = get_discrete_bounds (range, &low_bound, &high_bound);
364 if (low_bound == 0 && high_bound == -1 && TYPE_LENGTH (type) > 0)
366 /* If we know the size of the set type, we can figure out the
369 high_bound = TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1;
370 TYPE_HIGH_BOUND (range) = high_bound;
375 fputs_filtered ("<error value>", stream);
379 for (i = low_bound; i <= high_bound; i++)
381 int element = value_bit_index (type,
382 valaddr + embedded_offset, i);
387 goto maybe_bad_bstring;
392 fputs_filtered (", ", stream);
393 print_type_scalar (range, i, stream);
396 if (i + 1 <= high_bound
397 && value_bit_index (type,
398 valaddr + embedded_offset, ++i))
402 fputs_filtered ("..", stream);
403 while (i + 1 <= high_bound
404 && value_bit_index (type,
405 valaddr + embedded_offset,
408 print_type_scalar (range, j, stream);
413 fputs_filtered ("]", stream);
418 error (_("Invalid pascal type code %d in symbol table."),
425 pascal_value_print (struct value *val, struct ui_file *stream,
426 const struct value_print_options *options)
428 struct type *type = value_type (val);
429 struct value_print_options opts = *options;
433 /* If it is a pointer, indicate what it points to.
435 Print type also if it is a reference.
437 Object pascal: if it is a member pointer, we will take care
438 of that when we print it. */
439 if (TYPE_CODE (type) == TYPE_CODE_PTR
440 || TYPE_CODE (type) == TYPE_CODE_REF)
442 /* Hack: remove (char *) for char strings. Their
443 type is indicated by the quoted string anyway. */
444 if (TYPE_CODE (type) == TYPE_CODE_PTR
445 && TYPE_NAME (type) == NULL
446 && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
447 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
453 fprintf_filtered (stream, "(");
454 type_print (type, "", stream, -1);
455 fprintf_filtered (stream, ") ");
458 common_val_print (val, stream, 0, &opts, current_language);
463 show_pascal_static_field_print (struct ui_file *file, int from_tty,
464 struct cmd_list_element *c, const char *value)
466 fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
470 static struct obstack dont_print_vb_obstack;
471 static struct obstack dont_print_statmem_obstack;
473 static void pascal_object_print_static_field (struct value *,
474 struct ui_file *, int,
475 const struct value_print_options *);
477 static void pascal_object_print_value (struct type *, const gdb_byte *,
479 CORE_ADDR, struct ui_file *, int,
481 const struct value_print_options *,
484 /* It was changed to this after 2.4.5. */
485 const char pascal_vtbl_ptr_name[] =
486 {'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
488 /* Return truth value for assertion that TYPE is of the type
489 "pointer to virtual function". */
492 pascal_object_is_vtbl_ptr_type (struct type *type)
494 const char *type_name = TYPE_NAME (type);
496 return (type_name != NULL
497 && strcmp (type_name, pascal_vtbl_ptr_name) == 0);
500 /* Return truth value for the assertion that TYPE is of the type
501 "pointer to virtual function table". */
504 pascal_object_is_vtbl_member (struct type *type)
506 if (TYPE_CODE (type) == TYPE_CODE_PTR)
508 type = TYPE_TARGET_TYPE (type);
509 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
511 type = TYPE_TARGET_TYPE (type);
512 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* If not using
514 || TYPE_CODE (type) == TYPE_CODE_PTR) /* If using thunks. */
516 /* Virtual functions tables are full of pointers
517 to virtual functions. */
518 return pascal_object_is_vtbl_ptr_type (type);
525 /* Mutually recursive subroutines of pascal_object_print_value and
526 c_val_print to print out a structure's fields:
527 pascal_object_print_value_fields and pascal_object_print_value.
529 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
530 same meanings as in pascal_object_print_value and c_val_print.
532 DONT_PRINT is an array of baseclass types that we
533 should not print, or zero if called from top level. */
536 pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
538 CORE_ADDR address, struct ui_file *stream,
541 const struct value_print_options *options,
542 struct type **dont_print_vb,
543 int dont_print_statmem)
545 int i, len, n_baseclasses;
546 char *last_dont_print
547 = (char *) obstack_next_free (&dont_print_statmem_obstack);
549 type = check_typedef (type);
551 fprintf_filtered (stream, "{");
552 len = TYPE_NFIELDS (type);
553 n_baseclasses = TYPE_N_BASECLASSES (type);
555 /* Print out baseclasses such that we don't print
556 duplicates of virtual baseclasses. */
557 if (n_baseclasses > 0)
558 pascal_object_print_value (type, valaddr, offset, address,
559 stream, recurse + 1, val,
560 options, dont_print_vb);
562 if (!len && n_baseclasses == 1)
563 fprintf_filtered (stream, "<No data fields>");
566 struct obstack tmp_obstack = dont_print_statmem_obstack;
569 if (dont_print_statmem == 0)
571 /* If we're at top level, carve out a completely fresh
572 chunk of the obstack and use that until this particular
573 invocation returns. */
574 obstack_finish (&dont_print_statmem_obstack);
577 for (i = n_baseclasses; i < len; i++)
579 /* If requested, skip printing of static fields. */
580 if (!options->pascal_static_field_print
581 && field_is_static (&TYPE_FIELD (type, i)))
584 fprintf_filtered (stream, ", ");
585 else if (n_baseclasses > 0)
587 if (options->prettyformat)
589 fprintf_filtered (stream, "\n");
590 print_spaces_filtered (2 + 2 * recurse, stream);
591 fputs_filtered ("members of ", stream);
592 fputs_filtered (TYPE_NAME (type), stream);
593 fputs_filtered (": ", stream);
598 if (options->prettyformat)
600 fprintf_filtered (stream, "\n");
601 print_spaces_filtered (2 + 2 * recurse, stream);
605 wrap_here (n_spaces (2 + 2 * recurse));
608 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
610 if (field_is_static (&TYPE_FIELD (type, i)))
611 fputs_filtered ("static ", stream);
612 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
614 DMGL_PARAMS | DMGL_ANSI);
615 annotate_field_name_end ();
616 fputs_filtered (" = ", stream);
617 annotate_field_value ();
619 if (!field_is_static (&TYPE_FIELD (type, i))
620 && TYPE_FIELD_PACKED (type, i))
624 /* Bitfields require special handling, especially due to byte
626 if (TYPE_FIELD_IGNORE (type, i))
628 fputs_filtered ("<optimized out or zero length>", stream);
630 else if (value_bits_synthetic_pointer (val,
631 TYPE_FIELD_BITPOS (type,
633 TYPE_FIELD_BITSIZE (type,
636 fputs_filtered (_("<synthetic pointer>"), stream);
640 struct value_print_options opts = *options;
642 v = value_field_bitfield (type, i, valaddr, offset, val);
645 common_val_print (v, stream, recurse + 1, &opts,
651 if (TYPE_FIELD_IGNORE (type, i))
653 fputs_filtered ("<optimized out or zero length>", stream);
655 else if (field_is_static (&TYPE_FIELD (type, i)))
657 /* struct value *v = value_static_field (type, i);
661 v = value_field_bitfield (type, i, valaddr, offset, val);
664 val_print_optimized_out (NULL, stream);
666 pascal_object_print_static_field (v, stream, recurse + 1,
671 struct value_print_options opts = *options;
674 /* val_print (TYPE_FIELD_TYPE (type, i),
675 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
676 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
677 stream, format, 0, recurse + 1, pretty); */
678 val_print (TYPE_FIELD_TYPE (type, i),
679 offset + TYPE_FIELD_BITPOS (type, i) / 8,
680 address, stream, recurse + 1, val, &opts,
684 annotate_field_end ();
687 if (dont_print_statmem == 0)
689 /* Free the space used to deal with the printing
690 of the members from top level. */
691 obstack_free (&dont_print_statmem_obstack, last_dont_print);
692 dont_print_statmem_obstack = tmp_obstack;
695 if (options->prettyformat)
697 fprintf_filtered (stream, "\n");
698 print_spaces_filtered (2 * recurse, stream);
701 fprintf_filtered (stream, "}");
704 /* Special val_print routine to avoid printing multiple copies of virtual
708 pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
710 CORE_ADDR address, struct ui_file *stream,
713 const struct value_print_options *options,
714 struct type **dont_print_vb)
716 struct type **last_dont_print
717 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
718 struct obstack tmp_obstack = dont_print_vb_obstack;
719 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
721 if (dont_print_vb == 0)
723 /* If we're at top level, carve out a completely fresh
724 chunk of the obstack and use that until this particular
725 invocation returns. */
726 /* Bump up the high-water mark. Now alpha is omega. */
727 obstack_finish (&dont_print_vb_obstack);
730 for (i = 0; i < n_baseclasses; i++)
733 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
734 const char *basename = TYPE_NAME (baseclass);
735 const gdb_byte *base_valaddr = NULL;
738 gdb::byte_vector buf;
740 if (BASETYPE_VIA_VIRTUAL (type, i))
742 struct type **first_dont_print
743 = (struct type **) obstack_base (&dont_print_vb_obstack);
745 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
749 if (baseclass == first_dont_print[j])
752 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
759 boffset = baseclass_offset (type, i, valaddr, offset, address, val);
761 CATCH (ex, RETURN_MASK_ERROR)
763 if (ex.error == NOT_AVAILABLE_ERROR)
772 /* The virtual base class pointer might have been clobbered by the
773 user program. Make sure that it still points to a valid memory
776 if (boffset < 0 || boffset >= TYPE_LENGTH (type))
778 buf.resize (TYPE_LENGTH (baseclass));
780 base_valaddr = buf.data ();
781 if (target_read_memory (address + boffset, buf.data (),
782 TYPE_LENGTH (baseclass)) != 0)
784 address = address + boffset;
789 base_valaddr = valaddr;
792 if (options->prettyformat)
794 fprintf_filtered (stream, "\n");
795 print_spaces_filtered (2 * recurse, stream);
797 fputs_filtered ("<", stream);
798 /* Not sure what the best notation is in the case where there is no
801 fputs_filtered (basename ? basename : "", stream);
802 fputs_filtered ("> = ", stream);
805 val_print_unavailable (stream);
807 val_print_invalid_address (stream);
809 pascal_object_print_value_fields (baseclass, base_valaddr,
810 thisoffset + boffset, address,
811 stream, recurse, val, options,
812 (struct type **) obstack_base (&dont_print_vb_obstack),
814 fputs_filtered (", ", stream);
820 if (dont_print_vb == 0)
822 /* Free the space used to deal with the printing
823 of this type from top level. */
824 obstack_free (&dont_print_vb_obstack, last_dont_print);
825 /* Reset watermark so that we can continue protecting
826 ourselves from whatever we were protecting ourselves. */
827 dont_print_vb_obstack = tmp_obstack;
831 /* Print value of a static member.
832 To avoid infinite recursion when printing a class that contains
833 a static instance of the class, we keep the addresses of all printed
834 static member classes in an obstack and refuse to print them more
837 VAL contains the value to print, STREAM, RECURSE, and OPTIONS
838 have the same meanings as in c_val_print. */
841 pascal_object_print_static_field (struct value *val,
842 struct ui_file *stream,
844 const struct value_print_options *options)
846 struct type *type = value_type (val);
847 struct value_print_options opts;
849 if (value_entirely_optimized_out (val))
851 val_print_optimized_out (val, stream);
855 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
857 CORE_ADDR *first_dont_print, addr;
861 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
862 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
867 if (value_address (val) == first_dont_print[i])
870 <same as static member of an already seen type>",
876 addr = value_address (val);
877 obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
880 type = check_typedef (type);
881 pascal_object_print_value_fields (type,
882 value_contents_for_printing (val),
883 value_embedded_offset (val),
886 val, options, NULL, 1);
892 common_val_print (val, stream, recurse, &opts, current_language);
896 _initialize_pascal_valprint (void)
898 add_setshow_boolean_cmd ("pascal_static-members", class_support,
899 &user_print_options.pascal_static_field_print, _("\
900 Set printing of pascal static members."), _("\
901 Show printing of pascal static members."), NULL,
903 show_pascal_static_field_print,
904 &setprintlist, &showprintlist);