* procfs.c: Reformat.
[deliverable/binutils-gdb.git] / gdb / p-valprint.c
CommitLineData
373a8247 1/* Support for printing Pascal values for GDB, the GNU debugger.
5bcca90b 2
4c38e0a4 3 Copyright (C) 2000, 2001, 2003, 2005, 2006, 2007, 2008, 2009, 2010
4f2aea11 4 Free Software Foundation, Inc.
373a8247
PM
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
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
373a8247
PM
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
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
373a8247
PM
20
21/* This file is derived from c-valprint.c */
22
23#include "defs.h"
04ea0df1 24#include "gdb_obstack.h"
373a8247
PM
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"
3172dc30 34#include "typeprint.h"
373a8247
PM
35#include "language.h"
36#include "target.h"
37#include "annotate.h"
38#include "p-lang.h"
eb43544b 39#include "cp-abi.h"
d3cbe7ef 40#include "cp-support.h"
373a8247
PM
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
79a45b7d 47 OPTIONS. The data at VALADDR is in target byte order.
373a8247
PM
48
49 If the data are a string pointer, returns the number of string characters
79a45b7d 50 printed. */
373a8247
PM
51
52
53int
fc1a4b47 54pascal_val_print (struct type *type, const gdb_byte *valaddr,
a2bd3dcd 55 int embedded_offset, CORE_ADDR address,
79a45b7d
TT
56 struct ui_file *stream, int recurse,
57 const struct value_print_options *options)
373a8247 58{
5af949e3 59 struct gdbarch *gdbarch = get_type_arch (type);
e17a4113 60 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
52f0bd74 61 unsigned int i = 0; /* Number of characters printed */
373a8247
PM
62 unsigned len;
63 struct type *elttype;
64 unsigned eltlen;
5598ce11 65 int length_pos, length_size, string_pos;
6c7a06a3 66 struct type *char_type;
373a8247
PM
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;
79a45b7d 79 if (options->prettyprint_arrays)
373a8247
PM
80 {
81 print_spaces_filtered (2 + 2 * recurse, stream);
82 }
6e354e5e
PM
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))
373a8247
PM
90 {
91 /* If requested, look for the first null char and only print
92 elements up to it. */
79a45b7d 93 if (options->stop_print_at_null)
373a8247
PM
94 {
95 unsigned int temp_len;
96
97 /* Look for a NULL char. */
98 for (temp_len = 0;
58159490 99 extract_unsigned_integer (valaddr + embedded_offset +
e17a4113
UW
100 temp_len * eltlen, eltlen,
101 byte_order)
79a45b7d 102 && temp_len < len && temp_len < options->print_max;
373a8247
PM
103 temp_len++);
104 len = temp_len;
105 }
106
6c7a06a3 107 LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type),
be759fcf 108 valaddr + embedded_offset, len, NULL, 0,
6c7a06a3 109 options);
373a8247
PM
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,
79a45b7d 127 recurse, options, i);
373a8247
PM
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:
79a45b7d 137 if (options->format && options->format != 's')
373a8247 138 {
79a45b7d
TT
139 print_scalar_formatted (valaddr + embedded_offset, type,
140 options, 0, stream);
373a8247
PM
141 break;
142 }
79a45b7d 143 if (options->vtblprint && pascal_object_is_vtbl_ptr_type (type))
373a8247
PM
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.) */
b276f1bb 148 /* Extract the address, assume that it is unsigned. */
e17a4113
UW
149 addr = extract_unsigned_integer (valaddr + embedded_offset,
150 TYPE_LENGTH (type), byte_order);
151 print_address_demangle (gdbarch, addr, stream, demangle);
373a8247
PM
152 break;
153 }
154 elttype = check_typedef (TYPE_TARGET_TYPE (type));
e13eedd5
PM
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)
373a8247 161 {
e13eedd5
PM
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 }
373a8247 167
e13eedd5
PM
168 if (options->addressprint && options->format != 's')
169 {
170 fputs_filtered (paddress (gdbarch, addr), stream);
171 }
373a8247 172
e13eedd5
PM
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;
ad3bbd48 197
e13eedd5
PM
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);
e13eedd5 209 struct minimal_symbol *msymbol =
ad3bbd48
MS
210 lookup_minimal_symbol_by_pc (vt_address);
211
e13eedd5
PM
212 if ((msymbol != NULL)
213 && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
373a8247 214 {
e13eedd5
PM
215 fputs_filtered (" <", stream);
216 fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
217 fputs_filtered (">", stream);
373a8247 218 }
e13eedd5 219 if (vt_address && options->vtblprint)
373a8247 220 {
e13eedd5
PM
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;
373a8247 226
e13eedd5
PM
227 if (msymbol != NULL)
228 wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol), block,
229 VAR_DOMAIN, &is_this_fld);
230
231 if (wsym)
373a8247 232 {
e13eedd5 233 wtype = SYMBOL_TYPE (wsym);
373a8247 234 }
e13eedd5 235 else
373a8247 236 {
e13eedd5
PM
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);
373a8247
PM
246 }
247 }
373a8247 248 }
e13eedd5
PM
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
373a8247
PM
255 break;
256
373a8247
PM
257 case TYPE_CODE_REF:
258 elttype = check_typedef (TYPE_TARGET_TYPE (type));
79a45b7d 259 if (options->addressprint)
373a8247 260 {
830bb937
UW
261 CORE_ADDR addr
262 = extract_typed_address (valaddr + embedded_offset, type);
ad3bbd48 263
373a8247 264 fprintf_filtered (stream, "@");
5af949e3 265 fputs_filtered (paddress (gdbarch, addr), stream);
79a45b7d 266 if (options->deref_ref)
373a8247
PM
267 fputs_filtered (": ", stream);
268 }
269 /* De-reference the reference. */
79a45b7d 270 if (options->deref_ref)
373a8247
PM
271 {
272 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
273 {
6943961c 274 struct value *deref_val =
ad3bbd48
MS
275 value_at
276 (TYPE_TARGET_TYPE (type),
277 unpack_pointer (type, valaddr + embedded_offset));
278
79a45b7d
TT
279 common_val_print (deref_val, stream, recurse + 1, options,
280 current_language);
373a8247
PM
281 }
282 else
283 fputs_filtered ("???", stream);
284 }
285 break;
286
287 case TYPE_CODE_UNION:
79a45b7d 288 if (recurse && !options->unionprint)
373a8247
PM
289 {
290 fprintf_filtered (stream, "{...}");
291 break;
292 }
293 /* Fall through. */
294 case TYPE_CODE_STRUCT:
79a45b7d 295 if (options->vtblprint && pascal_object_is_vtbl_ptr_type (type))
373a8247
PM
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.) */
b276f1bb
AC
300 /* Extract the address, assume that it is unsigned. */
301 print_address_demangle
5af949e3
UW
302 (gdbarch,
303 extract_unsigned_integer (valaddr + embedded_offset + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
e17a4113 304 TYPE_LENGTH (TYPE_FIELD_TYPE (type, VTBL_FNADDR_OFFSET)), byte_order),
b276f1bb 305 stream, demangle);
373a8247
PM
306 }
307 else
308 {
5598ce11 309 if (is_pascal_string_type (type, &length_pos, &length_size,
6c7a06a3 310 &string_pos, &char_type, NULL))
373a8247 311 {
e17a4113 312 len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size, byte_order);
be759fcf
PM
313 LA_PRINT_STRING (stream, char_type,
314 valaddr + embedded_offset + string_pos,
315 len, NULL, 0, options);
373a8247
PM
316 }
317 else
79a45b7d
TT
318 pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream,
319 recurse, options, NULL, 0);
373a8247
PM
320 }
321 break;
322
323 case TYPE_CODE_ENUM:
79a45b7d 324 if (options->format)
373a8247 325 {
79a45b7d
TT
326 print_scalar_formatted (valaddr + embedded_offset, type,
327 options, 0, stream);
373a8247
PM
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
4f2aea11 350 case TYPE_CODE_FLAGS:
79a45b7d
TT
351 if (options->format)
352 print_scalar_formatted (valaddr + embedded_offset, type,
353 options, 0, stream);
4f2aea11
MK
354 else
355 val_print_type_code_flags (type, valaddr + embedded_offset, stream);
356 break;
357
373a8247 358 case TYPE_CODE_FUNC:
79a45b7d 359 if (options->format)
373a8247 360 {
79a45b7d
TT
361 print_scalar_formatted (valaddr + embedded_offset, type,
362 options, 0, stream);
373a8247
PM
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. */
5af949e3 371 print_address_demangle (gdbarch, address, stream, demangle);
373a8247
PM
372 break;
373
374 case TYPE_CODE_BOOL:
79a45b7d
TT
375 if (options->format || options->output_format)
376 {
377 struct value_print_options opts = *options;
ad3bbd48 378
79a45b7d
TT
379 opts.format = (options->format ? options->format
380 : options->output_format);
381 print_scalar_formatted (valaddr + embedded_offset, type,
382 &opts, 0, stream);
383 }
373a8247
PM
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:
79a45b7d 410 if (options->format || options->output_format)
373a8247 411 {
79a45b7d 412 struct value_print_options opts = *options;
ad3bbd48 413
79a45b7d
TT
414 opts.format = (options->format ? options->format
415 : options->output_format);
416 print_scalar_formatted (valaddr + embedded_offset, type,
417 &opts, 0, stream);
373a8247
PM
418 }
419 else
420 {
421 val_print_type_code_int (type, valaddr + embedded_offset, stream);
422 }
423 break;
424
425 case TYPE_CODE_CHAR:
79a45b7d 426 if (options->format || options->output_format)
373a8247 427 {
79a45b7d 428 struct value_print_options opts = *options;
ad3bbd48 429
79a45b7d
TT
430 opts.format = (options->format ? options->format
431 : options->output_format);
432 print_scalar_formatted (valaddr + embedded_offset, type,
433 &opts, 0, stream);
373a8247
PM
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);
6c7a06a3 443 LA_PRINT_CHAR ((unsigned char) val, type, stream);
373a8247
PM
444 }
445 break;
446
447 case TYPE_CODE_FLT:
79a45b7d 448 if (options->format)
373a8247 449 {
79a45b7d
TT
450 print_scalar_formatted (valaddr + embedded_offset, type,
451 options, 0, stream);
373a8247
PM
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);
74a9bb82 463 if (TYPE_STUB (elttype))
373a8247
PM
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 maybe_bad_bstring:
484 if (i < 0)
485 {
486 fputs_filtered ("<error value>", stream);
487 goto done;
488 }
489
490 for (i = low_bound; i <= high_bound; i++)
491 {
492 int element = value_bit_index (type, valaddr + embedded_offset, i);
ad3bbd48 493
373a8247
PM
494 if (element < 0)
495 {
496 i = element;
497 goto maybe_bad_bstring;
498 }
499 if (is_bitstring)
500 fprintf_filtered (stream, "%d", element);
501 else if (element)
502 {
503 if (need_comma)
504 fputs_filtered (", ", stream);
505 print_type_scalar (range, i, stream);
506 need_comma = 1;
507
508 if (i + 1 <= high_bound && value_bit_index (type, valaddr + embedded_offset, ++i))
509 {
510 int j = i;
ad3bbd48 511
373a8247
PM
512 fputs_filtered ("..", stream);
513 while (i + 1 <= high_bound
514 && value_bit_index (type, valaddr + embedded_offset, ++i))
515 j = i;
516 print_type_scalar (range, j, stream);
517 }
518 }
519 }
520 done:
521 if (is_bitstring)
522 fputs_filtered ("'", stream);
523 else
524 fputs_filtered ("]", stream);
525 }
526 break;
527
528 case TYPE_CODE_VOID:
529 fprintf_filtered (stream, "void");
530 break;
531
532 case TYPE_CODE_ERROR:
533 fprintf_filtered (stream, "<error type>");
534 break;
535
536 case TYPE_CODE_UNDEF:
537 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
538 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
539 and no complete type for struct foo in that file. */
540 fprintf_filtered (stream, "<incomplete type>");
541 break;
542
543 default:
8a3fe4f8 544 error (_("Invalid pascal type code %d in symbol table."), TYPE_CODE (type));
373a8247
PM
545 }
546 gdb_flush (stream);
547 return (0);
548}
549\f
550int
79a45b7d
TT
551pascal_value_print (struct value *val, struct ui_file *stream,
552 const struct value_print_options *options)
373a8247 553{
df407dfe 554 struct type *type = value_type (val);
278582cb
PM
555 struct value_print_options opts = *options;
556
557 opts.deref_ref = 1;
373a8247
PM
558
559 /* If it is a pointer, indicate what it points to.
560
561 Print type also if it is a reference.
562
563 Object pascal: if it is a member pointer, we will take care
564 of that when we print it. */
b20a3440
PM
565 if (TYPE_CODE (type) == TYPE_CODE_PTR
566 || TYPE_CODE (type) == TYPE_CODE_REF)
373a8247
PM
567 {
568 /* Hack: remove (char *) for char strings. Their
569 type is indicated by the quoted string anyway. */
b20a3440
PM
570 if (TYPE_CODE (type) == TYPE_CODE_PTR
571 && TYPE_NAME (type) == NULL
572 && TYPE_NAME (TYPE_TARGET_TYPE (type)) != NULL
6314a349 573 && strcmp (TYPE_NAME (TYPE_TARGET_TYPE (type)), "char") == 0)
373a8247
PM
574 {
575 /* Print nothing */
576 }
577 else
578 {
579 fprintf_filtered (stream, "(");
580 type_print (type, "", stream, -1);
581 fprintf_filtered (stream, ") ");
582 }
583 }
278582cb 584 return common_val_print (val, stream, 0, &opts, current_language);
373a8247
PM
585}
586
587
920d2a44
AC
588static void
589show_pascal_static_field_print (struct ui_file *file, int from_tty,
590 struct cmd_list_element *c, const char *value)
591{
592 fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
593 value);
594}
373a8247
PM
595
596static struct obstack dont_print_vb_obstack;
597static struct obstack dont_print_statmem_obstack;
598
806048c6 599static void pascal_object_print_static_field (struct value *,
79a45b7d
TT
600 struct ui_file *, int,
601 const struct value_print_options *);
373a8247 602
fc1a4b47 603static void pascal_object_print_value (struct type *, const gdb_byte *,
79a45b7d
TT
604 CORE_ADDR, struct ui_file *, int,
605 const struct value_print_options *,
a2bd3dcd 606 struct type **);
373a8247 607
373a8247
PM
608/* It was changed to this after 2.4.5. */
609const char pascal_vtbl_ptr_name[] =
610{'_', '_', 'v', 't', 'b', 'l', '_', 'p', 't', 'r', '_', 't', 'y', 'p', 'e', 0};
611
612/* Return truth value for assertion that TYPE is of the type
613 "pointer to virtual function". */
614
615int
fba45db2 616pascal_object_is_vtbl_ptr_type (struct type *type)
373a8247
PM
617{
618 char *typename = type_name_no_tag (type);
619
620 return (typename != NULL
6314a349 621 && strcmp (typename, pascal_vtbl_ptr_name) == 0);
373a8247
PM
622}
623
624/* Return truth value for the assertion that TYPE is of the type
625 "pointer to virtual function table". */
626
627int
fba45db2 628pascal_object_is_vtbl_member (struct type *type)
373a8247
PM
629{
630 if (TYPE_CODE (type) == TYPE_CODE_PTR)
631 {
632 type = TYPE_TARGET_TYPE (type);
633 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
634 {
635 type = TYPE_TARGET_TYPE (type);
636 if (TYPE_CODE (type) == TYPE_CODE_STRUCT /* if not using thunks */
637 || TYPE_CODE (type) == TYPE_CODE_PTR) /* if using thunks */
638 {
639 /* Virtual functions tables are full of pointers
640 to virtual functions. */
641 return pascal_object_is_vtbl_ptr_type (type);
642 }
643 }
644 }
645 return 0;
646}
647
a2bd3dcd
AC
648/* Mutually recursive subroutines of pascal_object_print_value and
649 c_val_print to print out a structure's fields:
650 pascal_object_print_value_fields and pascal_object_print_value.
373a8247 651
79a45b7d 652 TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
373a8247
PM
653 same meanings as in pascal_object_print_value and c_val_print.
654
655 DONT_PRINT is an array of baseclass types that we
656 should not print, or zero if called from top level. */
657
658void
fc1a4b47 659pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
fba45db2 660 CORE_ADDR address, struct ui_file *stream,
79a45b7d
TT
661 int recurse,
662 const struct value_print_options *options,
fba45db2
KB
663 struct type **dont_print_vb,
664 int dont_print_statmem)
373a8247
PM
665{
666 int i, len, n_baseclasses;
373a8247
PM
667 char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
668
669 CHECK_TYPEDEF (type);
670
671 fprintf_filtered (stream, "{");
672 len = TYPE_NFIELDS (type);
673 n_baseclasses = TYPE_N_BASECLASSES (type);
674
675 /* Print out baseclasses such that we don't print
676 duplicates of virtual baseclasses. */
677 if (n_baseclasses > 0)
678 pascal_object_print_value (type, valaddr, address, stream,
79a45b7d 679 recurse + 1, options, dont_print_vb);
373a8247
PM
680
681 if (!len && n_baseclasses == 1)
682 fprintf_filtered (stream, "<No data fields>");
683 else
684 {
c1b6e682 685 struct obstack tmp_obstack = dont_print_statmem_obstack;
373a8247
PM
686 int fields_seen = 0;
687
688 if (dont_print_statmem == 0)
689 {
690 /* If we're at top level, carve out a completely fresh
691 chunk of the obstack and use that until this particular
692 invocation returns. */
373a8247
PM
693 obstack_finish (&dont_print_statmem_obstack);
694 }
695
696 for (i = n_baseclasses; i < len; i++)
697 {
698 /* If requested, skip printing of static fields. */
79a45b7d 699 if (!options->pascal_static_field_print
d6a843b5 700 && field_is_static (&TYPE_FIELD (type, i)))
373a8247
PM
701 continue;
702 if (fields_seen)
703 fprintf_filtered (stream, ", ");
704 else if (n_baseclasses > 0)
705 {
79a45b7d 706 if (options->pretty)
373a8247
PM
707 {
708 fprintf_filtered (stream, "\n");
709 print_spaces_filtered (2 + 2 * recurse, stream);
710 fputs_filtered ("members of ", stream);
711 fputs_filtered (type_name_no_tag (type), stream);
712 fputs_filtered (": ", stream);
713 }
714 }
715 fields_seen = 1;
716
79a45b7d 717 if (options->pretty)
373a8247
PM
718 {
719 fprintf_filtered (stream, "\n");
720 print_spaces_filtered (2 + 2 * recurse, stream);
721 }
722 else
723 {
724 wrap_here (n_spaces (2 + 2 * recurse));
725 }
79a45b7d 726 if (options->inspect_it)
373a8247
PM
727 {
728 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
729 fputs_filtered ("\"( ptr \"", stream);
730 else
731 fputs_filtered ("\"( nodef \"", stream);
d6a843b5 732 if (field_is_static (&TYPE_FIELD (type, i)))
373a8247
PM
733 fputs_filtered ("static ", stream);
734 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
735 language_cplus,
736 DMGL_PARAMS | DMGL_ANSI);
737 fputs_filtered ("\" \"", stream);
738 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
739 language_cplus,
740 DMGL_PARAMS | DMGL_ANSI);
741 fputs_filtered ("\") \"", stream);
742 }
743 else
744 {
745 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
746
d6a843b5 747 if (field_is_static (&TYPE_FIELD (type, i)))
373a8247
PM
748 fputs_filtered ("static ", stream);
749 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
750 language_cplus,
751 DMGL_PARAMS | DMGL_ANSI);
752 annotate_field_name_end ();
753 fputs_filtered (" = ", stream);
754 annotate_field_value ();
755 }
756
d6a843b5
JK
757 if (!field_is_static (&TYPE_FIELD (type, i))
758 && TYPE_FIELD_PACKED (type, i))
373a8247 759 {
6943961c 760 struct value *v;
373a8247
PM
761
762 /* Bitfields require special handling, especially due to byte
763 order problems. */
764 if (TYPE_FIELD_IGNORE (type, i))
765 {
766 fputs_filtered ("<optimized out or zero length>", stream);
767 }
768 else
769 {
79a45b7d 770 struct value_print_options opts = *options;
ad3bbd48 771
373a8247
PM
772 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
773 unpack_field_as_long (type, valaddr, i));
774
79a45b7d
TT
775 opts.deref_ref = 0;
776 common_val_print (v, stream, recurse + 1, &opts,
777 current_language);
373a8247
PM
778 }
779 }
780 else
781 {
782 if (TYPE_FIELD_IGNORE (type, i))
783 {
784 fputs_filtered ("<optimized out or zero length>", stream);
785 }
d6a843b5 786 else if (field_is_static (&TYPE_FIELD (type, i)))
373a8247 787 {
6943961c
AC
788 /* struct value *v = value_static_field (type, i); v4.17 specific */
789 struct value *v;
ad3bbd48 790
373a8247
PM
791 v = value_from_longest (TYPE_FIELD_TYPE (type, i),
792 unpack_field_as_long (type, valaddr, i));
793
794 if (v == NULL)
795 fputs_filtered ("<optimized out>", stream);
796 else
79a45b7d
TT
797 pascal_object_print_static_field (v, stream, recurse + 1,
798 options);
373a8247
PM
799 }
800 else
801 {
79a45b7d 802 struct value_print_options opts = *options;
ad3bbd48 803
79a45b7d 804 opts.deref_ref = 0;
373a8247
PM
805 /* val_print (TYPE_FIELD_TYPE (type, i),
806 valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
807 address + TYPE_FIELD_BITPOS (type, i) / 8, 0,
808 stream, format, 0, recurse + 1, pretty); */
809 val_print (TYPE_FIELD_TYPE (type, i),
810 valaddr, TYPE_FIELD_BITPOS (type, i) / 8,
811 address + TYPE_FIELD_BITPOS (type, i) / 8,
79a45b7d 812 stream, recurse + 1, &opts,
d8ca156b 813 current_language);
373a8247
PM
814 }
815 }
816 annotate_field_end ();
817 }
818
819 if (dont_print_statmem == 0)
820 {
821 /* Free the space used to deal with the printing
822 of the members from top level. */
823 obstack_free (&dont_print_statmem_obstack, last_dont_print);
824 dont_print_statmem_obstack = tmp_obstack;
825 }
826
79a45b7d 827 if (options->pretty)
373a8247
PM
828 {
829 fprintf_filtered (stream, "\n");
830 print_spaces_filtered (2 * recurse, stream);
831 }
832 }
833 fprintf_filtered (stream, "}");
834}
835
836/* Special val_print routine to avoid printing multiple copies of virtual
837 baseclasses. */
838
7080f20f 839static void
fc1a4b47 840pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
a2bd3dcd 841 CORE_ADDR address, struct ui_file *stream,
79a45b7d
TT
842 int recurse,
843 const struct value_print_options *options,
fba45db2 844 struct type **dont_print_vb)
373a8247 845{
373a8247 846 struct type **last_dont_print
ad3bbd48 847 = (struct type **) obstack_next_free (&dont_print_vb_obstack);
c1b6e682 848 struct obstack tmp_obstack = dont_print_vb_obstack;
373a8247
PM
849 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
850
851 if (dont_print_vb == 0)
852 {
853 /* If we're at top level, carve out a completely fresh
854 chunk of the obstack and use that until this particular
855 invocation returns. */
373a8247
PM
856 /* Bump up the high-water mark. Now alpha is omega. */
857 obstack_finish (&dont_print_vb_obstack);
858 }
859
860 for (i = 0; i < n_baseclasses; i++)
861 {
862 int boffset;
863 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
4a52dc15 864 char *basename = type_name_no_tag (baseclass);
fc1a4b47 865 const gdb_byte *base_valaddr;
373a8247
PM
866
867 if (BASETYPE_VIA_VIRTUAL (type, i))
868 {
869 struct type **first_dont_print
ad3bbd48 870 = (struct type **) obstack_base (&dont_print_vb_obstack);
373a8247
PM
871
872 int j = (struct type **) obstack_next_free (&dont_print_vb_obstack)
ad3bbd48 873 - first_dont_print;
373a8247
PM
874
875 while (--j >= 0)
876 if (baseclass == first_dont_print[j])
877 goto flush_it;
878
879 obstack_ptr_grow (&dont_print_vb_obstack, baseclass);
880 }
881
882 boffset = baseclass_offset (type, i, valaddr, address);
883
79a45b7d 884 if (options->pretty)
373a8247
PM
885 {
886 fprintf_filtered (stream, "\n");
887 print_spaces_filtered (2 * recurse, stream);
888 }
889 fputs_filtered ("<", stream);
890 /* Not sure what the best notation is in the case where there is no
891 baseclass name. */
892
893 fputs_filtered (basename ? basename : "", stream);
894 fputs_filtered ("> = ", stream);
895
896 /* The virtual base class pointer might have been clobbered by the
897 user program. Make sure that it still points to a valid memory
898 location. */
899
900 if (boffset != -1 && (boffset < 0 || boffset >= TYPE_LENGTH (type)))
901 {
34c0bd93 902 /* FIXME (alloc): not safe is baseclass is really really big. */
fc1a4b47 903 gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
ad3bbd48 904
a2bd3dcd
AC
905 base_valaddr = buf;
906 if (target_read_memory (address + boffset, buf,
373a8247
PM
907 TYPE_LENGTH (baseclass)) != 0)
908 boffset = -1;
909 }
910 else
911 base_valaddr = valaddr + boffset;
912
913 if (boffset == -1)
914 fprintf_filtered (stream, "<invalid address>");
915 else
916 pascal_object_print_value_fields (baseclass, base_valaddr, address + boffset,
79a45b7d 917 stream, recurse, options,
373a8247
PM
918 (struct type **) obstack_base (&dont_print_vb_obstack),
919 0);
920 fputs_filtered (", ", stream);
921
922 flush_it:
923 ;
924 }
925
926 if (dont_print_vb == 0)
927 {
928 /* Free the space used to deal with the printing
929 of this type from top level. */
930 obstack_free (&dont_print_vb_obstack, last_dont_print);
931 /* Reset watermark so that we can continue protecting
932 ourselves from whatever we were protecting ourselves. */
933 dont_print_vb_obstack = tmp_obstack;
934 }
935}
936
937/* Print value of a static member.
938 To avoid infinite recursion when printing a class that contains
939 a static instance of the class, we keep the addresses of all printed
940 static member classes in an obstack and refuse to print them more
941 than once.
942
79a45b7d 943 VAL contains the value to print, STREAM, RECURSE, and OPTIONS
373a8247
PM
944 have the same meanings as in c_val_print. */
945
946static void
806048c6 947pascal_object_print_static_field (struct value *val,
79a45b7d
TT
948 struct ui_file *stream,
949 int recurse,
950 const struct value_print_options *options)
373a8247 951{
806048c6 952 struct type *type = value_type (val);
79a45b7d 953 struct value_print_options opts;
806048c6 954
373a8247
PM
955 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
956 {
42ae5230 957 CORE_ADDR *first_dont_print, addr;
373a8247
PM
958 int i;
959
960 first_dont_print
961 = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack);
962 i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack)
963 - first_dont_print;
964
965 while (--i >= 0)
966 {
42ae5230 967 if (value_address (val) == first_dont_print[i])
373a8247
PM
968 {
969 fputs_filtered ("<same as static member of an already seen type>",
970 stream);
971 return;
972 }
973 }
974
42ae5230
TT
975 addr = value_address (val);
976 obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
373a8247
PM
977 sizeof (CORE_ADDR));
978
979 CHECK_TYPEDEF (type);
42ae5230 980 pascal_object_print_value_fields (type, value_contents (val), addr,
79a45b7d 981 stream, recurse, options, NULL, 1);
373a8247
PM
982 return;
983 }
79a45b7d
TT
984
985 opts = *options;
986 opts.deref_ref = 0;
987 common_val_print (val, stream, recurse, &opts, current_language);
373a8247
PM
988}
989
b9362cc7 990extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */
373a8247
PM
991
992void
fba45db2 993_initialize_pascal_valprint (void)
373a8247 994{
5bf193a2 995 add_setshow_boolean_cmd ("pascal_static-members", class_support,
79a45b7d 996 &user_print_options.pascal_static_field_print, _("\
5bf193a2
AC
997Set printing of pascal static members."), _("\
998Show printing of pascal static members."), NULL,
999 NULL,
920d2a44 1000 show_pascal_static_field_print,
5bf193a2 1001 &setprintlist, &showprintlist);
373a8247 1002}
This page took 1.23614 seconds and 4 git commands to generate.