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