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