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