[PATCH 12/57][Arm][GAS] Add support for MVE instructions: vaddlv and vaddv
[binutils-gdb.git] / gdb / cp-valprint.c
blobff860df499a95246366d08cffd54dea5b7d43cf8
1 /* Support for printing C++ values for GDB, the GNU debugger.
3 Copyright (C) 1986-2019 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
20 #include "defs.h"
21 #include "gdb_obstack.h"
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "expression.h"
25 #include "value.h"
26 #include "command.h"
27 #include "gdbcmd.h"
28 #include "demangle.h"
29 #include "annotate.h"
30 #include "c-lang.h"
31 #include "target.h"
32 #include "cp-abi.h"
33 #include "valprint.h"
34 #include "cp-support.h"
35 #include "language.h"
36 #include "extension.h"
37 #include "typeprint.h"
38 #include "common/byte-vector.h"
40 /* Controls printing of vtbl's. */
41 static void
42 show_vtblprint (struct ui_file *file, int from_tty,
43 struct cmd_list_element *c, const char *value)
45 fprintf_filtered (file, _("\
46 Printing of C++ virtual function tables is %s.\n"),
47 value);
50 /* Controls looking up an object's derived type using what we find in
51 its vtables. */
52 static void
53 show_objectprint (struct ui_file *file, int from_tty,
54 struct cmd_list_element *c,
55 const char *value)
57 fprintf_filtered (file, _("\
58 Printing of object's derived type based on vtable info is %s.\n"),
59 value);
62 static void
63 show_static_field_print (struct ui_file *file, int from_tty,
64 struct cmd_list_element *c,
65 const char *value)
67 fprintf_filtered (file,
68 _("Printing of C++ static members is %s.\n"),
69 value);
73 static struct obstack dont_print_vb_obstack;
74 static struct obstack dont_print_statmem_obstack;
75 static struct obstack dont_print_stat_array_obstack;
77 static void cp_print_static_field (struct type *, struct value *,
78 struct ui_file *, int,
79 const struct value_print_options *);
81 static void cp_print_value (struct type *, struct type *,
82 LONGEST,
83 CORE_ADDR, struct ui_file *,
84 int, struct value *,
85 const struct value_print_options *,
86 struct type **);
89 /* GCC versions after 2.4.5 use this. */
90 extern const char vtbl_ptr_name[] = "__vtbl_ptr_type";
92 /* Return truth value for assertion that TYPE is of the type
93 "pointer to virtual function". */
95 int
96 cp_is_vtbl_ptr_type (struct type *type)
98 const char *type_name = TYPE_NAME (type);
100 return (type_name != NULL && !strcmp (type_name, vtbl_ptr_name));
103 /* Return truth value for the assertion that TYPE is of the type
104 "pointer to virtual function table". */
107 cp_is_vtbl_member (struct type *type)
109 /* With older versions of g++, the vtbl field pointed to an array of
110 structures. Nowadays it points directly to the structure. */
111 if (TYPE_CODE (type) == TYPE_CODE_PTR)
113 type = TYPE_TARGET_TYPE (type);
114 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
116 type = TYPE_TARGET_TYPE (type);
117 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
118 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
120 /* Virtual functions tables are full of pointers
121 to virtual functions. */
122 return cp_is_vtbl_ptr_type (type);
125 else if (TYPE_CODE (type) == TYPE_CODE_STRUCT) /* if not using thunks */
127 return cp_is_vtbl_ptr_type (type);
129 else if (TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
131 /* The type name of the thunk pointer is NULL when using
132 dwarf2. We could test for a pointer to a function, but
133 there is no type info for the virtual table either, so it
134 wont help. */
135 return cp_is_vtbl_ptr_type (type);
138 return 0;
141 /* Mutually recursive subroutines of cp_print_value and c_val_print to
142 print out a structure's fields: cp_print_value_fields and
143 cp_print_value.
145 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the same
146 meanings as in cp_print_value and c_val_print.
148 2nd argument REAL_TYPE is used to carry over the type of the
149 derived class across the recursion to base classes.
151 DONT_PRINT is an array of baseclass types that we should not print,
152 or zero if called from top level. */
154 void
155 cp_print_value_fields (struct type *type, struct type *real_type,
156 LONGEST offset,
157 CORE_ADDR address, struct ui_file *stream,
158 int recurse, struct value *val,
159 const struct value_print_options *options,
160 struct type **dont_print_vb,
161 int dont_print_statmem)
163 int i, len, n_baseclasses;
164 int fields_seen = 0;
165 static int last_set_recurse = -1;
167 type = check_typedef (type);
169 if (recurse == 0)
171 /* Any object can be left on obstacks only during an unexpected
172 error. */
174 if (obstack_object_size (&dont_print_statmem_obstack) > 0)
176 obstack_free (&dont_print_statmem_obstack, NULL);
177 obstack_begin (&dont_print_statmem_obstack,
178 32 * sizeof (CORE_ADDR));
180 if (obstack_object_size (&dont_print_stat_array_obstack) > 0)
182 obstack_free (&dont_print_stat_array_obstack, NULL);
183 obstack_begin (&dont_print_stat_array_obstack,
184 32 * sizeof (struct type *));
188 fprintf_filtered (stream, "{");
189 len = TYPE_NFIELDS (type);
190 n_baseclasses = TYPE_N_BASECLASSES (type);
192 /* First, print out baseclasses such that we don't print
193 duplicates of virtual baseclasses. */
195 if (n_baseclasses > 0)
196 cp_print_value (type, real_type,
197 offset, address, stream,
198 recurse + 1, val, options,
199 dont_print_vb);
201 /* Second, print out data fields */
203 /* If there are no data fields, skip this part */
204 if (len == n_baseclasses || !len)
205 fprintf_filtered (stream, "<No data fields>");
206 else
208 size_t statmem_obstack_initial_size = 0;
209 size_t stat_array_obstack_initial_size = 0;
210 struct type *vptr_basetype = NULL;
211 int vptr_fieldno;
213 if (dont_print_statmem == 0)
215 statmem_obstack_initial_size =
216 obstack_object_size (&dont_print_statmem_obstack);
218 if (last_set_recurse != recurse)
220 stat_array_obstack_initial_size =
221 obstack_object_size (&dont_print_stat_array_obstack);
223 last_set_recurse = recurse;
227 vptr_fieldno = get_vptr_fieldno (type, &vptr_basetype);
228 for (i = n_baseclasses; i < len; i++)
230 const gdb_byte *valaddr = value_contents_for_printing (val);
232 /* If requested, skip printing of static fields. */
233 if (!options->static_field_print
234 && field_is_static (&TYPE_FIELD (type, i)))
235 continue;
237 if (fields_seen)
239 fputs_filtered (",", stream);
240 if (!options->prettyformat)
241 fputs_filtered (" ", stream);
243 else if (n_baseclasses > 0)
245 if (options->prettyformat)
247 fprintf_filtered (stream, "\n");
248 print_spaces_filtered (2 + 2 * recurse, stream);
249 fputs_filtered ("members of ", stream);
250 fputs_filtered (TYPE_NAME (type), stream);
251 fputs_filtered (":", stream);
254 fields_seen = 1;
256 if (options->prettyformat)
258 fprintf_filtered (stream, "\n");
259 print_spaces_filtered (2 + 2 * recurse, stream);
261 else
263 wrap_here (n_spaces (2 + 2 * recurse));
266 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
268 if (field_is_static (&TYPE_FIELD (type, i)))
269 fputs_filtered ("static ", stream);
270 fprintf_symbol_filtered (stream,
271 TYPE_FIELD_NAME (type, i),
272 current_language->la_language,
273 DMGL_PARAMS | DMGL_ANSI);
274 annotate_field_name_end ();
276 /* We tweak various options in a few cases below. */
277 value_print_options options_copy = *options;
278 value_print_options *opts = &options_copy;
280 /* Do not print leading '=' in case of anonymous
281 unions. */
282 if (strcmp (TYPE_FIELD_NAME (type, i), ""))
283 fputs_filtered (" = ", stream);
284 else
286 /* If this is an anonymous field then we want to consider it
287 as though it is at its parent's depth when it comes to the
288 max print depth. */
289 if (opts->max_depth != -1 && opts->max_depth < INT_MAX)
290 ++opts->max_depth;
292 annotate_field_value ();
294 if (!field_is_static (&TYPE_FIELD (type, i))
295 && TYPE_FIELD_PACKED (type, i))
297 struct value *v;
299 /* Bitfields require special handling, especially due to
300 byte order problems. */
301 if (TYPE_FIELD_IGNORE (type, i))
303 fputs_filtered ("<optimized out or zero length>", stream);
305 else if (value_bits_synthetic_pointer (val,
306 TYPE_FIELD_BITPOS (type,
308 TYPE_FIELD_BITSIZE (type,
309 i)))
311 fputs_filtered (_("<synthetic pointer>"), stream);
313 else
315 opts->deref_ref = 0;
317 v = value_field_bitfield (type, i, valaddr, offset, val);
319 common_val_print (v, stream, recurse + 1,
320 opts, current_language);
323 else
325 if (TYPE_FIELD_IGNORE (type, i))
327 fputs_filtered ("<optimized out or zero length>",
328 stream);
330 else if (field_is_static (&TYPE_FIELD (type, i)))
332 struct value *v = NULL;
336 v = value_static_field (type, i);
339 catch (const gdb_exception_error &ex)
341 fprintf_filtered (stream,
342 _("<error reading variable: %s>"),
343 ex.what ());
346 cp_print_static_field (TYPE_FIELD_TYPE (type, i),
347 v, stream, recurse + 1, opts);
349 else if (i == vptr_fieldno && type == vptr_basetype)
351 int i_offset = offset + TYPE_FIELD_BITPOS (type, i) / 8;
352 struct type *i_type = TYPE_FIELD_TYPE (type, i);
354 if (valprint_check_validity (stream, i_type, i_offset, val))
356 CORE_ADDR addr;
358 addr = extract_typed_address (valaddr + i_offset, i_type);
359 print_function_pointer_address (opts,
360 get_type_arch (type),
361 addr, stream);
364 else
366 opts->deref_ref = 0;
367 val_print (TYPE_FIELD_TYPE (type, i),
368 offset + TYPE_FIELD_BITPOS (type, i) / 8,
369 address,
370 stream, recurse + 1, val, opts,
371 current_language);
374 annotate_field_end ();
377 if (dont_print_statmem == 0)
379 size_t obstack_final_size =
380 obstack_object_size (&dont_print_statmem_obstack);
382 if (obstack_final_size > statmem_obstack_initial_size)
384 /* In effect, a pop of the printed-statics stack. */
385 size_t shrink_bytes
386 = statmem_obstack_initial_size - obstack_final_size;
387 obstack_blank_fast (&dont_print_statmem_obstack, shrink_bytes);
390 if (last_set_recurse != recurse)
392 obstack_final_size =
393 obstack_object_size (&dont_print_stat_array_obstack);
395 if (obstack_final_size > stat_array_obstack_initial_size)
397 void *free_to_ptr =
398 (char *) obstack_next_free (&dont_print_stat_array_obstack)
399 - (obstack_final_size
400 - stat_array_obstack_initial_size);
402 obstack_free (&dont_print_stat_array_obstack,
403 free_to_ptr);
405 last_set_recurse = -1;
409 if (options->prettyformat)
411 fprintf_filtered (stream, "\n");
412 print_spaces_filtered (2 * recurse, stream);
414 } /* if there are data fields */
416 fprintf_filtered (stream, "}");
419 /* Like cp_print_value_fields, but find the runtime type of the object
420 and pass it as the `real_type' argument to cp_print_value_fields.
421 This function is a hack to work around the fact that
422 common_val_print passes the embedded offset to val_print, but not
423 the enclosing type. */
425 void
426 cp_print_value_fields_rtti (struct type *type,
427 const gdb_byte *valaddr, LONGEST offset,
428 CORE_ADDR address,
429 struct ui_file *stream, int recurse,
430 struct value *val,
431 const struct value_print_options *options,
432 struct type **dont_print_vb,
433 int dont_print_statmem)
435 struct type *real_type = NULL;
437 /* We require all bits to be valid in order to attempt a
438 conversion. */
439 if (!value_bits_any_optimized_out (val,
440 TARGET_CHAR_BIT * offset,
441 TARGET_CHAR_BIT * TYPE_LENGTH (type)))
443 struct value *value;
444 int full, using_enc;
445 LONGEST top;
447 /* Ugh, we have to convert back to a value here. */
448 value = value_from_contents_and_address (type, valaddr + offset,
449 address + offset);
450 type = value_type (value);
451 /* We don't actually care about most of the result here -- just
452 the type. We already have the correct offset, due to how
453 val_print was initially called. */
454 real_type = value_rtti_type (value, &full, &top, &using_enc);
457 if (!real_type)
458 real_type = type;
460 cp_print_value_fields (type, real_type, offset,
461 address, stream, recurse, val, options,
462 dont_print_vb, dont_print_statmem);
465 /* Special val_print routine to avoid printing multiple copies of
466 virtual baseclasses. */
468 static void
469 cp_print_value (struct type *type, struct type *real_type,
470 LONGEST offset,
471 CORE_ADDR address, struct ui_file *stream,
472 int recurse, struct value *val,
473 const struct value_print_options *options,
474 struct type **dont_print_vb)
476 struct type **last_dont_print
477 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
478 struct obstack tmp_obstack = dont_print_vb_obstack;
479 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
480 LONGEST thisoffset;
481 struct type *thistype;
482 const gdb_byte *valaddr = value_contents_for_printing (val);
484 if (dont_print_vb == 0)
486 /* If we're at top level, carve out a completely fresh chunk of
487 the obstack and use that until this particular invocation
488 returns. */
489 /* Bump up the high-water mark. Now alpha is omega. */
490 obstack_finish (&dont_print_vb_obstack);
493 for (i = 0; i < n_baseclasses; i++)
495 LONGEST boffset = 0;
496 int skip = 0;
497 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
498 const char *basename = TYPE_NAME (baseclass);
499 struct value *base_val = NULL;
501 if (BASETYPE_VIA_VIRTUAL (type, i))
503 struct type **first_dont_print
504 = (struct type **) obstack_base (&dont_print_vb_obstack);
506 int j = (struct type **)
507 obstack_next_free (&dont_print_vb_obstack) - first_dont_print;
509 while (--j >= 0)
510 if (baseclass == first_dont_print[j])
511 goto flush_it;
513 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
516 thisoffset = offset;
517 thistype = real_type;
521 boffset = baseclass_offset (type, i, valaddr, offset, address, val);
523 catch (const gdb_exception_error &ex)
525 if (ex.error == NOT_AVAILABLE_ERROR)
526 skip = -1;
527 else
528 skip = 1;
531 if (skip == 0)
533 if (BASETYPE_VIA_VIRTUAL (type, i))
535 /* The virtual base class pointer might have been
536 clobbered by the user program. Make sure that it
537 still points to a valid memory location. */
539 if ((boffset + offset) < 0
540 || (boffset + offset) >= TYPE_LENGTH (real_type))
542 gdb::byte_vector buf (TYPE_LENGTH (baseclass));
544 if (target_read_memory (address + boffset, buf.data (),
545 TYPE_LENGTH (baseclass)) != 0)
546 skip = 1;
547 base_val = value_from_contents_and_address (baseclass,
548 buf.data (),
549 address + boffset);
550 baseclass = value_type (base_val);
551 thisoffset = 0;
552 boffset = 0;
553 thistype = baseclass;
555 else
557 base_val = val;
560 else
562 base_val = val;
566 /* Now do the printing. */
567 if (options->prettyformat)
569 fprintf_filtered (stream, "\n");
570 print_spaces_filtered (2 * recurse, stream);
572 fputs_filtered ("<", stream);
573 /* Not sure what the best notation is in the case where there is
574 no baseclass name. */
575 fputs_filtered (basename ? basename : "", stream);
576 fputs_filtered ("> = ", stream);
578 if (skip < 0)
579 val_print_unavailable (stream);
580 else if (skip > 0)
581 val_print_invalid_address (stream);
582 else
584 int result = 0;
586 if (options->max_depth > -1
587 && recurse >= options->max_depth)
589 const struct language_defn *language = current_language;
590 gdb_assert (language->la_struct_too_deep_ellipsis != NULL);
591 fputs_filtered (language->la_struct_too_deep_ellipsis, stream);
593 else
595 /* Attempt to run an extension language pretty-printer on the
596 baseclass if possible. */
597 if (!options->raw)
598 result
599 = apply_ext_lang_val_pretty_printer (baseclass,
600 thisoffset + boffset,
601 value_address (base_val),
602 stream, recurse,
603 base_val, options,
604 current_language);
606 if (!result)
607 cp_print_value_fields (baseclass, thistype,
608 thisoffset + boffset,
609 value_address (base_val),
610 stream, recurse, base_val, options,
611 ((struct type **)
612 obstack_base (&dont_print_vb_obstack)),
616 fputs_filtered (", ", stream);
618 flush_it:
622 if (dont_print_vb == 0)
624 /* Free the space used to deal with the printing
625 of this type from top level. */
626 obstack_free (&dont_print_vb_obstack, last_dont_print);
627 /* Reset watermark so that we can continue protecting
628 ourselves from whatever we were protecting ourselves. */
629 dont_print_vb_obstack = tmp_obstack;
633 /* Print value of a static member. To avoid infinite recursion when
634 printing a class that contains a static instance of the class, we
635 keep the addresses of all printed static member classes in an
636 obstack and refuse to print them more than once.
638 VAL contains the value to print, TYPE, STREAM, RECURSE, and OPTIONS
639 have the same meanings as in c_val_print. */
641 static void
642 cp_print_static_field (struct type *type,
643 struct value *val,
644 struct ui_file *stream,
645 int recurse,
646 const struct value_print_options *options)
648 struct value_print_options opts;
650 if (value_entirely_optimized_out (val))
652 val_print_optimized_out (val, stream);
653 return;
656 struct type *real_type = check_typedef (type);
657 if (TYPE_CODE (real_type) == TYPE_CODE_STRUCT)
659 CORE_ADDR *first_dont_print;
660 CORE_ADDR addr;
661 int i;
663 first_dont_print
664 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
665 i = obstack_object_size (&dont_print_statmem_obstack)
666 / sizeof (CORE_ADDR);
668 while (--i >= 0)
670 if (value_address (val) == first_dont_print[i])
672 fputs_filtered ("<same as static member of an already"
673 " seen type>",
674 stream);
675 return;
679 addr = value_address (val);
680 obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
681 sizeof (CORE_ADDR));
682 cp_print_value_fields (type, value_enclosing_type (val),
683 value_embedded_offset (val), addr,
684 stream, recurse, val,
685 options, NULL, 1);
686 return;
689 if (TYPE_CODE (real_type) == TYPE_CODE_ARRAY)
691 struct type **first_dont_print;
692 int i;
693 struct type *target_type = TYPE_TARGET_TYPE (type);
695 first_dont_print
696 = (struct type **) obstack_base (&dont_print_stat_array_obstack);
697 i = obstack_object_size (&dont_print_stat_array_obstack)
698 / sizeof (struct type *);
700 while (--i >= 0)
702 if (target_type == first_dont_print[i])
704 fputs_filtered ("<same as static member of an already"
705 " seen type>",
706 stream);
707 return;
711 obstack_grow (&dont_print_stat_array_obstack,
712 (char *) &target_type,
713 sizeof (struct type *));
716 opts = *options;
717 opts.deref_ref = 0;
718 val_print (type,
719 value_embedded_offset (val),
720 value_address (val),
721 stream, recurse, val,
722 &opts, current_language);
725 /* Find the field in *SELF, or its non-virtual base classes, with
726 bit offset OFFSET. Set *SELF to the containing type and *FIELDNO
727 to the containing field number. If OFFSET is not exactly at the
728 start of some field, set *SELF to NULL. */
730 static void
731 cp_find_class_member (struct type **self_p, int *fieldno,
732 LONGEST offset)
734 struct type *self;
735 unsigned int i;
736 unsigned len;
738 *self_p = check_typedef (*self_p);
739 self = *self_p;
740 len = TYPE_NFIELDS (self);
742 for (i = TYPE_N_BASECLASSES (self); i < len; i++)
744 LONGEST bitpos = TYPE_FIELD_BITPOS (self, i);
746 QUIT;
747 if (offset == bitpos)
749 *fieldno = i;
750 return;
754 for (i = 0; i < TYPE_N_BASECLASSES (self); i++)
756 LONGEST bitpos = TYPE_FIELD_BITPOS (self, i);
757 LONGEST bitsize = 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (self, i));
759 if (offset >= bitpos && offset < bitpos + bitsize)
761 *self_p = TYPE_FIELD_TYPE (self, i);
762 cp_find_class_member (self_p, fieldno, offset - bitpos);
763 return;
767 *self_p = NULL;
770 void
771 cp_print_class_member (const gdb_byte *valaddr, struct type *type,
772 struct ui_file *stream, const char *prefix)
774 enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
776 /* VAL is a byte offset into the structure type SELF_TYPE.
777 Find the name of the field for that offset and
778 print it. */
779 struct type *self_type = TYPE_SELF_TYPE (type);
780 LONGEST val;
781 int fieldno;
783 val = extract_signed_integer (valaddr,
784 TYPE_LENGTH (type),
785 byte_order);
787 /* Pointers to data members are usually byte offsets into an object.
788 Because a data member can have offset zero, and a NULL pointer to
789 member must be distinct from any valid non-NULL pointer to
790 member, either the value is biased or the NULL value has a
791 special representation; both are permitted by ISO C++. HP aCC
792 used a bias of 0x20000000; HP cfront used a bias of 1; g++ 3.x
793 and other compilers which use the Itanium ABI use -1 as the NULL
794 value. GDB only supports that last form; to add support for
795 another form, make this into a cp-abi hook. */
797 if (val == -1)
799 fprintf_filtered (stream, "NULL");
800 return;
803 cp_find_class_member (&self_type, &fieldno, val << 3);
805 if (self_type != NULL)
807 const char *name;
809 fputs_filtered (prefix, stream);
810 name = TYPE_NAME (self_type);
811 if (name)
812 fputs_filtered (name, stream);
813 else
814 c_type_print_base (self_type, stream, 0, 0, &type_print_raw_options);
815 fprintf_filtered (stream, "::");
816 fputs_filtered (TYPE_FIELD_NAME (self_type, fieldno), stream);
818 else
819 fprintf_filtered (stream, "%ld", (long) val);
823 void
824 _initialize_cp_valprint (void)
826 add_setshow_boolean_cmd ("static-members", class_support,
827 &user_print_options.static_field_print, _("\
828 Set printing of C++ static members."), _("\
829 Show printing of C++ static members."), NULL,
830 NULL,
831 show_static_field_print,
832 &setprintlist, &showprintlist);
834 add_setshow_boolean_cmd ("vtbl", class_support,
835 &user_print_options.vtblprint, _("\
836 Set printing of C++ virtual function tables."), _("\
837 Show printing of C++ virtual function tables."), NULL,
838 NULL,
839 show_vtblprint,
840 &setprintlist, &showprintlist);
842 add_setshow_boolean_cmd ("object", class_support,
843 &user_print_options.objectprint, _("\
844 Set printing of object's derived type based on vtable info."), _("\
845 Show printing of object's derived type based on vtable info."), NULL,
846 NULL,
847 show_objectprint,
848 &setprintlist, &showprintlist);
850 obstack_begin (&dont_print_stat_array_obstack,
851 32 * sizeof (struct type *));
852 obstack_begin (&dont_print_statmem_obstack,
853 32 * sizeof (CORE_ADDR));
854 obstack_begin (&dont_print_vb_obstack,
855 32 * sizeof (struct type *));