gdb/
[deliverable/binutils-gdb.git] / gdb / jv-valprint.c
1 /* Support for printing Java values for GDB, the GNU debugger.
2
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007,
4 2008, 2009, 2010, 2011 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 #include "defs.h"
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "gdbcore.h"
25 #include "expression.h"
26 #include "value.h"
27 #include "demangle.h"
28 #include "valprint.h"
29 #include "language.h"
30 #include "jv-lang.h"
31 #include "c-lang.h"
32 #include "annotate.h"
33 #include "gdb_string.h"
34
35 /* Local functions */
36
37 int
38 java_value_print (struct value *val, struct ui_file *stream,
39 const struct value_print_options *options)
40 {
41 struct gdbarch *gdbarch = get_type_arch (value_type (val));
42 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
43 struct type *type;
44 CORE_ADDR address;
45 int i;
46 char *name;
47 struct value_print_options opts;
48
49 type = value_type (val);
50 address = value_address (val);
51
52 if (is_object_type (type))
53 {
54 CORE_ADDR obj_addr;
55
56 /* Get the run-time type, and cast the object into that. */
57
58 obj_addr = unpack_pointer (type, value_contents (val));
59
60 if (obj_addr != 0)
61 {
62 type = type_from_class (gdbarch, java_class_from_object (val));
63 type = lookup_pointer_type (type);
64
65 val = value_at (type, address);
66 }
67 }
68
69 if (TYPE_CODE (type) == TYPE_CODE_PTR && !value_logical_not (val))
70 type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
71
72 name = TYPE_TAG_NAME (type);
73 if (TYPE_CODE (type) == TYPE_CODE_STRUCT && name != NULL
74 && (i = strlen (name), name[i - 1] == ']'))
75 {
76 gdb_byte buf4[4];
77 long length;
78 unsigned int things_printed = 0;
79 int reps;
80 struct type *el_type
81 = java_primitive_type_from_name (gdbarch, name, i - 2);
82
83 i = 0;
84 read_memory (address + get_java_object_header_size (gdbarch), buf4, 4);
85
86 length = (long) extract_signed_integer (buf4, 4, byte_order);
87 fprintf_filtered (stream, "{length: %ld", length);
88
89 if (el_type == NULL)
90 {
91 CORE_ADDR element;
92 CORE_ADDR next_element = -1; /* Dummy initial value. */
93
94 /* Skip object header and length. */
95 address += get_java_object_header_size (gdbarch) + 4;
96
97 while (i < length && things_printed < options->print_max)
98 {
99 gdb_byte *buf;
100
101 buf = alloca (gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT);
102 fputs_filtered (", ", stream);
103 wrap_here (n_spaces (2));
104
105 if (i > 0)
106 element = next_element;
107 else
108 {
109 read_memory (address, buf, sizeof (buf));
110 address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
111 /* FIXME: cagney/2003-05-24: Bogus or what. It
112 pulls a host sized pointer out of the target and
113 then extracts that as an address (while assuming
114 that the address is unsigned)! */
115 element = extract_unsigned_integer (buf, sizeof (buf),
116 byte_order);
117 }
118
119 for (reps = 1; i + reps < length; reps++)
120 {
121 read_memory (address, buf, sizeof (buf));
122 address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
123 /* FIXME: cagney/2003-05-24: Bogus or what. It
124 pulls a host sized pointer out of the target and
125 then extracts that as an address (while assuming
126 that the address is unsigned)! */
127 next_element = extract_unsigned_integer (buf, sizeof (buf),
128 byte_order);
129 if (next_element != element)
130 break;
131 }
132
133 if (reps == 1)
134 fprintf_filtered (stream, "%d: ", i);
135 else
136 fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
137
138 if (element == 0)
139 fprintf_filtered (stream, "null");
140 else
141 fprintf_filtered (stream, "@%s", paddress (gdbarch, element));
142
143 things_printed++;
144 i += reps;
145 }
146 }
147 else
148 {
149 struct value *v = allocate_value (el_type);
150 struct value *next_v = allocate_value (el_type);
151
152 set_value_address (v, (address
153 + get_java_object_header_size (gdbarch) + 4));
154 set_value_address (next_v, value_raw_address (v));
155
156 while (i < length && things_printed < options->print_max)
157 {
158 fputs_filtered (", ", stream);
159 wrap_here (n_spaces (2));
160
161 if (i > 0)
162 {
163 struct value *tmp;
164
165 tmp = next_v;
166 next_v = v;
167 v = tmp;
168 }
169 else
170 {
171 set_value_lazy (v, 1);
172 set_value_offset (v, 0);
173 }
174
175 set_value_offset (next_v, value_offset (v));
176
177 for (reps = 1; i + reps < length; reps++)
178 {
179 set_value_lazy (next_v, 1);
180 set_value_offset (next_v, value_offset (next_v)
181 + TYPE_LENGTH (el_type));
182 value_fetch_lazy (next_v);
183 if (!(value_available_contents_eq
184 (v, value_embedded_offset (v),
185 next_v, value_embedded_offset (next_v),
186 TYPE_LENGTH (el_type))))
187 break;
188 }
189
190 if (reps == 1)
191 fprintf_filtered (stream, "%d: ", i);
192 else
193 fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
194
195 opts = *options;
196 opts.deref_ref = 1;
197 common_val_print (v, stream, 1, &opts, current_language);
198
199 things_printed++;
200 i += reps;
201 }
202 }
203
204 if (i < length)
205 fprintf_filtered (stream, "...");
206
207 fprintf_filtered (stream, "}");
208
209 return 0;
210 }
211
212 /* If it's type String, print it. */
213
214 if (TYPE_CODE (type) == TYPE_CODE_PTR
215 && TYPE_TARGET_TYPE (type)
216 && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type))
217 && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)),
218 "java.lang.String") == 0
219 && (options->format == 0 || options->format == 's')
220 && address != 0
221 && value_as_address (val) != 0)
222 {
223 struct type *char_type;
224 struct value *data_val;
225 CORE_ADDR data;
226 struct value *boffset_val;
227 unsigned long boffset;
228 struct value *count_val;
229 unsigned long count;
230 struct value *mark;
231
232 mark = value_mark (); /* Remember start of new values. */
233
234 data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
235 data = value_as_address (data_val);
236
237 boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
238 boffset = value_as_address (boffset_val);
239
240 count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
241 count = value_as_address (count_val);
242
243 value_free_to_mark (mark); /* Release unnecessary values. */
244
245 char_type = builtin_java_type (gdbarch)->builtin_char;
246 val_print_string (char_type, NULL, data + boffset, count, stream,
247 options);
248
249 return 0;
250 }
251
252 opts = *options;
253 opts.deref_ref = 1;
254 return common_val_print (val, stream, 0, &opts, current_language);
255 }
256
257 /* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
258 same meanings as in cp_print_value and c_val_print.
259
260 DONT_PRINT is an array of baseclass types that we
261 should not print, or zero if called from top level. */
262
263 static void
264 java_print_value_fields (struct type *type, const gdb_byte *valaddr,
265 int offset,
266 CORE_ADDR address, struct ui_file *stream,
267 int recurse,
268 const struct value *val,
269 const struct value_print_options *options)
270 {
271 int i, len, n_baseclasses;
272
273 CHECK_TYPEDEF (type);
274
275 fprintf_filtered (stream, "{");
276 len = TYPE_NFIELDS (type);
277 n_baseclasses = TYPE_N_BASECLASSES (type);
278
279 if (n_baseclasses > 0)
280 {
281 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
282
283 for (i = 0; i < n_baseclasses; i++)
284 {
285 int boffset;
286 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
287 char *basename = TYPE_NAME (baseclass);
288 const gdb_byte *base_valaddr;
289
290 if (BASETYPE_VIA_VIRTUAL (type, i))
291 continue;
292
293 if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
294 continue;
295
296 boffset = 0;
297
298 if (options->pretty)
299 {
300 fprintf_filtered (stream, "\n");
301 print_spaces_filtered (2 * (recurse + 1), stream);
302 }
303 fputs_filtered ("<", stream);
304 /* Not sure what the best notation is in the case where there is no
305 baseclass name. */
306 fputs_filtered (basename ? basename : "", stream);
307 fputs_filtered ("> = ", stream);
308
309 base_valaddr = valaddr;
310
311 java_print_value_fields (baseclass, base_valaddr,
312 offset + boffset, address,
313 stream, recurse + 1, val, options);
314 fputs_filtered (", ", stream);
315 }
316 }
317
318 if (!len && n_baseclasses == 1)
319 fprintf_filtered (stream, "<No data fields>");
320 else
321 {
322 int fields_seen = 0;
323
324 for (i = n_baseclasses; i < len; i++)
325 {
326 /* If requested, skip printing of static fields. */
327 if (field_is_static (&TYPE_FIELD (type, i)))
328 {
329 char *name = TYPE_FIELD_NAME (type, i);
330
331 if (!options->static_field_print)
332 continue;
333 if (name != NULL && strcmp (name, "class") == 0)
334 continue;
335 }
336 if (fields_seen)
337 fprintf_filtered (stream, ", ");
338 else if (n_baseclasses > 0)
339 {
340 if (options->pretty)
341 {
342 fprintf_filtered (stream, "\n");
343 print_spaces_filtered (2 + 2 * recurse, stream);
344 fputs_filtered ("members of ", stream);
345 fputs_filtered (type_name_no_tag (type), stream);
346 fputs_filtered (": ", stream);
347 }
348 }
349 fields_seen = 1;
350
351 if (options->pretty)
352 {
353 fprintf_filtered (stream, "\n");
354 print_spaces_filtered (2 + 2 * recurse, stream);
355 }
356 else
357 {
358 wrap_here (n_spaces (2 + 2 * recurse));
359 }
360 if (options->inspect_it)
361 {
362 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
363 fputs_filtered ("\"( ptr \"", stream);
364 else
365 fputs_filtered ("\"( nodef \"", stream);
366 if (field_is_static (&TYPE_FIELD (type, i)))
367 fputs_filtered ("static ", stream);
368 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
369 language_cplus,
370 DMGL_PARAMS | DMGL_ANSI);
371 fputs_filtered ("\" \"", stream);
372 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
373 language_cplus,
374 DMGL_PARAMS | DMGL_ANSI);
375 fputs_filtered ("\") \"", stream);
376 }
377 else
378 {
379 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
380
381 if (field_is_static (&TYPE_FIELD (type, i)))
382 fputs_filtered ("static ", stream);
383 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
384 language_cplus,
385 DMGL_PARAMS | DMGL_ANSI);
386 annotate_field_name_end ();
387 fputs_filtered (": ", stream);
388 annotate_field_value ();
389 }
390
391 if (!field_is_static (&TYPE_FIELD (type, i))
392 && TYPE_FIELD_PACKED (type, i))
393 {
394 struct value *v;
395
396 /* Bitfields require special handling, especially due to byte
397 order problems. */
398 if (TYPE_FIELD_IGNORE (type, i))
399 {
400 fputs_filtered ("<optimized out or zero length>", stream);
401 }
402 else if (value_bits_synthetic_pointer (val,
403 TYPE_FIELD_BITPOS (type,
404 i),
405 TYPE_FIELD_BITSIZE (type,
406 i)))
407 {
408 fputs_filtered (_("<synthetic pointer>"), stream);
409 }
410 else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
411 TYPE_FIELD_BITSIZE (type, i)))
412 {
413 val_print_optimized_out (stream);
414 }
415 else
416 {
417 struct value_print_options opts;
418
419 v = value_from_longest
420 (TYPE_FIELD_TYPE (type, i),
421 unpack_field_as_long (type, valaddr + offset, i));
422
423 opts = *options;
424 opts.deref_ref = 0;
425 common_val_print (v, stream, recurse + 1,
426 &opts, current_language);
427 }
428 }
429 else
430 {
431 if (TYPE_FIELD_IGNORE (type, i))
432 {
433 fputs_filtered ("<optimized out or zero length>", stream);
434 }
435 else if (field_is_static (&TYPE_FIELD (type, i)))
436 {
437 struct value *v = value_static_field (type, i);
438
439 if (v == NULL)
440 val_print_optimized_out (stream);
441 else
442 {
443 struct value_print_options opts;
444 struct type *t = check_typedef (value_type (v));
445
446 if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
447 v = value_addr (v);
448 opts = *options;
449 opts.deref_ref = 0;
450 common_val_print (v, stream, recurse + 1,
451 &opts, current_language);
452 }
453 }
454 else if (TYPE_FIELD_TYPE (type, i) == NULL)
455 fputs_filtered ("<unknown type>", stream);
456 else
457 {
458 struct value_print_options opts = *options;
459
460 opts.deref_ref = 0;
461 val_print (TYPE_FIELD_TYPE (type, i),
462 valaddr,
463 offset + TYPE_FIELD_BITPOS (type, i) / 8,
464 address, stream, recurse + 1, val, &opts,
465 current_language);
466 }
467 }
468 annotate_field_end ();
469 }
470
471 if (options->pretty)
472 {
473 fprintf_filtered (stream, "\n");
474 print_spaces_filtered (2 * recurse, stream);
475 }
476 }
477 fprintf_filtered (stream, "}");
478 }
479
480 /* See val_print for a description of the various parameters of this
481 function; they are identical. The semantics of the return value is
482 also identical to val_print. */
483
484 int
485 java_val_print (struct type *type, const gdb_byte *valaddr,
486 int embedded_offset, CORE_ADDR address,
487 struct ui_file *stream, int recurse,
488 const struct value *val,
489 const struct value_print_options *options)
490 {
491 struct gdbarch *gdbarch = get_type_arch (type);
492 unsigned int i = 0; /* Number of characters printed. */
493 struct type *target_type;
494 CORE_ADDR addr;
495
496 CHECK_TYPEDEF (type);
497 switch (TYPE_CODE (type))
498 {
499 case TYPE_CODE_PTR:
500 if (options->format && options->format != 's')
501 {
502 val_print_scalar_formatted (type, valaddr, embedded_offset,
503 val, options, 0, stream);
504 break;
505 }
506 #if 0
507 if (options->vtblprint && cp_is_vtbl_ptr_type (type))
508 {
509 /* Print the unmangled name if desired. */
510 /* Print vtable entry - we only get here if we ARE using
511 -fvtable_thunks. (Otherwise, look under TYPE_CODE_STRUCT.) */
512 /* Extract an address, assume that it is unsigned. */
513 print_address_demangle
514 (gdbarch,
515 extract_unsigned_integer (valaddr + embedded_offset,
516 TYPE_LENGTH (type)),
517 stream, demangle);
518 break;
519 }
520 #endif
521 addr = unpack_pointer (type, valaddr + embedded_offset);
522 if (addr == 0)
523 {
524 fputs_filtered ("null", stream);
525 return i;
526 }
527 target_type = check_typedef (TYPE_TARGET_TYPE (type));
528
529 if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
530 {
531 /* Try to print what function it points to. */
532 print_address_demangle (gdbarch, addr, stream, demangle);
533 /* Return value is irrelevant except for string pointers. */
534 return (0);
535 }
536
537 if (options->addressprint && options->format != 's')
538 {
539 fputs_filtered ("@", stream);
540 print_longest (stream, 'x', 0, (ULONGEST) addr);
541 }
542
543 return i;
544
545 case TYPE_CODE_CHAR:
546 case TYPE_CODE_INT:
547 /* Can't just call c_val_print because that prints bytes as C
548 chars. */
549 if (options->format || options->output_format)
550 {
551 struct value_print_options opts = *options;
552
553 opts.format = (options->format ? options->format
554 : options->output_format);
555 val_print_scalar_formatted (type, valaddr, embedded_offset,
556 val, &opts, 0, stream);
557 }
558 else if (TYPE_CODE (type) == TYPE_CODE_CHAR
559 || (TYPE_CODE (type) == TYPE_CODE_INT
560 && TYPE_LENGTH (type) == 2
561 && strcmp (TYPE_NAME (type), "char") == 0))
562 LA_PRINT_CHAR ((int) unpack_long (type, valaddr + embedded_offset),
563 type, stream);
564 else
565 val_print_type_code_int (type, valaddr + embedded_offset, stream);
566 break;
567
568 case TYPE_CODE_STRUCT:
569 java_print_value_fields (type, valaddr, embedded_offset,
570 address, stream, recurse, val, options);
571 break;
572
573 default:
574 return c_val_print (type, valaddr, embedded_offset, address, stream,
575 recurse, val, options);
576 }
577
578 return 0;
579 }
This page took 0.073758 seconds and 4 git commands to generate.