Fix xcoff linker's ordering of pad sections
[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,
6943961c 3 2000, 2001
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
SS
203{
204 if (TYPE_CODE (type) == TYPE_CODE_PTR)
205 {
206 type = TYPE_TARGET_TYPE (type);
207 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
208 {
209 type = TYPE_TARGET_TYPE (type);
c5aa993b
JM
210 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
211 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
c906108c
SS
212 {
213 /* Virtual functions tables are full of pointers
c5aa993b 214 to virtual functions. */
c906108c
SS
215 return cp_is_vtbl_ptr_type (type);
216 }
217 }
218 }
219 return 0;
220}
221
222/* Mutually recursive subroutines of cp_print_value and c_val_print to
223 print out a structure's fields: cp_print_value_fields and cp_print_value.
c5aa993b 224
c906108c
SS
225 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
226 same meanings as in cp_print_value and c_val_print.
227
228 2nd argument REAL_TYPE is used to carry over the type of the derived
229 class across the recursion to base classes.
230
231 DONT_PRINT is an array of baseclass types that we
232 should not print, or zero if called from top level. */
233
234void
fba45db2
KB
235cp_print_value_fields (struct type *type, struct type *real_type, char *valaddr,
236 int offset, CORE_ADDR address, struct ui_file *stream,
237 int format, int recurse, enum val_prettyprint pretty,
238 struct type **dont_print_vb, int dont_print_statmem)
c906108c
SS
239{
240 int i, len, n_baseclasses;
241 struct obstack tmp_obstack;
242 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
243 int fields_seen = 0;
244
245 CHECK_TYPEDEF (type);
246
247 fprintf_filtered (stream, "{");
248 len = TYPE_NFIELDS (type);
249 n_baseclasses = TYPE_N_BASECLASSES (type);
250
251 /* First, print out baseclasses such that we don't print
252 duplicates of virtual baseclasses. */
253
254 if (n_baseclasses > 0)
255 cp_print_value (type, real_type, valaddr, offset, address, stream,
c5aa993b 256 format, recurse + 1, pretty, dont_print_vb);
c906108c
SS
257
258 /* Second, print out data fields */
259
260 /* If there are no data fields, or if the only field is the
c5aa993b 261 * vtbl pointer, skip this part */
2c63a960
JB
262 if ((len == n_baseclasses)
263 || ((len - n_baseclasses == 1)
264 && TYPE_HAS_VTABLE (type)
265 && STREQN (TYPE_FIELD_NAME (type, n_baseclasses),
266 hpacc_vtbl_ptr_name, 5))
267 || !len)
c906108c
SS
268 fprintf_filtered (stream, "<No data fields>");
269 else
270 {
271 extern int inspect_it;
272
273 if (dont_print_statmem == 0)
274 {
275 /* If we're at top level, carve out a completely fresh
276 chunk of the obstack and use that until this particular
277 invocation returns. */
278 tmp_obstack = dont_print_statmem_obstack;
279 obstack_finish (&dont_print_statmem_obstack);
280 }
281
282 for (i = n_baseclasses; i < len; i++)
283 {
284 /* If requested, skip printing of static fields. */
285 if (!static_field_print && TYPE_FIELD_STATIC (type, i))
286 continue;
287
c5aa993b 288 /* If a vtable pointer appears, we'll print it out later */
2c63a960
JB
289 if (TYPE_HAS_VTABLE (type)
290 && STREQN (TYPE_FIELD_NAME (type, i), hpacc_vtbl_ptr_name, 5))
c5aa993b
JM
291 continue;
292
c906108c
SS
293 if (fields_seen)
294 fprintf_filtered (stream, ", ");
295 else if (n_baseclasses > 0)
296 {
297 if (pretty)
298 {
299 fprintf_filtered (stream, "\n");
300 print_spaces_filtered (2 + 2 * recurse, stream);
301 fputs_filtered ("members of ", stream);
302 fputs_filtered (type_name_no_tag (type), stream);
303 fputs_filtered (": ", stream);
304 }
305 }
306 fields_seen = 1;
307
308 if (pretty)
309 {
310 fprintf_filtered (stream, "\n");
311 print_spaces_filtered (2 + 2 * recurse, stream);
312 }
c5aa993b 313 else
c906108c
SS
314 {
315 wrap_here (n_spaces (2 + 2 * recurse));
316 }
317 if (inspect_it)
318 {
319 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
320 fputs_filtered ("\"( ptr \"", stream);
321 else
322 fputs_filtered ("\"( nodef \"", stream);
323 if (TYPE_FIELD_STATIC (type, i))
324 fputs_filtered ("static ", stream);
325 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
326 language_cplus,
327 DMGL_PARAMS | DMGL_ANSI);
328 fputs_filtered ("\" \"", stream);
329 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
330 language_cplus,
331 DMGL_PARAMS | DMGL_ANSI);
332 fputs_filtered ("\") \"", stream);
333 }
334 else
335 {
336 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
337
338 if (TYPE_FIELD_STATIC (type, i))
339 fputs_filtered ("static ", stream);
340 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
341 language_cplus,
342 DMGL_PARAMS | DMGL_ANSI);
343 annotate_field_name_end ();
344 /* do not print leading '=' in case of anonymous unions */
345 if (strcmp (TYPE_FIELD_NAME (type, i), ""))
346 fputs_filtered (" = ", stream);
347 annotate_field_value ();
348 }
349
350 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
351 {
6943961c 352 struct value *v;
c906108c
SS
353
354 /* Bitfields require special handling, especially due to byte
c5aa993b 355 order problems. */
c906108c
SS
356 if (TYPE_FIELD_IGNORE (type, i))
357 {
c5aa993b 358 fputs_filtered ("<optimized out or zero length>", stream);
c906108c
SS
359 }
360 else
361 {
2c63a960
JB
362 v = value_from_longest
363 (TYPE_FIELD_TYPE (type, i),
364 unpack_field_as_long (type, valaddr + offset, i));
c906108c 365
2c63a960
JB
366 val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v),
367 0, 0, stream, format, 0, recurse + 1, pretty);
c906108c
SS
368 }
369 }
370 else
371 {
372 if (TYPE_FIELD_IGNORE (type, i))
373 {
c5aa993b 374 fputs_filtered ("<optimized out or zero length>", stream);
c906108c
SS
375 }
376 else if (TYPE_FIELD_STATIC (type, i))
377 {
6943961c 378 struct value *v = value_static_field (type, i);
c906108c
SS
379 if (v == NULL)
380 fputs_filtered ("<optimized out>", stream);
381 else
382 cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
383 stream, format, recurse + 1,
384 pretty);
385 }
386 else
387 {
c5aa993b 388 val_print (TYPE_FIELD_TYPE (type, i),
2c63a960 389 valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8,
c5aa993b
JM
390 address + TYPE_FIELD_BITPOS (type, i) / 8,
391 stream, format, 0, recurse + 1, pretty);
c906108c
SS
392 }
393 }
394 annotate_field_end ();
395 }
396
397 if (dont_print_statmem == 0)
398 {
399 /* Free the space used to deal with the printing
400 of the members from top level. */
401 obstack_free (&dont_print_statmem_obstack, last_dont_print);
402 dont_print_statmem_obstack = tmp_obstack;
403 }
404
405 if (pretty)
406 {
407 fprintf_filtered (stream, "\n");
408 print_spaces_filtered (2 * recurse, stream);
409 }
c5aa993b
JM
410 } /* if there are data fields */
411 /* Now print out the virtual table pointer if there is one */
2c63a960
JB
412 if (TYPE_HAS_VTABLE (type)
413 && STREQN (TYPE_FIELD_NAME (type, n_baseclasses),
414 hpacc_vtbl_ptr_name,
415 5))
c906108c 416 {
6943961c 417 struct value *v;
c5aa993b 418 /* First get the virtual table pointer and print it out */
c906108c
SS
419
420#if 0
421 fputs_filtered ("__vfp = ", stream);
422#endif
423
424 fputs_filtered (", Virtual table at ", stream);
425
426 /* pai: FIXME 32x64 problem? */
427 /* Not sure what the best notation is in the case where there is no
428 baseclass name. */
4478b372 429 v = value_from_pointer (lookup_pointer_type (builtin_type_unsigned_long),
c5aa993b 430 *(unsigned long *) (valaddr + offset));
c906108c
SS
431
432 val_print (VALUE_TYPE (v), VALUE_CONTENTS (v), 0, 0,
c5aa993b 433 stream, format, 0, recurse + 1, pretty);
c906108c
SS
434 fields_seen = 1;
435
436 if (vtblprint)
c5aa993b
JM
437 {
438 /* Print out function pointers in vtable. */
c906108c 439
c5aa993b
JM
440 /* FIXME: then-clause is for non-RRBC layout of virtual
441 * table. The RRBC case in the else-clause is yet to be
442 * implemented. The if (1) below should be changed to a
443 * test for whether the executable we have was compiled
444 * with a version of HP aCC that doesn't have RRBC
445 * support. */
c906108c 446
c5aa993b
JM
447 if (1)
448 {
2c63a960
JB
449 /* no RRBC support; function pointers embedded directly
450 in vtable */
c906108c 451
c5aa993b 452 int vfuncs = count_virtual_fns (real_type);
c906108c 453
c5aa993b 454 fputs_filtered (" {", stream);
c906108c 455
c5aa993b 456 /* FIXME : doesn't work at present */
c906108c 457#if 0
2c63a960
JB
458 fprintf_filtered (stream, "%d entr%s: ", vfuncs,
459 vfuncs == 1 ? "y" : "ies");
c906108c 460#else
c5aa993b 461 fputs_filtered ("not implemented", stream);
c906108c
SS
462
463
464#endif
465
c5aa993b 466 /* recursive function that prints all virtual function entries */
c906108c 467#if 0
2c63a960
JB
468 cp_print_hpacc_virtual_table_entries (real_type, &vfuncs, v,
469 stream, format, recurse,
470 pretty);
c906108c 471#endif
c5aa993b
JM
472 fputs_filtered ("}", stream);
473 } /* non-RRBC case */
474 else
475 {
4d33f415 476 /* FIXME -- see comments above */
c5aa993b
JM
477 /* RRBC support present; function pointers are found
478 * by indirection through the class segment entries. */
479
480
481 } /* RRBC case */
482 } /* if vtblprint */
c906108c
SS
483
484 if (pretty)
485 {
486 fprintf_filtered (stream, "\n");
487 print_spaces_filtered (2 * recurse, stream);
488 }
489
c5aa993b
JM
490 } /* if vtable exists */
491
c906108c
SS
492 fprintf_filtered (stream, "}");
493}
494
495/* Special val_print routine to avoid printing multiple copies of virtual
496 baseclasses. */
497
498static void
fba45db2
KB
499cp_print_value (struct type *type, struct type *real_type, char *valaddr,
500 int offset, CORE_ADDR address, struct ui_file *stream,
501 int format, int recurse, enum val_prettyprint pretty,
502 struct type **dont_print_vb)
c906108c
SS
503{
504 struct obstack tmp_obstack;
505 struct type **last_dont_print
2c63a960 506 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
c906108c 507 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
b9d652ac
DJ
508 int thisoffset;
509 struct type *thistype;
c906108c
SS
510
511 if (dont_print_vb == 0)
512 {
513 /* If we're at top level, carve out a completely fresh
c5aa993b
JM
514 chunk of the obstack and use that until this particular
515 invocation returns. */
c906108c
SS
516 tmp_obstack = dont_print_vb_obstack;
517 /* Bump up the high-water mark. Now alpha is omega. */
518 obstack_finish (&dont_print_vb_obstack);
519 }
520
521 for (i = 0; i < n_baseclasses; i++)
522 {
523 int boffset;
524 int skip;
525 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
526 char *basename = TYPE_NAME (baseclass);
527 char *base_valaddr;
528
529 if (BASETYPE_VIA_VIRTUAL (type, i))
530 {
531 struct type **first_dont_print
2c63a960 532 = (struct type **) obstack_base (&dont_print_vb_obstack);
c906108c 533
c5aa993b 534 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
2c63a960 535 - first_dont_print;
c906108c
SS
536
537 while (--j >= 0)
538 if (baseclass == first_dont_print[j])
539 goto flush_it;
540
541 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
542 }
543
b9d652ac
DJ
544 thisoffset = offset;
545 thistype = real_type;
c906108c 546 if (TYPE_HAS_VTABLE (type) && BASETYPE_VIA_VIRTUAL (type, i))
c5aa993b
JM
547 {
548 /* Assume HP/Taligent runtime convention */
549 find_rt_vbase_offset (type, TYPE_BASECLASS (type, i),
550 valaddr, offset, &boffset, &skip);
551 if (skip >= 0)
2c63a960
JB
552 error ("Virtual base class offset not found from vtable while"
553 " printing");
c5aa993b
JM
554 base_valaddr = valaddr;
555 }
c906108c 556 else
c5aa993b 557 {
2c63a960
JB
558 boffset = baseclass_offset (type, i,
559 valaddr + offset,
560 address + offset);
c5aa993b 561 skip = ((boffset == -1) || (boffset + offset) < 0) ? 1 : -1;
c906108c 562
c5aa993b
JM
563 if (BASETYPE_VIA_VIRTUAL (type, i))
564 {
2c63a960
JB
565 /* The virtual base class pointer might have been
566 clobbered by the user program. Make sure that it
567 still points to a valid memory location. */
c906108c 568
2c63a960
JB
569 if (boffset != -1
570 && ((boffset + offset) < 0
571 || (boffset + offset) >= TYPE_LENGTH (type)))
c5aa993b
JM
572 {
573 base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
b9d652ac 574 if (target_read_memory (address + offset + boffset, base_valaddr,
c5aa993b
JM
575 TYPE_LENGTH (baseclass)) != 0)
576 skip = 1;
b9d652ac
DJ
577 thisoffset = 0;
578 boffset = 0;
579 thistype = baseclass;
c5aa993b
JM
580 }
581 else
582 base_valaddr = valaddr;
583 }
584 else
585 base_valaddr = valaddr;
c906108c
SS
586 }
587
588 /* now do the printing */
589 if (pretty)
590 {
591 fprintf_filtered (stream, "\n");
592 print_spaces_filtered (2 * recurse, stream);
593 }
594 fputs_filtered ("<", stream);
595 /* Not sure what the best notation is in the case where there is no
c5aa993b 596 baseclass name. */
c906108c
SS
597 fputs_filtered (basename ? basename : "", stream);
598 fputs_filtered ("> = ", stream);
599
600
601 if (skip >= 1)
602 fprintf_filtered (stream, "<invalid address>");
603 else
b9d652ac
DJ
604 cp_print_value_fields (baseclass, thistype, base_valaddr,
605 thisoffset + boffset, address, stream, format,
2c63a960
JB
606 recurse, pretty,
607 ((struct type **)
608 obstack_base (&dont_print_vb_obstack)),
c906108c
SS
609 0);
610 fputs_filtered (", ", stream);
611
612 flush_it:
613 ;
614 }
615
616 if (dont_print_vb == 0)
617 {
618 /* Free the space used to deal with the printing
c5aa993b 619 of this type from top level. */
c906108c
SS
620 obstack_free (&dont_print_vb_obstack, last_dont_print);
621 /* Reset watermark so that we can continue protecting
c5aa993b 622 ourselves from whatever we were protecting ourselves. */
c906108c
SS
623 dont_print_vb_obstack = tmp_obstack;
624 }
625}
626
627/* Print value of a static member.
628 To avoid infinite recursion when printing a class that contains
629 a static instance of the class, we keep the addresses of all printed
630 static member classes in an obstack and refuse to print them more
631 than once.
632
633 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
634 have the same meanings as in c_val_print. */
635
636static void
2c63a960 637cp_print_static_field (struct type *type,
6943961c 638 struct value *val,
2c63a960
JB
639 struct ui_file *stream,
640 int format,
641 int recurse,
642 enum val_prettyprint pretty)
c906108c
SS
643{
644 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
645 {
646 CORE_ADDR *first_dont_print;
647 int i;
648
649 first_dont_print
c5aa993b
JM
650 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
651 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
c906108c
SS
652 - first_dont_print;
653
654 while (--i >= 0)
655 {
656 if (VALUE_ADDRESS (val) == first_dont_print[i])
657 {
2c63a960
JB
658 fputs_filtered ("<same as static member of an already"
659 " seen type>",
c906108c
SS
660 stream);
661 return;
662 }
663 }
664
665 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
666 sizeof (CORE_ADDR));
667
668 CHECK_TYPEDEF (type);
2c63a960
JB
669 cp_print_value_fields (type, type, VALUE_CONTENTS_ALL (val),
670 VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
c906108c
SS
671 stream, format, recurse, pretty, NULL, 1);
672 return;
673 }
2c63a960
JB
674 val_print (type, VALUE_CONTENTS_ALL (val),
675 VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
c906108c
SS
676 stream, format, 0, recurse, pretty);
677}
678
679void
fba45db2
KB
680cp_print_class_member (char *valaddr, struct type *domain,
681 struct ui_file *stream, char *prefix)
c906108c 682{
c5aa993b 683
c906108c
SS
684 /* VAL is a byte offset into the structure type DOMAIN.
685 Find the name of the field for that offset and
686 print it. */
687 int extra = 0;
688 int bits = 0;
689 register unsigned int i;
690 unsigned len = TYPE_NFIELDS (domain);
691
692 /* @@ Make VAL into bit offset */
693
694 /* Note: HP aCC generates offsets that are the real byte offsets added
695 to a constant bias 0x20000000 (1 << 29). This constant bias gets
696 shifted out in the code below -- joyous happenstance! */
697
698 /* Note: HP cfront uses a constant bias of 1; if we support this
c5aa993b
JM
699 compiler ever, we will have to adjust the computation below */
700
c906108c
SS
701 LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
702 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
703 {
704 int bitpos = TYPE_FIELD_BITPOS (domain, i);
705 QUIT;
706 if (val == bitpos)
707 break;
708 if (val < bitpos && i != 0)
709 {
710 /* Somehow pointing into a field. */
711 i -= 1;
712 extra = (val - TYPE_FIELD_BITPOS (domain, i));
713 if (extra & 0x7)
714 bits = 1;
715 else
716 extra >>= 3;
717 break;
718 }
719 }
720 if (i < len)
721 {
722 char *name;
723 fprintf_filtered (stream, prefix);
724 name = type_name_no_tag (domain);
725 if (name)
c5aa993b 726 fputs_filtered (name, stream);
c906108c
SS
727 else
728 c_type_print_base (domain, stream, 0, 0);
729 fprintf_filtered (stream, "::");
730 fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
731 if (extra)
732 fprintf_filtered (stream, " + %d bytes", extra);
733 if (bits)
734 fprintf_filtered (stream, " (offset in bits)");
735 }
736 else
d4f3574e 737 fprintf_filtered (stream, "%ld", (long) (val >> 3));
c906108c
SS
738}
739
740
741/* This function prints out virtual table entries for a class; it
742 * recurses on the base classes to find all virtual functions
743 * available in a class.
744 *
745 * pai/1997-05-21 Note: As the name suggests, it's currently
746 * implemented for HP aCC runtime only. g++ objects are handled
747 * differently and I have made no attempt to fold that logic in
748 * here. The runtime layout is different for the two cases. Also,
749 * this currently has only the code for non-RRBC layouts generated by
750 * the HP aCC compiler; RRBC code is stubbed out and will have to be
751 * added later. */
c5aa993b 752
c906108c
SS
753
754static void
fba45db2 755cp_print_hpacc_virtual_table_entries (struct type *type, int *vfuncs,
6943961c 756 struct value *v, struct ui_file *stream,
fba45db2
KB
757 int format, int recurse,
758 enum val_prettyprint pretty)
c906108c
SS
759{
760 int fn, oi;
761
762 /* pai: FIXME this function doesn't work. It should handle a given
763 * virtual function only once (latest redefinition in class hierarchy)
764 */
765
c5aa993b
JM
766 /* Recursion on other classes that can share the same vtable */
767 struct type *pbc = primary_base_class (type);
c906108c 768 if (pbc)
2c63a960
JB
769 cp_print_hpacc_virtual_table_entries (pbc, vfuncs, v, stream, format,
770 recurse, pretty);
c5aa993b 771
c906108c
SS
772 /* Now deal with vfuncs declared in this class */
773 for (fn = 0; fn < TYPE_NFN_FIELDS (type); fn++)
774 for (oi = 0; oi < TYPE_FN_FIELDLIST_LENGTH (type, fn); oi++)
775 if (TYPE_FN_FIELD_VIRTUAL_P (TYPE_FN_FIELDLIST1 (type, fn), oi))
c5aa993b
JM
776 {
777 char *vf_name;
2c63a960 778 const char *field_physname;
c5aa993b
JM
779
780 /* virtual function offset */
2c63a960
JB
781 int vx = (TYPE_FN_FIELD_VOFFSET (TYPE_FN_FIELDLIST1 (type, fn), oi)
782 - 1);
c5aa993b
JM
783
784 /* Get the address of the vfunction entry */
6943961c 785 struct value *vf = value_copy (v);
c5aa993b
JM
786 if (VALUE_LAZY (vf))
787 (void) value_fetch_lazy (vf);
2c63a960
JB
788 /* adjust by offset */
789 vf->aligner.contents[0] += 4 * (HP_ACC_VFUNC_START + vx);
c5aa993b
JM
790 vf = value_ind (vf); /* get the entry */
791 VALUE_TYPE (vf) = VALUE_TYPE (v); /* make it a pointer */
792
793 /* print out the entry */
794 val_print (VALUE_TYPE (vf), VALUE_CONTENTS (vf), 0, 0,
795 stream, format, 0, recurse + 1, pretty);
2c63a960
JB
796 field_physname
797 = TYPE_FN_FIELD_PHYSNAME (TYPE_FN_FIELDLIST1 (type, fn), oi);
798 /* pai: (temp) FIXME Maybe this should be DMGL_ANSI */
799 vf_name = cplus_demangle (field_physname, DMGL_ARM);
c5aa993b
JM
800 fprintf_filtered (stream, " %s", vf_name);
801 if (--(*vfuncs) > 0)
802 fputs_filtered (", ", stream);
803 }
c906108c
SS
804}
805
806
807
808void
fba45db2 809_initialize_cp_valprint (void)
c906108c
SS
810{
811 add_show_from_set
812 (add_set_cmd ("static-members", class_support, var_boolean,
c5aa993b 813 (char *) &static_field_print,
c906108c
SS
814 "Set printing of C++ static members.",
815 &setprintlist),
816 &showprintlist);
817 /* Turn on printing of static fields. */
818 static_field_print = 1;
819
820 add_show_from_set
c5aa993b 821 (add_set_cmd ("vtbl", class_support, var_boolean, (char *) &vtblprint,
c906108c
SS
822 "Set printing of C++ virtual function tables.",
823 &setprintlist),
824 &showprintlist);
825
826 add_show_from_set
c5aa993b
JM
827 (add_set_cmd ("object", class_support, var_boolean, (char *) &objectprint,
828 "Set printing of object's derived type based on vtable info.",
c906108c
SS
829 &setprintlist),
830 &showprintlist);
831
832 /* Give people the defaults which they are used to. */
833 objectprint = 0;
834 vtblprint = 0;
835 obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
836 obstack_specify_allocation (&dont_print_statmem_obstack,
837 32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),
b8c9b27d 838 xmalloc, xfree);
c906108c 839}
This page took 0.165689 seconds and 4 git commands to generate.