2009-07-01 Paul Brook <paul@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / cp-valprint.c
CommitLineData
c906108c 1/* Support for printing C++ values for GDB, the GNU debugger.
a2bd3dcd 2
6aba47ca 3 Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
0fb0cc75 4 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009
9b254dd1 5 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
04ea0df1 23#include "gdb_obstack.h"
c906108c
SS
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 "demangle.h"
31#include "annotate.h"
32#include "gdb_string.h"
33#include "c-lang.h"
34#include "target.h"
b9d652ac 35#include "cp-abi.h"
973177d3 36#include "valprint.h"
d3cbe7ef 37#include "cp-support.h"
cf309262 38#include "language.h"
a6bac58e 39#include "python/python.h"
c906108c 40
920d2a44 41/* Controls printing of vtbl's */
920d2a44
AC
42static void
43show_vtblprint (struct ui_file *file, int from_tty,
44 struct cmd_list_element *c, const char *value)
45{
46 fprintf_filtered (file, _("\
47Printing of C++ virtual function tables is %s.\n"),
48 value);
49}
50
51/* Controls looking up an object's derived type using what we find in
52 its vtables. */
920d2a44
AC
53static void
54show_objectprint (struct ui_file *file, int from_tty,
55 struct cmd_list_element *c,
56 const char *value)
57{
58 fprintf_filtered (file, _("\
59Printing of object's derived type based on vtable info is %s.\n"),
60 value);
61}
62
920d2a44
AC
63static void
64show_static_field_print (struct ui_file *file, int from_tty,
65 struct cmd_list_element *c, const char *value)
66{
67 fprintf_filtered (file, _("Printing of C++ static members is %s.\n"),
68 value);
69}
70
c906108c
SS
71
72static struct obstack dont_print_vb_obstack;
73static struct obstack dont_print_statmem_obstack;
74
a14ed312 75extern void _initialize_cp_valprint (void);
392a587b 76
6943961c 77static void cp_print_static_field (struct type *, struct value *,
79a45b7d
TT
78 struct ui_file *, int,
79 const struct value_print_options *);
c906108c 80
fc1a4b47 81static void cp_print_value (struct type *, struct type *, const gdb_byte *,
79a45b7d
TT
82 int, CORE_ADDR, struct ui_file *, int,
83 const struct value_print_options *, struct type **);
c906108c 84
c906108c 85
8343f86c 86/* GCC versions after 2.4.5 use this. */
2c63a960 87const char vtbl_ptr_name[] = "__vtbl_ptr_type";
c906108c 88
c906108c
SS
89/* Return truth value for assertion that TYPE is of the type
90 "pointer to virtual function". */
91
92int
fba45db2 93cp_is_vtbl_ptr_type (struct type *type)
c906108c
SS
94{
95 char *typename = type_name_no_tag (type);
96
8343f86c 97 return (typename != NULL && !strcmp (typename, vtbl_ptr_name));
c906108c
SS
98}
99
100/* Return truth value for the assertion that TYPE is of the type
101 "pointer to virtual function table". */
102
103int
fba45db2 104cp_is_vtbl_member (struct type *type)
c906108c 105{
0e5e3ea6
PS
106 /* With older versions of g++, the vtbl field pointed to an array
107 of structures. Nowadays it points directly to the structure. */
c906108c
SS
108 if (TYPE_CODE (type) == TYPE_CODE_PTR)
109 {
110 type = TYPE_TARGET_TYPE (type);
111 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
112 {
113 type = TYPE_TARGET_TYPE (type);
c5aa993b
JM
114 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
115 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
c906108c
SS
116 {
117 /* Virtual functions tables are full of pointers
c5aa993b 118 to virtual functions. */
c906108c
SS
119 return cp_is_vtbl_ptr_type (type);
120 }
121 }
0e5e3ea6
PS
122 else if (TYPE_CODE (type) == TYPE_CODE_STRUCT) /* if not using thunks */
123 {
124 return cp_is_vtbl_ptr_type (type);
125 }
126 else if (TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
127 {
128 /* The type name of the thunk pointer is NULL when using dwarf2.
129 We could test for a pointer to a function, but there is
130 no type info for the virtual table either, so it wont help. */
131 return cp_is_vtbl_ptr_type (type);
132 }
c906108c
SS
133 }
134 return 0;
135}
136
137/* Mutually recursive subroutines of cp_print_value and c_val_print to
138 print out a structure's fields: cp_print_value_fields and cp_print_value.
c5aa993b 139
79a45b7d 140 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
c906108c
SS
141 same meanings as in cp_print_value and c_val_print.
142
143 2nd argument REAL_TYPE is used to carry over the type of the derived
144 class across the recursion to base classes.
145
146 DONT_PRINT is an array of baseclass types that we
147 should not print, or zero if called from top level. */
148
149void
a2bd3dcd 150cp_print_value_fields (struct type *type, struct type *real_type,
fc1a4b47 151 const gdb_byte *valaddr, int offset, CORE_ADDR address,
79a45b7d
TT
152 struct ui_file *stream, int recurse,
153 const struct value_print_options *options,
154 struct type **dont_print_vb, int dont_print_statmem)
c906108c
SS
155{
156 int i, len, n_baseclasses;
c906108c
SS
157 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
158 int fields_seen = 0;
159
160 CHECK_TYPEDEF (type);
161
162 fprintf_filtered (stream, "{");
163 len = TYPE_NFIELDS (type);
164 n_baseclasses = TYPE_N_BASECLASSES (type);
165
166 /* First, print out baseclasses such that we don't print
167 duplicates of virtual baseclasses. */
168
169 if (n_baseclasses > 0)
170 cp_print_value (type, real_type, valaddr, offset, address, stream,
79a45b7d 171 recurse + 1, options, dont_print_vb);
c906108c
SS
172
173 /* Second, print out data fields */
174
086280be
UW
175 /* If there are no data fields, skip this part */
176 if (len == n_baseclasses || !len)
c906108c
SS
177 fprintf_filtered (stream, "<No data fields>");
178 else
179 {
c1b6e682
DJ
180 struct obstack tmp_obstack = dont_print_statmem_obstack;
181
c906108c
SS
182 if (dont_print_statmem == 0)
183 {
184 /* If we're at top level, carve out a completely fresh
185 chunk of the obstack and use that until this particular
186 invocation returns. */
c906108c
SS
187 obstack_finish (&dont_print_statmem_obstack);
188 }
189
190 for (i = n_baseclasses; i < len; i++)
191 {
192 /* If requested, skip printing of static fields. */
79a45b7d 193 if (!options->static_field_print
d6a843b5 194 && field_is_static (&TYPE_FIELD (type, i)))
c906108c
SS
195 continue;
196
c906108c
SS
197 if (fields_seen)
198 fprintf_filtered (stream, ", ");
199 else if (n_baseclasses > 0)
200 {
79a45b7d 201 if (options->pretty)
c906108c
SS
202 {
203 fprintf_filtered (stream, "\n");
204 print_spaces_filtered (2 + 2 * recurse, stream);
205 fputs_filtered ("members of ", stream);
206 fputs_filtered (type_name_no_tag (type), stream);
207 fputs_filtered (": ", stream);
208 }
209 }
210 fields_seen = 1;
211
79a45b7d 212 if (options->pretty)
c906108c
SS
213 {
214 fprintf_filtered (stream, "\n");
215 print_spaces_filtered (2 + 2 * recurse, stream);
216 }
c5aa993b 217 else
c906108c
SS
218 {
219 wrap_here (n_spaces (2 + 2 * recurse));
220 }
79a45b7d 221 if (options->inspect_it)
c906108c
SS
222 {
223 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
224 fputs_filtered ("\"( ptr \"", stream);
225 else
226 fputs_filtered ("\"( nodef \"", stream);
d6a843b5 227 if (field_is_static (&TYPE_FIELD (type, i)))
c906108c
SS
228 fputs_filtered ("static ", stream);
229 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
cf309262 230 current_language->la_language,
c906108c
SS
231 DMGL_PARAMS | DMGL_ANSI);
232 fputs_filtered ("\" \"", stream);
233 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
cf309262 234 current_language->la_language,
c906108c
SS
235 DMGL_PARAMS | DMGL_ANSI);
236 fputs_filtered ("\") \"", stream);
237 }
238 else
239 {
240 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
241
d6a843b5 242 if (field_is_static (&TYPE_FIELD (type, i)))
c906108c
SS
243 fputs_filtered ("static ", stream);
244 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
cf309262 245 current_language->la_language,
c906108c
SS
246 DMGL_PARAMS | DMGL_ANSI);
247 annotate_field_name_end ();
248 /* do not print leading '=' in case of anonymous unions */
249 if (strcmp (TYPE_FIELD_NAME (type, i), ""))
250 fputs_filtered (" = ", stream);
251 annotate_field_value ();
252 }
253
d6a843b5
JK
254 if (!field_is_static (&TYPE_FIELD (type, i))
255 && TYPE_FIELD_PACKED (type, i))
c906108c 256 {
6943961c 257 struct value *v;
c906108c
SS
258
259 /* Bitfields require special handling, especially due to byte
c5aa993b 260 order problems. */
c906108c
SS
261 if (TYPE_FIELD_IGNORE (type, i))
262 {
c5aa993b 263 fputs_filtered ("<optimized out or zero length>", stream);
c906108c
SS
264 }
265 else
266 {
79a45b7d
TT
267 struct value_print_options opts = *options;
268 opts.deref_ref = 0;
2c63a960
JB
269 v = value_from_longest
270 (TYPE_FIELD_TYPE (type, i),
271 unpack_field_as_long (type, valaddr + offset, i));
c906108c 272
79a45b7d 273 common_val_print (v, stream, recurse + 1, &opts,
d8ca156b 274 current_language);
c906108c
SS
275 }
276 }
277 else
278 {
279 if (TYPE_FIELD_IGNORE (type, i))
280 {
c5aa993b 281 fputs_filtered ("<optimized out or zero length>", stream);
c906108c 282 }
d6a843b5 283 else if (field_is_static (&TYPE_FIELD (type, i)))
c906108c 284 {
6943961c 285 struct value *v = value_static_field (type, i);
c906108c
SS
286 if (v == NULL)
287 fputs_filtered ("<optimized out>", stream);
288 else
289 cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
79a45b7d 290 stream, recurse + 1, options);
c906108c
SS
291 }
292 else
293 {
79a45b7d
TT
294 struct value_print_options opts = *options;
295 opts.deref_ref = 0;
c5aa993b 296 val_print (TYPE_FIELD_TYPE (type, i),
2c63a960 297 valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
c5aa993b 298 address + TYPE_FIELD_BITPOS (type, i) / 8,
79a45b7d 299 stream, recurse + 1, &opts,
d8ca156b 300 current_language);
c906108c
SS
301 }
302 }
303 annotate_field_end ();
304 }
305
306 if (dont_print_statmem == 0)
307 {
308 /* Free the space used to deal with the printing
309 of the members from top level. */
310 obstack_free (&dont_print_statmem_obstack, last_dont_print);
311 dont_print_statmem_obstack = tmp_obstack;
312 }
313
79a45b7d 314 if (options->pretty)
c906108c
SS
315 {
316 fprintf_filtered (stream, "\n");
317 print_spaces_filtered (2 * recurse, stream);
318 }
c5aa993b 319 } /* if there are data fields */
c5aa993b 320
c906108c
SS
321 fprintf_filtered (stream, "}");
322}
323
324/* Special val_print routine to avoid printing multiple copies of virtual
325 baseclasses. */
326
327static void
a2bd3dcd 328cp_print_value (struct type *type, struct type *real_type,
fc1a4b47 329 const gdb_byte *valaddr, int offset, CORE_ADDR address,
79a45b7d
TT
330 struct ui_file *stream, int recurse,
331 const struct value_print_options *options,
332 struct type **dont_print_vb)
c906108c 333{
c906108c 334 struct type **last_dont_print
2c63a960 335 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
c1b6e682 336 struct obstack tmp_obstack = dont_print_vb_obstack;
c906108c 337 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
b9d652ac
DJ
338 int thisoffset;
339 struct type *thistype;
c906108c
SS
340
341 if (dont_print_vb == 0)
342 {
343 /* If we're at top level, carve out a completely fresh
c5aa993b
JM
344 chunk of the obstack and use that until this particular
345 invocation returns. */
c906108c
SS
346 /* Bump up the high-water mark. Now alpha is omega. */
347 obstack_finish (&dont_print_vb_obstack);
348 }
349
350 for (i = 0; i < n_baseclasses; i++)
351 {
352 int boffset;
353 int skip;
354 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
355 char *basename = TYPE_NAME (baseclass);
fc1a4b47 356 const gdb_byte *base_valaddr;
c906108c
SS
357
358 if (BASETYPE_VIA_VIRTUAL (type, i))
359 {
360 struct type **first_dont_print
2c63a960 361 = (struct type **) obstack_base (&dont_print_vb_obstack);
c906108c 362
c5aa993b 363 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
2c63a960 364 - first_dont_print;
c906108c
SS
365
366 while (--j >= 0)
367 if (baseclass == first_dont_print[j])
368 goto flush_it;
369
370 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
371 }
372
b9d652ac
DJ
373 thisoffset = offset;
374 thistype = real_type;
086280be
UW
375
376 boffset = baseclass_offset (type, i, valaddr + offset, address);
377 skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
378
379 if (BASETYPE_VIA_VIRTUAL (type, i))
c5aa993b 380 {
086280be
UW
381 /* The virtual base class pointer might have been
382 clobbered by the user program. Make sure that it
383 still points to a valid memory location. */
c906108c 384
086280be
UW
385 if (boffset != -1
386 && ((boffset + offset) < 0
387 || (boffset + offset) >= TYPE_LENGTH (type)))
c5aa993b 388 {
086280be
UW
389 /* FIXME (alloca): unsafe if baseclass is really really large. */
390 gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
391 base_valaddr = buf;
392 if (target_read_memory (address + boffset, buf,
393 TYPE_LENGTH (baseclass)) != 0)
394 skip = 1;
395 address = address + boffset;
396 thisoffset = 0;
397 boffset = 0;
398 thistype = baseclass;
c5aa993b
JM
399 }
400 else
401 base_valaddr = valaddr;
c906108c 402 }
086280be
UW
403 else
404 base_valaddr = valaddr;
c906108c
SS
405
406 /* now do the printing */
79a45b7d 407 if (options->pretty)
c906108c
SS
408 {
409 fprintf_filtered (stream, "\n");
410 print_spaces_filtered (2 * recurse, stream);
411 }
412 fputs_filtered ("<", stream);
413 /* Not sure what the best notation is in the case where there is no
c5aa993b 414 baseclass name. */
c906108c
SS
415 fputs_filtered (basename ? basename : "", stream);
416 fputs_filtered ("> = ", stream);
417
418
419 if (skip >= 1)
420 fprintf_filtered (stream, "<invalid address>");
421 else
a6bac58e
TT
422 {
423 int result = 0;
424
425 /* Attempt to run the Python pretty-printers on the
426 baseclass if possible. */
427 if (!options->raw)
428 result = apply_val_pretty_printer (baseclass, base_valaddr,
429 thisoffset + boffset,
430 address + boffset,
431 stream, recurse,
432 options,
433 current_language);
434
435 if (!result)
436 cp_print_value_fields (baseclass, thistype, base_valaddr,
437 thisoffset + boffset, address + boffset,
438 stream, recurse, options,
439 ((struct type **)
440 obstack_base (&dont_print_vb_obstack)),
441 0);
442 }
c906108c
SS
443 fputs_filtered (", ", stream);
444
445 flush_it:
446 ;
447 }
448
449 if (dont_print_vb == 0)
450 {
451 /* Free the space used to deal with the printing
c5aa993b 452 of this type from top level. */
c906108c
SS
453 obstack_free (&dont_print_vb_obstack, last_dont_print);
454 /* Reset watermark so that we can continue protecting
c5aa993b 455 ourselves from whatever we were protecting ourselves. */
c906108c
SS
456 dont_print_vb_obstack = tmp_obstack;
457 }
458}
459
460/* Print value of a static member.
461 To avoid infinite recursion when printing a class that contains
462 a static instance of the class, we keep the addresses of all printed
463 static member classes in an obstack and refuse to print them more
464 than once.
465
79a45b7d 466 VAL contains the value to print, TYPE, STREAM, RECURSE, and OPTIONS
c906108c
SS
467 have the same meanings as in c_val_print. */
468
469static void
2c63a960 470cp_print_static_field (struct type *type,
6943961c 471 struct value *val,
2c63a960 472 struct ui_file *stream,
2c63a960 473 int recurse,
79a45b7d 474 const struct value_print_options *options)
c906108c 475{
79a45b7d 476 struct value_print_options opts;
c906108c
SS
477 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
478 {
479 CORE_ADDR *first_dont_print;
42ae5230 480 CORE_ADDR addr;
c906108c
SS
481 int i;
482
483 first_dont_print
c5aa993b
JM
484 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
485 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
c906108c
SS
486 - first_dont_print;
487
488 while (--i >= 0)
489 {
42ae5230 490 if (value_address (val) == first_dont_print[i])
c906108c 491 {
2c63a960
JB
492 fputs_filtered ("<same as static member of an already"
493 " seen type>",
c906108c
SS
494 stream);
495 return;
496 }
497 }
498
42ae5230
TT
499 addr = value_address (val);
500 obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
c906108c
SS
501 sizeof (CORE_ADDR));
502
503 CHECK_TYPEDEF (type);
46615f07 504 cp_print_value_fields (type, type, value_contents_all (val),
42ae5230 505 value_embedded_offset (val), addr,
79a45b7d 506 stream, recurse, options, NULL, 1);
c906108c
SS
507 return;
508 }
79a45b7d
TT
509
510 opts = *options;
511 opts.deref_ref = 0;
46615f07 512 val_print (type, value_contents_all (val),
42ae5230 513 value_embedded_offset (val), value_address (val),
79a45b7d 514 stream, recurse, &opts, current_language);
c906108c
SS
515}
516
0d5de010
DJ
517
518/* Find the field in *DOMAIN, or its non-virtual base classes, with bit offset
519 OFFSET. Set *DOMAIN to the containing type and *FIELDNO to the containing
520 field number. If OFFSET is not exactly at the start of some field, set
521 *DOMAIN to NULL. */
522
2c0b251b 523static void
0d5de010
DJ
524cp_find_class_member (struct type **domain_p, int *fieldno,
525 LONGEST offset)
526{
527 struct type *domain;
528 unsigned int i;
529 unsigned len;
530
531 *domain_p = check_typedef (*domain_p);
532 domain = *domain_p;
533 len = TYPE_NFIELDS (domain);
534
535 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
536 {
537 LONGEST bitpos = TYPE_FIELD_BITPOS (domain, i);
538
539 QUIT;
540 if (offset == bitpos)
541 {
542 *fieldno = i;
543 return;
544 }
545 }
546
547 for (i = 0; i < TYPE_N_BASECLASSES (domain); i++)
548 {
549 LONGEST bitpos = TYPE_FIELD_BITPOS (domain, i);
550 LONGEST bitsize = 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (domain, i));
551
552 if (offset >= bitpos && offset < bitpos + bitsize)
553 {
554 *domain_p = TYPE_FIELD_TYPE (domain, i);
555 cp_find_class_member (domain_p, fieldno, offset - bitpos);
556 return;
557 }
558 }
559
560 *domain_p = NULL;
561}
562
c906108c 563void
ad4820ab 564cp_print_class_member (const gdb_byte *valaddr, struct type *type,
fba45db2 565 struct ui_file *stream, char *prefix)
c906108c 566{
c906108c
SS
567 /* VAL is a byte offset into the structure type DOMAIN.
568 Find the name of the field for that offset and
569 print it. */
ad4820ab
UW
570 struct type *domain = TYPE_DOMAIN_TYPE (type);
571 LONGEST val = extract_signed_integer (valaddr, TYPE_LENGTH (type));
0d5de010 572 unsigned int fieldno;
c906108c 573
0d5de010
DJ
574 /* Pointers to data members are usually byte offsets into an object.
575 Because a data member can have offset zero, and a NULL pointer to
576 member must be distinct from any valid non-NULL pointer to
577 member, either the value is biased or the NULL value has a
578 special representation; both are permitted by ISO C++. HP aCC
579 used a bias of 0x20000000; HP cfront used a bias of 1; g++ 3.x
580 and other compilers which use the Itanium ABI use -1 as the NULL
581 value. GDB only supports that last form; to add support for
582 another form, make this into a cp-abi hook. */
c906108c 583
0d5de010 584 if (val == -1)
c906108c 585 {
0d5de010
DJ
586 fprintf_filtered (stream, "NULL");
587 return;
c906108c 588 }
0d5de010
DJ
589
590 cp_find_class_member (&domain, &fieldno, val << 3);
591
592 if (domain != NULL)
c906108c
SS
593 {
594 char *name;
306d9ac5 595 fputs_filtered (prefix, stream);
c906108c
SS
596 name = type_name_no_tag (domain);
597 if (name)
c5aa993b 598 fputs_filtered (name, stream);
c906108c
SS
599 else
600 c_type_print_base (domain, stream, 0, 0);
601 fprintf_filtered (stream, "::");
0d5de010 602 fputs_filtered (TYPE_FIELD_NAME (domain, fieldno), stream);
c906108c
SS
603 }
604 else
0d5de010 605 fprintf_filtered (stream, "%ld", (long) val);
c906108c
SS
606}
607
608
c906108c 609void
fba45db2 610_initialize_cp_valprint (void)
c906108c 611{
5bf193a2 612 add_setshow_boolean_cmd ("static-members", class_support,
79a45b7d 613 &user_print_options.static_field_print, _("\
5bf193a2
AC
614Set printing of C++ static members."), _("\
615Show printing of C++ static members."), NULL,
616 NULL,
920d2a44 617 show_static_field_print,
5bf193a2 618 &setprintlist, &showprintlist);
c906108c 619
79a45b7d
TT
620 add_setshow_boolean_cmd ("vtbl", class_support,
621 &user_print_options.vtblprint, _("\
5bf193a2
AC
622Set printing of C++ virtual function tables."), _("\
623Show printing of C++ virtual function tables."), NULL,
624 NULL,
920d2a44 625 show_vtblprint,
5bf193a2
AC
626 &setprintlist, &showprintlist);
627
79a45b7d
TT
628 add_setshow_boolean_cmd ("object", class_support,
629 &user_print_options.objectprint, _("\
5bf193a2
AC
630Set printing of object's derived type based on vtable info."), _("\
631Show printing of object's derived type based on vtable info."), NULL,
632 NULL,
920d2a44 633 show_objectprint,
5bf193a2 634 &setprintlist, &showprintlist);
c906108c 635
c906108c
SS
636 obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
637 obstack_specify_allocation (&dont_print_statmem_obstack,
638 32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),
b8c9b27d 639 xmalloc, xfree);
c906108c 640}
This page took 0.600219 seconds and 4 git commands to generate.