xref: /openbsd/gnu/usr.bin/binutils/gdb/cp-valprint.c (revision 4cfece93)
1 /* Support for printing C++ values for GDB, the GNU debugger.
2    Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3    2000, 2001, 2002, 2003
4    Free Software Foundation, Inc.
5 
6    This file is part of GDB.
7 
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.
12 
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.
17 
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.  */
22 
23 #include "defs.h"
24 #include "gdb_obstack.h"
25 #include "symtab.h"
26 #include "gdbtypes.h"
27 #include "expression.h"
28 #include "value.h"
29 #include "command.h"
30 #include "gdbcmd.h"
31 #include "demangle.h"
32 #include "annotate.h"
33 #include "gdb_string.h"
34 #include "c-lang.h"
35 #include "target.h"
36 #include "cp-abi.h"
37 #include "valprint.h"
38 
39 int vtblprint;			/* Controls printing of vtbl's */
40 int objectprint;		/* Controls looking up an object's derived type
41 				   using what we find in its vtables.  */
42 int static_field_print;		/* Controls printing of static fields. */
43 
44 static struct obstack dont_print_vb_obstack;
45 static struct obstack dont_print_statmem_obstack;
46 
47 extern void _initialize_cp_valprint (void);
48 
49 static void cp_print_static_field (struct type *, struct value *,
50 				   struct ui_file *, int, int,
51 				   enum val_prettyprint);
52 
53 static void cp_print_value (struct type *, struct type *, char *, int,
54 			    CORE_ADDR, struct ui_file *, int, int,
55 			    enum val_prettyprint, struct type **);
56 
57 static void cp_print_hpacc_virtual_table_entries (struct type *, int *,
58 						  struct value *,
59 						  struct ui_file *, int,
60 						  int,
61 						  enum val_prettyprint);
62 
63 
64 void
65 cp_print_class_method (char *valaddr,
66 		       struct type *type,
67 		       struct ui_file *stream)
68 {
69   struct type *domain;
70   struct fn_field *f = NULL;
71   int j = 0;
72   int len2;
73   int offset;
74   char *kind = "";
75   CORE_ADDR addr;
76   struct symbol *sym;
77   unsigned len;
78   unsigned int i;
79   struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
80 
81   domain = TYPE_DOMAIN_TYPE (target_type);
82   if (domain == (struct type *) NULL)
83     {
84       fprintf_filtered (stream, "<unknown>");
85       return;
86     }
87   addr = unpack_pointer (type, valaddr);
88   if (METHOD_PTR_IS_VIRTUAL (addr))
89     {
90       offset = METHOD_PTR_TO_VOFFSET (addr);
91       len = TYPE_NFN_FIELDS (domain);
92       for (i = 0; i < len; i++)
93 	{
94 	  f = TYPE_FN_FIELDLIST1 (domain, i);
95 	  len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
96 
97 	  check_stub_method_group (domain, i);
98 	  for (j = 0; j < len2; j++)
99 	    {
100 	      if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
101 		{
102 		  kind = "virtual ";
103 		  goto common;
104 		}
105 	    }
106 	}
107     }
108   else
109     {
110       sym = find_pc_function (addr);
111       if (sym == 0)
112 	{
113 	  /* 1997-08-01 Currently unsupported with HP aCC */
114 	  if (deprecated_hp_som_som_object_present)
115 	    {
116 	      fputs_filtered ("?? <not supported with HP aCC>", stream);
117 	      return;
118 	    }
119 	  error ("invalid pointer to member function");
120 	}
121       len = TYPE_NFN_FIELDS (domain);
122       for (i = 0; i < len; i++)
123 	{
124 	  f = TYPE_FN_FIELDLIST1 (domain, i);
125 	  len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
126 
127 	  check_stub_method_group (domain, i);
128 	  for (j = 0; j < len2; j++)
129 	    {
130 	      if (strcmp (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j))
131 		  == 0)
132 		goto common;
133 	    }
134 	}
135     }
136  common:
137   if (i < len)
138     {
139       char *demangled_name;
140 
141       fprintf_filtered (stream, "&");
142       fputs_filtered (kind, stream);
143       demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
144 				       DMGL_ANSI | DMGL_PARAMS);
145       if (demangled_name == NULL)
146 	fprintf_filtered (stream, "<badly mangled name %s>",
147 			  TYPE_FN_FIELD_PHYSNAME (f, j));
148       else
149 	{
150 	  fputs_filtered (demangled_name, stream);
151 	  xfree (demangled_name);
152 	}
153     }
154   else
155     {
156       fprintf_filtered (stream, "(");
157       type_print (type, "", stream, -1);
158       fprintf_filtered (stream, ") %d", (int) addr >> 3);
159     }
160 }
161 
162 /* GCC versions after 2.4.5 use this.  */
163 const char vtbl_ptr_name[] = "__vtbl_ptr_type";
164 
165 /* HP aCC uses different names.  */
166 const char hpacc_vtbl_ptr_name[] = "__vfp";
167 const char hpacc_vtbl_ptr_type_name[] = "__vftyp";
168 
169 /* Return truth value for assertion that TYPE is of the type
170    "pointer to virtual function".  */
171 
172 int
173 cp_is_vtbl_ptr_type (struct type *type)
174 {
175   char *typename = type_name_no_tag (type);
176 
177   return (typename != NULL && !strcmp (typename, vtbl_ptr_name));
178 }
179 
180 /* Return truth value for the assertion that TYPE is of the type
181    "pointer to virtual function table".  */
182 
183 int
184 cp_is_vtbl_member (struct type *type)
185 {
186   /* With older versions of g++, the vtbl field pointed to an array
187      of structures.  Nowadays it points directly to the structure. */
188   if (TYPE_CODE (type) == TYPE_CODE_PTR)
189     {
190       type = TYPE_TARGET_TYPE (type);
191       if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
192 	{
193 	  type = TYPE_TARGET_TYPE (type);
194 	  if (TYPE_CODE (type) == TYPE_CODE_STRUCT	/* if not using thunks */
195 	      || TYPE_CODE (type) == TYPE_CODE_PTR)	/* if using thunks */
196 	    {
197 	      /* Virtual functions tables are full of pointers
198 	         to virtual functions. */
199 	      return cp_is_vtbl_ptr_type (type);
200 	    }
201 	}
202       else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)  /* if not using thunks */
203 	{
204 	  return cp_is_vtbl_ptr_type (type);
205 	}
206       else if (TYPE_CODE (type) == TYPE_CODE_PTR)     /* if using thunks */
207 	{
208 	  /* The type name of the thunk pointer is NULL when using dwarf2.
209 	     We could test for a pointer to a function, but there is
210 	     no type info for the virtual table either, so it wont help.  */
211 	  return cp_is_vtbl_ptr_type (type);
212 	}
213     }
214   return 0;
215 }
216 
217 /* Mutually recursive subroutines of cp_print_value and c_val_print to
218    print out a structure's fields: cp_print_value_fields and cp_print_value.
219 
220    TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
221    same meanings as in cp_print_value and c_val_print.
222 
223    2nd argument REAL_TYPE is used to carry over the type of the derived
224    class across the recursion to base classes.
225 
226    DONT_PRINT is an array of baseclass types that we
227    should not print, or zero if called from top level.  */
228 
229 void
230 cp_print_value_fields (struct type *type, struct type *real_type, char *valaddr,
231 		       int offset, CORE_ADDR address, struct ui_file *stream,
232 		       int format, int recurse, enum val_prettyprint pretty,
233 		       struct type **dont_print_vb, int dont_print_statmem)
234 {
235   int i, len, n_baseclasses;
236   struct obstack tmp_obstack;
237   char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
238   int fields_seen = 0;
239 
240   CHECK_TYPEDEF (type);
241 
242   fprintf_filtered (stream, "{");
243   len = TYPE_NFIELDS (type);
244   n_baseclasses = TYPE_N_BASECLASSES (type);
245 
246   /* First, print out baseclasses such that we don't print
247      duplicates of virtual baseclasses.  */
248 
249   if (n_baseclasses > 0)
250     cp_print_value (type, real_type, valaddr, offset, address, stream,
251 		    format, recurse + 1, pretty, dont_print_vb);
252 
253   /* Second, print out data fields */
254 
255   /* If there are no data fields, or if the only field is the
256    * vtbl pointer, skip this part */
257   if ((len == n_baseclasses)
258       || ((len - n_baseclasses == 1)
259 	  && TYPE_HAS_VTABLE (type)
260 	  && strncmp (TYPE_FIELD_NAME (type, n_baseclasses),
261 		      hpacc_vtbl_ptr_name, 5) == 0)
262       || !len)
263     fprintf_filtered (stream, "<No data fields>");
264   else
265     {
266       if (dont_print_statmem == 0)
267 	{
268 	  /* If we're at top level, carve out a completely fresh
269 	     chunk of the obstack and use that until this particular
270 	     invocation returns.  */
271 	  tmp_obstack = dont_print_statmem_obstack;
272 	  obstack_finish (&dont_print_statmem_obstack);
273 	}
274 
275       for (i = n_baseclasses; i < len; i++)
276 	{
277 	  /* If requested, skip printing of static fields.  */
278 	  if (!static_field_print && TYPE_FIELD_STATIC (type, i))
279 	    continue;
280 
281 	  /* If a vtable pointer appears, we'll print it out later */
282 	  if (TYPE_HAS_VTABLE (type)
283 	      && strncmp (TYPE_FIELD_NAME (type, i), hpacc_vtbl_ptr_name,
284 			  5) == 0)
285 	    continue;
286 
287 	  if (fields_seen)
288 	    fprintf_filtered (stream, ", ");
289 	  else if (n_baseclasses > 0)
290 	    {
291 	      if (pretty)
292 		{
293 		  fprintf_filtered (stream, "\n");
294 		  print_spaces_filtered (2 + 2 * recurse, stream);
295 		  fputs_filtered ("members of ", stream);
296 		  fputs_filtered (type_name_no_tag (type), stream);
297 		  fputs_filtered (": ", stream);
298 		}
299 	    }
300 	  fields_seen = 1;
301 
302 	  if (pretty)
303 	    {
304 	      fprintf_filtered (stream, "\n");
305 	      print_spaces_filtered (2 + 2 * recurse, stream);
306 	    }
307 	  else
308 	    {
309 	      wrap_here (n_spaces (2 + 2 * recurse));
310 	    }
311 	  if (inspect_it)
312 	    {
313 	      if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
314 		fputs_filtered ("\"( ptr \"", stream);
315 	      else
316 		fputs_filtered ("\"( nodef \"", stream);
317 	      if (TYPE_FIELD_STATIC (type, i))
318 		fputs_filtered ("static ", stream);
319 	      fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
320 				       language_cplus,
321 				       DMGL_PARAMS | DMGL_ANSI);
322 	      fputs_filtered ("\" \"", stream);
323 	      fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
324 				       language_cplus,
325 				       DMGL_PARAMS | DMGL_ANSI);
326 	      fputs_filtered ("\") \"", stream);
327 	    }
328 	  else
329 	    {
330 	      annotate_field_begin (TYPE_FIELD_TYPE (type, i));
331 
332 	      if (TYPE_FIELD_STATIC (type, i))
333 		fputs_filtered ("static ", stream);
334 	      fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
335 				       language_cplus,
336 				       DMGL_PARAMS | DMGL_ANSI);
337 	      annotate_field_name_end ();
338 	      /* do not print leading '=' in case of anonymous unions */
339 	      if (strcmp (TYPE_FIELD_NAME (type, i), ""))
340 		fputs_filtered (" = ", stream);
341 	      annotate_field_value ();
342 	    }
343 
344 	  if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
345 	    {
346 	      struct value *v;
347 
348 	      /* Bitfields require special handling, especially due to byte
349 	         order problems.  */
350 	      if (TYPE_FIELD_IGNORE (type, i))
351 		{
352 		  fputs_filtered ("<optimized out or zero length>", stream);
353 		}
354 	      else
355 		{
356 		  v = value_from_longest
357 		    (TYPE_FIELD_TYPE (type, i),
358 		     unpack_field_as_long (type, valaddr + offset, i));
359 
360 		  val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v),
361 			     0, 0, stream, format, 0, recurse + 1, pretty);
362 		}
363 	    }
364 	  else
365 	    {
366 	      if (TYPE_FIELD_IGNORE (type, i))
367 		{
368 		  fputs_filtered ("<optimized out or zero length>", stream);
369 		}
370 	      else if (TYPE_FIELD_STATIC (type, i))
371 		{
372 		  struct value *v = value_static_field (type, i);
373 		  if (v == NULL)
374 		    fputs_filtered ("<optimized out>", stream);
375 		  else
376 		    cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
377 					   stream, format, recurse + 1,
378 					   pretty);
379 		}
380 	      else
381 		{
382 		  val_print (TYPE_FIELD_TYPE (type, i),
383 			     valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
384 			     address + TYPE_FIELD_BITPOS (type, i) / 8,
385 			     stream, format, 0, recurse + 1, pretty);
386 		}
387 	    }
388 	  annotate_field_end ();
389 	}
390 
391       if (dont_print_statmem == 0)
392 	{
393 	  /* Free the space used to deal with the printing
394 	     of the members from top level.  */
395 	  obstack_free (&dont_print_statmem_obstack, last_dont_print);
396 	  dont_print_statmem_obstack = tmp_obstack;
397 	}
398 
399       if (pretty)
400 	{
401 	  fprintf_filtered (stream, "\n");
402 	  print_spaces_filtered (2 * recurse, stream);
403 	}
404     }				/* if there are data fields */
405   /* Now print out the virtual table pointer if there is one */
406   if (TYPE_HAS_VTABLE (type)
407       && strncmp (TYPE_FIELD_NAME (type, n_baseclasses),
408 		  hpacc_vtbl_ptr_name, 5) == 0)
409     {
410       struct value *v;
411       /* First get the virtual table pointer and print it out */
412 
413 #if 0
414       fputs_filtered ("__vfp = ", stream);
415 #endif
416 
417       fputs_filtered (", Virtual table at ", stream);
418 
419       /* pai: FIXME 32x64 problem? */
420       /* Not sure what the best notation is in the case where there is no
421          baseclass name.  */
422       v = value_from_pointer (lookup_pointer_type (builtin_type_unsigned_long),
423 			      *(unsigned long *) (valaddr + offset));
424 
425       val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
426 		 stream, format, 0, recurse + 1, pretty);
427       fields_seen = 1;
428 
429       if (vtblprint)
430 	{
431 	  /* Print out function pointers in vtable. */
432 
433 	  /* FIXME: then-clause is for non-RRBC layout of virtual
434 	   * table.  The RRBC case in the else-clause is yet to be
435 	   * implemented.  The if (1) below should be changed to a
436 	   * test for whether the executable we have was compiled
437 	   * with a version of HP aCC that doesn't have RRBC
438 	   * support. */
439 
440 	  if (1)
441 	    {
442 	      /* no RRBC support; function pointers embedded directly
443                  in vtable */
444 
445 	      int vfuncs = count_virtual_fns (real_type);
446 
447 	      fputs_filtered (" {", stream);
448 
449 	      /* FIXME : doesn't work at present */
450 #if 0
451 	      fprintf_filtered (stream, "%d entr%s: ", vfuncs,
452 				vfuncs == 1 ? "y" : "ies");
453 #else
454 	      fputs_filtered ("not implemented", stream);
455 
456 
457 #endif
458 
459 	      /* recursive function that prints all virtual function entries */
460 #if 0
461 	      cp_print_hpacc_virtual_table_entries (real_type, &vfuncs, v,
462 						    stream, format, recurse,
463 						    pretty);
464 #endif
465 	      fputs_filtered ("}", stream);
466 	    }			/* non-RRBC case */
467 	  else
468 	    {
469 	      /* FIXME -- see comments above */
470 	      /* RRBC support present; function pointers are found
471 	       * by indirection through the class segment entries. */
472 
473 
474 	    }			/* RRBC case */
475 	}			/* if vtblprint */
476 
477       if (pretty)
478 	{
479 	  fprintf_filtered (stream, "\n");
480 	  print_spaces_filtered (2 * recurse, stream);
481 	}
482 
483     }				/* if vtable exists */
484 
485   fprintf_filtered (stream, "}");
486 }
487 
488 /* Special val_print routine to avoid printing multiple copies of virtual
489    baseclasses.  */
490 
491 static void
492 cp_print_value (struct type *type, struct type *real_type, char *valaddr,
493 		int offset, CORE_ADDR address, struct ui_file *stream,
494 		int format, int recurse, enum val_prettyprint pretty,
495 		struct type **dont_print_vb)
496 {
497   struct obstack tmp_obstack;
498   struct type **last_dont_print
499     = (struct type **) obstack_next_free (&dont_print_vb_obstack);
500   int i, n_baseclasses = TYPE_N_BASECLASSES (type);
501   int thisoffset;
502   struct type *thistype;
503 
504   if (dont_print_vb == 0)
505     {
506       /* If we're at top level, carve out a completely fresh
507          chunk of the obstack and use that until this particular
508          invocation returns.  */
509       tmp_obstack = dont_print_vb_obstack;
510       /* Bump up the high-water mark.  Now alpha is omega.  */
511       obstack_finish (&dont_print_vb_obstack);
512     }
513 
514   for (i = 0; i < n_baseclasses; i++)
515     {
516       int boffset;
517       int skip;
518       struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
519       char *basename = TYPE_NAME (baseclass);
520       char *base_valaddr;
521 
522       if (BASETYPE_VIA_VIRTUAL (type, i))
523 	{
524 	  struct type **first_dont_print
525 	    = (struct type **) obstack_base (&dont_print_vb_obstack);
526 
527 	  int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
528 	    - first_dont_print;
529 
530 	  while (--j >= 0)
531 	    if (baseclass == first_dont_print[j])
532 	      goto flush_it;
533 
534 	  obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
535 	}
536 
537       thisoffset = offset;
538       thistype = real_type;
539       if (TYPE_HAS_VTABLE (type) && BASETYPE_VIA_VIRTUAL (type, i))
540 	{
541 	  /* Assume HP/Taligent runtime convention */
542 	  find_rt_vbase_offset (type, TYPE_BASECLASS (type, i),
543 				valaddr, offset, &boffset, &skip);
544 	  if (skip >= 0)
545 	    error ("Virtual base class offset not found from vtable while"
546 		   " printing");
547 	  base_valaddr = valaddr;
548 	}
549       else
550 	{
551 	  boffset = baseclass_offset (type, i,
552 				      valaddr + offset,
553 				      address);
554 	  skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
555 
556 	  if (BASETYPE_VIA_VIRTUAL (type, i))
557 	    {
558 	      /* The virtual base class pointer might have been
559 	         clobbered by the user program. Make sure that it
560 	         still points to a valid memory location.  */
561 
562 	      if (boffset != -1
563 		  && ((boffset + offset) < 0
564 		      || (boffset + offset) >= TYPE_LENGTH (type)))
565 		{
566 		  /* FIXME (alloca): unsafe if baseclass is really really large. */
567 		  base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
568 		  if (target_read_memory (address + boffset, base_valaddr,
569 					  TYPE_LENGTH (baseclass)) != 0)
570 		    skip = 1;
571 		  address = address + boffset;
572 		  thisoffset = 0;
573 		  boffset = 0;
574 		  thistype = baseclass;
575 		}
576 	      else
577 		base_valaddr = valaddr;
578 	    }
579 	  else
580 	    base_valaddr = valaddr;
581 	}
582 
583       /* now do the printing */
584       if (pretty)
585 	{
586 	  fprintf_filtered (stream, "\n");
587 	  print_spaces_filtered (2 * recurse, stream);
588 	}
589       fputs_filtered ("<", stream);
590       /* Not sure what the best notation is in the case where there is no
591          baseclass name.  */
592       fputs_filtered (basename ? basename : "", stream);
593       fputs_filtered ("> = ", stream);
594 
595 
596       if (skip >= 1)
597 	fprintf_filtered (stream, "<invalid address>");
598       else
599 	cp_print_value_fields (baseclass, thistype, base_valaddr,
600 			       thisoffset + boffset, address + boffset,
601 			       stream, format,
602 			       recurse, pretty,
603 			       ((struct type **)
604 				obstack_base (&dont_print_vb_obstack)),
605 			       0);
606       fputs_filtered (", ", stream);
607 
608     flush_it:
609       ;
610     }
611 
612   if (dont_print_vb == 0)
613     {
614       /* Free the space used to deal with the printing
615          of this type from top level.  */
616       obstack_free (&dont_print_vb_obstack, last_dont_print);
617       /* Reset watermark so that we can continue protecting
618          ourselves from whatever we were protecting ourselves.  */
619       dont_print_vb_obstack = tmp_obstack;
620     }
621 }
622 
623 /* Print value of a static member.
624    To avoid infinite recursion when printing a class that contains
625    a static instance of the class, we keep the addresses of all printed
626    static member classes in an obstack and refuse to print them more
627    than once.
628 
629    VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
630    have the same meanings as in c_val_print.  */
631 
632 static void
633 cp_print_static_field (struct type *type,
634 		       struct value *val,
635 		       struct ui_file *stream,
636 		       int format,
637 		       int recurse,
638 		       enum val_prettyprint pretty)
639 {
640   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
641     {
642       CORE_ADDR *first_dont_print;
643       int i;
644 
645       first_dont_print
646 	= (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
647       i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
648 	- first_dont_print;
649 
650       while (--i >= 0)
651 	{
652 	  if (VALUE_ADDRESS (val) == first_dont_print[i])
653 	    {
654 	      fputs_filtered ("<same as static member of an already"
655 			      " seen type>",
656 			      stream);
657 	      return;
658 	    }
659 	}
660 
661       obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
662 		    sizeof (CORE_ADDR));
663 
664       CHECK_TYPEDEF (type);
665       cp_print_value_fields (type, type, VALUE_CONTENTS_ALL (val),
666 			     VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
667 			     stream, format, recurse, pretty, NULL, 1);
668       return;
669     }
670   val_print (type, VALUE_CONTENTS_ALL (val),
671 	     VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
672 	     stream, format, 0, recurse, pretty);
673 }
674 
675 void
676 cp_print_class_member (char *valaddr, struct type *domain,
677 		       struct ui_file *stream, char *prefix)
678 {
679 
680   /* VAL is a byte offset into the structure type DOMAIN.
681      Find the name of the field for that offset and
682      print it.  */
683   int extra = 0;
684   int bits = 0;
685   unsigned int i;
686   unsigned len = TYPE_NFIELDS (domain);
687 
688   /* @@ Make VAL into bit offset */
689 
690   /* Note: HP aCC generates offsets that are the real byte offsets added
691      to a constant bias 0x20000000 (1 << 29).  This constant bias gets
692      shifted out in the code below -- joyous happenstance! */
693 
694   /* Note: HP cfront uses a constant bias of 1; if we support this
695      compiler ever, we will have to adjust the computation below */
696 
697   LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
698   for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
699     {
700       int bitpos = TYPE_FIELD_BITPOS (domain, i);
701       QUIT;
702       if (val == bitpos)
703 	break;
704       if (val < bitpos && i != 0)
705 	{
706 	  /* Somehow pointing into a field.  */
707 	  i -= 1;
708 	  extra = (val - TYPE_FIELD_BITPOS (domain, i));
709 	  if (extra & 0x7)
710 	    bits = 1;
711 	  else
712 	    extra >>= 3;
713 	  break;
714 	}
715     }
716   if (i < len)
717     {
718       char *name;
719       fputs_filtered (prefix, stream);
720       name = type_name_no_tag (domain);
721       if (name)
722 	fputs_filtered (name, stream);
723       else
724 	c_type_print_base (domain, stream, 0, 0);
725       fprintf_filtered (stream, "::");
726       fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
727       if (extra)
728 	fprintf_filtered (stream, " + %d bytes", extra);
729       if (bits)
730 	fprintf_filtered (stream, " (offset in bits)");
731     }
732   else
733     fprintf_filtered (stream, "%ld", (long) (val >> 3));
734 }
735 
736 
737 /* This function prints out virtual table entries for a class; it
738  * recurses on the base classes to find all virtual functions
739  * available in a class.
740  *
741  * pai/1997-05-21 Note: As the name suggests, it's currently
742  * implemented for HP aCC runtime only. g++ objects are handled
743  * differently and I have made no attempt to fold that logic in
744  * here. The runtime layout is different for the two cases.  Also,
745  * this currently has only the code for non-RRBC layouts generated by
746  * the HP aCC compiler; RRBC code is stubbed out and will have to be
747  * added later. */
748 
749 
750 static void
751 cp_print_hpacc_virtual_table_entries (struct type *type, int *vfuncs,
752 				      struct value *v, struct ui_file *stream,
753 				      int format, int recurse,
754 				      enum val_prettyprint pretty)
755 {
756   int fn, oi;
757 
758   /* pai: FIXME this function doesn't work. It should handle a given
759    * virtual function only once (latest redefinition in class hierarchy)
760    */
761 
762   /* Recursion on other classes that can share the same vtable */
763   struct type *pbc = primary_base_class (type);
764   if (pbc)
765     cp_print_hpacc_virtual_table_entries (pbc, vfuncs, v, stream, format,
766 					  recurse, pretty);
767 
768   /* Now deal with vfuncs declared in this class */
769   for (fn = 0; fn < TYPE_NFN_FIELDS (type); fn++)
770     for (oi = 0; oi < TYPE_FN_FIELDLIST_LENGTH (type, fn); oi++)
771       if (TYPE_FN_FIELD_VIRTUAL_P (TYPE_FN_FIELDLIST1 (type, fn), oi))
772 	{
773 	  char *vf_name;
774 	  const char *field_physname;
775 
776 	  /* virtual function offset */
777 	  int vx = (TYPE_FN_FIELD_VOFFSET (TYPE_FN_FIELDLIST1 (type, fn), oi)
778 		    - 1);
779 
780 	  /* Get the address of the vfunction entry */
781 	  struct value *vf = value_copy (v);
782 	  if (VALUE_LAZY (vf))
783 	    (void) value_fetch_lazy (vf);
784 	  /* adjust by offset */
785 	  vf->aligner.contents[0] += 4 * (HP_ACC_VFUNC_START + vx);
786 	  vf = value_ind (vf);	/* get the entry */
787 	  VALUE_TYPE (vf) = VALUE_TYPE (v);	/* make it a pointer */
788 
789 	  /* print out the entry */
790 	  val_print (VALUE_TYPE (vf), VALUE_CONTENTS (vf), 0, 0,
791 		     stream, format, 0, recurse + 1, pretty);
792 	  field_physname
793 	    = TYPE_FN_FIELD_PHYSNAME (TYPE_FN_FIELDLIST1 (type, fn), oi);
794 	  /* pai: (temp) FIXME Maybe this should be DMGL_ANSI */
795 	  vf_name = cplus_demangle (field_physname, DMGL_ARM);
796 	  fprintf_filtered (stream, " %s", vf_name);
797 	  if (--(*vfuncs) > 0)
798 	    fputs_filtered (", ", stream);
799 	}
800 }
801 
802 
803 
804 void
805 _initialize_cp_valprint (void)
806 {
807   deprecated_add_show_from_set
808     (add_set_cmd ("static-members", class_support, var_boolean,
809 		  (char *) &static_field_print,
810 		  "Set printing of C++ static members.",
811 		  &setprintlist),
812      &showprintlist);
813   /* Turn on printing of static fields.  */
814   static_field_print = 1;
815 
816   deprecated_add_show_from_set
817     (add_set_cmd ("vtbl", class_support, var_boolean, (char *) &vtblprint,
818 		  "Set printing of C++ virtual function tables.",
819 		  &setprintlist),
820      &showprintlist);
821 
822   deprecated_add_show_from_set
823     (add_set_cmd ("object", class_support, var_boolean, (char *) &objectprint,
824 	      "Set printing of object's derived type based on vtable info.",
825 		  &setprintlist),
826      &showprintlist);
827 
828   /* Give people the defaults which they are used to.  */
829   objectprint = 0;
830   vtblprint = 0;
831   obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
832   obstack_specify_allocation (&dont_print_statmem_obstack,
833 			      32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),
834 			      xmalloc, xfree);
835 }
836