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