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