2004-04-30 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / gdb / p-valprint.c
1 /* Support for printing Pascal values for GDB, the GNU debugger.
2 Copyright 2000, 2001, 2003
3 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 \f
41
42
43
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.
48
49 If the data are a string pointer, returns the number of string characters
50 printed.
51
52 If DEREF_REF is nonzero, then dereference references, otherwise just print
53 them like pointers.
54
55 The PRETTY parameter controls prettyprinting. */
56
57
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)
62 {
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;
71
72 CHECK_TYPEDEF (type);
73 switch (TYPE_CODE (type))
74 {
75 case TYPE_CODE_ARRAY:
76 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
77 {
78 elttype = check_typedef (TYPE_TARGET_TYPE (type));
79 eltlen = TYPE_LENGTH (elttype);
80 len = TYPE_LENGTH (type) / eltlen;
81 if (prettyprint_arrays)
82 {
83 print_spaces_filtered (2 + 2 * recurse, stream);
84 }
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'))
91 {
92 /* If requested, look for the first null char and only print
93 elements up to it. */
94 if (stop_print_at_null)
95 {
96 unsigned int temp_len;
97
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;
104 }
105
106 LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0);
107 i = len;
108 }
109 else
110 {
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))
115 {
116 i = 1;
117 fprintf_filtered (stream, "%d vtable entries", len - 1);
118 }
119 else
120 {
121 i = 0;
122 }
123 val_print_array_elements (type, valaddr + embedded_offset, address, stream,
124 format, deref_ref, recurse, pretty, i);
125 fprintf_filtered (stream, "}");
126 }
127 break;
128 }
129 /* Array of unspecified length: treat like pointer to first elt. */
130 addr = address;
131 goto print_unpacked_pointer;
132
133 case TYPE_CODE_PTR:
134 if (format && format != 's')
135 {
136 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
137 break;
138 }
139 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
140 {
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;
148 }
149 elttype = check_typedef (TYPE_TARGET_TYPE (type));
150 if (TYPE_CODE (elttype) == TYPE_CODE_METHOD)
151 {
152 pascal_object_print_class_method (valaddr + embedded_offset, type, stream);
153 }
154 else if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
155 {
156 pascal_object_print_class_member (valaddr + embedded_offset,
157 TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (type)),
158 stream, "&");
159 }
160 else
161 {
162 addr = unpack_pointer (type, valaddr + embedded_offset);
163 print_unpacked_pointer:
164 elttype = check_typedef (TYPE_TARGET_TYPE (type));
165
166 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
167 {
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);
172 }
173
174 if (addressprint && format != 's')
175 {
176 print_address_numeric (addr, 1, stream);
177 }
178
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)
185 {
186 /* no wide string yet */
187 i = val_print_string (addr, -1, 1, stream);
188 }
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)
197 {
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);
205 }
206 else if (pascal_object_is_vtbl_member (type))
207 {
208 /* print vtbl's nicely */
209 CORE_ADDR vt_address = unpack_pointer (type, valaddr + embedded_offset);
210
211 struct minimal_symbol *msymbol =
212 lookup_minimal_symbol_by_pc (vt_address);
213 if ((msymbol != NULL)
214 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
215 {
216 fputs_filtered (" <", stream);
217 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
218 fputs_filtered (">", stream);
219 }
220 if (vt_address && vtblprint)
221 {
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;
227
228 if (msymbol != NULL)
229 wsym = lookup_symbol (DEPRECATED_SYMBOL_NAME (msymbol), block,
230 VAR_DOMAIN, &is_this_fld, NULL);
231
232 if (wsym)
233 {
234 wtype = SYMBOL_TYPE (wsym);
235 }
236 else
237 {
238 wtype = TYPE_TARGET_TYPE (type);
239 }
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)
245 {
246 fprintf_filtered (stream, "\n");
247 print_spaces_filtered (2 + 2 * recurse, stream);
248 }
249 }
250 }
251
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;
256 }
257 break;
258
259 case TYPE_CODE_MEMBER:
260 error ("not implemented: member type in pascal_val_print");
261 break;
262
263 case TYPE_CODE_REF:
264 elttype = check_typedef (TYPE_TARGET_TYPE (type));
265 if (TYPE_CODE (elttype) == TYPE_CODE_MEMBER)
266 {
267 pascal_object_print_class_member (valaddr + embedded_offset,
268 TYPE_DOMAIN_TYPE (elttype),
269 stream, "");
270 break;
271 }
272 if (addressprint)
273 {
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);
282 }
283 /* De-reference the reference. */
284 if (deref_ref)
285 {
286 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
287 {
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);
298 }
299 else
300 fputs_filtered ("???", stream);
301 }
302 break;
303
304 case TYPE_CODE_UNION:
305 if (recurse && !unionprint)
306 {
307 fprintf_filtered (stream, "{...}");
308 break;
309 }
310 /* Fall through. */
311 case TYPE_CODE_STRUCT:
312 if (vtblprint && pascal_object_is_vtbl_ptr_type (type))
313 {
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);
322 }
323 else
324 {
325 if (is_pascal_string_type (type, &length_pos, &length_size,
326 &string_pos, &char_size, NULL))
327 {
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);
330 }
331 else
332 pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format,
333 recurse, pretty, NULL, 0);
334 }
335 break;
336
337 case TYPE_CODE_ENUM:
338 if (format)
339 {
340 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
341 break;
342 }
343 len = TYPE_NFIELDS (type);
344 val = unpack_long (type, valaddr + embedded_offset);
345 for (i = 0; i < len; i++)
346 {
347 QUIT;
348 if (val == TYPE_FIELD_BITPOS (type, i))
349 {
350 break;
351 }
352 }
353 if (i < len)
354 {
355 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
356 }
357 else
358 {
359 print_longest (stream, 'd', 0, val);
360 }
361 break;
362
363 case TYPE_CODE_FUNC:
364 if (format)
365 {
366 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
367 break;
368 }
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;
377
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
383 {
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
390 {
391 fputs_filtered ("true (", stream);
392 fprintf_filtered (stream, "%ld)", (long int) val);
393 }
394 }
395 break;
396
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 */
406
407 case TYPE_CODE_INT:
408 format = format ? format : output_format;
409 if (format)
410 {
411 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
412 }
413 else
414 {
415 val_print_type_code_int (type, valaddr + embedded_offset, stream);
416 }
417 break;
418
419 case TYPE_CODE_CHAR:
420 format = format ? format : output_format;
421 if (format)
422 {
423 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
424 }
425 else
426 {
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);
434 }
435 break;
436
437 case TYPE_CODE_FLT:
438 if (format)
439 {
440 print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
441 }
442 else
443 {
444 print_floating (valaddr + embedded_offset, type, stream);
445 }
446 break;
447
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))
453 {
454 fprintf_filtered (stream, "<incomplete type>");
455 gdb_flush (stream);
456 break;
457 }
458 else
459 {
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;
465
466 if (is_bitstring)
467 fputs_filtered ("B'", stream);
468 else
469 fputs_filtered ("[", stream);
470
471 i = get_discrete_bounds (range, &low_bound, &high_bound);
472 maybe_bad_bstring:
473 if (i < 0)
474 {
475 fputs_filtered ("<error value>", stream);
476 goto done;
477 }
478
479 for (i = low_bound; i <= high_bound; i++)
480 {
481 int element = value_bit_index (type, valaddr + embedded_offset, i);
482 if (element < 0)
483 {
484 i = element;
485 goto maybe_bad_bstring;
486 }
487 if (is_bitstring)
488 fprintf_filtered (stream, "%d", element);
489 else if (element)
490 {
491 if (need_comma)
492 fputs_filtered (", ", stream);
493 print_type_scalar (range, i, stream);
494 need_comma = 1;
495
496 if (i + 1 <= high_bound && value_bit_index (type, valaddr + embedded_offset, ++i))
497 {
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);
504 }
505 }
506 }
507 done:
508 if (is_bitstring)
509 fputs_filtered ("'", stream);
510 else
511 fputs_filtered ("]", stream);
512 }
513 break;
514
515 case TYPE_CODE_VOID:
516 fprintf_filtered (stream, "void");
517 break;
518
519 case TYPE_CODE_ERROR:
520 fprintf_filtered (stream, "<error type>");
521 break;
522
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;
529
530 default:
531 error ("Invalid pascal type code %d in symbol table.", TYPE_CODE (type));
532 }
533 gdb_flush (stream);
534 return (0);
535 }
536 \f
537 int
538 pascal_value_print (struct value *val, struct ui_file *stream, int format,
539 enum val_prettyprint pretty)
540 {
541 struct type *type = VALUE_TYPE (val);
542
543 /* If it is a pointer, indicate what it points to.
544
545 Print type also if it is a reference.
546
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)
551 {
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)
558 {
559 /* Print nothing */
560 }
561 else
562 {
563 fprintf_filtered (stream, "(");
564 type_print (type, "", stream, -1);
565 fprintf_filtered (stream, ") ");
566 }
567 }
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);
571 }
572
573
574 /******************************************************************************
575 Inserted from cp-valprint
576 ******************************************************************************/
577
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. */
582
583 static struct obstack dont_print_vb_obstack;
584 static struct obstack dont_print_statmem_obstack;
585
586 static void pascal_object_print_static_field (struct type *, struct value *,
587 struct ui_file *, int, int,
588 enum val_prettyprint);
589
590 static void
591 pascal_object_print_value (struct type *, char *, CORE_ADDR, struct ui_file *,
592 int, int, enum val_prettyprint, struct type **);
593
594 void
595 pascal_object_print_class_method (char *valaddr, struct type *type,
596 struct ui_file *stream)
597 {
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));
609
610 domain = TYPE_DOMAIN_TYPE (target_type);
611 if (domain == (struct type *) NULL)
612 {
613 fprintf_filtered (stream, "<unknown>");
614 return;
615 }
616 addr = unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr);
617 if (METHOD_PTR_IS_VIRTUAL (addr))
618 {
619 offset = METHOD_PTR_TO_VOFFSET (addr);
620 len = TYPE_NFN_FIELDS (domain);
621 for (i = 0; i < len; i++)
622 {
623 f = TYPE_FN_FIELDLIST1 (domain, i);
624 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
625
626 check_stub_method_group (domain, i);
627 for (j = 0; j < len2; j++)
628 {
629 if (TYPE_FN_FIELD_VOFFSET (f, j) == offset)
630 {
631 kind = "virtual ";
632 goto common;
633 }
634 }
635 }
636 }
637 else
638 {
639 sym = find_pc_function (addr);
640 if (sym == 0)
641 {
642 error ("invalid pointer to member function");
643 }
644 len = TYPE_NFN_FIELDS (domain);
645 for (i = 0; i < len; i++)
646 {
647 f = TYPE_FN_FIELDLIST1 (domain, i);
648 len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
649
650 check_stub_method_group (domain, i);
651 for (j = 0; j < len2; j++)
652 {
653 if (DEPRECATED_STREQ (DEPRECATED_SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
654 goto common;
655 }
656 }
657 }
658 common:
659 if (i < len)
660 {
661 char *demangled_name;
662
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
671 {
672 fputs_filtered (demangled_name, stream);
673 xfree (demangled_name);
674 }
675 }
676 else
677 {
678 fprintf_filtered (stream, "(");
679 type_print (type, "", stream, -1);
680 fprintf_filtered (stream, ") %d", (int) addr >> 3);
681 }
682 }
683
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};
687
688 /* Return truth value for assertion that TYPE is of the type
689 "pointer to virtual function". */
690
691 int
692 pascal_object_is_vtbl_ptr_type (struct type *type)
693 {
694 char *typename = type_name_no_tag (type);
695
696 return (typename != NULL
697 && strcmp (typename, pascal_vtbl_ptr_name) == 0);
698 }
699
700 /* Return truth value for the assertion that TYPE is of the type
701 "pointer to virtual function table". */
702
703 int
704 pascal_object_is_vtbl_member (struct type *type)
705 {
706 if (TYPE_CODE (type) == TYPE_CODE_PTR)
707 {
708 type = TYPE_TARGET_TYPE (type);
709 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
710 {
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 */
714 {
715 /* Virtual functions tables are full of pointers
716 to virtual functions. */
717 return pascal_object_is_vtbl_ptr_type (type);
718 }
719 }
720 }
721 return 0;
722 }
723
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.
726
727 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the
728 same meanings as in pascal_object_print_value and c_val_print.
729
730 DONT_PRINT is an array of baseclass types that we
731 should not print, or zero if called from top level. */
732
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)
740 {
741 int i, len, n_baseclasses;
742 struct obstack tmp_obstack;
743 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
744
745 CHECK_TYPEDEF (type);
746
747 fprintf_filtered (stream, "{");
748 len = TYPE_NFIELDS (type);
749 n_baseclasses = TYPE_N_BASECLASSES (type);
750
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);
756
757 if (!len && n_baseclasses == 1)
758 fprintf_filtered (stream, "<No data fields>");
759 else
760 {
761 int fields_seen = 0;
762
763 if (dont_print_statmem == 0)
764 {
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);
770 }
771
772 for (i = n_baseclasses; i < len; i++)
773 {
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)
780 {
781 if (pretty)
782 {
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);
788 }
789 }
790 fields_seen = 1;
791
792 if (pretty)
793 {
794 fprintf_filtered (stream, "\n");
795 print_spaces_filtered (2 + 2 * recurse, stream);
796 }
797 else
798 {
799 wrap_here (n_spaces (2 + 2 * recurse));
800 }
801 if (inspect_it)
802 {
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);
817 }
818 else
819 {
820 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
821
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 ();
830 }
831
832 if (!TYPE_FIELD_STATIC (type, i) && TYPE_FIELD_PACKED (type, i))
833 {
834 struct value *v;
835
836 /* Bitfields require special handling, especially due to byte
837 order problems. */
838 if (TYPE_FIELD_IGNORE (type, i))
839 {
840 fputs_filtered ("<optimized out or zero length>", stream);
841 }
842 else
843 {
844 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
845 unpack_field_as_long (type, valaddr, i));
846
847 val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
848 stream, format, 0, recurse + 1, pretty);
849 }
850 }
851 else
852 {
853 if (TYPE_FIELD_IGNORE (type, i))
854 {
855 fputs_filtered ("<optimized out or zero length>", stream);
856 }
857 else if (TYPE_FIELD_STATIC (type, i))
858 {
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));
863
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);
870 }
871 else
872 {
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);
881 }
882 }
883 annotate_field_end ();
884 }
885
886 if (dont_print_statmem == 0)
887 {
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;
892 }
893
894 if (pretty)
895 {
896 fprintf_filtered (stream, "\n");
897 print_spaces_filtered (2 * recurse, stream);
898 }
899 }
900 fprintf_filtered (stream, "}");
901 }
902
903 /* Special val_print routine to avoid printing multiple copies of virtual
904 baseclasses. */
905
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)
911 {
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);
916
917 if (dont_print_vb == 0)
918 {
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);
925 }
926
927 for (i = 0; i < n_baseclasses; i++)
928 {
929 int boffset;
930 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
931 char *basename = TYPE_NAME (baseclass);
932 char *base_valaddr;
933
934 if (BASETYPE_VIA_VIRTUAL (type, i))
935 {
936 struct type **first_dont_print
937 = (struct type **) obstack_base (&dont_print_vb_obstack);
938
939 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
940 - first_dont_print;
941
942 while (--j >= 0)
943 if (baseclass == first_dont_print[j])
944 goto flush_it;
945
946 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
947 }
948
949 boffset = baseclass_offset (type, i, valaddr, address);
950
951 if (pretty)
952 {
953 fprintf_filtered (stream, "\n");
954 print_spaces_filtered (2 * recurse, stream);
955 }
956 fputs_filtered ("<", stream);
957 /* Not sure what the best notation is in the case where there is no
958 baseclass name. */
959
960 fputs_filtered (basename ? basename : "", stream);
961 fputs_filtered ("> = ", stream);
962
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. */
966
967 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
968 {
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;
974 }
975 else
976 base_valaddr = valaddr + boffset;
977
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),
984 0);
985 fputs_filtered (", ", stream);
986
987 flush_it:
988 ;
989 }
990
991 if (dont_print_vb == 0)
992 {
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;
999 }
1000 }
1001
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.
1007
1008 VAL contains the value to print, TYPE, STREAM, RECURSE, and PRETTY
1009 have the same meanings as in c_val_print. */
1010
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)
1015 {
1016 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
1017 {
1018 CORE_ADDR *first_dont_print;
1019 int i;
1020
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;
1025
1026 while (--i >= 0)
1027 {
1028 if (VALUE_ADDRESS (val) == first_dont_print[i])
1029 {
1030 fputs_filtered ("<same as static member of an already seen type>",
1031 stream);
1032 return;
1033 }
1034 }
1035
1036 obstack_grow (&dont_print_statmem_obstack, (char *) &VALUE_ADDRESS (val),
1037 sizeof (CORE_ADDR));
1038
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;
1043 }
1044 val_print (type, VALUE_CONTENTS (val), 0, VALUE_ADDRESS (val),
1045 stream, format, 0, recurse, pretty);
1046 }
1047
1048 void
1049 pascal_object_print_class_member (char *valaddr, struct type *domain,
1050 struct ui_file *stream, char *prefix)
1051 {
1052
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++)
1063 {
1064 int bitpos = TYPE_FIELD_BITPOS (domain, i);
1065 QUIT;
1066 if (val == bitpos)
1067 break;
1068 if (val < bitpos && i != 0)
1069 {
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;
1078 }
1079 }
1080 if (i < len)
1081 {
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)");
1095 }
1096 else
1097 fprintf_filtered (stream, "%ld", (long int) (val >> 3));
1098 }
1099
1100 extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */
1101
1102 void
1103 _initialize_pascal_valprint (void)
1104 {
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;
1113
1114 }
This page took 0.0535949999999999 seconds and 4 git commands to generate.