]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/p-valprint.c
2005-02-14 Andrew Cagney <cagney@gnu.org>
[thirdparty/binutils-gdb.git] / gdb / p-valprint.c
1 /* Support for printing Pascal values for GDB, the GNU debugger.
2
3 Copyright 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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, Boston, MA 02111-1307, USA. */
20
21 /* This file is derived from c-valprint.c */
22
23 #include "defs.h"
24 #include "gdb_obstack.h"
25 #include "symtab.h"
26 #include "gdbtypes.h"
27 #include "expression.h"
28 #include "value.h"
29 #include "command.h"
30 #include "gdbcmd.h"
31 #include "gdbcore.h"
32 #include "demangle.h"
33 #include "valprint.h"
34 #include "typeprint.h"
35 #include "language.h"
36 #include "target.h"
37 #include "annotate.h"
38 #include "p-lang.h"
39 #include "cp-abi.h"
40 #include "cp-support.h"
41 \f
42
43
44
45 /* Print data of type TYPE located at VALADDR (within GDB), which came from
46 the inferior at address ADDRESS, onto stdio stream STREAM according to
47 FORMAT (a letter or 0 for natural format). The data at VALADDR is in
48 target byte order.
49
50 If the data are a string pointer, returns the number of string characters
51 printed.
52
53 If DEREF_REF is nonzero, then dereference references, otherwise just print
54 them like pointers.
55
56 The PRETTY parameter controls prettyprinting. */
57
58
59 int
60 pascal_val_print (struct type *type, const bfd_byte *valaddr,
61 int embedded_offset, CORE_ADDR address,
62 struct ui_file *stream, int format, int deref_ref,
63 int recurse, enum val_prettyprint pretty)
64 {
65 unsigned int i = 0; /* Number of characters printed */
66 unsigned len;
67 struct type *elttype;
68 unsigned eltlen;
69 int length_pos, length_size, string_pos;
70 int char_size;
71 LONGEST val;
72 CORE_ADDR addr;
73
74 CHECK_TYPEDEF (type);
75 switch (TYPE_CODE (type))
76 {
77 case TYPE_CODE_ARRAY:
78 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
79 {
80 elttype = check_typedef (TYPE_TARGET_TYPE (type));
81 eltlen = TYPE_LENGTH (elttype);
82 len = TYPE_LENGTH (type) / eltlen;
83 if (prettyprint_arrays)
84 {
85 print_spaces_filtered (2 + 2 * recurse, stream);
86 }
87 /* For an array of chars, print with string syntax. */
88 if (eltlen == 1 &&
89 ((TYPE_CODE (elttype) == TYPE_CODE_INT)
90 || ((current_language->la_language == language_m2)
91 && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
92 && (format == 0 || format == 's'))
93 {
94 /* If requested, look for the first null char and only print
95 elements up to it. */
96 if (stop_print_at_null)
97 {
98 unsigned int temp_len;
99
100 /* Look for a NULL char. */
101 for (temp_len = 0;
102 (valaddr + embedded_offset)[temp_len]
103 && temp_len < len && temp_len < print_max;
104 temp_len++);
105 len = temp_len;
106 }
107
108 LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0);
109 i = len;
110 }
111 else
112 {
113 fprintf_filtered (stream, "{");
114 /* If this is a virtual function table, print the 0th
115 entry specially, and the rest of the members normally. */
116 if (pascal_object_is_vtbl_ptr_type (elttype))
117 {
118 i = 1;
119 fprintf_filtered (stream, "%d vtable entries", len - 1);
120 }
121 else
122 {
123 i = 0;
124 }
125 val_print_array_elements (type, valaddr + embedded_offset, address, stream,
126 format, deref_ref, recurse, pretty, i);
127 fprintf_filtered (stream, "}");
128 }
129 break;
130 }
131 /* Array of unspecified length: treat like pointer to first elt. */
132 addr = address;
133 goto print_unpacked_pointer;
134
135 case TYPE_CODE_PTR:
136 if (format && format != 's')
137 {
138 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
139 break;
140 }
141 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
142 {
143 /* Print the unmangled name if desired. */
144 /* Print vtable entry - we only get here if we ARE using
145 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
146 /* Extract the address, assume that it is unsigned. */
147 print_address_demangle (extract_unsigned_integer (valaddr + embedded_offset, TYPE_LENGTH (type)),
148 stream, demangle);
149 break;
150 }
151 elttype = check_typedef (TYPE_TARGET_TYPE (type));
152 if (TYPE_CODE (elttype) == TYPE_CODE_METHOD)
153 {
154 pascal_object_print_class_method (valaddr + embedded_offset, type, stream);
155 }
156 else if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
157 {
158 pascal_object_print_class_member (valaddr + embedded_offset,
159 TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (type)),
160 stream, "&");
161 }
162 else
163 {
164 addr = unpack_pointer (type, valaddr + embedded_offset);
165 print_unpacked_pointer:
166 elttype = check_typedef (TYPE_TARGET_TYPE (type));
167
168 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
169 {
170 /* Try to print what function it points to. */
171 print_address_demangle (addr, stream, demangle);
172 /* Return value is irrelevant except for string pointers. */
173 return (0);
174 }
175
176 if (addressprint && format != 's')
177 {
178 deprecated_print_address_numeric (addr, 1, stream);
179 }
180
181 /* For a pointer to char or unsigned char, also print the string
182 pointed to, unless pointer is null. */
183 if (TYPE_LENGTH (elttype) == 1
184 && TYPE_CODE (elttype) == TYPE_CODE_INT
185 && (format == 0 || format == 's')
186 && addr != 0)
187 {
188 /* no wide string yet */
189 i = val_print_string (addr, -1, 1, stream);
190 }
191 /* also for pointers to pascal strings */
192 /* Note: this is Free Pascal specific:
193 as GDB does not recognize stabs pascal strings
194 Pascal strings are mapped to records
195 with lowercase names PM */
196 if (is_pascal_string_type (elttype, &length_pos, &length_size,
197 &string_pos, &char_size, NULL)
198 && addr != 0)
199 {
200 ULONGEST string_length;
201 void *buffer;
202 buffer = xmalloc (length_size);
203 read_memory (addr + length_pos, buffer, length_size);
204 string_length = extract_unsigned_integer (buffer, length_size);
205 xfree (buffer);
206 i = val_print_string (addr + string_pos, string_length, char_size, stream);
207 }
208 else if (pascal_object_is_vtbl_member (type))
209 {
210 /* print vtbl's nicely */
211 CORE_ADDR vt_address = unpack_pointer (type, valaddr + embedded_offset);
212
213 struct minimal_symbol *msymbol =
214 lookup_minimal_symbol_by_pc (vt_address);
215 if ((msymbol != NULL)
216 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
217 {
218 fputs_filtered (" <", stream);
219 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
220 fputs_filtered (">", stream);
221 }
222 if (vt_address && vtblprint)
223 {
224 struct value *vt_val;
225 struct symbol *wsym = (struct symbol *) NULL;
226 struct type *wtype;
227 struct block *block = (struct block *) NULL;
228 int is_this_fld;
229
230 if (msymbol != NULL)
231 wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block,
232 VAR_DOMAIN, &is_this_fld, NULL);
233
234 if (wsym)
235 {
236 wtype = SYMBOL_TYPE (wsym);
237 }
238 else
239 {
240 wtype = TYPE_TARGET_TYPE (type);
241 }
242 vt_val = value_at (wtype, vt_address);
243 val_print (value_type (vt_val), value_contents (vt_val), 0,
244 VALUE_ADDRESS (vt_val), stream, format,
245 deref_ref, recurse + 1, pretty);
246 if (pretty)
247 {
248 fprintf_filtered (stream, "\n");
249 print_spaces_filtered (2 + 2 * recurse, stream);
250 }
251 }
252 }
253
254 /* Return number of characters printed, including the terminating
255 '\0' if we reached the end. val_print_string takes care including
256 the terminating '\0' if necessary. */
257 return i;
258 }
259 break;
260
261 case TYPE_CODE_MEMBER:
262 error (_("not implemented: member type in pascal_val_print"));
263 break;
264
265 case TYPE_CODE_REF:
266 elttype = check_typedef (TYPE_TARGET_TYPE (type));
267 if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
268 {
269 pascal_object_print_class_member (valaddr + embedded_offset,
270 TYPE_DOMAIN_TYPE (elttype),
271 stream, "");
272 break;
273 }
274 if (addressprint)
275 {
276 fprintf_filtered (stream, "@");
277 /* Extract the address, assume that it is unsigned. */
278 deprecated_print_address_numeric
279 (extract_unsigned_integer (valaddr + embedded_offset,
280 TARGET_PTR_BIT / HOST_CHAR_BIT),
281 1, stream);
282 if (deref_ref)
283 fputs_filtered (": ", stream);
284 }
285 /* De-reference the reference. */
286 if (deref_ref)
287 {
288 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
289 {
290 struct value *deref_val =
291 value_at
292 (TYPE_TARGET_TYPE (type),
293 unpack_pointer (lookup_pointer_type (builtin_type_void),
294 valaddr + embedded_offset));
295 val_print (value_type (deref_val),
296 value_contents (deref_val), 0,
297 VALUE_ADDRESS (deref_val), stream, format,
298 deref_ref, recurse + 1, pretty);
299 }
300 else
301 fputs_filtered ("???", stream);
302 }
303 break;
304
305 case TYPE_CODE_UNION:
306 if (recurse && !unionprint)
307 {
308 fprintf_filtered (stream, "{...}");
309 break;
310 }
311 /* Fall through. */
312 case TYPE_CODE_STRUCT:
313 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
314 {
315 /* Print the unmangled name if desired. */
316 /* Print vtable entry - we only get here if NOT using
317 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
318 /* Extract the address, assume that it is unsigned. */
319 print_address_demangle
320 (extract_unsigned_integer (valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
321 TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))),
322 stream, demangle);
323 }
324 else
325 {
326 if (is_pascal_string_type (type, &length_pos, &length_size,
327 &string_pos, &char_size, NULL))
328 {
329 len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
330 LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
331 }
332 else
333 pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
334 recurse, pretty, NULL, 0);
335 }
336 break;
337
338 case TYPE_CODE_ENUM:
339 if (format)
340 {
341 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
342 break;
343 }
344 len = TYPE_NFIELDS (type);
345 val = unpack_long (type, valaddr + embedded_offset);
346 for (i = 0; i < len; i++)
347 {
348 QUIT;
349 if (val == TYPE_FIELD_BITPOS (type, i))
350 {
351 break;
352 }
353 }
354 if (i < len)
355 {
356 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
357 }
358 else
359 {
360 print_longest (stream, 'd', 0, val);
361 }
362 break;
363
364 case TYPE_CODE_FUNC:
365 if (format)
366 {
367 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
368 break;
369 }
370 /* FIXME, we should consider, at least for ANSI C language, eliminating
371 the distinction made between FUNCs and POINTERs to FUNCs. */
372 fprintf_filtered (stream, "{");
373 type_print (type, "", stream, -1);
374 fprintf_filtered (stream, "} ");
375 /* Try to print what function it points to, and its address. */
376 print_address_demangle (address, stream, demangle);
377 break;
378
379 case TYPE_CODE_BOOL:
380 format = format ? format : output_format;
381 if (format)
382 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
383 else
384 {
385 val = unpack_long (type, valaddr + embedded_offset);
386 if (val == 0)
387 fputs_filtered ("false", stream);
388 else if (val == 1)
389 fputs_filtered ("true", stream);
390 else
391 {
392 fputs_filtered ("true (", stream);
393 fprintf_filtered (stream, "%ld)", (long int) val);
394 }
395 }
396 break;
397
398 case TYPE_CODE_RANGE:
399 /* FIXME: create_range_type does not set the unsigned bit in a
400 range type (I think it probably should copy it from the target
401 type), so we won't print values which are too large to
402 fit in a signed integer correctly. */
403 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
404 print with the target type, though, because the size of our type
405 and the target type might differ). */
406 /* FALLTHROUGH */
407
408 case TYPE_CODE_INT:
409 format = format ? format : output_format;
410 if (format)
411 {
412 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
413 }
414 else
415 {
416 val_print_type_code_int (type, valaddr + embedded_offset, stream);
417 }
418 break;
419
420 case TYPE_CODE_CHAR:
421 format = format ? format : output_format;
422 if (format)
423 {
424 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
425 }
426 else
427 {
428 val = unpack_long (type, valaddr + embedded_offset);
429 if (TYPE_UNSIGNED (type))
430 fprintf_filtered (stream, "%u", (unsigned int) val);
431 else
432 fprintf_filtered (stream, "%d", (int) val);
433 fputs_filtered (" ", stream);
434 LA_PRINT_CHAR ((unsigned char) val, stream);
435 }
436 break;
437
438 case TYPE_CODE_FLT:
439 if (format)
440 {
441 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
442 }
443 else
444 {
445 print_floating (valaddr + embedded_offset, type, stream);
446 }
447 break;
448
449 case TYPE_CODE_BITSTRING:
450 case TYPE_CODE_SET:
451 elttype = TYPE_INDEX_TYPE (type);
452 CHECK_TYPEDEF (elttype);
453 if (TYPE_STUB (elttype))
454 {
455 fprintf_filtered (stream, "<incomplete type>");
456 gdb_flush (stream);
457 break;
458 }
459 else
460 {
461 struct type *range = elttype;
462 LONGEST low_bound, high_bound;
463 int i;
464 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
465 int need_comma = 0;
466
467 if (is_bitstring)
468 fputs_filtered ("B'", stream);
469 else
470 fputs_filtered ("[", stream);
471
472 i = get_discrete_bounds (range, &low_bound, &high_bound);
473 maybe_bad_bstring:
474 if (i < 0)
475 {
476 fputs_filtered ("<error value>", stream);
477 goto done;
478 }
479
480 for (i = low_bound; i <= high_bound; i++)
481 {
482 int element = value_bit_index (type, valaddr + embedded_offset, i);
483 if (element < 0)
484 {
485 i = element;
486 goto maybe_bad_bstring;
487 }
488 if (is_bitstring)
489 fprintf_filtered (stream, "%d", element);
490 else if (element)
491 {
492 if (need_comma)
493 fputs_filtered (", ", stream);
494 print_type_scalar (range, i, stream);
495 need_comma = 1;
496
497 if (i + 1 <= high_bound && value_bit_index (type, valaddr + embedded_offset, ++i))
498 {
499 int j = i;
500 fputs_filtered ("..", stream);
501 while (i + 1 <= high_bound
502 && value_bit_index (type, valaddr + embedded_offset, ++i))
503 j = i;
504 print_type_scalar (range, j, stream);
505 }
506 }
507 }
508 done:
509 if (is_bitstring)
510 fputs_filtered ("'", stream);
511 else
512 fputs_filtered ("]", stream);
513 }
514 break;
515
516 case TYPE_CODE_VOID:
517 fprintf_filtered (stream, "void");
518 break;
519
520 case TYPE_CODE_ERROR:
521 fprintf_filtered (stream, "<error type>");
522 break;
523
524 case TYPE_CODE_UNDEF:
525 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
526 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
527 and no complete type for struct foo in that file. */
528 fprintf_filtered (stream, "<incomplete type>");
529 break;
530
531 default:
532 error (_("Invalid pascal type code %d in symbol table."), TYPE_CODE (type));
533 }
534 gdb_flush (stream);
535 return (0);
536 }
537 \f
538 int
539 pascal_value_print (struct value *val, struct ui_file *stream, int format,
540 enum val_prettyprint pretty)
541 {
542 struct type *type = value_type (val);
543
544 /* If it is a pointer, indicate what it points to.
545
546 Print type also if it is a reference.
547
548 Object pascal: if it is a member pointer, we will take care
549 of that when we print it. */
550 if (TYPE_CODE (type) == TYPE_CODE_PTR ||
551 TYPE_CODE (type) == TYPE_CODE_REF)
552 {
553 /* Hack: remove (char *) for char strings. Their
554 type is indicated by the quoted string anyway. */
555 if (TYPE_CODE (type) == TYPE_CODE_PTR &&
556 TYPE_NAME (type) == NULL &&
557 TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
558 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
559 {
560 /* Print nothing */
561 }
562 else
563 {
564 fprintf_filtered (stream, "(");
565 type_print (type, "", stream, -1);
566 fprintf_filtered (stream, ") ");
567 }
568 }
569 return val_print (type, value_contents (val), value_embedded_offset (val),
570 VALUE_ADDRESS (val) + value_offset (val),
571 stream, format, 1, 0, pretty);
572 }
573
574
575 /******************************************************************************
576 Inserted from cp-valprint
577 ******************************************************************************/
578
579 extern int vtblprint; /* Controls printing of vtbl's */
580 extern int objectprint; /* Controls looking up an object's derived type
581 using what we find in its vtables. */
582 static int pascal_static_field_print; /* Controls printing of static fields. */
583
584 static struct obstack dont_print_vb_obstack;
585 static struct obstack dont_print_statmem_obstack;
586
587 static void pascal_object_print_static_field (struct type *, struct value *,
588 struct ui_file *, int, int,
589 enum val_prettyprint);
590
591 static void pascal_object_print_value (struct type *, const bfd_byte *,
592 CORE_ADDR, struct ui_file *,
593 int, int, enum val_prettyprint,
594 struct type **);
595
596 void
597 pascal_object_print_class_method (const bfd_byte *valaddr, struct type *type,
598 struct ui_file *stream)
599 {
600 struct type *domain;
601 struct fn_field *f = NULL;
602 int j = 0;
603 int len2;
604 int offset;
605 char *kind = "";
606 CORE_ADDR addr;
607 struct symbol *sym;
608 unsigned len;
609 unsigned int i;
610 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
611
612 domain = TYPE_DOMAIN_TYPE (target_type);
613 if (domain == (struct type *) NULL)
614 {
615 fprintf_filtered (stream, "<unknown>");
616 return;
617 }
618 addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
619 if (METHOD_PTR_IS_VIRTUAL (addr))
620 {
621 offset = METHOD_PTR_TO_VOFFSET (addr);
622 len = TYPE_NFN_FIELDS (domain);
623 for (i = 0; i < len; i++)
624 {
625 f = TYPE_FN_FIELDLIST1 (domain, i);
626 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
627
628 check_stub_method_group (domain, i);
629 for (j = 0; j < len2; j++)
630 {
631 if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
632 {
633 kind = "virtual ";
634 goto common;
635 }
636 }
637 }
638 }
639 else
640 {
641 sym = find_pc_function (addr);
642 if (sym == 0)
643 {
644 error (_("invalid pointer to member function"));
645 }
646 len = TYPE_NFN_FIELDS (domain);
647 for (i = 0; i < len; i++)
648 {
649 f = TYPE_FN_FIELDLIST1 (domain, i);
650 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
651
652 check_stub_method_group (domain, i);
653 for (j = 0; j < len2; j++)
654 {
655 if (DEPRECATED_STREQ (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
656 goto common;
657 }
658 }
659 }
660 common:
661 if (i < len)
662 {
663 char *demangled_name;
664
665 fprintf_filtered (stream, "&");
666 fputs_filtered (kind, stream);
667 demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
668 DMGL_ANSI | DMGL_PARAMS);
669 if (demangled_name == NULL)
670 fprintf_filtered (stream, "<badly mangled name %s>",
671 TYPE_FN_FIELD_PHYSNAME (f, j));
672 else
673 {
674 fputs_filtered (demangled_name, stream);
675 xfree (demangled_name);
676 }
677 }
678 else
679 {
680 fprintf_filtered (stream, "(");
681 type_print (type, "", stream, -1);
682 fprintf_filtered (stream, ") %d", (int) addr >> 3);
683 }
684 }
685
686 /* It was changed to this after 2.4.5. */
687 const char pascal_vtbl_ptr_name[] =
688 {'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
689
690 /* Return truth value for assertion that TYPE is of the type
691 "pointer to virtual function". */
692
693 int
694 pascal_object_is_vtbl_ptr_type (struct type *type)
695 {
696 char *typename = type_name_no_tag (type);
697
698 return (typename != NULL
699 && strcmp (typename, pascal_vtbl_ptr_name) == 0);
700 }
701
702 /* Return truth value for the assertion that TYPE is of the type
703 "pointer to virtual function table". */
704
705 int
706 pascal_object_is_vtbl_member (struct type *type)
707 {
708 if (TYPE_CODE (type) == TYPE_CODE_PTR)
709 {
710 type = TYPE_TARGET_TYPE (type);
711 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
712 {
713 type = TYPE_TARGET_TYPE (type);
714 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
715 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
716 {
717 /* Virtual functions tables are full of pointers
718 to virtual functions. */
719 return pascal_object_is_vtbl_ptr_type (type);
720 }
721 }
722 }
723 return 0;
724 }
725
726 /* Mutually recursive subroutines of pascal_object_print_value and
727 c_val_print to print out a structure's fields:
728 pascal_object_print_value_fields and pascal_object_print_value.
729
730 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
731 same meanings as in pascal_object_print_value and c_val_print.
732
733 DONT_PRINT is an array of baseclass types that we
734 should not print, or zero if called from top level. */
735
736 void
737 pascal_object_print_value_fields (struct type *type, const bfd_byte *valaddr,
738 CORE_ADDR address, struct ui_file *stream,
739 int format, int recurse,
740 enum val_prettyprint pretty,
741 struct type **dont_print_vb,
742 int dont_print_statmem)
743 {
744 int i, len, n_baseclasses;
745 struct obstack tmp_obstack;
746 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
747
748 CHECK_TYPEDEF (type);
749
750 fprintf_filtered (stream, "{");
751 len = TYPE_NFIELDS (type);
752 n_baseclasses = TYPE_N_BASECLASSES (type);
753
754 /* Print out baseclasses such that we don't print
755 duplicates of virtual baseclasses. */
756 if (n_baseclasses > 0)
757 pascal_object_print_value (type, valaddr, address, stream,
758 format, recurse + 1, pretty, dont_print_vb);
759
760 if (!len && n_baseclasses == 1)
761 fprintf_filtered (stream, "<No data fields>");
762 else
763 {
764 int fields_seen = 0;
765
766 if (dont_print_statmem == 0)
767 {
768 /* If we're at top level, carve out a completely fresh
769 chunk of the obstack and use that until this particular
770 invocation returns. */
771 tmp_obstack = dont_print_statmem_obstack;
772 obstack_finish (&dont_print_statmem_obstack);
773 }
774
775 for (i = n_baseclasses; i < len; i++)
776 {
777 /* If requested, skip printing of static fields. */
778 if (!pascal_static_field_print && TYPE_FIELD_STATIC (type, i))
779 continue;
780 if (fields_seen)
781 fprintf_filtered (stream, ", ");
782 else if (n_baseclasses > 0)
783 {
784 if (pretty)
785 {
786 fprintf_filtered (stream, "\n");
787 print_spaces_filtered (2 + 2 * recurse, stream);
788 fputs_filtered ("members of ", stream);
789 fputs_filtered (type_name_no_tag (type), stream);
790 fputs_filtered (": ", stream);
791 }
792 }
793 fields_seen = 1;
794
795 if (pretty)
796 {
797 fprintf_filtered (stream, "\n");
798 print_spaces_filtered (2 + 2 * recurse, stream);
799 }
800 else
801 {
802 wrap_here (n_spaces (2 + 2 * recurse));
803 }
804 if (inspect_it)
805 {
806 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
807 fputs_filtered ("\"( ptr \"", stream);
808 else
809 fputs_filtered ("\"( nodef \"", stream);
810 if (TYPE_FIELD_STATIC (type, i))
811 fputs_filtered ("static ", stream);
812 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
813 language_cplus,
814 DMGL_PARAMS | DMGL_ANSI);
815 fputs_filtered ("\" \"", stream);
816 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
817 language_cplus,
818 DMGL_PARAMS | DMGL_ANSI);
819 fputs_filtered ("\") \"", stream);
820 }
821 else
822 {
823 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
824
825 if (TYPE_FIELD_STATIC (type, i))
826 fputs_filtered ("static ", stream);
827 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
828 language_cplus,
829 DMGL_PARAMS | DMGL_ANSI);
830 annotate_field_name_end ();
831 fputs_filtered (" = ", stream);
832 annotate_field_value ();
833 }
834
835 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
836 {
837 struct value *v;
838
839 /* Bitfields require special handling, especially due to byte
840 order problems. */
841 if (TYPE_FIELD_IGNORE (type, i))
842 {
843 fputs_filtered ("<optimized out or zero length>", stream);
844 }
845 else
846 {
847 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
848 unpack_field_as_long (type, valaddr, i));
849
850 val_print (TYPE_FIELD_TYPE (type, i), value_contents (v), 0, 0,
851 stream, format, 0, recurse + 1, pretty);
852 }
853 }
854 else
855 {
856 if (TYPE_FIELD_IGNORE (type, i))
857 {
858 fputs_filtered ("<optimized out or zero length>", stream);
859 }
860 else if (TYPE_FIELD_STATIC (type, i))
861 {
862 /* struct value *v = value_static_field (type, i); v4.17 specific */
863 struct value *v;
864 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
865 unpack_field_as_long (type, valaddr, i));
866
867 if (v == NULL)
868 fputs_filtered ("<optimized out>", stream);
869 else
870 pascal_object_print_static_field (TYPE_FIELD_TYPE (type, i), v,
871 stream, format, recurse + 1,
872 pretty);
873 }
874 else
875 {
876 /* val_print (TYPE_FIELD_TYPE (type, i),
877 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
878 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
879 stream, format, 0, recurse + 1, pretty); */
880 val_print (TYPE_FIELD_TYPE (type, i),
881 valaddr, TYPE_FIELD_BITPOS (type, i) / 8,
882 address + TYPE_FIELD_BITPOS (type, i) / 8,
883 stream, format, 0, recurse + 1, pretty);
884 }
885 }
886 annotate_field_end ();
887 }
888
889 if (dont_print_statmem == 0)
890 {
891 /* Free the space used to deal with the printing
892 of the members from top level. */
893 obstack_free (&dont_print_statmem_obstack, last_dont_print);
894 dont_print_statmem_obstack = tmp_obstack;
895 }
896
897 if (pretty)
898 {
899 fprintf_filtered (stream, "\n");
900 print_spaces_filtered (2 * recurse, stream);
901 }
902 }
903 fprintf_filtered (stream, "}");
904 }
905
906 /* Special val_print routine to avoid printing multiple copies of virtual
907 baseclasses. */
908
909 void
910 pascal_object_print_value (struct type *type, const bfd_byte *valaddr,
911 CORE_ADDR address, struct ui_file *stream,
912 int format, int recurse,
913 enum val_prettyprint pretty,
914 struct type **dont_print_vb)
915 {
916 struct obstack tmp_obstack;
917 struct type **last_dont_print
918 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
919 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
920
921 if (dont_print_vb == 0)
922 {
923 /* If we're at top level, carve out a completely fresh
924 chunk of the obstack and use that until this particular
925 invocation returns. */
926 tmp_obstack = dont_print_vb_obstack;
927 /* Bump up the high-water mark. Now alpha is omega. */
928 obstack_finish (&dont_print_vb_obstack);
929 }
930
931 for (i = 0; i < n_baseclasses; i++)
932 {
933 int boffset;
934 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
935 char *basename = TYPE_NAME (baseclass);
936 const bfd_byte *base_valaddr;
937
938 if (BASETYPE_VIA_VIRTUAL (type, i))
939 {
940 struct type **first_dont_print
941 = (struct type **) obstack_base (&dont_print_vb_obstack);
942
943 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
944 - first_dont_print;
945
946 while (--j >= 0)
947 if (baseclass == first_dont_print[j])
948 goto flush_it;
949
950 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
951 }
952
953 boffset = baseclass_offset (type, i, valaddr, address);
954
955 if (pretty)
956 {
957 fprintf_filtered (stream, "\n");
958 print_spaces_filtered (2 * recurse, stream);
959 }
960 fputs_filtered ("<", stream);
961 /* Not sure what the best notation is in the case where there is no
962 baseclass name. */
963
964 fputs_filtered (basename ? basename : "", stream);
965 fputs_filtered ("> = ", stream);
966
967 /* The virtual base class pointer might have been clobbered by the
968 user program. Make sure that it still points to a valid memory
969 location. */
970
971 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
972 {
973 /* FIXME (alloc): not safe is baseclass is really really big. */
974 bfd_byte *buf = alloca (TYPE_LENGTH (baseclass));
975 base_valaddr = buf;
976 if (target_read_memory (address + boffset, buf,
977 TYPE_LENGTH (baseclass)) != 0)
978 boffset = -1;
979 }
980 else
981 base_valaddr = valaddr + boffset;
982
983 if (boffset == -1)
984 fprintf_filtered (stream, "<invalid address>");
985 else
986 pascal_object_print_value_fields (baseclass, base_valaddr, address + boffset,
987 stream, format, recurse, pretty,
988 (struct type **) obstack_base (&dont_print_vb_obstack),
989 0);
990 fputs_filtered (", ", stream);
991
992 flush_it:
993 ;
994 }
995
996 if (dont_print_vb == 0)
997 {
998 /* Free the space used to deal with the printing
999 of this type from top level. */
1000 obstack_free (&dont_print_vb_obstack, last_dont_print);
1001 /* Reset watermark so that we can continue protecting
1002 ourselves from whatever we were protecting ourselves. */
1003 dont_print_vb_obstack = tmp_obstack;
1004 }
1005 }
1006
1007 /* Print value of a static member.
1008 To avoid infinite recursion when printing a class that contains
1009 a static instance of the class, we keep the addresses of all printed
1010 static member classes in an obstack and refuse to print them more
1011 than once.
1012
1013 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
1014 have the same meanings as in c_val_print. */
1015
1016 static void
1017 pascal_object_print_static_field (struct type *type, struct value *val,
1018 struct ui_file *stream, int format,
1019 int recurse, enum val_prettyprint pretty)
1020 {
1021 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
1022 {
1023 CORE_ADDR *first_dont_print;
1024 int i;
1025
1026 first_dont_print
1027 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
1028 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
1029 - first_dont_print;
1030
1031 while (--i >= 0)
1032 {
1033 if (VALUE_ADDRESS (val) == first_dont_print[i])
1034 {
1035 fputs_filtered ("<same as static member of an already seen type>",
1036 stream);
1037 return;
1038 }
1039 }
1040
1041 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
1042 sizeof (CORE_ADDR));
1043
1044 CHECK_TYPEDEF (type);
1045 pascal_object_print_value_fields (type, value_contents (val), VALUE_ADDRESS (val),
1046 stream, format, recurse, pretty, NULL, 1);
1047 return;
1048 }
1049 val_print (type, value_contents (val), 0, VALUE_ADDRESS (val),
1050 stream, format, 0, recurse, pretty);
1051 }
1052
1053 void
1054 pascal_object_print_class_member (const bfd_byte *valaddr, struct type *domain,
1055 struct ui_file *stream, char *prefix)
1056 {
1057
1058 /* VAL is a byte offset into the structure type DOMAIN.
1059 Find the name of the field for that offset and
1060 print it. */
1061 int extra = 0;
1062 int bits = 0;
1063 unsigned int i;
1064 unsigned len = TYPE_NFIELDS (domain);
1065 /* @@ Make VAL into bit offset */
1066 LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
1067 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
1068 {
1069 int bitpos = TYPE_FIELD_BITPOS (domain, i);
1070 QUIT;
1071 if (val == bitpos)
1072 break;
1073 if (val < bitpos && i != 0)
1074 {
1075 /* Somehow pointing into a field. */
1076 i -= 1;
1077 extra = (val - TYPE_FIELD_BITPOS (domain, i));
1078 if (extra & 0x7)
1079 bits = 1;
1080 else
1081 extra >>= 3;
1082 break;
1083 }
1084 }
1085 if (i < len)
1086 {
1087 char *name;
1088 fputs_filtered (prefix, stream);
1089 name = type_name_no_tag (domain);
1090 if (name)
1091 fputs_filtered (name, stream);
1092 else
1093 pascal_type_print_base (domain, stream, 0, 0);
1094 fprintf_filtered (stream, "::");
1095 fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
1096 if (extra)
1097 fprintf_filtered (stream, " + %d bytes", extra);
1098 if (bits)
1099 fprintf_filtered (stream, " (offset in bits)");
1100 }
1101 else
1102 fprintf_filtered (stream, "%ld", (long int) (val >> 3));
1103 }
1104
1105 extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */
1106
1107 void
1108 _initialize_pascal_valprint (void)
1109 {
1110 deprecated_add_show_from_set
1111 (add_set_cmd ("pascal_static-members", class_support, var_boolean,
1112 (char *) &pascal_static_field_print,
1113 "Set printing of pascal static members.",
1114 &setprintlist),
1115 &showprintlist);
1116 /* Turn on printing of static fields. */
1117 pascal_static_field_print = 1;
1118
1119 }