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