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