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 "gdbsupport/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;
253 fputs_filtered (" ", stream);
255 if (msymbol.minsym != NULL)
257 const char *search_name
258 = MSYMBOL_SEARCH_NAME (msymbol.minsym);
259 wsym = lookup_symbol_search_name (search_name, NULL,
265 wtype = SYMBOL_TYPE (wsym);
269 wtype = TYPE_TARGET_TYPE (type);
271 vt_val = value_at (wtype, vt_address);
272 common_val_print (vt_val, stream, recurse + 1, options,
274 if (options->prettyformat)
276 fprintf_filtered (stream, "\n");
277 print_spaces_filtered (2 + 2 * recurse, stream);
286 case TYPE_CODE_FLAGS:
288 case TYPE_CODE_RANGE:
292 case TYPE_CODE_ERROR:
293 case TYPE_CODE_UNDEF:
296 generic_val_print (type, embedded_offset, address,
297 stream, recurse, original_value, options,
301 case TYPE_CODE_UNION:
302 if (recurse && !options->unionprint)
304 fprintf_filtered (stream, "{...}");
308 case TYPE_CODE_STRUCT:
309 if (options->vtblprint && pascal_object_is_vtbl_ptr_type (type))
311 /* Print the unmangled name if desired. */
312 /* Print vtable entry - we only get here if NOT using
313 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
314 /* Extract the address, assume that it is unsigned. */
315 print_address_demangle
317 extract_unsigned_integer (valaddr + embedded_offset
318 + TYPE_FIELD_BITPOS (type,
319 VTBL_FNADDR_OFFSET) / 8,
320 TYPE_LENGTH (TYPE_FIELD_TYPE (type,
321 VTBL_FNADDR_OFFSET)),
327 if (is_pascal_string_type (type, &length_pos, &length_size,
328 &string_pos, &char_type, NULL))
330 len = extract_unsigned_integer (valaddr + embedded_offset
331 + length_pos, length_size,
333 LA_PRINT_STRING (stream, char_type,
334 valaddr + embedded_offset + string_pos,
335 len, NULL, 0, options);
338 pascal_object_print_value_fields (type, valaddr, embedded_offset,
339 address, stream, recurse,
340 original_value, options,
346 elttype = TYPE_INDEX_TYPE (type);
347 elttype = check_typedef (elttype);
348 if (TYPE_STUB (elttype))
350 fprintf_filtered (stream, "<incomplete type>");
355 struct type *range = elttype;
356 LONGEST low_bound, high_bound;
359 fputs_filtered ("[", stream);
361 int bound_info = get_discrete_bounds (range, &low_bound, &high_bound);
362 if (low_bound == 0 && high_bound == -1 && TYPE_LENGTH (type) > 0)
364 /* If we know the size of the set type, we can figure out the
367 high_bound = TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1;
368 TYPE_HIGH_BOUND (range) = high_bound;
373 fputs_filtered ("<error value>", stream);
377 for (i = low_bound; i <= high_bound; i++)
379 int element = value_bit_index (type,
380 valaddr + embedded_offset, i);
385 goto maybe_bad_bstring;
390 fputs_filtered (", ", stream);
391 print_type_scalar (range, i, stream);
394 if (i + 1 <= high_bound
395 && value_bit_index (type,
396 valaddr + embedded_offset, ++i))
400 fputs_filtered ("..", stream);
401 while (i + 1 <= high_bound
402 && value_bit_index (type,
403 valaddr + embedded_offset,
406 print_type_scalar (range, j, stream);
411 fputs_filtered ("]", stream);
416 error (_("Invalid pascal type code %d in symbol table."),
422 pascal_value_print (struct value *val, struct ui_file *stream,
423 const struct value_print_options *options)
425 struct type *type = value_type (val);
426 struct value_print_options opts = *options;
430 /* If it is a pointer, indicate what it points to.
432 Print type also if it is a reference.
434 Object pascal: if it is a member pointer, we will take care
435 of that when we print it. */
436 if (TYPE_CODE (type) == TYPE_CODE_PTR
437 || TYPE_CODE (type) == TYPE_CODE_REF)
439 /* Hack: remove (char *) for char strings. Their
440 type is indicated by the quoted string anyway. */
441 if (TYPE_CODE (type) == TYPE_CODE_PTR
442 && TYPE_NAME (type) == NULL
443 && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
444 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
450 fprintf_filtered (stream, "(");
451 type_print (type, "", stream, -1);
452 fprintf_filtered (stream, ") ");
455 common_val_print (val, stream, 0, &opts, current_language);
460 show_pascal_static_field_print (struct ui_file *file, int from_tty,
461 struct cmd_list_element *c, const char *value)
463 fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
467 static struct obstack dont_print_vb_obstack;
468 static struct obstack dont_print_statmem_obstack;
470 static void pascal_object_print_static_field (struct value *,
471 struct ui_file *, int,
472 const struct value_print_options *);
474 static void pascal_object_print_value (struct type *, const gdb_byte *,
476 CORE_ADDR, struct ui_file *, int,
478 const struct value_print_options *,
481 /* It was changed to this after 2.4.5. */
482 const char pascal_vtbl_ptr_name[] =
483 {'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
485 /* Return truth value for assertion that TYPE is of the type
486 "pointer to virtual function". */
489 pascal_object_is_vtbl_ptr_type (struct type *type)
491 const char *type_name = TYPE_NAME (type);
493 return (type_name != NULL
494 && strcmp (type_name, pascal_vtbl_ptr_name) == 0);
497 /* Return truth value for the assertion that TYPE is of the type
498 "pointer to virtual function table". */
501 pascal_object_is_vtbl_member (struct type *type)
503 if (TYPE_CODE (type) == TYPE_CODE_PTR)
505 type = TYPE_TARGET_TYPE (type);
506 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
508 type = TYPE_TARGET_TYPE (type);
509 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* If not using
511 || TYPE_CODE (type) == TYPE_CODE_PTR) /* If using thunks. */
513 /* Virtual functions tables are full of pointers
514 to virtual functions. */
515 return pascal_object_is_vtbl_ptr_type (type);
522 /* Mutually recursive subroutines of pascal_object_print_value and
523 c_val_print to print out a structure's fields:
524 pascal_object_print_value_fields and pascal_object_print_value.
526 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
527 same meanings as in pascal_object_print_value and c_val_print.
529 DONT_PRINT is an array of baseclass types that we
530 should not print, or zero if called from top level. */
533 pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
535 CORE_ADDR address, struct ui_file *stream,
538 const struct value_print_options *options,
539 struct type **dont_print_vb,
540 int dont_print_statmem)
542 int i, len, n_baseclasses;
543 char *last_dont_print
544 = (char *) obstack_next_free (&dont_print_statmem_obstack);
546 type = check_typedef (type);
548 fprintf_filtered (stream, "{");
549 len = TYPE_NFIELDS (type);
550 n_baseclasses = TYPE_N_BASECLASSES (type);
552 /* Print out baseclasses such that we don't print
553 duplicates of virtual baseclasses. */
554 if (n_baseclasses > 0)
555 pascal_object_print_value (type, valaddr, offset, address,
556 stream, recurse + 1, val,
557 options, dont_print_vb);
559 if (!len && n_baseclasses == 1)
560 fprintf_filtered (stream, "<No data fields>");
563 struct obstack tmp_obstack = dont_print_statmem_obstack;
566 if (dont_print_statmem == 0)
568 /* If we're at top level, carve out a completely fresh
569 chunk of the obstack and use that until this particular
570 invocation returns. */
571 obstack_finish (&dont_print_statmem_obstack);
574 for (i = n_baseclasses; i < len; i++)
576 /* If requested, skip printing of static fields. */
577 if (!options->pascal_static_field_print
578 && field_is_static (&TYPE_FIELD (type, i)))
581 fprintf_filtered (stream, ", ");
582 else if (n_baseclasses > 0)
584 if (options->prettyformat)
586 fprintf_filtered (stream, "\n");
587 print_spaces_filtered (2 + 2 * recurse, stream);
588 fputs_filtered ("members of ", stream);
589 fputs_filtered (TYPE_NAME (type), stream);
590 fputs_filtered (": ", stream);
595 if (options->prettyformat)
597 fprintf_filtered (stream, "\n");
598 print_spaces_filtered (2 + 2 * recurse, stream);
602 wrap_here (n_spaces (2 + 2 * recurse));
605 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
607 if (field_is_static (&TYPE_FIELD (type, i)))
608 fputs_filtered ("static ", stream);
609 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
611 DMGL_PARAMS | DMGL_ANSI);
612 annotate_field_name_end ();
613 fputs_filtered (" = ", stream);
614 annotate_field_value ();
616 if (!field_is_static (&TYPE_FIELD (type, i))
617 && TYPE_FIELD_PACKED (type, i))
621 /* Bitfields require special handling, especially due to byte
623 if (TYPE_FIELD_IGNORE (type, i))
625 fputs_filtered ("<optimized out or zero length>", stream);
627 else if (value_bits_synthetic_pointer (val,
628 TYPE_FIELD_BITPOS (type,
630 TYPE_FIELD_BITSIZE (type,
633 fputs_filtered (_("<synthetic pointer>"), stream);
637 struct value_print_options opts = *options;
639 v = value_field_bitfield (type, i, valaddr, offset, val);
642 common_val_print (v, stream, recurse + 1, &opts,
648 if (TYPE_FIELD_IGNORE (type, i))
650 fputs_filtered ("<optimized out or zero length>", stream);
652 else if (field_is_static (&TYPE_FIELD (type, i)))
654 /* struct value *v = value_static_field (type, i);
658 v = value_field_bitfield (type, i, valaddr, offset, val);
661 val_print_optimized_out (NULL, stream);
663 pascal_object_print_static_field (v, stream, recurse + 1,
668 struct value_print_options opts = *options;
671 /* val_print (TYPE_FIELD_TYPE (type, i),
672 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
673 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
674 stream, format, 0, recurse + 1, pretty); */
675 val_print (TYPE_FIELD_TYPE (type, i),
676 offset + TYPE_FIELD_BITPOS (type, i) / 8,
677 address, stream, recurse + 1, val, &opts,
681 annotate_field_end ();
684 if (dont_print_statmem == 0)
686 /* Free the space used to deal with the printing
687 of the members from top level. */
688 obstack_free (&dont_print_statmem_obstack, last_dont_print);
689 dont_print_statmem_obstack = tmp_obstack;
692 if (options->prettyformat)
694 fprintf_filtered (stream, "\n");
695 print_spaces_filtered (2 * recurse, stream);
698 fprintf_filtered (stream, "}");
701 /* Special val_print routine to avoid printing multiple copies of virtual
705 pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
707 CORE_ADDR address, struct ui_file *stream,
710 const struct value_print_options *options,
711 struct type **dont_print_vb)
713 struct type **last_dont_print
714 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
715 struct obstack tmp_obstack = dont_print_vb_obstack;
716 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
718 if (dont_print_vb == 0)
720 /* If we're at top level, carve out a completely fresh
721 chunk of the obstack and use that until this particular
722 invocation returns. */
723 /* Bump up the high-water mark. Now alpha is omega. */
724 obstack_finish (&dont_print_vb_obstack);
727 for (i = 0; i < n_baseclasses; i++)
730 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
731 const char *basename = TYPE_NAME (baseclass);
732 const gdb_byte *base_valaddr = NULL;
735 gdb::byte_vector buf;
737 if (BASETYPE_VIA_VIRTUAL (type, i))
739 struct type **first_dont_print
740 = (struct type **) obstack_base (&dont_print_vb_obstack);
742 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
746 if (baseclass == first_dont_print[j])
749 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
756 boffset = baseclass_offset (type, i, valaddr, offset, address, val);
758 catch (const gdb_exception_error &ex)
760 if (ex.error == NOT_AVAILABLE_ERROR)
768 /* The virtual base class pointer might have been clobbered by the
769 user program. Make sure that it still points to a valid memory
772 if (boffset < 0 || boffset >= TYPE_LENGTH (type))
774 buf.resize (TYPE_LENGTH (baseclass));
776 base_valaddr = buf.data ();
777 if (target_read_memory (address + boffset, buf.data (),
778 TYPE_LENGTH (baseclass)) != 0)
780 address = address + boffset;
785 base_valaddr = valaddr;
788 if (options->prettyformat)
790 fprintf_filtered (stream, "\n");
791 print_spaces_filtered (2 * recurse, stream);
793 fputs_filtered ("<", stream);
794 /* Not sure what the best notation is in the case where there is no
797 fputs_filtered (basename ? basename : "", stream);
798 fputs_filtered ("> = ", stream);
801 val_print_unavailable (stream);
803 val_print_invalid_address (stream);
805 pascal_object_print_value_fields (baseclass, base_valaddr,
806 thisoffset + boffset, address,
807 stream, recurse, val, options,
808 (struct type **) obstack_base (&dont_print_vb_obstack),
810 fputs_filtered (", ", stream);
816 if (dont_print_vb == 0)
818 /* Free the space used to deal with the printing
819 of this type from top level. */
820 obstack_free (&dont_print_vb_obstack, last_dont_print);
821 /* Reset watermark so that we can continue protecting
822 ourselves from whatever we were protecting ourselves. */
823 dont_print_vb_obstack = tmp_obstack;
827 /* Print value of a static member.
828 To avoid infinite recursion when printing a class that contains
829 a static instance of the class, we keep the addresses of all printed
830 static member classes in an obstack and refuse to print them more
833 VAL contains the value to print, STREAM, RECURSE, and OPTIONS
834 have the same meanings as in c_val_print. */
837 pascal_object_print_static_field (struct value *val,
838 struct ui_file *stream,
840 const struct value_print_options *options)
842 struct type *type = value_type (val);
843 struct value_print_options opts;
845 if (value_entirely_optimized_out (val))
847 val_print_optimized_out (val, stream);
851 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
853 CORE_ADDR *first_dont_print, addr;
857 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
858 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
863 if (value_address (val) == first_dont_print[i])
866 <same as static member of an already seen type>",
872 addr = value_address (val);
873 obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
876 type = check_typedef (type);
877 pascal_object_print_value_fields (type,
878 value_contents_for_printing (val),
879 value_embedded_offset (val),
882 val, options, NULL, 1);
888 common_val_print (val, stream, recurse, &opts, current_language);
892 _initialize_pascal_valprint (void)
894 add_setshow_boolean_cmd ("pascal_static-members", class_support,
895 &user_print_options.pascal_static_field_print, _("\
896 Set printing of pascal static members."), _("\
897 Show printing of pascal static members."), NULL,
899 show_pascal_static_field_print,
900 &setprintlist, &showprintlist);