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