Make pascal_object_print_value_fields static
[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
PM
427}
428\f
8e069a98 429void
79a45b7d
TT
430pascal_value_print (struct value *val, struct ui_file *stream,
431 const struct value_print_options *options)
373a8247 432{
df407dfe 433 struct type *type = value_type (val);
278582cb
PM
434 struct value_print_options opts = *options;
435
436 opts.deref_ref = 1;
373a8247
PM
437
438 /* If it is a pointer, indicate what it points to.
439
440 Print type also if it is a reference.
441
442 Object pascal: if it is a member pointer, we will take care
443 of that when we print it. */
b20a3440
PM
444 if (TYPE_CODE (type) == TYPE_CODE_PTR
445 || TYPE_CODE (type) == TYPE_CODE_REF)
373a8247
PM
446 {
447 /* Hack: remove (char *) for char strings. Their
0df8b418 448 type is indicated by the quoted string anyway. */
6ced1581 449 if (TYPE_CODE (type) == TYPE_CODE_PTR
b20a3440
PM
450 && TYPE_NAME (type) == NULL
451 && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
6314a349 452 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
373a8247 453 {
0df8b418 454 /* Print nothing. */
373a8247
PM
455 }
456 else
457 {
458 fprintf_filtered (stream, "(");
459 type_print (type, "", stream, -1);
460 fprintf_filtered (stream, ") ");
461 }
462 }
8e069a98 463 common_val_print (val, stream, 0, &opts, current_language);
373a8247
PM
464}
465
466
920d2a44
AC
467static void
468show_pascal_static_field_print (struct ui_file *file, int from_tty,
469 struct cmd_list_element *c, const char *value)
470{
471 fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
472 value);
473}
373a8247
PM
474
475static struct obstack dont_print_vb_obstack;
476static struct obstack dont_print_statmem_obstack;
477
806048c6 478static void pascal_object_print_static_field (struct value *,
79a45b7d
TT
479 struct ui_file *, int,
480 const struct value_print_options *);
373a8247 481
fc1a4b47 482static void pascal_object_print_value (struct type *, const gdb_byte *,
6b850546 483 LONGEST,
79a45b7d 484 CORE_ADDR, struct ui_file *, int,
e8b24d9f 485 struct value *,
79a45b7d 486 const struct value_print_options *,
a2bd3dcd 487 struct type **);
373a8247 488
373a8247
PM
489/* It was changed to this after 2.4.5. */
490const char pascal_vtbl_ptr_name[] =
491{'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
492
493/* Return truth value for assertion that TYPE is of the type
494 "pointer to virtual function". */
495
496int
fba45db2 497pascal_object_is_vtbl_ptr_type (struct type *type)
373a8247 498{
a737d952 499 const char *type_name = TYPE_NAME (type);
373a8247 500
fe978cb0
PA
501 return (type_name != NULL
502 && strcmp (type_name, pascal_vtbl_ptr_name) == 0);
373a8247
PM
503}
504
505/* Return truth value for the assertion that TYPE is of the type
506 "pointer to virtual function table". */
507
508int
fba45db2 509pascal_object_is_vtbl_member (struct type *type)
373a8247
PM
510{
511 if (TYPE_CODE (type) == TYPE_CODE_PTR)
512 {
513 type = TYPE_TARGET_TYPE (type);
514 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
515 {
516 type = TYPE_TARGET_TYPE (type);
0df8b418
MS
517 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* If not using
518 thunks. */
519 || TYPE_CODE (type) == TYPE_CODE_PTR) /* If using thunks. */
373a8247
PM
520 {
521 /* Virtual functions tables are full of pointers
0df8b418 522 to virtual functions. */
373a8247
PM
523 return pascal_object_is_vtbl_ptr_type (type);
524 }
525 }
526 }
527 return 0;
528}
529
a2bd3dcd
AC
530/* Mutually recursive subroutines of pascal_object_print_value and
531 c_val_print to print out a structure's fields:
532 pascal_object_print_value_fields and pascal_object_print_value.
373a8247 533
79a45b7d 534 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
373a8247
PM
535 same meanings as in pascal_object_print_value and c_val_print.
536
537 DONT_PRINT is an array of baseclass types that we
538 should not print, or zero if called from top level. */
539
1e592a8a 540static void
fc1a4b47 541pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
6b850546 542 LONGEST offset,
fba45db2 543 CORE_ADDR address, struct ui_file *stream,
79a45b7d 544 int recurse,
e8b24d9f 545 struct value *val,
79a45b7d 546 const struct value_print_options *options,
fba45db2
KB
547 struct type **dont_print_vb,
548 int dont_print_statmem)
373a8247
PM
549{
550 int i, len, n_baseclasses;
79f33898
SM
551 char *last_dont_print
552 = (char *) obstack_next_free (&dont_print_statmem_obstack);
373a8247 553
f168693b 554 type = check_typedef (type);
373a8247
PM
555
556 fprintf_filtered (stream, "{");
557 len = TYPE_NFIELDS (type);
558 n_baseclasses = TYPE_N_BASECLASSES (type);
559
560 /* Print out baseclasses such that we don't print
561 duplicates of virtual baseclasses. */
562 if (n_baseclasses > 0)
490f124f
PA
563 pascal_object_print_value (type, valaddr, offset, address,
564 stream, recurse + 1, val,
565 options, dont_print_vb);
373a8247
PM
566
567 if (!len && n_baseclasses == 1)
7f6aba03 568 fprintf_styled (stream, metadata_style.style (), "<No data fields>");
373a8247
PM
569 else
570 {
c1b6e682 571 struct obstack tmp_obstack = dont_print_statmem_obstack;
373a8247
PM
572 int fields_seen = 0;
573
574 if (dont_print_statmem == 0)
575 {
576 /* If we're at top level, carve out a completely fresh
577 chunk of the obstack and use that until this particular
578 invocation returns. */
373a8247
PM
579 obstack_finish (&dont_print_statmem_obstack);
580 }
581
582 for (i = n_baseclasses; i < len; i++)
583 {
584 /* If requested, skip printing of static fields. */
79a45b7d 585 if (!options->pascal_static_field_print
d6a843b5 586 && field_is_static (&TYPE_FIELD (type, i)))
373a8247
PM
587 continue;
588 if (fields_seen)
589 fprintf_filtered (stream, ", ");
590 else if (n_baseclasses > 0)
591 {
2a998fc0 592 if (options->prettyformat)
373a8247
PM
593 {
594 fprintf_filtered (stream, "\n");
595 print_spaces_filtered (2 + 2 * recurse, stream);
596 fputs_filtered ("members of ", stream);
a737d952 597 fputs_filtered (TYPE_NAME (type), stream);
373a8247
PM
598 fputs_filtered (": ", stream);
599 }
600 }
601 fields_seen = 1;
602
2a998fc0 603 if (options->prettyformat)
373a8247
PM
604 {
605 fprintf_filtered (stream, "\n");
606 print_spaces_filtered (2 + 2 * recurse, stream);
607 }
608 else
609 {
610 wrap_here (n_spaces (2 + 2 * recurse));
611 }
e93a8774
TT
612
613 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
614
615 if (field_is_static (&TYPE_FIELD (type, i)))
3f0cbb04
TT
616 {
617 fputs_filtered ("static ", stream);
618 fprintf_symbol_filtered (stream,
619 TYPE_FIELD_NAME (type, i),
620 current_language->la_language,
621 DMGL_PARAMS | DMGL_ANSI);
622 }
623 else
624 fputs_styled (TYPE_FIELD_NAME (type, i),
625 variable_name_style.style (), stream);
e93a8774
TT
626 annotate_field_name_end ();
627 fputs_filtered (" = ", stream);
628 annotate_field_value ();
373a8247 629
d6a843b5
JK
630 if (!field_is_static (&TYPE_FIELD (type, i))
631 && TYPE_FIELD_PACKED (type, i))
373a8247 632 {
6943961c 633 struct value *v;
373a8247
PM
634
635 /* Bitfields require special handling, especially due to byte
636 order problems. */
637 if (TYPE_FIELD_IGNORE (type, i))
638 {
7f6aba03
TT
639 fputs_styled ("<optimized out or zero length>",
640 metadata_style.style (), stream);
373a8247 641 }
8cf6f0b1
TT
642 else if (value_bits_synthetic_pointer (val,
643 TYPE_FIELD_BITPOS (type,
644 i),
645 TYPE_FIELD_BITSIZE (type,
646 i)))
647 {
7f6aba03
TT
648 fputs_styled (_("<synthetic pointer>"),
649 metadata_style.style (), stream);
8cf6f0b1 650 }
373a8247
PM
651 else
652 {
79a45b7d 653 struct value_print_options opts = *options;
ad3bbd48 654
5467c6c8 655 v = value_field_bitfield (type, i, valaddr, offset, val);
373a8247 656
79a45b7d
TT
657 opts.deref_ref = 0;
658 common_val_print (v, stream, recurse + 1, &opts,
659 current_language);
373a8247
PM
660 }
661 }
662 else
663 {
664 if (TYPE_FIELD_IGNORE (type, i))
665 {
7f6aba03
TT
666 fputs_styled ("<optimized out or zero length>",
667 metadata_style.style (), stream);
373a8247 668 }
d6a843b5 669 else if (field_is_static (&TYPE_FIELD (type, i)))
373a8247 670 {
3e43a32a 671 /* struct value *v = value_static_field (type, i);
0df8b418 672 v4.17 specific. */
6943961c 673 struct value *v;
ad3bbd48 674
5467c6c8 675 v = value_field_bitfield (type, i, valaddr, offset, val);
373a8247
PM
676
677 if (v == NULL)
901461f8 678 val_print_optimized_out (NULL, stream);
373a8247 679 else
79a45b7d
TT
680 pascal_object_print_static_field (v, stream, recurse + 1,
681 options);
373a8247
PM
682 }
683 else
684 {
79a45b7d 685 struct value_print_options opts = *options;
ad3bbd48 686
79a45b7d 687 opts.deref_ref = 0;
373a8247
PM
688 /* val_print (TYPE_FIELD_TYPE (type, i),
689 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
690 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
691 stream, format, 0, recurse + 1, pretty); */
692 val_print (TYPE_FIELD_TYPE (type, i),
e8b24d9f 693 offset + TYPE_FIELD_BITPOS (type, i) / 8,
490f124f 694 address, stream, recurse + 1, val, &opts,
d8ca156b 695 current_language);
373a8247
PM
696 }
697 }
698 annotate_field_end ();
699 }
700
701 if (dont_print_statmem == 0)
702 {
703 /* Free the space used to deal with the printing
704 of the members from top level. */
705 obstack_free (&dont_print_statmem_obstack, last_dont_print);
706 dont_print_statmem_obstack = tmp_obstack;
707 }
708
2a998fc0 709 if (options->prettyformat)
373a8247
PM
710 {
711 fprintf_filtered (stream, "\n");
712 print_spaces_filtered (2 * recurse, stream);
713 }
714 }
715 fprintf_filtered (stream, "}");
716}
717
718/* Special val_print routine to avoid printing multiple copies of virtual
719 baseclasses. */
720
7080f20f 721static void
fc1a4b47 722pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
6b850546 723 LONGEST offset,
a2bd3dcd 724 CORE_ADDR address, struct ui_file *stream,
79a45b7d 725 int recurse,
e8b24d9f 726 struct value *val,
79a45b7d 727 const struct value_print_options *options,
fba45db2 728 struct type **dont_print_vb)
373a8247 729{
373a8247 730 struct type **last_dont_print
ad3bbd48 731 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
c1b6e682 732 struct obstack tmp_obstack = dont_print_vb_obstack;
373a8247
PM
733 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
734
735 if (dont_print_vb == 0)
736 {
737 /* If we're at top level, carve out a completely fresh
738 chunk of the obstack and use that until this particular
739 invocation returns. */
373a8247
PM
740 /* Bump up the high-water mark. Now alpha is omega. */
741 obstack_finish (&dont_print_vb_obstack);
742 }
743
744 for (i = 0; i < n_baseclasses; i++)
745 {
6b850546 746 LONGEST boffset = 0;
373a8247 747 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
a737d952 748 const char *basename = TYPE_NAME (baseclass);
8af8e3bc 749 const gdb_byte *base_valaddr = NULL;
6b850546 750 LONGEST thisoffset;
8af8e3bc 751 int skip = 0;
49663d05 752 gdb::byte_vector buf;
373a8247
PM
753
754 if (BASETYPE_VIA_VIRTUAL (type, i))
755 {
756 struct type **first_dont_print
ad3bbd48 757 = (struct type **) obstack_base (&dont_print_vb_obstack);
373a8247
PM
758
759 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
ad3bbd48 760 - first_dont_print;
373a8247
PM
761
762 while (--j >= 0)
763 if (baseclass == first_dont_print[j])
764 goto flush_it;
765
766 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
767 }
768
490f124f
PA
769 thisoffset = offset;
770
a70b8144 771 try
8af8e3bc
PA
772 {
773 boffset = baseclass_offset (type, i, valaddr, offset, address, val);
774 }
230d2906 775 catch (const gdb_exception_error &ex)
8af8e3bc 776 {
7556d4a4
PA
777 if (ex.error == NOT_AVAILABLE_ERROR)
778 skip = -1;
779 else
780 skip = 1;
781 }
8af8e3bc 782
7556d4a4
PA
783 if (skip == 0)
784 {
8af8e3bc
PA
785 /* The virtual base class pointer might have been clobbered by the
786 user program. Make sure that it still points to a valid memory
787 location. */
788
789 if (boffset < 0 || boffset >= TYPE_LENGTH (type))
790 {
49663d05 791 buf.resize (TYPE_LENGTH (baseclass));
6c18f3e0 792
49663d05
TT
793 base_valaddr = buf.data ();
794 if (target_read_memory (address + boffset, buf.data (),
8af8e3bc
PA
795 TYPE_LENGTH (baseclass)) != 0)
796 skip = 1;
797 address = address + boffset;
798 thisoffset = 0;
799 boffset = 0;
800 }
801 else
802 base_valaddr = valaddr;
803 }
373a8247 804
2a998fc0 805 if (options->prettyformat)
373a8247
PM
806 {
807 fprintf_filtered (stream, "\n");
808 print_spaces_filtered (2 * recurse, stream);
809 }
810 fputs_filtered ("<", stream);
811 /* Not sure what the best notation is in the case where there is no
812 baseclass name. */
813
814 fputs_filtered (basename ? basename : "", stream);
815 fputs_filtered ("> = ", stream);
816
8af8e3bc
PA
817 if (skip < 0)
818 val_print_unavailable (stream);
819 else if (skip > 0)
820 val_print_invalid_address (stream);
373a8247 821 else
3e43a32a 822 pascal_object_print_value_fields (baseclass, base_valaddr,
490f124f
PA
823 thisoffset + boffset, address,
824 stream, recurse, val, options,
373a8247
PM
825 (struct type **) obstack_base (&dont_print_vb_obstack),
826 0);
827 fputs_filtered (", ", stream);
828
829 flush_it:
830 ;
831 }
832
833 if (dont_print_vb == 0)
834 {
835 /* Free the space used to deal with the printing
836 of this type from top level. */
837 obstack_free (&dont_print_vb_obstack, last_dont_print);
838 /* Reset watermark so that we can continue protecting
839 ourselves from whatever we were protecting ourselves. */
840 dont_print_vb_obstack = tmp_obstack;
841 }
842}
843
844/* Print value of a static member.
845 To avoid infinite recursion when printing a class that contains
846 a static instance of the class, we keep the addresses of all printed
847 static member classes in an obstack and refuse to print them more
848 than once.
849
79a45b7d 850 VAL contains the value to print, STREAM, RECURSE, and OPTIONS
373a8247
PM
851 have the same meanings as in c_val_print. */
852
853static void
806048c6 854pascal_object_print_static_field (struct value *val,
79a45b7d
TT
855 struct ui_file *stream,
856 int recurse,
857 const struct value_print_options *options)
373a8247 858{
806048c6 859 struct type *type = value_type (val);
79a45b7d 860 struct value_print_options opts;
806048c6 861
686d4def
PA
862 if (value_entirely_optimized_out (val))
863 {
864 val_print_optimized_out (val, stream);
865 return;
866 }
867
373a8247
PM
868 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
869 {
42ae5230 870 CORE_ADDR *first_dont_print, addr;
373a8247
PM
871 int i;
872
873 first_dont_print
874 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
875 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
876 - first_dont_print;
877
878 while (--i >= 0)
879 {
42ae5230 880 if (value_address (val) == first_dont_print[i])
373a8247 881 {
2dbc041e
TT
882 fputs_styled (_("\
883<same as static member of an already seen type>"),
884 metadata_style.style (), stream);
373a8247
PM
885 return;
886 }
887 }
888
42ae5230
TT
889 addr = value_address (val);
890 obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
373a8247
PM
891 sizeof (CORE_ADDR));
892
f168693b 893 type = check_typedef (type);
490f124f
PA
894 pascal_object_print_value_fields (type,
895 value_contents_for_printing (val),
896 value_embedded_offset (val),
897 addr,
898 stream, recurse,
899 val, options, NULL, 1);
373a8247
PM
900 return;
901 }
79a45b7d
TT
902
903 opts = *options;
904 opts.deref_ref = 0;
905 common_val_print (val, stream, recurse, &opts, current_language);
373a8247
PM
906}
907
6c265988 908void _initialize_pascal_valprint ();
373a8247 909void
6c265988 910_initialize_pascal_valprint ()
373a8247 911{
5bf193a2 912 add_setshow_boolean_cmd ("pascal_static-members", class_support,
79a45b7d 913 &user_print_options.pascal_static_field_print, _("\
5bf193a2
AC
914Set printing of pascal static members."), _("\
915Show printing of pascal static members."), NULL,
916 NULL,
920d2a44 917 show_pascal_static_field_print,
5bf193a2 918 &setprintlist, &showprintlist);
373a8247 919}
This page took 1.939689 seconds and 4 git commands to generate.