]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/p-valprint.c
2007-09-07 Pierre Muller <muller@ics.u-strasbg.fr>
[thirdparty/binutils-gdb.git] / gdb / p-valprint.c
1 /* Support for printing Pascal values for GDB, the GNU debugger.
2
3 Copyright (C) 2000, 2001, 2003, 2005, 2006, 2007
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
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 3 of the License, or
11 (at your option) any later version.
12
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.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
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 gdb_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 {
153 addr = unpack_pointer (type, valaddr + embedded_offset);
154 print_unpacked_pointer:
155 elttype = check_typedef (TYPE_TARGET_TYPE (type));
156
157 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
158 {
159 /* Try to print what function it points to. */
160 print_address_demangle (addr, stream, demangle);
161 /* Return value is irrelevant except for string pointers. */
162 return (0);
163 }
164
165 if (addressprint && format != 's')
166 {
167 fputs_filtered (paddress (addr), stream);
168 }
169
170 /* For a pointer to char or unsigned char, also print the string
171 pointed to, unless pointer is null. */
172 if (TYPE_LENGTH (elttype) == 1
173 && TYPE_CODE (elttype) == TYPE_CODE_INT
174 && (format == 0 || format == 's')
175 && addr != 0)
176 {
177 /* no wide string yet */
178 i = val_print_string (addr, -1, 1, stream);
179 }
180 /* also for pointers to pascal strings */
181 /* Note: this is Free Pascal specific:
182 as GDB does not recognize stabs pascal strings
183 Pascal strings are mapped to records
184 with lowercase names PM */
185 if (is_pascal_string_type (elttype, &length_pos, &length_size,
186 &string_pos, &char_size, NULL)
187 && addr != 0)
188 {
189 ULONGEST string_length;
190 void *buffer;
191 buffer = xmalloc (length_size);
192 read_memory (addr + length_pos, buffer, length_size);
193 string_length = extract_unsigned_integer (buffer, length_size);
194 xfree (buffer);
195 i = val_print_string (addr + string_pos, string_length, char_size, stream);
196 }
197 else if (pascal_object_is_vtbl_member (type))
198 {
199 /* print vtbl's nicely */
200 CORE_ADDR vt_address = unpack_pointer (type, valaddr + embedded_offset);
201
202 struct minimal_symbol *msymbol =
203 lookup_minimal_symbol_by_pc (vt_address);
204 if ((msymbol != NULL)
205 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
206 {
207 fputs_filtered (" <", stream);
208 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
209 fputs_filtered (">", stream);
210 }
211 if (vt_address && vtblprint)
212 {
213 struct value *vt_val;
214 struct symbol *wsym = (struct symbol *) NULL;
215 struct type *wtype;
216 struct block *block = (struct block *) NULL;
217 int is_this_fld;
218
219 if (msymbol != NULL)
220 wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol), block,
221 VAR_DOMAIN, &is_this_fld, NULL);
222
223 if (wsym)
224 {
225 wtype = SYMBOL_TYPE (wsym);
226 }
227 else
228 {
229 wtype = TYPE_TARGET_TYPE (type);
230 }
231 vt_val = value_at (wtype, vt_address);
232 common_val_print (vt_val, stream, format, deref_ref,
233 recurse + 1, pretty);
234 if (pretty)
235 {
236 fprintf_filtered (stream, "\n");
237 print_spaces_filtered (2 + 2 * recurse, stream);
238 }
239 }
240 }
241
242 /* Return number of characters printed, including the terminating
243 '\0' if we reached the end. val_print_string takes care including
244 the terminating '\0' if necessary. */
245 return i;
246 }
247 break;
248
249 case TYPE_CODE_REF:
250 elttype = check_typedef (TYPE_TARGET_TYPE (type));
251 if (addressprint)
252 {
253 fprintf_filtered (stream, "@");
254 /* Extract the address, assume that it is unsigned. */
255 fputs_filtered (paddress (
256 extract_unsigned_integer (valaddr + embedded_offset,
257 gdbarch_ptr_bit (current_gdbarch) / HOST_CHAR_BIT)), stream);
258 if (deref_ref)
259 fputs_filtered (": ", stream);
260 }
261 /* De-reference the reference. */
262 if (deref_ref)
263 {
264 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
265 {
266 struct value *deref_val =
267 value_at
268 (TYPE_TARGET_TYPE (type),
269 unpack_pointer (lookup_pointer_type (builtin_type_void),
270 valaddr + embedded_offset));
271 common_val_print (deref_val, stream, format, deref_ref,
272 recurse + 1, pretty);
273 }
274 else
275 fputs_filtered ("???", stream);
276 }
277 break;
278
279 case TYPE_CODE_UNION:
280 if (recurse && !unionprint)
281 {
282 fprintf_filtered (stream, "{...}");
283 break;
284 }
285 /* Fall through. */
286 case TYPE_CODE_STRUCT:
287 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
288 {
289 /* Print the unmangled name if desired. */
290 /* Print vtable entry - we only get here if NOT using
291 -fvtable_thunks. (Otherwise, look under TYPE_CODE_PTR.) */
292 /* Extract the address, assume that it is unsigned. */
293 print_address_demangle
294 (extract_unsigned_integer (valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
295 TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET))),
296 stream, demangle);
297 }
298 else
299 {
300 if (is_pascal_string_type (type, &length_pos, &length_size,
301 &string_pos, &char_size, NULL))
302 {
303 len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
304 LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
305 }
306 else
307 pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
308 recurse, pretty, NULL, 0);
309 }
310 break;
311
312 case TYPE_CODE_ENUM:
313 if (format)
314 {
315 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
316 break;
317 }
318 len = TYPE_NFIELDS (type);
319 val = unpack_long (type, valaddr + embedded_offset);
320 for (i = 0; i < len; i++)
321 {
322 QUIT;
323 if (val == TYPE_FIELD_BITPOS (type, i))
324 {
325 break;
326 }
327 }
328 if (i < len)
329 {
330 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
331 }
332 else
333 {
334 print_longest (stream, 'd', 0, val);
335 }
336 break;
337
338 case TYPE_CODE_FLAGS:
339 if (format)
340 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
341 else
342 val_print_type_code_flags (type, valaddr + embedded_offset, stream);
343 break;
344
345 case TYPE_CODE_FUNC:
346 if (format)
347 {
348 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
349 break;
350 }
351 /* FIXME, we should consider, at least for ANSI C language, eliminating
352 the distinction made between FUNCs and POINTERs to FUNCs. */
353 fprintf_filtered (stream, "{");
354 type_print (type, "", stream, -1);
355 fprintf_filtered (stream, "} ");
356 /* Try to print what function it points to, and its address. */
357 print_address_demangle (address, stream, demangle);
358 break;
359
360 case TYPE_CODE_BOOL:
361 format = format ? format : output_format;
362 if (format)
363 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
364 else
365 {
366 val = unpack_long (type, valaddr + embedded_offset);
367 if (val == 0)
368 fputs_filtered ("false", stream);
369 else if (val == 1)
370 fputs_filtered ("true", stream);
371 else
372 {
373 fputs_filtered ("true (", stream);
374 fprintf_filtered (stream, "%ld)", (long int) val);
375 }
376 }
377 break;
378
379 case TYPE_CODE_RANGE:
380 /* FIXME: create_range_type does not set the unsigned bit in a
381 range type (I think it probably should copy it from the target
382 type), so we won't print values which are too large to
383 fit in a signed integer correctly. */
384 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
385 print with the target type, though, because the size of our type
386 and the target type might differ). */
387 /* FALLTHROUGH */
388
389 case TYPE_CODE_INT:
390 format = format ? format : output_format;
391 if (format)
392 {
393 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
394 }
395 else
396 {
397 val_print_type_code_int (type, valaddr + embedded_offset, stream);
398 }
399 break;
400
401 case TYPE_CODE_CHAR:
402 format = format ? format : output_format;
403 if (format)
404 {
405 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
406 }
407 else
408 {
409 val = unpack_long (type, valaddr + embedded_offset);
410 if (TYPE_UNSIGNED (type))
411 fprintf_filtered (stream, "%u", (unsigned int) val);
412 else
413 fprintf_filtered (stream, "%d", (int) val);
414 fputs_filtered (" ", stream);
415 LA_PRINT_CHAR ((unsigned char) val, stream);
416 }
417 break;
418
419 case TYPE_CODE_FLT:
420 if (format)
421 {
422 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
423 }
424 else
425 {
426 print_floating (valaddr + embedded_offset, type, stream);
427 }
428 break;
429
430 case TYPE_CODE_BITSTRING:
431 case TYPE_CODE_SET:
432 elttype = TYPE_INDEX_TYPE (type);
433 CHECK_TYPEDEF (elttype);
434 if (TYPE_STUB (elttype))
435 {
436 fprintf_filtered (stream, "<incomplete type>");
437 gdb_flush (stream);
438 break;
439 }
440 else
441 {
442 struct type *range = elttype;
443 LONGEST low_bound, high_bound;
444 int i;
445 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
446 int need_comma = 0;
447
448 if (is_bitstring)
449 fputs_filtered ("B'", stream);
450 else
451 fputs_filtered ("[", stream);
452
453 i = get_discrete_bounds (range, &low_bound, &high_bound);
454 maybe_bad_bstring:
455 if (i < 0)
456 {
457 fputs_filtered ("<error value>", stream);
458 goto done;
459 }
460
461 for (i = low_bound; i <= high_bound; i++)
462 {
463 int element = value_bit_index (type, valaddr + embedded_offset, i);
464 if (element < 0)
465 {
466 i = element;
467 goto maybe_bad_bstring;
468 }
469 if (is_bitstring)
470 fprintf_filtered (stream, "%d", element);
471 else if (element)
472 {
473 if (need_comma)
474 fputs_filtered (", ", stream);
475 print_type_scalar (range, i, stream);
476 need_comma = 1;
477
478 if (i + 1 <= high_bound && value_bit_index (type, valaddr + embedded_offset, ++i))
479 {
480 int j = i;
481 fputs_filtered ("..", stream);
482 while (i + 1 <= high_bound
483 && value_bit_index (type, valaddr + embedded_offset, ++i))
484 j = i;
485 print_type_scalar (range, j, stream);
486 }
487 }
488 }
489 done:
490 if (is_bitstring)
491 fputs_filtered ("'", stream);
492 else
493 fputs_filtered ("]", stream);
494 }
495 break;
496
497 case TYPE_CODE_VOID:
498 fprintf_filtered (stream, "void");
499 break;
500
501 case TYPE_CODE_ERROR:
502 fprintf_filtered (stream, "<error type>");
503 break;
504
505 case TYPE_CODE_UNDEF:
506 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
507 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
508 and no complete type for struct foo in that file. */
509 fprintf_filtered (stream, "<incomplete type>");
510 break;
511
512 default:
513 error (_("Invalid pascal type code %d in symbol table."), TYPE_CODE (type));
514 }
515 gdb_flush (stream);
516 return (0);
517 }
518 \f
519 int
520 pascal_value_print (struct value *val, struct ui_file *stream, int format,
521 enum val_prettyprint pretty)
522 {
523 struct type *type = value_type (val);
524
525 /* If it is a pointer, indicate what it points to.
526
527 Print type also if it is a reference.
528
529 Object pascal: if it is a member pointer, we will take care
530 of that when we print it. */
531 if (TYPE_CODE (type) == TYPE_CODE_PTR
532 || TYPE_CODE (type) == TYPE_CODE_REF)
533 {
534 /* Hack: remove (char *) for char strings. Their
535 type is indicated by the quoted string anyway. */
536 if (TYPE_CODE (type) == TYPE_CODE_PTR
537 && TYPE_NAME (type) == NULL
538 && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
539 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
540 {
541 /* Print nothing */
542 }
543 else
544 {
545 fprintf_filtered (stream, "(");
546 type_print (type, "", stream, -1);
547 fprintf_filtered (stream, ") ");
548 }
549 }
550 return common_val_print (val, stream, format, 1, 0, pretty);
551 }
552
553
554 /******************************************************************************
555 Inserted from cp-valprint
556 ******************************************************************************/
557
558 extern int vtblprint; /* Controls printing of vtbl's */
559 extern int objectprint; /* Controls looking up an object's derived type
560 using what we find in its vtables. */
561 static int pascal_static_field_print; /* Controls printing of static fields. */
562 static void
563 show_pascal_static_field_print (struct ui_file *file, int from_tty,
564 struct cmd_list_element *c, const char *value)
565 {
566 fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
567 value);
568 }
569
570 static struct obstack dont_print_vb_obstack;
571 static struct obstack dont_print_statmem_obstack;
572
573 static void pascal_object_print_static_field (struct value *,
574 struct ui_file *, int, int,
575 enum val_prettyprint);
576
577 static void pascal_object_print_value (struct type *, const gdb_byte *,
578 CORE_ADDR, struct ui_file *,
579 int, int, enum val_prettyprint,
580 struct type **);
581
582 /* It was changed to this after 2.4.5. */
583 const char pascal_vtbl_ptr_name[] =
584 {'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
585
586 /* Return truth value for assertion that TYPE is of the type
587 "pointer to virtual function". */
588
589 int
590 pascal_object_is_vtbl_ptr_type (struct type *type)
591 {
592 char *typename = type_name_no_tag (type);
593
594 return (typename != NULL
595 && strcmp (typename, pascal_vtbl_ptr_name) == 0);
596 }
597
598 /* Return truth value for the assertion that TYPE is of the type
599 "pointer to virtual function table". */
600
601 int
602 pascal_object_is_vtbl_member (struct type *type)
603 {
604 if (TYPE_CODE (type) == TYPE_CODE_PTR)
605 {
606 type = TYPE_TARGET_TYPE (type);
607 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
608 {
609 type = TYPE_TARGET_TYPE (type);
610 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
611 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
612 {
613 /* Virtual functions tables are full of pointers
614 to virtual functions. */
615 return pascal_object_is_vtbl_ptr_type (type);
616 }
617 }
618 }
619 return 0;
620 }
621
622 /* Mutually recursive subroutines of pascal_object_print_value and
623 c_val_print to print out a structure's fields:
624 pascal_object_print_value_fields and pascal_object_print_value.
625
626 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
627 same meanings as in pascal_object_print_value and c_val_print.
628
629 DONT_PRINT is an array of baseclass types that we
630 should not print, or zero if called from top level. */
631
632 void
633 pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
634 CORE_ADDR address, struct ui_file *stream,
635 int format, int recurse,
636 enum val_prettyprint pretty,
637 struct type **dont_print_vb,
638 int dont_print_statmem)
639 {
640 int i, len, n_baseclasses;
641 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
642
643 CHECK_TYPEDEF (type);
644
645 fprintf_filtered (stream, "{");
646 len = TYPE_NFIELDS (type);
647 n_baseclasses = TYPE_N_BASECLASSES (type);
648
649 /* Print out baseclasses such that we don't print
650 duplicates of virtual baseclasses. */
651 if (n_baseclasses > 0)
652 pascal_object_print_value (type, valaddr, address, stream,
653 format, recurse + 1, pretty, dont_print_vb);
654
655 if (!len && n_baseclasses == 1)
656 fprintf_filtered (stream, "<No data fields>");
657 else
658 {
659 struct obstack tmp_obstack = dont_print_statmem_obstack;
660 int fields_seen = 0;
661
662 if (dont_print_statmem == 0)
663 {
664 /* If we're at top level, carve out a completely fresh
665 chunk of the obstack and use that until this particular
666 invocation returns. */
667 obstack_finish (&dont_print_statmem_obstack);
668 }
669
670 for (i = n_baseclasses; i < len; i++)
671 {
672 /* If requested, skip printing of static fields. */
673 if (!pascal_static_field_print && TYPE_FIELD_STATIC (type, i))
674 continue;
675 if (fields_seen)
676 fprintf_filtered (stream, ", ");
677 else if (n_baseclasses > 0)
678 {
679 if (pretty)
680 {
681 fprintf_filtered (stream, "\n");
682 print_spaces_filtered (2 + 2 * recurse, stream);
683 fputs_filtered ("members of ", stream);
684 fputs_filtered (type_name_no_tag (type), stream);
685 fputs_filtered (": ", stream);
686 }
687 }
688 fields_seen = 1;
689
690 if (pretty)
691 {
692 fprintf_filtered (stream, "\n");
693 print_spaces_filtered (2 + 2 * recurse, stream);
694 }
695 else
696 {
697 wrap_here (n_spaces (2 + 2 * recurse));
698 }
699 if (inspect_it)
700 {
701 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
702 fputs_filtered ("\"( ptr \"", stream);
703 else
704 fputs_filtered ("\"( nodef \"", stream);
705 if (TYPE_FIELD_STATIC (type, i))
706 fputs_filtered ("static ", stream);
707 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
708 language_cplus,
709 DMGL_PARAMS | DMGL_ANSI);
710 fputs_filtered ("\" \"", stream);
711 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
712 language_cplus,
713 DMGL_PARAMS | DMGL_ANSI);
714 fputs_filtered ("\") \"", stream);
715 }
716 else
717 {
718 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
719
720 if (TYPE_FIELD_STATIC (type, i))
721 fputs_filtered ("static ", stream);
722 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
723 language_cplus,
724 DMGL_PARAMS | DMGL_ANSI);
725 annotate_field_name_end ();
726 fputs_filtered (" = ", stream);
727 annotate_field_value ();
728 }
729
730 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
731 {
732 struct value *v;
733
734 /* Bitfields require special handling, especially due to byte
735 order problems. */
736 if (TYPE_FIELD_IGNORE (type, i))
737 {
738 fputs_filtered ("<optimized out or zero length>", stream);
739 }
740 else
741 {
742 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
743 unpack_field_as_long (type, valaddr, i));
744
745 common_val_print (v, stream, format, 0, recurse + 1, pretty);
746 }
747 }
748 else
749 {
750 if (TYPE_FIELD_IGNORE (type, i))
751 {
752 fputs_filtered ("<optimized out or zero length>", stream);
753 }
754 else if (TYPE_FIELD_STATIC (type, i))
755 {
756 /* struct value *v = value_static_field (type, i); v4.17 specific */
757 struct value *v;
758 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
759 unpack_field_as_long (type, valaddr, i));
760
761 if (v == NULL)
762 fputs_filtered ("<optimized out>", stream);
763 else
764 pascal_object_print_static_field (v, stream, format,
765 recurse + 1, pretty);
766 }
767 else
768 {
769 /* val_print (TYPE_FIELD_TYPE (type, i),
770 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
771 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
772 stream, format, 0, recurse + 1, pretty); */
773 val_print (TYPE_FIELD_TYPE (type, i),
774 valaddr, TYPE_FIELD_BITPOS (type, i) / 8,
775 address + TYPE_FIELD_BITPOS (type, i) / 8,
776 stream, format, 0, recurse + 1, pretty);
777 }
778 }
779 annotate_field_end ();
780 }
781
782 if (dont_print_statmem == 0)
783 {
784 /* Free the space used to deal with the printing
785 of the members from top level. */
786 obstack_free (&dont_print_statmem_obstack, last_dont_print);
787 dont_print_statmem_obstack = tmp_obstack;
788 }
789
790 if (pretty)
791 {
792 fprintf_filtered (stream, "\n");
793 print_spaces_filtered (2 * recurse, stream);
794 }
795 }
796 fprintf_filtered (stream, "}");
797 }
798
799 /* Special val_print routine to avoid printing multiple copies of virtual
800 baseclasses. */
801
802 static void
803 pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
804 CORE_ADDR address, struct ui_file *stream,
805 int format, int recurse,
806 enum val_prettyprint pretty,
807 struct type **dont_print_vb)
808 {
809 struct type **last_dont_print
810 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
811 struct obstack tmp_obstack = dont_print_vb_obstack;
812 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
813
814 if (dont_print_vb == 0)
815 {
816 /* If we're at top level, carve out a completely fresh
817 chunk of the obstack and use that until this particular
818 invocation returns. */
819 /* Bump up the high-water mark. Now alpha is omega. */
820 obstack_finish (&dont_print_vb_obstack);
821 }
822
823 for (i = 0; i < n_baseclasses; i++)
824 {
825 int boffset;
826 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
827 char *basename = type_name_no_tag (baseclass);
828 const gdb_byte *base_valaddr;
829
830 if (BASETYPE_VIA_VIRTUAL (type, i))
831 {
832 struct type **first_dont_print
833 = (struct type **) obstack_base (&dont_print_vb_obstack);
834
835 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
836 - first_dont_print;
837
838 while (--j >= 0)
839 if (baseclass == first_dont_print[j])
840 goto flush_it;
841
842 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
843 }
844
845 boffset = baseclass_offset (type, i, valaddr, address);
846
847 if (pretty)
848 {
849 fprintf_filtered (stream, "\n");
850 print_spaces_filtered (2 * recurse, stream);
851 }
852 fputs_filtered ("<", stream);
853 /* Not sure what the best notation is in the case where there is no
854 baseclass name. */
855
856 fputs_filtered (basename ? basename : "", stream);
857 fputs_filtered ("> = ", stream);
858
859 /* The virtual base class pointer might have been clobbered by the
860 user program. Make sure that it still points to a valid memory
861 location. */
862
863 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
864 {
865 /* FIXME (alloc): not safe is baseclass is really really big. */
866 gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
867 base_valaddr = buf;
868 if (target_read_memory (address + boffset, buf,
869 TYPE_LENGTH (baseclass)) != 0)
870 boffset = -1;
871 }
872 else
873 base_valaddr = valaddr + boffset;
874
875 if (boffset == -1)
876 fprintf_filtered (stream, "<invalid address>");
877 else
878 pascal_object_print_value_fields (baseclass, base_valaddr, address + boffset,
879 stream, format, recurse, pretty,
880 (struct type **) obstack_base (&dont_print_vb_obstack),
881 0);
882 fputs_filtered (", ", stream);
883
884 flush_it:
885 ;
886 }
887
888 if (dont_print_vb == 0)
889 {
890 /* Free the space used to deal with the printing
891 of this type from top level. */
892 obstack_free (&dont_print_vb_obstack, last_dont_print);
893 /* Reset watermark so that we can continue protecting
894 ourselves from whatever we were protecting ourselves. */
895 dont_print_vb_obstack = tmp_obstack;
896 }
897 }
898
899 /* Print value of a static member.
900 To avoid infinite recursion when printing a class that contains
901 a static instance of the class, we keep the addresses of all printed
902 static member classes in an obstack and refuse to print them more
903 than once.
904
905 VAL contains the value to print, STREAM, RECURSE, and PRETTY
906 have the same meanings as in c_val_print. */
907
908 static void
909 pascal_object_print_static_field (struct value *val,
910 struct ui_file *stream, int format,
911 int recurse, enum val_prettyprint pretty)
912 {
913 struct type *type = value_type (val);
914
915 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
916 {
917 CORE_ADDR *first_dont_print;
918 int i;
919
920 first_dont_print
921 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
922 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
923 - first_dont_print;
924
925 while (--i >= 0)
926 {
927 if (VALUE_ADDRESS (val) == first_dont_print[i])
928 {
929 fputs_filtered ("<same as static member of an already seen type>",
930 stream);
931 return;
932 }
933 }
934
935 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
936 sizeof (CORE_ADDR));
937
938 CHECK_TYPEDEF (type);
939 pascal_object_print_value_fields (type, value_contents (val), VALUE_ADDRESS (val),
940 stream, format, recurse, pretty, NULL, 1);
941 return;
942 }
943 common_val_print (val, stream, format, 0, recurse, pretty);
944 }
945
946 extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */
947
948 void
949 _initialize_pascal_valprint (void)
950 {
951 add_setshow_boolean_cmd ("pascal_static-members", class_support,
952 &pascal_static_field_print, _("\
953 Set printing of pascal static members."), _("\
954 Show printing of pascal static members."), NULL,
955 NULL,
956 show_pascal_static_field_print,
957 &setprintlist, &showprintlist);
958 /* Turn on printing of static fields. */
959 pascal_static_field_print = 1;
960
961 }