OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [cp-valprint.c] - Blame information for rev 824

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.