]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/p-valprint.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / gdb / p-valprint.c
CommitLineData
373a8247 1/* Support for printing Pascal values for GDB, the GNU debugger.
5bcca90b 2
b811d2c2 3 Copyright (C) 2000-2020 Free Software Foundation, Inc.
373a8247
PM
4
5 This file is part of GDB.
6
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
373a8247
PM
10 (at your option) any later version.
11
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.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
373a8247
PM
19
20/* This file is derived from c-valprint.c */
21
22#include "defs.h"
04ea0df1 23#include "gdb_obstack.h"
373a8247
PM
24#include "symtab.h"
25#include "gdbtypes.h"
26#include "expression.h"
27#include "value.h"
28#include "command.h"
29#include "gdbcmd.h"
30#include "gdbcore.h"
31#include "demangle.h"
32#include "valprint.h"
3172dc30 33#include "typeprint.h"
373a8247
PM
34#include "language.h"
35#include "target.h"
36#include "annotate.h"
37#include "p-lang.h"
eb43544b 38#include "cp-abi.h"
d3cbe7ef 39#include "cp-support.h"
77e371c0 40#include "objfiles.h"
268a13a5 41#include "gdbsupport/byte-vector.h"
7f6aba03 42#include "cli/cli-style.h"
373a8247
PM
43\f
44
07a32858
TT
45static void pascal_object_print_value_fields (struct value *, struct ui_file *,
46 int,
47 const struct value_print_options *,
48 struct type **, int);
49
e88acd96
TT
50/* Decorations for Pascal. */
51
52static const struct generic_val_print_decorations p_decorations =
53{
54 "",
55 " + ",
56 " * I",
57 "true",
58 "false",
00272ec4
TT
59 "void",
60 "{",
61 "}"
e88acd96
TT
62};
63
426a9c18 64/* See p-lang.h. */
373a8247 65
d3eab38a 66void
426a9c18
TT
67pascal_value_print_inner (struct value *val, struct ui_file *stream,
68 int recurse,
69 const struct value_print_options *options)
70
373a8247 71{
426a9c18 72 struct type *type = check_typedef (value_type (val));
5af949e3 73 struct gdbarch *gdbarch = get_type_arch (type);
34877895 74 enum bfd_endian byte_order = type_byte_order (type);
52f0bd74 75 unsigned int i = 0; /* Number of characters printed */
373a8247
PM
76 unsigned len;
77 struct type *elttype;
78 unsigned eltlen;
5598ce11 79 int length_pos, length_size, string_pos;
6c7a06a3 80 struct type *char_type;
373a8247 81 CORE_ADDR addr;
b012acdd 82 int want_space = 0;
426a9c18 83 const gdb_byte *valaddr = value_contents_for_printing (val);
373a8247 84
78134374 85 switch (type->code ())
373a8247
PM
86 {
87 case TYPE_CODE_ARRAY:
b926417a
TT
88 {
89 LONGEST low_bound, high_bound;
373a8247 90
b926417a
TT
91 if (get_array_bounds (type, &low_bound, &high_bound))
92 {
93 len = high_bound - low_bound + 1;
94 elttype = check_typedef (TYPE_TARGET_TYPE (type));
95 eltlen = TYPE_LENGTH (elttype);
b926417a
TT
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)
78134374 101 && elttype->code () == TYPE_CODE_CHAR
b926417a
TT
102 && options->format == 0))
103 {
104 /* If requested, look for the first null char and only print
105 elements up to it. */
106 if (options->stop_print_at_null)
107 {
108 unsigned int temp_len;
109
110 /* Look for a NULL char. */
111 for (temp_len = 0;
426a9c18
TT
112 extract_unsigned_integer (valaddr + temp_len * eltlen,
113 eltlen, byte_order)
b926417a
TT
114 && temp_len < len && temp_len < options->print_max;
115 temp_len++);
116 len = temp_len;
117 }
118
119 LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type),
426a9c18 120 valaddr, len, NULL, 0, options);
b926417a
TT
121 i = len;
122 }
123 else
124 {
125 fprintf_filtered (stream, "{");
126 /* If this is a virtual function table, print the 0th
127 entry specially, and the rest of the members normally. */
128 if (pascal_object_is_vtbl_ptr_type (elttype))
129 {
130 i = 1;
131 fprintf_filtered (stream, "%d vtable entries", len - 1);
132 }
133 else
134 {
135 i = 0;
136 }
426a9c18 137 value_print_array_elements (val, stream, recurse, options, i);
b926417a
TT
138 fprintf_filtered (stream, "}");
139 }
140 break;
141 }
142 /* Array of unspecified length: treat like pointer to first elt. */
426a9c18 143 addr = value_address (val);
b926417a 144 }
373a8247
PM
145 goto print_unpacked_pointer;
146
147 case TYPE_CODE_PTR:
79a45b7d 148 if (options->format && options->format != 's')
373a8247 149 {
426a9c18 150 value_print_scalar_formatted (val, options, 0, stream);
373a8247
PM
151 break;
152 }
79a45b7d 153 if (options->vtblprint && pascal_object_is_vtbl_ptr_type (type))
373a8247
PM
154 {
155 /* Print the unmangled name if desired. */
156 /* Print vtable entry - we only get here if we ARE using
0df8b418 157 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
b276f1bb 158 /* Extract the address, assume that it is unsigned. */
426a9c18 159 addr = extract_unsigned_integer (valaddr,
e17a4113 160 TYPE_LENGTH (type), byte_order);
edf0c1b7 161 print_address_demangle (options, gdbarch, addr, stream, demangle);
373a8247
PM
162 break;
163 }
91e8df85 164 check_typedef (TYPE_TARGET_TYPE (type));
e13eedd5 165
426a9c18 166 addr = unpack_pointer (type, valaddr);
e13eedd5
PM
167 print_unpacked_pointer:
168 elttype = check_typedef (TYPE_TARGET_TYPE (type));
169
78134374 170 if (elttype->code () == TYPE_CODE_FUNC)
373a8247 171 {
e13eedd5 172 /* Try to print what function it points to. */
edf0c1b7 173 print_address_demangle (options, gdbarch, addr, stream, demangle);
d3eab38a 174 return;
e13eedd5 175 }
373a8247 176
e13eedd5
PM
177 if (options->addressprint && options->format != 's')
178 {
179 fputs_filtered (paddress (gdbarch, addr), stream);
b012acdd 180 want_space = 1;
e13eedd5 181 }
373a8247 182
e13eedd5
PM
183 /* For a pointer to char or unsigned char, also print the string
184 pointed to, unless pointer is null. */
185 if (((TYPE_LENGTH (elttype) == 1
78134374
SM
186 && (elttype->code () == TYPE_CODE_INT
187 || elttype->code () == TYPE_CODE_CHAR))
188 || ((TYPE_LENGTH (elttype) == 2 || TYPE_LENGTH (elttype) == 4)
189 && elttype->code () == TYPE_CODE_CHAR))
e13eedd5
PM
190 && (options->format == 0 || options->format == 's')
191 && addr != 0)
192 {
b012acdd
TT
193 if (want_space)
194 fputs_filtered (" ", stream);
0df8b418 195 /* No wide string yet. */
09ca9e2e 196 i = val_print_string (elttype, NULL, addr, -1, stream, options);
e13eedd5 197 }
0df8b418 198 /* Also for pointers to pascal strings. */
e13eedd5
PM
199 /* Note: this is Free Pascal specific:
200 as GDB does not recognize stabs pascal strings
201 Pascal strings are mapped to records
0df8b418 202 with lowercase names PM. */
e13eedd5
PM
203 if (is_pascal_string_type (elttype, &length_pos, &length_size,
204 &string_pos, &char_type, NULL)
205 && addr != 0)
206 {
207 ULONGEST string_length;
7c543f7b 208 gdb_byte *buffer;
ad3bbd48 209
b012acdd
TT
210 if (want_space)
211 fputs_filtered (" ", stream);
7c543f7b 212 buffer = (gdb_byte *) xmalloc (length_size);
e13eedd5
PM
213 read_memory (addr + length_pos, buffer, length_size);
214 string_length = extract_unsigned_integer (buffer, length_size,
215 byte_order);
216 xfree (buffer);
09ca9e2e
TT
217 i = val_print_string (char_type, NULL,
218 addr + string_pos, string_length,
219 stream, options);
e13eedd5
PM
220 }
221 else if (pascal_object_is_vtbl_member (type))
222 {
0df8b418 223 /* Print vtbl's nicely. */
426a9c18 224 CORE_ADDR vt_address = unpack_pointer (type, valaddr);
7cbd4a93 225 struct bound_minimal_symbol msymbol =
ad3bbd48
MS
226 lookup_minimal_symbol_by_pc (vt_address);
227
9cb709b6
TT
228 /* If 'symbol_print' is set, we did the work above. */
229 if (!options->symbol_print
7cbd4a93 230 && (msymbol.minsym != NULL)
77e371c0 231 && (vt_address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
373a8247 232 {
b012acdd
TT
233 if (want_space)
234 fputs_filtered (" ", stream);
235 fputs_filtered ("<", stream);
c9d95fa3 236 fputs_filtered (msymbol.minsym->print_name (), stream);
e13eedd5 237 fputs_filtered (">", stream);
b012acdd 238 want_space = 1;
373a8247 239 }
e13eedd5 240 if (vt_address && options->vtblprint)
373a8247 241 {
e13eedd5 242 struct value *vt_val;
be903358 243 struct symbol *wsym = NULL;
e13eedd5 244 struct type *wtype;
373a8247 245
b012acdd
TT
246 if (want_space)
247 fputs_filtered (" ", stream);
248
7cbd4a93 249 if (msymbol.minsym != NULL)
de63c46b 250 {
c9d95fa3 251 const char *search_name = msymbol.minsym->search_name ();
582942f4 252 wsym = lookup_symbol_search_name (search_name, NULL,
de63c46b
PA
253 VAR_DOMAIN).symbol;
254 }
e13eedd5
PM
255
256 if (wsym)
373a8247 257 {
e13eedd5 258 wtype = SYMBOL_TYPE (wsym);
373a8247 259 }
e13eedd5 260 else
373a8247 261 {
e13eedd5
PM
262 wtype = TYPE_TARGET_TYPE (type);
263 }
264 vt_val = value_at (wtype, vt_address);
265 common_val_print (vt_val, stream, recurse + 1, options,
266 current_language);
2a998fc0 267 if (options->prettyformat)
e13eedd5
PM
268 {
269 fprintf_filtered (stream, "\n");
270 print_spaces_filtered (2 + 2 * recurse, stream);
373a8247
PM
271 }
272 }
373a8247 273 }
e13eedd5 274
d3eab38a 275 return;
373a8247 276
373a8247 277 case TYPE_CODE_REF:
e88acd96
TT
278 case TYPE_CODE_ENUM:
279 case TYPE_CODE_FLAGS:
280 case TYPE_CODE_FUNC:
281 case TYPE_CODE_RANGE:
282 case TYPE_CODE_INT:
283 case TYPE_CODE_FLT:
284 case TYPE_CODE_VOID:
285 case TYPE_CODE_ERROR:
286 case TYPE_CODE_UNDEF:
287 case TYPE_CODE_BOOL:
288 case TYPE_CODE_CHAR:
426a9c18 289 generic_value_print (val, stream, recurse, options, &p_decorations);
373a8247
PM
290 break;
291
292 case TYPE_CODE_UNION:
79a45b7d 293 if (recurse && !options->unionprint)
373a8247
PM
294 {
295 fprintf_filtered (stream, "{...}");
296 break;
297 }
298 /* Fall through. */
299 case TYPE_CODE_STRUCT:
79a45b7d 300 if (options->vtblprint && pascal_object_is_vtbl_ptr_type (type))
373a8247
PM
301 {
302 /* Print the unmangled name if desired. */
303 /* Print vtable entry - we only get here if NOT using
0df8b418 304 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
b276f1bb
AC
305 /* Extract the address, assume that it is unsigned. */
306 print_address_demangle
edf0c1b7 307 (options, gdbarch,
426a9c18 308 extract_unsigned_integer (valaddr
3e43a32a
MS
309 + TYPE_FIELD_BITPOS (type,
310 VTBL_FNADDR_OFFSET) / 8,
311 TYPE_LENGTH (TYPE_FIELD_TYPE (type,
312 VTBL_FNADDR_OFFSET)),
313 byte_order),
b276f1bb 314 stream, demangle);
373a8247
PM
315 }
316 else
317 {
5598ce11 318 if (is_pascal_string_type (type, &length_pos, &length_size,
6c7a06a3 319 &string_pos, &char_type, NULL))
373a8247 320 {
426a9c18
TT
321 len = extract_unsigned_integer (valaddr + length_pos,
322 length_size, byte_order);
323 LA_PRINT_STRING (stream, char_type, valaddr + string_pos,
be759fcf 324 len, NULL, 0, options);
373a8247
PM
325 }
326 else
426a9c18
TT
327 pascal_object_print_value_fields (val, stream, recurse,
328 options, NULL, 0);
373a8247
PM
329 }
330 break;
331
373a8247
PM
332 case TYPE_CODE_SET:
333 elttype = TYPE_INDEX_TYPE (type);
f168693b 334 elttype = check_typedef (elttype);
74a9bb82 335 if (TYPE_STUB (elttype))
373a8247 336 {
7f6aba03 337 fprintf_styled (stream, metadata_style.style (), "<incomplete type>");
373a8247
PM
338 break;
339 }
340 else
341 {
342 struct type *range = elttype;
343 LONGEST low_bound, high_bound;
373a8247
PM
344 int need_comma = 0;
345
6b1755ce 346 fputs_filtered ("[", stream);
373a8247 347
b926417a 348 int bound_info = get_discrete_bounds (range, &low_bound, &high_bound);
7a081a30
PM
349 if (low_bound == 0 && high_bound == -1 && TYPE_LENGTH (type) > 0)
350 {
351 /* If we know the size of the set type, we can figure out the
352 maximum value. */
b926417a 353 bound_info = 0;
7a081a30
PM
354 high_bound = TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1;
355 TYPE_HIGH_BOUND (range) = high_bound;
356 }
373a8247 357 maybe_bad_bstring:
b926417a 358 if (bound_info < 0)
373a8247 359 {
7f6aba03 360 fputs_styled ("<error value>", metadata_style.style (), stream);
373a8247
PM
361 goto done;
362 }
363
364 for (i = low_bound; i <= high_bound; i++)
365 {
426a9c18 366 int element = value_bit_index (type, valaddr, i);
ad3bbd48 367
373a8247
PM
368 if (element < 0)
369 {
370 i = element;
371 goto maybe_bad_bstring;
372 }
6b1755ce 373 if (element)
373a8247
PM
374 {
375 if (need_comma)
376 fputs_filtered (", ", stream);
377 print_type_scalar (range, i, stream);
378 need_comma = 1;
379
3e43a32a 380 if (i + 1 <= high_bound
426a9c18 381 && value_bit_index (type, valaddr, ++i))
373a8247
PM
382 {
383 int j = i;
ad3bbd48 384
373a8247
PM
385 fputs_filtered ("..", stream);
386 while (i + 1 <= high_bound
426a9c18 387 && value_bit_index (type, valaddr, ++i))
373a8247
PM
388 j = i;
389 print_type_scalar (range, j, stream);
390 }
391 }
392 }
393 done:
6b1755ce 394 fputs_filtered ("]", stream);
373a8247
PM
395 }
396 break;
397
373a8247 398 default:
3e43a32a 399 error (_("Invalid pascal type code %d in symbol table."),
78134374 400 type->code ());
373a8247 401 }
373a8247 402}
c0941be6 403
426a9c18 404\f
c0941be6 405void
426a9c18
TT
406pascal_value_print (struct value *val, struct ui_file *stream,
407 const struct value_print_options *options)
c0941be6 408{
426a9c18
TT
409 struct type *type = value_type (val);
410 struct value_print_options opts = *options;
64d64d3a 411
426a9c18 412 opts.deref_ref = 1;
64d64d3a 413
426a9c18 414 /* If it is a pointer, indicate what it points to.
64d64d3a 415
426a9c18 416 Print type also if it is a reference.
64d64d3a 417
426a9c18
TT
418 Object pascal: if it is a member pointer, we will take care
419 of that when we print it. */
78134374
SM
420 if (type->code () == TYPE_CODE_PTR
421 || type->code () == TYPE_CODE_REF)
426a9c18
TT
422 {
423 /* Hack: remove (char *) for char strings. Their
424 type is indicated by the quoted string anyway. */
78134374 425 if (type->code () == TYPE_CODE_PTR
7d93a1e0
SM
426 && type->name () == NULL
427 && TYPE_TARGET_TYPE (type)->name () != NULL
428 && strcmp (TYPE_TARGET_TYPE (type)->name (), "char") == 0)
64d64d3a 429 {
426a9c18 430 /* Print nothing. */
64d64d3a 431 }
426a9c18 432 else
64d64d3a 433 {
426a9c18
TT
434 fprintf_filtered (stream, "(");
435 type_print (type, "", stream, -1);
436 fprintf_filtered (stream, ") ");
64d64d3a 437 }
426a9c18
TT
438 }
439 common_val_print (val, stream, 0, &opts, current_language);
440}
64d64d3a 441
64d64d3a 442
426a9c18
TT
443static void
444show_pascal_static_field_print (struct ui_file *file, int from_tty,
445 struct cmd_list_element *c, const char *value)
446{
447 fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
448 value);
449}
64d64d3a 450
426a9c18
TT
451static struct obstack dont_print_vb_obstack;
452static struct obstack dont_print_statmem_obstack;
64d64d3a 453
426a9c18
TT
454static void pascal_object_print_static_field (struct value *,
455 struct ui_file *, int,
456 const struct value_print_options *);
64d64d3a 457
426a9c18
TT
458static void pascal_object_print_value (struct value *, struct ui_file *, int,
459 const struct value_print_options *,
460 struct type **);
64d64d3a 461
426a9c18
TT
462/* It was changed to this after 2.4.5. */
463const char pascal_vtbl_ptr_name[] =
464{'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
64d64d3a 465
426a9c18
TT
466/* Return truth value for assertion that TYPE is of the type
467 "pointer to virtual function". */
64d64d3a 468
426a9c18
TT
469int
470pascal_object_is_vtbl_ptr_type (struct type *type)
471{
7d93a1e0 472 const char *type_name = type->name ();
373a8247 473
fe978cb0
PA
474 return (type_name != NULL
475 && strcmp (type_name, pascal_vtbl_ptr_name) == 0);
373a8247
PM
476}
477
478/* Return truth value for the assertion that TYPE is of the type
479 "pointer to virtual function table". */
480
481int
fba45db2 482pascal_object_is_vtbl_member (struct type *type)
373a8247 483{
78134374 484 if (type->code () == TYPE_CODE_PTR)
373a8247
PM
485 {
486 type = TYPE_TARGET_TYPE (type);
78134374 487 if (type->code () == TYPE_CODE_ARRAY)
373a8247
PM
488 {
489 type = TYPE_TARGET_TYPE (type);
78134374 490 if (type->code () == TYPE_CODE_STRUCT /* If not using
0df8b418 491 thunks. */
78134374 492 || type->code () == TYPE_CODE_PTR) /* If using thunks. */
373a8247
PM
493 {
494 /* Virtual functions tables are full of pointers
0df8b418 495 to virtual functions. */
373a8247
PM
496 return pascal_object_is_vtbl_ptr_type (type);
497 }
498 }
499 }
500 return 0;
501}
502
07a32858
TT
503/* Mutually recursive subroutines of pascal_object_print_value and
504 pascal_value_print to print out a structure's fields:
505 pascal_object_print_value_fields and pascal_object_print_value.
506
507 VAL, STREAM, RECURSE, and OPTIONS have the same meanings as in
508 pascal_object_print_value and c_value_print.
509
510 DONT_PRINT is an array of baseclass types that we
511 should not print, or zero if called from top level. */
512
513static void
514pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
515 int recurse,
516 const struct value_print_options *options,
517 struct type **dont_print_vb,
518 int dont_print_statmem)
519{
520 int i, len, n_baseclasses;
521 char *last_dont_print
522 = (char *) obstack_next_free (&dont_print_statmem_obstack);
523
524 struct type *type = check_typedef (value_type (val));
525
526 fprintf_filtered (stream, "{");
1f704f76 527 len = type->num_fields ();
07a32858
TT
528 n_baseclasses = TYPE_N_BASECLASSES (type);
529
530 /* Print out baseclasses such that we don't print
531 duplicates of virtual baseclasses. */
532 if (n_baseclasses > 0)
533 pascal_object_print_value (val, stream, recurse + 1,
534 options, dont_print_vb);
535
536 if (!len && n_baseclasses == 1)
537 fprintf_styled (stream, metadata_style.style (), "<No data fields>");
538 else
539 {
540 struct obstack tmp_obstack = dont_print_statmem_obstack;
541 int fields_seen = 0;
542 const gdb_byte *valaddr = value_contents_for_printing (val);
543
544 if (dont_print_statmem == 0)
545 {
546 /* If we're at top level, carve out a completely fresh
547 chunk of the obstack and use that until this particular
548 invocation returns. */
549 obstack_finish (&dont_print_statmem_obstack);
550 }
551
552 for (i = n_baseclasses; i < len; i++)
553 {
554 /* If requested, skip printing of static fields. */
555 if (!options->pascal_static_field_print
ceacbf6e 556 && field_is_static (&type->field (i)))
07a32858
TT
557 continue;
558 if (fields_seen)
559 fprintf_filtered (stream, ", ");
560 else if (n_baseclasses > 0)
561 {
562 if (options->prettyformat)
563 {
564 fprintf_filtered (stream, "\n");
565 print_spaces_filtered (2 + 2 * recurse, stream);
566 fputs_filtered ("members of ", stream);
7d93a1e0 567 fputs_filtered (type->name (), stream);
07a32858
TT
568 fputs_filtered (": ", stream);
569 }
570 }
571 fields_seen = 1;
572
573 if (options->prettyformat)
574 {
575 fprintf_filtered (stream, "\n");
576 print_spaces_filtered (2 + 2 * recurse, stream);
577 }
578 else
579 {
580 wrap_here (n_spaces (2 + 2 * recurse));
581 }
582
583 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
584
ceacbf6e 585 if (field_is_static (&type->field (i)))
07a32858
TT
586 {
587 fputs_filtered ("static ", stream);
588 fprintf_symbol_filtered (stream,
589 TYPE_FIELD_NAME (type, i),
590 current_language->la_language,
591 DMGL_PARAMS | DMGL_ANSI);
592 }
593 else
594 fputs_styled (TYPE_FIELD_NAME (type, i),
595 variable_name_style.style (), stream);
596 annotate_field_name_end ();
597 fputs_filtered (" = ", stream);
598 annotate_field_value ();
599
ceacbf6e 600 if (!field_is_static (&type->field (i))
07a32858
TT
601 && TYPE_FIELD_PACKED (type, i))
602 {
603 struct value *v;
604
605 /* Bitfields require special handling, especially due to byte
606 order problems. */
607 if (TYPE_FIELD_IGNORE (type, i))
608 {
609 fputs_styled ("<optimized out or zero length>",
610 metadata_style.style (), stream);
611 }
612 else if (value_bits_synthetic_pointer (val,
613 TYPE_FIELD_BITPOS (type,
614 i),
615 TYPE_FIELD_BITSIZE (type,
616 i)))
617 {
618 fputs_styled (_("<synthetic pointer>"),
619 metadata_style.style (), stream);
620 }
621 else
622 {
623 struct value_print_options opts = *options;
624
625 v = value_field_bitfield (type, i, valaddr, 0, val);
626
627 opts.deref_ref = 0;
628 common_val_print (v, stream, recurse + 1, &opts,
629 current_language);
630 }
631 }
632 else
633 {
634 if (TYPE_FIELD_IGNORE (type, i))
635 {
636 fputs_styled ("<optimized out or zero length>",
637 metadata_style.style (), stream);
638 }
ceacbf6e 639 else if (field_is_static (&type->field (i)))
07a32858
TT
640 {
641 /* struct value *v = value_static_field (type, i);
642 v4.17 specific. */
643 struct value *v;
644
645 v = value_field_bitfield (type, i, valaddr, 0, val);
646
647 if (v == NULL)
648 val_print_optimized_out (NULL, stream);
649 else
650 pascal_object_print_static_field (v, stream, recurse + 1,
651 options);
652 }
653 else
654 {
655 struct value_print_options opts = *options;
656
657 opts.deref_ref = 0;
658
659 struct value *v = value_primitive_field (val, 0, i,
660 value_type (val));
661 common_val_print (v, stream, recurse + 1, &opts,
662 current_language);
663 }
664 }
665 annotate_field_end ();
666 }
667
668 if (dont_print_statmem == 0)
669 {
670 /* Free the space used to deal with the printing
671 of the members from top level. */
672 obstack_free (&dont_print_statmem_obstack, last_dont_print);
673 dont_print_statmem_obstack = tmp_obstack;
674 }
675
676 if (options->prettyformat)
677 {
678 fprintf_filtered (stream, "\n");
679 print_spaces_filtered (2 * recurse, stream);
680 }
681 }
682 fprintf_filtered (stream, "}");
683}
684
07a32858
TT
685/* Special val_print routine to avoid printing multiple copies of virtual
686 baseclasses. */
687
688static void
689pascal_object_print_value (struct value *val, struct ui_file *stream,
690 int recurse,
691 const struct value_print_options *options,
692 struct type **dont_print_vb)
693{
694 struct type **last_dont_print
695 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
696 struct obstack tmp_obstack = dont_print_vb_obstack;
697 struct type *type = check_typedef (value_type (val));
698 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
699
700 if (dont_print_vb == 0)
701 {
702 /* If we're at top level, carve out a completely fresh
703 chunk of the obstack and use that until this particular
704 invocation returns. */
705 /* Bump up the high-water mark. Now alpha is omega. */
706 obstack_finish (&dont_print_vb_obstack);
707 }
708
709 for (i = 0; i < n_baseclasses; i++)
710 {
711 LONGEST boffset = 0;
712 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
7d93a1e0 713 const char *basename = baseclass->name ();
07a32858
TT
714 int skip = 0;
715
716 if (BASETYPE_VIA_VIRTUAL (type, i))
717 {
718 struct type **first_dont_print
719 = (struct type **) obstack_base (&dont_print_vb_obstack);
720
721 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
722 - first_dont_print;
723
724 while (--j >= 0)
725 if (baseclass == first_dont_print[j])
726 goto flush_it;
727
728 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
729 }
730
731 struct value *base_value;
732 try
733 {
734 base_value = value_primitive_field (val, 0, i, type);
735 }
736 catch (const gdb_exception_error &ex)
737 {
771dd3a8 738 base_value = nullptr;
07a32858
TT
739 if (ex.error == NOT_AVAILABLE_ERROR)
740 skip = -1;
741 else
742 skip = 1;
743 }
744
745 if (skip == 0)
746 {
747 /* The virtual base class pointer might have been clobbered by the
748 user program. Make sure that it still points to a valid memory
749 location. */
750
751 if (boffset < 0 || boffset >= TYPE_LENGTH (type))
752 {
753 CORE_ADDR address= value_address (val);
754 gdb::byte_vector buf (TYPE_LENGTH (baseclass));
755
756 if (target_read_memory (address + boffset, buf.data (),
757 TYPE_LENGTH (baseclass)) != 0)
758 skip = 1;
759 base_value = value_from_contents_and_address (baseclass,
760 buf.data (),
761 address + boffset);
762 baseclass = value_type (base_value);
763 boffset = 0;
764 }
765 }
766
767 if (options->prettyformat)
768 {
769 fprintf_filtered (stream, "\n");
770 print_spaces_filtered (2 * recurse, stream);
771 }
772 fputs_filtered ("<", stream);
773 /* Not sure what the best notation is in the case where there is no
774 baseclass name. */
775
776 fputs_filtered (basename ? basename : "", stream);
777 fputs_filtered ("> = ", stream);
778
779 if (skip < 0)
780 val_print_unavailable (stream);
781 else if (skip > 0)
782 val_print_invalid_address (stream);
783 else
784 pascal_object_print_value_fields
785 (base_value, stream, recurse, options,
786 (struct type **) obstack_base (&dont_print_vb_obstack),
787 0);
788 fputs_filtered (", ", stream);
789
790 flush_it:
791 ;
792 }
793
794 if (dont_print_vb == 0)
795 {
796 /* Free the space used to deal with the printing
797 of this type from top level. */
798 obstack_free (&dont_print_vb_obstack, last_dont_print);
799 /* Reset watermark so that we can continue protecting
800 ourselves from whatever we were protecting ourselves. */
801 dont_print_vb_obstack = tmp_obstack;
802 }
803}
804
373a8247
PM
805/* Print value of a static member.
806 To avoid infinite recursion when printing a class that contains
807 a static instance of the class, we keep the addresses of all printed
808 static member classes in an obstack and refuse to print them more
809 than once.
810
79a45b7d 811 VAL contains the value to print, STREAM, RECURSE, and OPTIONS
373a8247
PM
812 have the same meanings as in c_val_print. */
813
814static void
806048c6 815pascal_object_print_static_field (struct value *val,
79a45b7d
TT
816 struct ui_file *stream,
817 int recurse,
818 const struct value_print_options *options)
373a8247 819{
806048c6 820 struct type *type = value_type (val);
79a45b7d 821 struct value_print_options opts;
806048c6 822
686d4def
PA
823 if (value_entirely_optimized_out (val))
824 {
825 val_print_optimized_out (val, stream);
826 return;
827 }
828
78134374 829 if (type->code () == TYPE_CODE_STRUCT)
373a8247 830 {
42ae5230 831 CORE_ADDR *first_dont_print, addr;
373a8247
PM
832 int i;
833
834 first_dont_print
835 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
836 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
837 - first_dont_print;
838
839 while (--i >= 0)
840 {
42ae5230 841 if (value_address (val) == first_dont_print[i])
373a8247 842 {
2dbc041e
TT
843 fputs_styled (_("\
844<same as static member of an already seen type>"),
845 metadata_style.style (), stream);
373a8247
PM
846 return;
847 }
848 }
849
42ae5230
TT
850 addr = value_address (val);
851 obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
373a8247
PM
852 sizeof (CORE_ADDR));
853
f168693b 854 type = check_typedef (type);
426a9c18
TT
855 pascal_object_print_value_fields (val, stream, recurse,
856 options, NULL, 1);
373a8247
PM
857 return;
858 }
79a45b7d
TT
859
860 opts = *options;
861 opts.deref_ref = 0;
862 common_val_print (val, stream, recurse, &opts, current_language);
373a8247
PM
863}
864
6c265988 865void _initialize_pascal_valprint ();
373a8247 866void
6c265988 867_initialize_pascal_valprint ()
373a8247 868{
5bf193a2 869 add_setshow_boolean_cmd ("pascal_static-members", class_support,
79a45b7d 870 &user_print_options.pascal_static_field_print, _("\
5bf193a2
AC
871Set printing of pascal static members."), _("\
872Show printing of pascal static members."), NULL,
873 NULL,
920d2a44 874 show_pascal_static_field_print,
5bf193a2 875 &setprintlist, &showprintlist);
373a8247 876}