* gdb.disasm/mn10300.exp: Fix buglets in "other" tests.
[deliverable/binutils-gdb.git] / gdb / cp-valprint.c
CommitLineData
a8a69e63 1/* Support for printing C++ values for GDB, the GNU debugger.
81afee37 2 Copyright 1986, 1988, 1989, 1991, 1994, 1995, 1996
a1a0d974 3 Free Software Foundation, Inc.
a8a69e63
FF
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
6c9638b4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
a8a69e63
FF
20
21#include "defs.h"
22#include "obstack.h"
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "expression.h"
26#include "value.h"
27#include "command.h"
28#include "gdbcmd.h"
5e81259d 29#include "demangle.h"
1c95d7ab 30#include "annotate.h"
2b576293 31#include "gdb_string.h"
5e548861 32#include "c-lang.h"
074d813d 33#include "target.h"
a8a69e63
FF
34
35int vtblprint; /* Controls printing of vtbl's */
36int objectprint; /* Controls looking up an object's derived type
37 using what we find in its vtables. */
4c664b8d 38static int static_field_print; /* Controls printing of static fields. */
a1a0d974
PS
39
40static struct obstack dont_print_vb_obstack;
41static struct obstack dont_print_statmem_obstack;
42
43static void
44cp_print_static_field PARAMS ((struct type *, value_ptr, GDB_FILE *, int, int,
45 enum val_prettyprint));
a8a69e63
FF
46
47static void
5e548861
PB
48cp_print_value PARAMS ((struct type *, char *, CORE_ADDR, GDB_FILE *,
49 int, int, enum val_prettyprint, struct type **));
a8a69e63 50
c7da3ed3
FF
51void
52cp_print_class_method (valaddr, type, stream)
53 char *valaddr;
54 struct type *type;
199b2450 55 GDB_FILE *stream;
c7da3ed3
FF
56{
57 struct type *domain;
72cd0384
RP
58 struct fn_field *f = NULL;
59 int j = 0;
c7da3ed3
FF
60 int len2;
61 int offset;
62 char *kind = "";
63 CORE_ADDR addr;
64 struct symbol *sym;
65 unsigned len;
66 unsigned int i;
5e548861 67 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
c7da3ed3 68
5e548861 69 domain = TYPE_DOMAIN_TYPE (target_type);
30d20d15
PS
70 if (domain == (struct type *)NULL)
71 {
72 fprintf_filtered (stream, "<unknown>");
73 return;
74 }
c7da3ed3
FF
75 addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
76 if (METHOD_PTR_IS_VIRTUAL (addr))
77 {
78 offset = METHOD_PTR_TO_VOFFSET (addr);
79 len = TYPE_NFN_FIELDS (domain);
80 for (i = 0; i < len; i++)
81 {
82 f = TYPE_FN_FIELDLIST1 (domain, i);
83 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
84
85 for (j = 0; j < len2; j++)
86 {
87 QUIT;
88 if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
89 {
a46d92a7
PS
90 if (TYPE_FN_FIELD_STUB (f, j))
91 check_stub_method (domain, i, j);
c7da3ed3
FF
92 kind = "virtual ";
93 goto common;
94 }
95 }
96 }
97 }
98 else
99 {
100 sym = find_pc_function (addr);
101 if (sym == 0)
102 {
103 error ("invalid pointer to member function");
104 }
105 len = TYPE_NFN_FIELDS (domain);
106 for (i = 0; i < len; i++)
107 {
108 f = TYPE_FN_FIELDLIST1 (domain, i);
109 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
110
111 for (j = 0; j < len2; j++)
112 {
113 QUIT;
39cb3d04
PS
114 if (TYPE_FN_FIELD_STUB (f, j))
115 check_stub_method (domain, i, j);
c7da3ed3
FF
116 if (STREQ (SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
117 {
118 goto common;
119 }
120 }
121 }
122 }
123 common:
124 if (i < len)
125 {
a46d92a7
PS
126 char *demangled_name;
127
c7da3ed3 128 fprintf_filtered (stream, "&");
a46d92a7
PS
129 fprintf_filtered (stream, kind);
130 demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
131 DMGL_ANSI | DMGL_PARAMS);
132 if (demangled_name == NULL)
133 fprintf_filtered (stream, "<badly mangled name %s>",
134 TYPE_FN_FIELD_PHYSNAME (f, j));
c7da3ed3
FF
135 else
136 {
a46d92a7
PS
137 fputs_filtered (demangled_name, stream);
138 free (demangled_name);
c7da3ed3
FF
139 }
140 }
141 else
142 {
143 fprintf_filtered (stream, "(");
144 type_print (type, "", stream, -1);
145 fprintf_filtered (stream, ") %d", (int) addr >> 3);
146 }
147}
148
36a2283d
PB
149/* This was what it was for gcc 2.4.5 and earlier. */
150static const char vtbl_ptr_name_old[] =
151 { CPLUS_MARKER,'v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
152/* It was changed to this after 2.4.5. */
153const char vtbl_ptr_name[] =
154 { '_','_','v','t','b','l','_','p','t','r','_','t','y','p','e', 0 };
155
a8a69e63
FF
156/* Return truth value for assertion that TYPE is of the type
157 "pointer to virtual function". */
158
159int
160cp_is_vtbl_ptr_type(type)
161 struct type *type;
162{
163 char *typename = type_name_no_tag (type);
a8a69e63 164
8f341c15
JK
165 return (typename != NULL
166 && (STREQ (typename, vtbl_ptr_name)
167 || STREQ (typename, vtbl_ptr_name_old)));
a8a69e63
FF
168}
169
170/* Return truth value for the assertion that TYPE is of the type
171 "pointer to virtual function table". */
172
173int
174cp_is_vtbl_member(type)
175 struct type *type;
176{
177 if (TYPE_CODE (type) == TYPE_CODE_PTR)
36a2283d
PB
178 {
179 type = TYPE_TARGET_TYPE (type);
180 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
181 {
182 type = TYPE_TARGET_TYPE (type);
183 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
184 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
185 {
186 /* Virtual functions tables are full of pointers
187 to virtual functions. */
188 return cp_is_vtbl_ptr_type (type);
189 }
190 }
191 }
a8a69e63
FF
192 return 0;
193}
194
5e548861
PB
195/* Mutually recursive subroutines of cp_print_value and c_val_print to
196 print out a structure's fields: cp_print_value_fields and cp_print_value.
197
198 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
199 same meanings as in cp_print_value and c_val_print.
a8a69e63
FF
200
201 DONT_PRINT is an array of baseclass types that we
202 should not print, or zero if called from top level. */
203
204void
5e548861 205cp_print_value_fields (type, valaddr, address, stream, format, recurse, pretty,
a1a0d974 206 dont_print_vb, dont_print_statmem)
a8a69e63
FF
207 struct type *type;
208 char *valaddr;
5e548861 209 CORE_ADDR address;
199b2450 210 GDB_FILE *stream;
a8a69e63
FF
211 int format;
212 int recurse;
213 enum val_prettyprint pretty;
a1a0d974
PS
214 struct type **dont_print_vb;
215 int dont_print_statmem;
a8a69e63
FF
216{
217 int i, len, n_baseclasses;
a1a0d974
PS
218 struct obstack tmp_obstack;
219 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
a8a69e63 220
5e548861 221 CHECK_TYPEDEF (type);
a8a69e63
FF
222
223 fprintf_filtered (stream, "{");
224 len = TYPE_NFIELDS (type);
225 n_baseclasses = TYPE_N_BASECLASSES (type);
226
227 /* Print out baseclasses such that we don't print
228 duplicates of virtual baseclasses. */
229 if (n_baseclasses > 0)
5e548861
PB
230 cp_print_value (type, valaddr, address, stream,
231 format, recurse+1, pretty, dont_print_vb);
a8a69e63
FF
232
233 if (!len && n_baseclasses == 1)
234 fprintf_filtered (stream, "<No data fields>");
235 else
236 {
237 extern int inspect_it;
238 int fields_seen = 0;
239
a1a0d974
PS
240 if (dont_print_statmem == 0)
241 {
242 /* If we're at top level, carve out a completely fresh
243 chunk of the obstack and use that until this particular
244 invocation returns. */
245 tmp_obstack = dont_print_statmem_obstack;
246 obstack_finish (&dont_print_statmem_obstack);
247 }
248
a8a69e63
FF
249 for (i = n_baseclasses; i < len; i++)
250 {
4c664b8d
PS
251 /* If requested, skip printing of static fields. */
252 if (!static_field_print && TYPE_FIELD_STATIC (type, i))
a8a69e63
FF
253 continue;
254 if (fields_seen)
255 fprintf_filtered (stream, ", ");
256 else if (n_baseclasses > 0)
257 {
258 if (pretty)
259 {
260 fprintf_filtered (stream, "\n");
261 print_spaces_filtered (2 + 2 * recurse, stream);
262 fputs_filtered ("members of ", stream);
263 fputs_filtered (type_name_no_tag (type), stream);
264 fputs_filtered (": ", stream);
265 }
266 }
267 fields_seen = 1;
268
269 if (pretty)
270 {
271 fprintf_filtered (stream, "\n");
272 print_spaces_filtered (2 + 2 * recurse, stream);
273 }
274 else
275 {
276 wrap_here (n_spaces (2 + 2 * recurse));
277 }
278 if (inspect_it)
279 {
280 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
281 fputs_filtered ("\"( ptr \"", stream);
282 else
283 fputs_filtered ("\"( nodef \"", stream);
4c664b8d
PS
284 if (TYPE_FIELD_STATIC (type, i))
285 fputs_filtered ("static ", stream);
5e81259d
FF
286 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
287 language_cplus,
288 DMGL_PARAMS | DMGL_ANSI);
a8a69e63 289 fputs_filtered ("\" \"", stream);
5e81259d
FF
290 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
291 language_cplus,
292 DMGL_PARAMS | DMGL_ANSI);
a8a69e63
FF
293 fputs_filtered ("\") \"", stream);
294 }
295 else
296 {
1c95d7ab 297 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
da988c20 298
4c664b8d
PS
299 if (TYPE_FIELD_STATIC (type, i))
300 fputs_filtered ("static ", stream);
5e81259d
FF
301 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
302 language_cplus,
303 DMGL_PARAMS | DMGL_ANSI);
1c95d7ab 304 annotate_field_name_end ();
a8a69e63 305 fputs_filtered (" = ", stream);
1c95d7ab 306 annotate_field_value ();
96f7edbd
JK
307 }
308
4c664b8d 309 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
a8a69e63 310 {
82a2edfb 311 value_ptr v;
a8a69e63
FF
312
313 /* Bitfields require special handling, especially due to byte
314 order problems. */
024f65b1
KH
315 if (TYPE_FIELD_IGNORE (type, i))
316 {
aa074e84 317 fputs_filtered ("<optimized out or zero length>", stream);
024f65b1
KH
318 }
319 else
320 {
321 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
a8a69e63
FF
322 unpack_field_as_long (type, valaddr, i));
323
dda398c3
JK
324 val_print (TYPE_FIELD_TYPE(type, i), VALUE_CONTENTS (v), 0,
325 stream, format, 0, recurse + 1, pretty);
024f65b1 326 }
a8a69e63
FF
327 }
328 else
329 {
024f65b1
KH
330 if (TYPE_FIELD_IGNORE (type, i))
331 {
aa074e84 332 fputs_filtered ("<optimized out or zero length>", stream);
024f65b1 333 }
4c664b8d
PS
334 else if (TYPE_FIELD_STATIC (type, i))
335 {
336 value_ptr v;
337 char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, i);
338 struct symbol *sym =
339 lookup_symbol (phys_name, 0, VAR_NAMESPACE, 0, NULL);
340 if (sym == NULL)
341 fputs_filtered ("<optimized out>", stream);
342 else
343 {
344 v = value_at (TYPE_FIELD_TYPE (type, i),
6c310da8
SG
345 SYMBOL_VALUE_ADDRESS (sym),
346 NULL);
a1a0d974
PS
347 cp_print_static_field (TYPE_FIELD_TYPE (type, i), v,
348 stream, format, recurse + 1,
349 pretty);
4c664b8d
PS
350 }
351 }
024f65b1
KH
352 else
353 {
dda398c3
JK
354 val_print (TYPE_FIELD_TYPE (type, i),
355 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
972256e7
PS
356 address + TYPE_FIELD_BITPOS (type, i) / 8,
357 stream, format, 0, recurse + 1, pretty);
024f65b1 358 }
a8a69e63 359 }
1c95d7ab 360 annotate_field_end ();
a8a69e63 361 }
96f7edbd 362
a1a0d974
PS
363 if (dont_print_statmem == 0)
364 {
365 /* Free the space used to deal with the printing
366 of the members from top level. */
367 obstack_free (&dont_print_statmem_obstack, last_dont_print);
368 dont_print_statmem_obstack = tmp_obstack;
369 }
370
a8a69e63
FF
371 if (pretty)
372 {
373 fprintf_filtered (stream, "\n");
374 print_spaces_filtered (2 * recurse, stream);
375 }
376 }
377 fprintf_filtered (stream, "}");
378}
379
380/* Special val_print routine to avoid printing multiple copies of virtual
381 baseclasses. */
382
383static void
5e548861
PB
384cp_print_value (type, valaddr, address, stream, format, recurse, pretty,
385 dont_print_vb)
a8a69e63
FF
386 struct type *type;
387 char *valaddr;
5e548861 388 CORE_ADDR address;
199b2450 389 GDB_FILE *stream;
a8a69e63
FF
390 int format;
391 int recurse;
392 enum val_prettyprint pretty;
a1a0d974 393 struct type **dont_print_vb;
a8a69e63
FF
394{
395 struct obstack tmp_obstack;
396 struct type **last_dont_print
a1a0d974 397 = (struct type **)obstack_next_free (&dont_print_vb_obstack);
a8a69e63
FF
398 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
399
a1a0d974 400 if (dont_print_vb == 0)
a8a69e63
FF
401 {
402 /* If we're at top level, carve out a completely fresh
403 chunk of the obstack and use that until this particular
404 invocation returns. */
a1a0d974 405 tmp_obstack = dont_print_vb_obstack;
a8a69e63 406 /* Bump up the high-water mark. Now alpha is omega. */
a1a0d974 407 obstack_finish (&dont_print_vb_obstack);
a8a69e63
FF
408 }
409
410 for (i = 0; i < n_baseclasses; i++)
411 {
5e548861
PB
412 int boffset;
413 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
414 char *basename = TYPE_NAME (baseclass);
074d813d 415 char *base_valaddr;
a8a69e63
FF
416
417 if (BASETYPE_VIA_VIRTUAL (type, i))
418 {
419 struct type **first_dont_print
a1a0d974 420 = (struct type **)obstack_base (&dont_print_vb_obstack);
a8a69e63 421
a1a0d974 422 int j = (struct type **)obstack_next_free (&dont_print_vb_obstack)
a8a69e63
FF
423 - first_dont_print;
424
425 while (--j >= 0)
5e548861 426 if (baseclass == first_dont_print[j])
a8a69e63
FF
427 goto flush_it;
428
5e548861 429 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
a8a69e63
FF
430 }
431
5e548861 432 boffset = baseclass_offset (type, i , valaddr, address);
a8a69e63
FF
433
434 if (pretty)
435 {
436 fprintf_filtered (stream, "\n");
437 print_spaces_filtered (2 * recurse, stream);
438 }
439 fputs_filtered ("<", stream);
1410f5f1
JK
440 /* Not sure what the best notation is in the case where there is no
441 baseclass name. */
442 fputs_filtered (basename ? basename : "", stream);
a8a69e63 443 fputs_filtered ("> = ", stream);
074d813d
PS
444
445 /* The virtual base class pointer might have been clobbered by the
446 user program. Make sure that it still points to a valid memory
447 location. */
448
449 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
450 {
451 base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
452 if (target_read_memory (address + boffset, base_valaddr,
453 TYPE_LENGTH (baseclass)) != 0)
454 boffset = -1;
455 }
456 else
457 base_valaddr = valaddr + boffset;
458
5e548861
PB
459 if (boffset == -1)
460 fprintf_filtered (stream, "<invalid address>");
a8a69e63 461 else
074d813d 462 cp_print_value_fields (baseclass, base_valaddr, address + boffset,
5e548861 463 stream, format, recurse, pretty,
a1a0d974
PS
464 (struct type **) obstack_base (&dont_print_vb_obstack),
465 0);
a8a69e63
FF
466 fputs_filtered (", ", stream);
467
468 flush_it:
469 ;
470 }
471
a1a0d974 472 if (dont_print_vb == 0)
a8a69e63
FF
473 {
474 /* Free the space used to deal with the printing
475 of this type from top level. */
a1a0d974 476 obstack_free (&dont_print_vb_obstack, last_dont_print);
a8a69e63
FF
477 /* Reset watermark so that we can continue protecting
478 ourselves from whatever we were protecting ourselves. */
a1a0d974
PS
479 dont_print_vb_obstack = tmp_obstack;
480 }
481}
482
483/* Print value of a static member.
484 To avoid infinite recursion when printing a class that contains
485 a static instance of the class, we keep the addresses of all printed
486 static member classes in an obstack and refuse to print them more
487 than once.
488
489 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
490 have the same meanings as in c_val_print. */
491
492static void
493cp_print_static_field (type, val, stream, format, recurse, pretty)
494 struct type *type;
495 value_ptr val;
496 GDB_FILE *stream;
497 int format;
498 int recurse;
499 enum val_prettyprint pretty;
500{
501 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
502 {
503 CORE_ADDR *first_dont_print;
504 int i;
505
506 first_dont_print
507 = (CORE_ADDR *)obstack_base (&dont_print_statmem_obstack);
508 i = (CORE_ADDR *)obstack_next_free (&dont_print_statmem_obstack)
509 - first_dont_print;
510
511 while (--i >= 0)
512 {
513 if (VALUE_ADDRESS (val) == first_dont_print[i])
514 {
515 fputs_filtered ("<same as static member of an already seen type>",
516 stream);
517 return;
518 }
519 }
520
5579919f 521 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
a1a0d974
PS
522 sizeof (CORE_ADDR));
523
5e548861
PB
524 CHECK_TYPEDEF (type);
525 cp_print_value_fields (type, VALUE_CONTENTS (val), VALUE_ADDRESS (val),
526 stream, format, recurse, pretty, NULL, 1);
a1a0d974 527 return;
a8a69e63 528 }
a1a0d974
PS
529 val_print (type, VALUE_CONTENTS (val), VALUE_ADDRESS (val),
530 stream, format, 0, recurse, pretty);
a8a69e63
FF
531}
532
533void
534cp_print_class_member (valaddr, domain, stream, prefix)
535 char *valaddr;
536 struct type *domain;
199b2450 537 GDB_FILE *stream;
a8a69e63
FF
538 char *prefix;
539{
540
541 /* VAL is a byte offset into the structure type DOMAIN.
542 Find the name of the field for that offset and
543 print it. */
544 int extra = 0;
545 int bits = 0;
546 register unsigned int i;
547 unsigned len = TYPE_NFIELDS (domain);
548 /* @@ Make VAL into bit offset */
549 LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
550 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
551 {
552 int bitpos = TYPE_FIELD_BITPOS (domain, i);
553 QUIT;
554 if (val == bitpos)
555 break;
556 if (val < bitpos && i != 0)
557 {
558 /* Somehow pointing into a field. */
559 i -= 1;
560 extra = (val - TYPE_FIELD_BITPOS (domain, i));
561 if (extra & 0x7)
562 bits = 1;
563 else
564 extra >>= 3;
565 break;
566 }
567 }
568 if (i < len)
569 {
570 char *name;
571 fprintf_filtered (stream, prefix);
572 name = type_name_no_tag (domain);
573 if (name)
574 fputs_filtered (name, stream);
575 else
576 c_type_print_base (domain, stream, 0, 0);
577 fprintf_filtered (stream, "::");
578 fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
579 if (extra)
580 fprintf_filtered (stream, " + %d bytes", extra);
581 if (bits)
582 fprintf_filtered (stream, " (offset in bits)");
583 }
584 else
585 fprintf_filtered (stream, "%d", val >> 3);
586}
587
588void
589_initialize_cp_valprint ()
590{
4c664b8d
PS
591 add_show_from_set
592 (add_set_cmd ("static-members", class_support, var_boolean,
593 (char *)&static_field_print,
594 "Set printing of C++ static members.",
595 &setprintlist),
596 &showprintlist);
597 /* Turn on printing of static fields. */
598 static_field_print = 1;
599
a8a69e63
FF
600 add_show_from_set
601 (add_set_cmd ("vtbl", class_support, var_boolean, (char *)&vtblprint,
602 "Set printing of C++ virtual function tables.",
603 &setprintlist),
604 &showprintlist);
605
606 add_show_from_set
607 (add_set_cmd ("object", class_support, var_boolean, (char *)&objectprint,
608 "Set printing of object's derived type based on vtable info.",
609 &setprintlist),
610 &showprintlist);
611
612 /* Give people the defaults which they are used to. */
613 objectprint = 0;
614 vtblprint = 0;
a1a0d974
PS
615 obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *));
616 obstack_specify_allocation (&dont_print_statmem_obstack,
617 32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR),
618 xmalloc, free);
a8a69e63 619}
This page took 0.23266 seconds and 4 git commands to generate.