dma: beautify queue listing output
[dragonfly.git] / contrib / gdb-6.2.1 / gdb / p-valprint.c
blobeb92f77591cbdfa1ce0822231eb7fbd6463573c8
1 /* Support for printing Pascal values for GDB, the GNU debugger.
2 Copyright 2000, 2001, 2003
3 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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. */
21 /* This file is derived from c-valprint.c */
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"
44 /* Print data of type TYPE located at VALADDR (within GDB), which came from
45 the inferior at address ADDRESS, onto stdio stream STREAM according to
46 FORMAT (a letter or 0 for natural format). The data at VALADDR is in
47 target byte order.
49 If the data are a string pointer, returns the number of string characters
50 printed.
52 If DEREF_REF is nonzero, then dereference references, otherwise just print
53 them like pointers.
55 The PRETTY parameter controls prettyprinting. */
58 int
59 pascal_val_print (struct type *type, char *valaddr, int embedded_offset,
60 CORE_ADDR address, struct ui_file *stream, int format,
61 int deref_ref, int recurse, enum val_prettyprint pretty)
63 unsigned int i = 0; /* Number of characters printed */
64 unsigned len;
65 struct type *elttype;
66 unsigned eltlen;
67 int length_pos, length_size, string_pos;
68 int char_size;
69 LONGEST val;
70 CORE_ADDR addr;
72 CHECK_TYPEDEF (type);
73 switch (TYPE_CODE (type))
75 case TYPE_CODE_ARRAY:
76 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
78 elttype = check_typedef (TYPE_TARGET_TYPE (type));
79 eltlen = TYPE_LENGTH (elttype);
80 len = TYPE_LENGTH (type) / eltlen;
81 if (prettyprint_arrays)
83 print_spaces_filtered (2 + 2 * recurse, stream);
85 /* For an array of chars, print with string syntax. */
86 if (eltlen == 1 &&
87 ((TYPE_CODE (elttype) == TYPE_CODE_INT)
88 || ((current_language->la_language == language_m2)
89 && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
90 && (format == 0 || format == 's'))
92 /* If requested, look for the first null char and only print
93 elements up to it. */
94 if (stop_print_at_null)
96 unsigned int temp_len;
98 /* Look for a NULL char. */
99 for (temp_len = 0;
100 (valaddr + embedded_offset)[temp_len]
101 && temp_len < len && temp_len < print_max;
102 temp_len++);
103 len = temp_len;
106 LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0);
107 i = len;
109 else
111 fprintf_filtered (stream, "{");
112 /* If this is a virtual function table, print the 0th
113 entry specially, and the rest of the members normally. */
114 if (pascal_object_is_vtbl_ptr_type (elttype))
116 i = 1;
117 fprintf_filtered (stream, "%d vtable entries", len - 1);
119 else
121 i = 0;
123 val_print_array_elements (type, valaddr + embedded_offset, address, stream,
124 format, deref_ref, recurse, pretty, i);
125 fprintf_filtered (stream, "}");
127 break;
129 /* Array of unspecified length: treat like pointer to first elt. */
130 addr = address;
131 goto print_unpacked_pointer;
133 case TYPE_CODE_PTR:
134 if (format && format != 's')
136 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
137 break;
139 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
141 /* Print the unmangled name if desired. */
142 /* Print vtable entry - we only get here if we ARE using
143 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
144 /* Extract the address, assume that it is unsigned. */
145 print_address_demangle (extract_unsigned_integer (valaddr + embedded_offset, TYPE_LENGTH (type)),
146 stream, demangle);
147 break;
149 elttype = check_typedef (TYPE_TARGET_TYPE (type));
150 if (TYPE_CODE (elttype) == TYPE_CODE_METHOD)
152 pascal_object_print_class_method (valaddr + embedded_offset, type, stream);
154 else if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
156 pascal_object_print_class_member (valaddr + embedded_offset,
157 TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (type)),
158 stream, "&");
160 else
162 addr = unpack_pointer (type, valaddr + embedded_offset);
163 print_unpacked_pointer:
164 elttype = check_typedef (TYPE_TARGET_TYPE (type));
166 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
168 /* Try to print what function it points to. */
169 print_address_demangle (addr, stream, demangle);
170 /* Return value is irrelevant except for string pointers. */
171 return (0);
174 if (addressprint && format != 's')
176 print_address_numeric (addr, 1, stream);
179 /* For a pointer to char or unsigned char, also print the string
180 pointed to, unless pointer is null. */
181 if (TYPE_LENGTH (elttype) == 1
182 && TYPE_CODE (elttype) == TYPE_CODE_INT
183 && (format == 0 || format == 's')
184 && addr != 0)
186 /* no wide string yet */
187 i = val_print_string (addr, -1, 1, stream);
189 /* also for pointers to pascal strings */
190 /* Note: this is Free Pascal specific:
191 as GDB does not recognize stabs pascal strings
192 Pascal strings are mapped to records
193 with lowercase names PM */
194 if (is_pascal_string_type (elttype, &length_pos, &length_size,
195 &string_pos, &char_size, NULL)
196 && addr != 0)
198 ULONGEST string_length;
199 void *buffer;
200 buffer = xmalloc (length_size);
201 read_memory (addr + length_pos, buffer, length_size);
202 string_length = extract_unsigned_integer (buffer, length_size);
203 xfree (buffer);
204 i = val_print_string (addr + string_pos, string_length, char_size, stream);
206 else if (pascal_object_is_vtbl_member (type))
208 /* print vtbl's nicely */
209 CORE_ADDR vt_address = unpack_pointer (type, valaddr + embedded_offset);
211 struct minimal_symbol *msymbol =
212 lookup_minimal_symbol_by_pc (vt_address);
213 if ((msymbol != NULL)
214 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
216 fputs_filtered (" <", stream);
217 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
218 fputs_filtered (">", stream);
220 if (vt_address && vtblprint)
222 struct value *vt_val;
223 struct symbol *wsym = (struct symbol *) NULL;
224 struct type *wtype;
225 struct block *block = (struct block *) NULL;
226 int is_this_fld;
228 if (msymbol != NULL)
229 wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block,
230 VAR_DOMAIN, &is_this_fld, NULL);
232 if (wsym)
234 wtype = SYMBOL_TYPE (wsym);
236 else
238 wtype = TYPE_TARGET_TYPE (type);
240 vt_val = value_at (wtype, vt_address, NULL);
241 val_print (VALUE_TYPE (vt_val), VALUE_CONTENTS (vt_val), 0,
242 VALUE_ADDRESS (vt_val), stream, format,
243 deref_ref, recurse + 1, pretty);
244 if (pretty)
246 fprintf_filtered (stream, "\n");
247 print_spaces_filtered (2 + 2 * recurse, stream);
252 /* Return number of characters printed, including the terminating
253 '\0' if we reached the end. val_print_string takes care including
254 the terminating '\0' if necessary. */
255 return i;
257 break;
259 case TYPE_CODE_MEMBER:
260 error ("not implemented: member type in pascal_val_print");
261 break;
263 case TYPE_CODE_REF:
264 elttype = check_typedef (TYPE_TARGET_TYPE (type));
265 if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
267 pascal_object_print_class_member (valaddr + embedded_offset,
268 TYPE_DOMAIN_TYPE (elttype),
269 stream, "");
270 break;
272 if (addressprint)
274 fprintf_filtered (stream, "@");
275 /* Extract the address, assume that it is unsigned. */
276 print_address_numeric
277 (extract_unsigned_integer (valaddr + embedded_offset,
278 TARGET_PTR_BIT / HOST_CHAR_BIT),
279 1, stream);
280 if (deref_ref)
281 fputs_filtered (": ", stream);
283 /* De-reference the reference. */
284 if (deref_ref)
286 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
288 struct value *deref_val =
289 value_at
290 (TYPE_TARGET_TYPE (type),
291 unpack_pointer (lookup_pointer_type (builtin_type_void),
292 valaddr + embedded_offset),
293 NULL);
294 val_print (VALUE_TYPE (deref_val),
295 VALUE_CONTENTS (deref_val), 0,
296 VALUE_ADDRESS (deref_val), stream, format,
297 deref_ref, recurse + 1, pretty);
299 else
300 fputs_filtered ("???", stream);
302 break;
304 case TYPE_CODE_UNION:
305 if (recurse && !unionprint)
307 fprintf_filtered (stream, "{...}");
308 break;
310 /* Fall through. */
311 case TYPE_CODE_STRUCT:
312 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
314 /* Print the unmangled name if desired. */
315 /* Print vtable entry - we only get here if NOT using
316 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
317 /* Extract the address, assume that it is unsigned. */
318 print_address_demangle
319 (extract_unsigned_integer (valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
320 TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))),
321 stream, demangle);
323 else
325 if (is_pascal_string_type (type, &length_pos, &length_size,
326 &string_pos, &char_size, NULL))
328 len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
329 LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
331 else
332 pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
333 recurse, pretty, NULL, 0);
335 break;
337 case TYPE_CODE_ENUM:
338 if (format)
340 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
341 break;
343 len = TYPE_NFIELDS (type);
344 val = unpack_long (type, valaddr + embedded_offset);
345 for (i = 0; i < len; i++)
347 QUIT;
348 if (val == TYPE_FIELD_BITPOS (type, i))
350 break;
353 if (i < len)
355 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
357 else
359 print_longest (stream, 'd', 0, val);
361 break;
363 case TYPE_CODE_FUNC:
364 if (format)
366 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
367 break;
369 /* FIXME, we should consider, at least for ANSI C language, eliminating
370 the distinction made between FUNCs and POINTERs to FUNCs. */
371 fprintf_filtered (stream, "{");
372 type_print (type, "", stream, -1);
373 fprintf_filtered (stream, "} ");
374 /* Try to print what function it points to, and its address. */
375 print_address_demangle (address, stream, demangle);
376 break;
378 case TYPE_CODE_BOOL:
379 format = format ? format : output_format;
380 if (format)
381 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
382 else
384 val = unpack_long (type, valaddr + embedded_offset);
385 if (val == 0)
386 fputs_filtered ("false", stream);
387 else if (val == 1)
388 fputs_filtered ("true", stream);
389 else
391 fputs_filtered ("true (", stream);
392 fprintf_filtered (stream, "%ld)", (long int) val);
395 break;
397 case TYPE_CODE_RANGE:
398 /* FIXME: create_range_type does not set the unsigned bit in a
399 range type (I think it probably should copy it from the target
400 type), so we won't print values which are too large to
401 fit in a signed integer correctly. */
402 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
403 print with the target type, though, because the size of our type
404 and the target type might differ). */
405 /* FALLTHROUGH */
407 case TYPE_CODE_INT:
408 format = format ? format : output_format;
409 if (format)
411 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
413 else
415 val_print_type_code_int (type, valaddr + embedded_offset, stream);
417 break;
419 case TYPE_CODE_CHAR:
420 format = format ? format : output_format;
421 if (format)
423 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
425 else
427 val = unpack_long (type, valaddr + embedded_offset);
428 if (TYPE_UNSIGNED (type))
429 fprintf_filtered (stream, "%u", (unsigned int) val);
430 else
431 fprintf_filtered (stream, "%d", (int) val);
432 fputs_filtered (" ", stream);
433 LA_PRINT_CHAR ((unsigned char) val, stream);
435 break;
437 case TYPE_CODE_FLT:
438 if (format)
440 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
442 else
444 print_floating (valaddr + embedded_offset, type, stream);
446 break;
448 case TYPE_CODE_BITSTRING:
449 case TYPE_CODE_SET:
450 elttype = TYPE_INDEX_TYPE (type);
451 CHECK_TYPEDEF (elttype);
452 if (TYPE_STUB (elttype))
454 fprintf_filtered (stream, "<incomplete type>");
455 gdb_flush (stream);
456 break;
458 else
460 struct type *range = elttype;
461 LONGEST low_bound, high_bound;
462 int i;
463 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
464 int need_comma = 0;
466 if (is_bitstring)
467 fputs_filtered ("B'", stream);
468 else
469 fputs_filtered ("[", stream);
471 i = get_discrete_bounds (range, &low_bound, &high_bound);
472 maybe_bad_bstring:
473 if (i < 0)
475 fputs_filtered ("<error value>", stream);
476 goto done;
479 for (i = low_bound; i <= high_bound; i++)
481 int element = value_bit_index (type, valaddr + embedded_offset, i);
482 if (element < 0)
484 i = element;
485 goto maybe_bad_bstring;
487 if (is_bitstring)
488 fprintf_filtered (stream, "%d", element);
489 else if (element)
491 if (need_comma)
492 fputs_filtered (", ", stream);
493 print_type_scalar (range, i, stream);
494 need_comma = 1;
496 if (i + 1 <= high_bound && value_bit_index (type, valaddr + embedded_offset, ++i))
498 int j = i;
499 fputs_filtered ("..", stream);
500 while (i + 1 <= high_bound
501 && value_bit_index (type, valaddr + embedded_offset, ++i))
502 j = i;
503 print_type_scalar (range, j, stream);
507 done:
508 if (is_bitstring)
509 fputs_filtered ("'", stream);
510 else
511 fputs_filtered ("]", stream);
513 break;
515 case TYPE_CODE_VOID:
516 fprintf_filtered (stream, "void");
517 break;
519 case TYPE_CODE_ERROR:
520 fprintf_filtered (stream, "<error type>");
521 break;
523 case TYPE_CODE_UNDEF:
524 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
525 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
526 and no complete type for struct foo in that file. */
527 fprintf_filtered (stream, "<incomplete type>");
528 break;
530 default:
531 error ("Invalid pascal type code %d in symbol table.", TYPE_CODE (type));
533 gdb_flush (stream);
534 return (0);
538 pascal_value_print (struct value *val, struct ui_file *stream, int format,
539 enum val_prettyprint pretty)
541 struct type *type = VALUE_TYPE (val);
543 /* If it is a pointer, indicate what it points to.
545 Print type also if it is a reference.
547 Object pascal: if it is a member pointer, we will take care
548 of that when we print it. */
549 if (TYPE_CODE (type) == TYPE_CODE_PTR ||
550 TYPE_CODE (type) == TYPE_CODE_REF)
552 /* Hack: remove (char *) for char strings. Their
553 type is indicated by the quoted string anyway. */
554 if (TYPE_CODE (type) == TYPE_CODE_PTR &&
555 TYPE_NAME (type) == NULL &&
556 TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
557 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
559 /* Print nothing */
561 else
563 fprintf_filtered (stream, "(");
564 type_print (type, "", stream, -1);
565 fprintf_filtered (stream, ") ");
568 return val_print (type, VALUE_CONTENTS (val), VALUE_EMBEDDED_OFFSET (val),
569 VALUE_ADDRESS (val) + VALUE_OFFSET (val),
570 stream, format, 1, 0, pretty);
574 /******************************************************************************
575 Inserted from cp-valprint
576 ******************************************************************************/
578 extern int vtblprint; /* Controls printing of vtbl's */
579 extern int objectprint; /* Controls looking up an object's derived type
580 using what we find in its vtables. */
581 static int pascal_static_field_print; /* Controls printing of static fields. */
583 static struct obstack dont_print_vb_obstack;
584 static struct obstack dont_print_statmem_obstack;
586 static void pascal_object_print_static_field (struct type *, struct value *,
587 struct ui_file *, int, int,
588 enum val_prettyprint);
590 static void
591 pascal_object_print_value (struct type *, char *, CORE_ADDR, struct ui_file *,
592 int, int, enum val_prettyprint, struct type **);
594 void
595 pascal_object_print_class_method (char *valaddr, struct type *type,
596 struct ui_file *stream)
598 struct type *domain;
599 struct fn_field *f = NULL;
600 int j = 0;
601 int len2;
602 int offset;
603 char *kind = "";
604 CORE_ADDR addr;
605 struct symbol *sym;
606 unsigned len;
607 unsigned int i;
608 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
610 domain = TYPE_DOMAIN_TYPE (target_type);
611 if (domain == (struct type *) NULL)
613 fprintf_filtered (stream, "<unknown>");
614 return;
616 addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
617 if (METHOD_PTR_IS_VIRTUAL (addr))
619 offset = METHOD_PTR_TO_VOFFSET (addr);
620 len = TYPE_NFN_FIELDS (domain);
621 for (i = 0; i < len; i++)
623 f = TYPE_FN_FIELDLIST1 (domain, i);
624 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
626 check_stub_method_group (domain, i);
627 for (j = 0; j < len2; j++)
629 if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
631 kind = "virtual ";
632 goto common;
637 else
639 sym = find_pc_function (addr);
640 if (sym == 0)
642 error ("invalid pointer to member function");
644 len = TYPE_NFN_FIELDS (domain);
645 for (i = 0; i < len; i++)
647 f = TYPE_FN_FIELDLIST1 (domain, i);
648 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
650 check_stub_method_group (domain, i);
651 for (j = 0; j < len2; j++)
653 if (DEPRECATED_STREQ (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
654 goto common;
658 common:
659 if (i < len)
661 char *demangled_name;
663 fprintf_filtered (stream, "&");
664 fputs_filtered (kind, stream);
665 demangled_name = cplus_demangle (TYPE_FN_FIELD_PHYSNAME (f, j),
666 DMGL_ANSI | DMGL_PARAMS);
667 if (demangled_name == NULL)
668 fprintf_filtered (stream, "<badly mangled name %s>",
669 TYPE_FN_FIELD_PHYSNAME (f, j));
670 else
672 fputs_filtered (demangled_name, stream);
673 xfree (demangled_name);
676 else
678 fprintf_filtered (stream, "(");
679 type_print (type, "", stream, -1);
680 fprintf_filtered (stream, ") %d", (int) addr >> 3);
684 /* It was changed to this after 2.4.5. */
685 const char pascal_vtbl_ptr_name[] =
686 {'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
688 /* Return truth value for assertion that TYPE is of the type
689 "pointer to virtual function". */
692 pascal_object_is_vtbl_ptr_type (struct type *type)
694 char *typename = type_name_no_tag (type);
696 return (typename != NULL
697 && strcmp (typename, pascal_vtbl_ptr_name) == 0);
700 /* Return truth value for the assertion that TYPE is of the type
701 "pointer to virtual function table". */
704 pascal_object_is_vtbl_member (struct type *type)
706 if (TYPE_CODE (type) == TYPE_CODE_PTR)
708 type = TYPE_TARGET_TYPE (type);
709 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
711 type = TYPE_TARGET_TYPE (type);
712 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
713 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
715 /* Virtual functions tables are full of pointers
716 to virtual functions. */
717 return pascal_object_is_vtbl_ptr_type (type);
721 return 0;
724 /* Mutually recursive subroutines of pascal_object_print_value and c_val_print to
725 print out a structure's fields: pascal_object_print_value_fields and pascal_object_print_value.
727 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
728 same meanings as in pascal_object_print_value and c_val_print.
730 DONT_PRINT is an array of baseclass types that we
731 should not print, or zero if called from top level. */
733 void
734 pascal_object_print_value_fields (struct type *type, char *valaddr,
735 CORE_ADDR address, struct ui_file *stream,
736 int format, int recurse,
737 enum val_prettyprint pretty,
738 struct type **dont_print_vb,
739 int dont_print_statmem)
741 int i, len, n_baseclasses;
742 struct obstack tmp_obstack;
743 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
745 CHECK_TYPEDEF (type);
747 fprintf_filtered (stream, "{");
748 len = TYPE_NFIELDS (type);
749 n_baseclasses = TYPE_N_BASECLASSES (type);
751 /* Print out baseclasses such that we don't print
752 duplicates of virtual baseclasses. */
753 if (n_baseclasses > 0)
754 pascal_object_print_value (type, valaddr, address, stream,
755 format, recurse + 1, pretty, dont_print_vb);
757 if (!len && n_baseclasses == 1)
758 fprintf_filtered (stream, "<No data fields>");
759 else
761 int fields_seen = 0;
763 if (dont_print_statmem == 0)
765 /* If we're at top level, carve out a completely fresh
766 chunk of the obstack and use that until this particular
767 invocation returns. */
768 tmp_obstack = dont_print_statmem_obstack;
769 obstack_finish (&dont_print_statmem_obstack);
772 for (i = n_baseclasses; i < len; i++)
774 /* If requested, skip printing of static fields. */
775 if (!pascal_static_field_print && TYPE_FIELD_STATIC (type, i))
776 continue;
777 if (fields_seen)
778 fprintf_filtered (stream, ", ");
779 else if (n_baseclasses > 0)
781 if (pretty)
783 fprintf_filtered (stream, "\n");
784 print_spaces_filtered (2 + 2 * recurse, stream);
785 fputs_filtered ("members of ", stream);
786 fputs_filtered (type_name_no_tag (type), stream);
787 fputs_filtered (": ", stream);
790 fields_seen = 1;
792 if (pretty)
794 fprintf_filtered (stream, "\n");
795 print_spaces_filtered (2 + 2 * recurse, stream);
797 else
799 wrap_here (n_spaces (2 + 2 * recurse));
801 if (inspect_it)
803 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
804 fputs_filtered ("\"( ptr \"", stream);
805 else
806 fputs_filtered ("\"( nodef \"", stream);
807 if (TYPE_FIELD_STATIC (type, i))
808 fputs_filtered ("static ", stream);
809 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
810 language_cplus,
811 DMGL_PARAMS | DMGL_ANSI);
812 fputs_filtered ("\" \"", stream);
813 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
814 language_cplus,
815 DMGL_PARAMS | DMGL_ANSI);
816 fputs_filtered ("\") \"", stream);
818 else
820 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
822 if (TYPE_FIELD_STATIC (type, i))
823 fputs_filtered ("static ", stream);
824 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
825 language_cplus,
826 DMGL_PARAMS | DMGL_ANSI);
827 annotate_field_name_end ();
828 fputs_filtered (" = ", stream);
829 annotate_field_value ();
832 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
834 struct value *v;
836 /* Bitfields require special handling, especially due to byte
837 order problems. */
838 if (TYPE_FIELD_IGNORE (type, i))
840 fputs_filtered ("<optimized out or zero length>", stream);
842 else
844 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
845 unpack_field_as_long (type, valaddr, i));
847 val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
848 stream, format, 0, recurse + 1, pretty);
851 else
853 if (TYPE_FIELD_IGNORE (type, i))
855 fputs_filtered ("<optimized out or zero length>", stream);
857 else if (TYPE_FIELD_STATIC (type, i))
859 /* struct value *v = value_static_field (type, i); v4.17 specific */
860 struct value *v;
861 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
862 unpack_field_as_long (type, valaddr, i));
864 if (v == NULL)
865 fputs_filtered ("<optimized out>", stream);
866 else
867 pascal_object_print_static_field (TYPE_FIELD_TYPE (type, i), v,
868 stream, format, recurse + 1,
869 pretty);
871 else
873 /* val_print (TYPE_FIELD_TYPE (type, i),
874 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
875 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
876 stream, format, 0, recurse + 1, pretty); */
877 val_print (TYPE_FIELD_TYPE (type, i),
878 valaddr, TYPE_FIELD_BITPOS (type, i) / 8,
879 address + TYPE_FIELD_BITPOS (type, i) / 8,
880 stream, format, 0, recurse + 1, pretty);
883 annotate_field_end ();
886 if (dont_print_statmem == 0)
888 /* Free the space used to deal with the printing
889 of the members from top level. */
890 obstack_free (&dont_print_statmem_obstack, last_dont_print);
891 dont_print_statmem_obstack = tmp_obstack;
894 if (pretty)
896 fprintf_filtered (stream, "\n");
897 print_spaces_filtered (2 * recurse, stream);
900 fprintf_filtered (stream, "}");
903 /* Special val_print routine to avoid printing multiple copies of virtual
904 baseclasses. */
906 void
907 pascal_object_print_value (struct type *type, char *valaddr, CORE_ADDR address,
908 struct ui_file *stream, int format, int recurse,
909 enum val_prettyprint pretty,
910 struct type **dont_print_vb)
912 struct obstack tmp_obstack;
913 struct type **last_dont_print
914 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
915 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
917 if (dont_print_vb == 0)
919 /* If we're at top level, carve out a completely fresh
920 chunk of the obstack and use that until this particular
921 invocation returns. */
922 tmp_obstack = dont_print_vb_obstack;
923 /* Bump up the high-water mark. Now alpha is omega. */
924 obstack_finish (&dont_print_vb_obstack);
927 for (i = 0; i < n_baseclasses; i++)
929 int boffset;
930 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
931 char *basename = TYPE_NAME (baseclass);
932 char *base_valaddr;
934 if (BASETYPE_VIA_VIRTUAL (type, i))
936 struct type **first_dont_print
937 = (struct type **) obstack_base (&dont_print_vb_obstack);
939 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
940 - first_dont_print;
942 while (--j >= 0)
943 if (baseclass == first_dont_print[j])
944 goto flush_it;
946 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
949 boffset = baseclass_offset (type, i, valaddr, address);
951 if (pretty)
953 fprintf_filtered (stream, "\n");
954 print_spaces_filtered (2 * recurse, stream);
956 fputs_filtered ("<", stream);
957 /* Not sure what the best notation is in the case where there is no
958 baseclass name. */
960 fputs_filtered (basename ? basename : "", stream);
961 fputs_filtered ("> = ", stream);
963 /* The virtual base class pointer might have been clobbered by the
964 user program. Make sure that it still points to a valid memory
965 location. */
967 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
969 /* FIXME (alloc): not safe is baseclass is really really big. */
970 base_valaddr = (char *) alloca (TYPE_LENGTH (baseclass));
971 if (target_read_memory (address + boffset, base_valaddr,
972 TYPE_LENGTH (baseclass)) != 0)
973 boffset = -1;
975 else
976 base_valaddr = valaddr + boffset;
978 if (boffset == -1)
979 fprintf_filtered (stream, "<invalid address>");
980 else
981 pascal_object_print_value_fields (baseclass, base_valaddr, address + boffset,
982 stream, format, recurse, pretty,
983 (struct type **) obstack_base (&dont_print_vb_obstack),
985 fputs_filtered (", ", stream);
987 flush_it:
991 if (dont_print_vb == 0)
993 /* Free the space used to deal with the printing
994 of this type from top level. */
995 obstack_free (&dont_print_vb_obstack, last_dont_print);
996 /* Reset watermark so that we can continue protecting
997 ourselves from whatever we were protecting ourselves. */
998 dont_print_vb_obstack = tmp_obstack;
1002 /* Print value of a static member.
1003 To avoid infinite recursion when printing a class that contains
1004 a static instance of the class, we keep the addresses of all printed
1005 static member classes in an obstack and refuse to print them more
1006 than once.
1008 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
1009 have the same meanings as in c_val_print. */
1011 static void
1012 pascal_object_print_static_field (struct type *type, struct value *val,
1013 struct ui_file *stream, int format,
1014 int recurse, enum val_prettyprint pretty)
1016 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
1018 CORE_ADDR *first_dont_print;
1019 int i;
1021 first_dont_print
1022 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
1023 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
1024 - first_dont_print;
1026 while (--i >= 0)
1028 if (VALUE_ADDRESS (val) == first_dont_print[i])
1030 fputs_filtered ("<same as static member of an already seen type>",
1031 stream);
1032 return;
1036 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
1037 sizeof (CORE_ADDR));
1039 CHECK_TYPEDEF (type);
1040 pascal_object_print_value_fields (type, VALUE_CONTENTS (val), VALUE_ADDRESS (val),
1041 stream, format, recurse, pretty, NULL, 1);
1042 return;
1044 val_print (type, VALUE_CONTENTS (val), 0, VALUE_ADDRESS (val),
1045 stream, format, 0, recurse, pretty);
1048 void
1049 pascal_object_print_class_member (char *valaddr, struct type *domain,
1050 struct ui_file *stream, char *prefix)
1053 /* VAL is a byte offset into the structure type DOMAIN.
1054 Find the name of the field for that offset and
1055 print it. */
1056 int extra = 0;
1057 int bits = 0;
1058 unsigned int i;
1059 unsigned len = TYPE_NFIELDS (domain);
1060 /* @@ Make VAL into bit offset */
1061 LONGEST val = unpack_long (builtin_type_int, valaddr) << 3;
1062 for (i = TYPE_N_BASECLASSES (domain); i < len; i++)
1064 int bitpos = TYPE_FIELD_BITPOS (domain, i);
1065 QUIT;
1066 if (val == bitpos)
1067 break;
1068 if (val < bitpos && i != 0)
1070 /* Somehow pointing into a field. */
1071 i -= 1;
1072 extra = (val - TYPE_FIELD_BITPOS (domain, i));
1073 if (extra & 0x7)
1074 bits = 1;
1075 else
1076 extra >>= 3;
1077 break;
1080 if (i < len)
1082 char *name;
1083 fputs_filtered (prefix, stream);
1084 name = type_name_no_tag (domain);
1085 if (name)
1086 fputs_filtered (name, stream);
1087 else
1088 pascal_type_print_base (domain, stream, 0, 0);
1089 fprintf_filtered (stream, "::");
1090 fputs_filtered (TYPE_FIELD_NAME (domain, i), stream);
1091 if (extra)
1092 fprintf_filtered (stream, " + %d bytes", extra);
1093 if (bits)
1094 fprintf_filtered (stream, " (offset in bits)");
1096 else
1097 fprintf_filtered (stream, "%ld", (long int) (val >> 3));
1100 extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */
1102 void
1103 _initialize_pascal_valprint (void)
1105 add_show_from_set
1106 (add_set_cmd ("pascal_static-members", class_support, var_boolean,
1107 (char *) &pascal_static_field_print,
1108 "Set printing of pascal static members.",
1109 &setprintlist),
1110 &showprintlist);
1111 /* Turn on printing of static fields. */
1112 pascal_static_field_print = 1;