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