1 /* Support for printing C++ values for GDB, the GNU debugger.
2 Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
4 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
24 #include "gdb_obstack.h"
27 #include "expression.h"
33 #include "gdb_string.h"
38 /* Indication of presence of HP-compiled object files */
39 extern int hp_som_som_object_present; /* defined in symtab.c */
42 int vtblprint; /* Controls printing of vtbl's */
43 int objectprint; /* Controls looking up an object's derived type
44 using what we find in its vtables. */
45 int static_field_print; /* Controls printing of static fields. */
47 static struct obstack dont_print_vb_obstack;
48 static struct obstack dont_print_statmem_obstack;
50 extern void _initialize_cp_valprint (void);
52 static void cp_print_static_field (struct type *, struct value *,
53 struct ui_file *, int, int,
54 enum val_prettyprint);
56 static void cp_print_value (struct type *, struct type *, char *, int,
57 CORE_ADDR, struct ui_file *, int, int,
58 enum val_prettyprint, struct type **);
60 static void cp_print_hpacc_virtual_table_entries (struct type *, int *,
62 struct ui_file *, int,
64 enum val_prettyprint);
68 cp_print_class_method (char *valaddr,
70 struct ui_file *stream)
73 struct fn_field *f = NULL;
82 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
84 domain = TYPE_DOMAIN_TYPE (target_type);
85 if (domain == (struct type *) NULL)
87 fprintf_filtered (stream, "<unknown>");
90 addr = unpack_pointer (type, valaddr);
91 if (METHOD_PTR_IS_VIRTUAL (addr))
93 offset = METHOD_PTR_TO_VOFFSET (addr);
94 len = TYPE_NFN_FIELDS (domain);
95 for (i = 0; i < len; i++)
97 f = TYPE_FN_FIELDLIST1 (domain, i);
98 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
100 check_stub_method_group (domain, i);
101 for (j = 0; j < len2; j++)
103 if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
113 sym = find_pc_function (addr);
116 /* 1997-08-01 Currently unsupported with HP aCC */
117 if (hp_som_som_object_present)
119 fputs_filtered ("?? <not supported with HP aCC>", stream);
122 error ("invalid pointer to member function");
124 len = TYPE_NFN_FIELDS (domain);
125 for (i = 0; i < len; i++)
127 f = TYPE_FN_FIELDLIST1 (domain, i);
128 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
130 check_stub_method_group (domain, i);
131 for (j = 0; j < len2; j++)
133 if (strcmp (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j))
142 char *demangled_name;
144 fprintf_filtered (stream, "&");
145 fprintf_filtered (stream, kind);
146 demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
147 DMGL_ANSI | DMGL_PARAMS);
148 if (demangled_name == NULL)
149 fprintf_filtered (stream, "<badly mangled name %s>",
150 TYPE_FN_FIELD_PHYSNAME (f, j));
153 fputs_filtered (demangled_name, stream);
154 xfree (demangled_name);
159 fprintf_filtered (stream, "(");
160 type_print (type, "", stream, -1);
161 fprintf_filtered (stream, ") %d", (int) addr >> 3);
165 /* GCC versions after 2.4.5 use this. */
166 const char vtbl_ptr_name[] = "__vtbl_ptr_type";
168 /* HP aCC uses different names. */
169 const char hpacc_vtbl_ptr_name[] = "__vfp";
170 const char hpacc_vtbl_ptr_type_name[] = "__vftyp";
172 /* Return truth value for assertion that TYPE is of the type
173 "pointer to virtual function". */
176 cp_is_vtbl_ptr_type (struct type *type)
178 char *typename = type_name_no_tag (type);
180 return (typename != NULL && !strcmp (typename, vtbl_ptr_name));
183 /* Return truth value for the assertion that TYPE is of the type
184 "pointer to virtual function table". */
187 cp_is_vtbl_member (struct type *type)
189 /* With older versions of g++, the vtbl field pointed to an array
190 of structures. Nowadays it points directly to the structure. */
191 if (TYPE_CODE (type) == TYPE_CODE_PTR)
193 type = TYPE_TARGET_TYPE (type);
194 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
196 type = TYPE_TARGET_TYPE (type);
197 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
198 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
200 /* Virtual functions tables are full of pointers
201 to virtual functions. */
202 return cp_is_vtbl_ptr_type (type);
205 else if (TYPE_CODE (type) == TYPE_CODE_STRUCT) /* if not using thunks */
207 return cp_is_vtbl_ptr_type (type);
209 else if (TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
211 /* The type name of the thunk pointer is NULL when using dwarf2.
212 We could test for a pointer to a function, but there is
213 no type info for the virtual table either, so it wont help. */
214 return cp_is_vtbl_ptr_type (type);
220 /* Mutually recursive subroutines of cp_print_value and c_val_print to
221 print out a structure's fields: cp_print_value_fields and cp_print_value.
223 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
224 same meanings as in cp_print_value and c_val_print.
226 2nd argument REAL_TYPE is used to carry over the type of the derived
227 class across the recursion to base classes.
229 DONT_PRINT is an array of baseclass types that we
230 should not print, or zero if called from top level. */
233 cp_print_value_fields (struct type *type, struct type *real_type, char *valaddr,
234 int offset, CORE_ADDR address, struct ui_file *stream,
235 int format, int recurse, enum val_prettyprint pretty,
236 struct type **dont_print_vb, int dont_print_statmem)
238 int i, len, n_baseclasses;
239 struct obstack tmp_obstack;
240 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
243 CHECK_TYPEDEF (type);
245 fprintf_filtered (stream, "{");
246 len = TYPE_NFIELDS (type);
247 n_baseclasses = TYPE_N_BASECLASSES (type);
249 /* First, print out baseclasses such that we don't print
250 duplicates of virtual baseclasses. */
252 if (n_baseclasses > 0)
253 cp_print_value (type, real_type, valaddr, offset, address, stream,
254 format, recurse + 1, pretty, dont_print_vb);
256 /* Second, print out data fields */
258 /* If there are no data fields, or if the only field is the
259 * vtbl pointer, skip this part */
260 if ((len == n_baseclasses)
261 || ((len - n_baseclasses == 1)
262 && TYPE_HAS_VTABLE (type)
263 && strncmp (TYPE_FIELD_NAME (type, n_baseclasses),
264 hpacc_vtbl_ptr_name, 5) == 0)
266 fprintf_filtered (stream, "<No data fields>");
269 extern int inspect_it;
271 if (dont_print_statmem == 0)
273 /* If we're at top level, carve out a completely fresh
274 chunk of the obstack and use that until this particular
275 invocation returns. */
276 tmp_obstack = dont_print_statmem_obstack;
277 obstack_finish (&dont_print_statmem_obstack);
280 for (i = n_baseclasses; i < len; i++)
282 /* If requested, skip printing of static fields. */
283 if (!static_field_print && TYPE_FIELD_STATIC (type, i))
286 /* If a vtable pointer appears, we'll print it out later */
287 if (TYPE_HAS_VTABLE (type)
288 && strncmp (TYPE_FIELD_NAME (type, i), hpacc_vtbl_ptr_name,
293 fprintf_filtered (stream, ", ");
294 else if (n_baseclasses > 0)
298 fprintf_filtered (stream, "\n");
299 print_spaces_filtered (2 + 2 * recurse, stream);
300 fputs_filtered ("members of ", stream);
301 fputs_filtered (type_name_no_tag (type), stream);
302 fputs_filtered (": ", stream);
309 fprintf_filtered (stream, "\n");
310 print_spaces_filtered (2 + 2 * recurse, stream);
314 wrap_here (n_spaces (2 + 2 * recurse));
318 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
319 fputs_filtered ("\"( ptr \"", stream);
321 fputs_filtered ("\"( nodef \"", stream);
322 if (TYPE_FIELD_STATIC (type, i))
323 fputs_filtered ("static ", stream);
324 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
326 DMGL_PARAMS | DMGL_ANSI);
327 fputs_filtered ("\" \"", stream);
328 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
330 DMGL_PARAMS | DMGL_ANSI);
331 fputs_filtered ("\") \"", stream);
335 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
337 if (TYPE_FIELD_STATIC (type, i))
338 fputs_filtered ("static ", stream);
339 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
341 DMGL_PARAMS | DMGL_ANSI);
342 annotate_field_name_end ();
343 /* do not print leading '=' in case of anonymous unions */
344 if (strcmp (TYPE_FIELD_NAME (type, i), ""))
345 fputs_filtered (" = ", stream);
346 annotate_field_value ();
349 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
353 /* Bitfields require special handling, especially due to byte
355 if (TYPE_FIELD_IGNORE (type, i))
357 fputs_filtered ("<optimized out or zero length>", stream);
361 v = value_from_longest
362 (TYPE_FIELD_TYPE (type, i),
363 unpack_field_as_long (type, valaddr + offset, i));
365 val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v),
366 0, 0, stream, format, 0, recurse + 1, pretty);
371 if (TYPE_FIELD_IGNORE (type, i))
373 fputs_filtered ("<optimized out or zero length>", stream);
375 else if (TYPE_FIELD_STATIC (type, i))
377 struct value *v = value_static_field (type, i);
379 fputs_filtered ("<optimized out>", stream);
381 cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
382 stream, format, recurse + 1,
387 val_print (TYPE_FIELD_TYPE (type, i),
388 valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
389 address + TYPE_FIELD_BITPOS (type, i) / 8,
390 stream, format, 0, recurse + 1, pretty);
393 annotate_field_end ();
396 if (dont_print_statmem == 0)
398 /* Free the space used to deal with the printing
399 of the members from top level. */
400 obstack_free (&dont_print_statmem_obstack, last_dont_print);
401 dont_print_statmem_obstack = tmp_obstack;
406 fprintf_filtered (stream, "\n");
407 print_spaces_filtered (2 * recurse, stream);
409 } /* if there are data fields */
410 /* Now print out the virtual table pointer if there is one */
411 if (TYPE_HAS_VTABLE (type)
412 && strncmp (TYPE_FIELD_NAME (type, n_baseclasses),
413 hpacc_vtbl_ptr_name, 5) == 0)
416 /* First get the virtual table pointer and print it out */
419 fputs_filtered ("__vfp = ", stream);
422 fputs_filtered (", Virtual table at ", stream);
424 /* pai: FIXME 32x64 problem? */
425 /* Not sure what the best notation is in the case where there is no
427 v = value_from_pointer (lookup_pointer_type (builtin_type_unsigned_long),
428 *(unsigned long *) (valaddr + offset));
430 val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
431 stream, format, 0, recurse + 1, pretty);
436 /* Print out function pointers in vtable. */
438 /* FIXME: then-clause is for non-RRBC layout of virtual
439 * table. The RRBC case in the else-clause is yet to be
440 * implemented. The if (1) below should be changed to a
441 * test for whether the executable we have was compiled
442 * with a version of HP aCC that doesn't have RRBC
447 /* no RRBC support; function pointers embedded directly
450 int vfuncs = count_virtual_fns (real_type);
452 fputs_filtered (" {", stream);
454 /* FIXME : doesn't work at present */
456 fprintf_filtered (stream, "%d entr%s: ", vfuncs,
457 vfuncs == 1 ? "y" : "ies");
459 fputs_filtered ("not implemented", stream);
464 /* recursive function that prints all virtual function entries */
466 cp_print_hpacc_virtual_table_entries (real_type, &vfuncs, v,
467 stream, format, recurse,
470 fputs_filtered ("}", stream);
471 } /* non-RRBC case */
474 /* FIXME -- see comments above */
475 /* RRBC support present; function pointers are found
476 * by indirection through the class segment entries. */
484 fprintf_filtered (stream, "\n");
485 print_spaces_filtered (2 * recurse, stream);
488 } /* if vtable exists */
490 fprintf_filtered (stream, "}");
493 /* Special val_print routine to avoid printing multiple copies of virtual
497 cp_print_value (struct type *type, struct type *real_type, char *valaddr,
498 int offset, CORE_ADDR address, struct ui_file *stream,
499 int format, int recurse, enum val_prettyprint pretty,
500 struct type **dont_print_vb)
502 struct obstack tmp_obstack;
503 struct type **last_dont_print
504 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
505 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
507 struct type *thistype;
509 if (dont_print_vb == 0)
511 /* If we're at top level, carve out a completely fresh
512 chunk of the obstack and use that until this particular
513 invocation returns. */
514 tmp_obstack = dont_print_vb_obstack;
515 /* Bump up the high-water mark. Now alpha is omega. */
516 obstack_finish (&dont_print_vb_obstack);
519 for (i = 0; i < n_baseclasses; i++)
523 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
524 char *basename = TYPE_NAME (baseclass);
527 if (BASETYPE_VIA_VIRTUAL (type, i))
529 struct type **first_dont_print
530 = (struct type **) obstack_base (&dont_print_vb_obstack);
532 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
536 if (baseclass == first_dont_print[j])
539 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
543 thistype = real_type;
544 if (TYPE_HAS_VTABLE (type) && BASETYPE_VIA_VIRTUAL (type, i))
546 /* Assume HP/Taligent runtime convention */
547 find_rt_vbase_offset (type, TYPE_BASECLASS (type, i),
548 valaddr, offset, &boffset, &skip);
550 error ("Virtual base class offset not found from vtable while"
552 base_valaddr = valaddr;
556 boffset = baseclass_offset (type, i,
559 skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
561 if (BASETYPE_VIA_VIRTUAL (type, i))
563 /* The virtual base class pointer might have been
564 clobbered by the user program. Make sure that it
565 still points to a valid memory location. */
568 && ((boffset + offset) < 0
569 || (boffset + offset) >= TYPE_LENGTH (type)))
571 /* FIXME (alloca): unsafe if baseclass is really really large. */
572 base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
573 if (target_read_memory (address + offset + boffset, base_valaddr,
574 TYPE_LENGTH (baseclass)) != 0)
578 thistype = baseclass;
581 base_valaddr = valaddr;
584 base_valaddr = valaddr;
587 /* now do the printing */
590 fprintf_filtered (stream, "\n");
591 print_spaces_filtered (2 * recurse, stream);
593 fputs_filtered ("<", stream);
594 /* Not sure what the best notation is in the case where there is no
596 fputs_filtered (basename ? basename : "", stream);
597 fputs_filtered ("> = ", stream);
601 fprintf_filtered (stream, "<invalid address>");
603 cp_print_value_fields (baseclass, thistype, base_valaddr,
604 thisoffset + boffset, address, stream, format,
607 obstack_base (&dont_print_vb_obstack)),
609 fputs_filtered (", ", stream);
615 if (dont_print_vb == 0)
617 /* Free the space used to deal with the printing
618 of this type from top level. */
619 obstack_free (&dont_print_vb_obstack, last_dont_print);
620 /* Reset watermark so that we can continue protecting
621 ourselves from whatever we were protecting ourselves. */
622 dont_print_vb_obstack = tmp_obstack;
626 /* Print value of a static member.
627 To avoid infinite recursion when printing a class that contains
628 a static instance of the class, we keep the addresses of all printed
629 static member classes in an obstack and refuse to print them more
632 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
633 have the same meanings as in c_val_print. */
636 cp_print_static_field (struct type *type,
638 struct ui_file *stream,
641 enum val_prettyprint pretty)
643 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
645 CORE_ADDR *first_dont_print;
649 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
650 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
655 if (VALUE_ADDRESS (val) == first_dont_print[i])
657 fputs_filtered ("<same as static member of an already"
664 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
667 CHECK_TYPEDEF (type);
668 cp_print_value_fields (type, type, VALUE_CONTENTS_ALL (val),
669 VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
670 stream, format, recurse, pretty, NULL, 1);
673 val_print (type, VALUE_CONTENTS_ALL (val),
674 VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
675 stream, format, 0, recurse, pretty);
679 cp_print_class_member (char *valaddr, struct type *domain,
680 struct ui_file *stream, char *prefix)
683 /* VAL is a byte offset into the structure type DOMAIN.
684 Find the name of the field for that offset and
688 register unsigned int i;
689 unsigned len = TYPE_NFIELDS (domain);
691 /* @@ Make VAL into bit offset */
693 /* Note: HP aCC generates offsets that are the real byte offsets added
694 to a constant bias 0x20000000 (1 << 29). This constant bias gets
695 shifted out in the code below -- joyous happenstance! */
697 /* Note: HP cfront uses a constant bias of 1; if we support this
698 compiler ever, we will have to adjust the computation below */
700 LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
701 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
703 int bitpos = TYPE_FIELD_BITPOS (domain, i);
707 if (val < bitpos && i != 0)
709 /* Somehow pointing into a field. */
711 extra = (val - TYPE_FIELD_BITPOS (domain, i));
722 fprintf_filtered (stream, prefix);
723 name = type_name_no_tag (domain);
725 fputs_filtered (name, stream);
727 c_type_print_base (domain, stream, 0, 0);
728 fprintf_filtered (stream, "::");
729 fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
731 fprintf_filtered (stream, " + %d bytes", extra);
733 fprintf_filtered (stream, " (offset in bits)");
736 fprintf_filtered (stream, "%ld", (long) (val >> 3));
740 /* This function prints out virtual table entries for a class; it
741 * recurses on the base classes to find all virtual functions
742 * available in a class.
744 * pai/1997-05-21 Note: As the name suggests, it's currently
745 * implemented for HP aCC runtime only. g++ objects are handled
746 * differently and I have made no attempt to fold that logic in
747 * here. The runtime layout is different for the two cases. Also,
748 * this currently has only the code for non-RRBC layouts generated by
749 * the HP aCC compiler; RRBC code is stubbed out and will have to be
754 cp_print_hpacc_virtual_table_entries (struct type *type, int *vfuncs,
755 struct value *v, struct ui_file *stream,
756 int format, int recurse,
757 enum val_prettyprint pretty)
761 /* pai: FIXME this function doesn't work. It should handle a given
762 * virtual function only once (latest redefinition in class hierarchy)
765 /* Recursion on other classes that can share the same vtable */
766 struct type *pbc = primary_base_class (type);
768 cp_print_hpacc_virtual_table_entries (pbc, vfuncs, v, stream, format,
771 /* Now deal with vfuncs declared in this class */
772 for (fn = 0; fn < TYPE_NFN_FIELDS (type); fn++)
773 for (oi = 0; oi < TYPE_FN_FIELDLIST_LENGTH (type, fn); oi++)
774 if (TYPE_FN_FIELD_VIRTUAL_P (TYPE_FN_FIELDLIST1 (type, fn), oi))
777 const char *field_physname;
779 /* virtual function offset */
780 int vx = (TYPE_FN_FIELD_VOFFSET (TYPE_FN_FIELDLIST1 (type, fn), oi)
783 /* Get the address of the vfunction entry */
784 struct value *vf = value_copy (v);
786 (void) value_fetch_lazy (vf);
787 /* adjust by offset */
788 vf->aligner.contents[0] += 4 * (HP_ACC_VFUNC_START + vx);
789 vf = value_ind (vf); /* get the entry */
790 VALUE_TYPE (vf) = VALUE_TYPE (v); /* make it a pointer */
792 /* print out the entry */
793 val_print (VALUE_TYPE (vf), VALUE_CONTENTS (vf), 0, 0,
794 stream, format, 0, recurse + 1, pretty);
796 = TYPE_FN_FIELD_PHYSNAME (TYPE_FN_FIELDLIST1 (type, fn), oi);
797 /* pai: (temp) FIXME Maybe this should be DMGL_ANSI */
798 vf_name = cplus_demangle (field_physname, DMGL_ARM);
799 fprintf_filtered (stream, " %s", vf_name);
801 fputs_filtered (", ", stream);
808 _initialize_cp_valprint (void)
811 (add_set_cmd ("static-members", class_support, var_boolean,
812 (char *) &static_field_print,
813 "Set printing of C++ static members.",
816 /* Turn on printing of static fields. */
817 static_field_print = 1;
820 (add_set_cmd ("vtbl", class_support, var_boolean, (char *) &vtblprint,
821 "Set printing of C++ virtual function tables.",
826 (add_set_cmd ("object", class_support, var_boolean, (char *) &objectprint,
827 "Set printing of object's derived type based on vtable info.",
831 /* Give people the defaults which they are used to. */
834 obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
835 obstack_specify_allocation (&dont_print_statmem_obstack,
836 32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),