]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/jv-valprint.c
Update year range in copyright notice of all files owned by the GDB project.
[thirdparty/binutils-gdb.git] / gdb / jv-valprint.c
CommitLineData
c906108c 1/* Support for printing Java values for GDB, the GNU debugger.
1e4728e7 2
32d0add0 3 Copyright (C) 1997-2015 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "symtab.h"
22#include "gdbtypes.h"
7a292a7a 23#include "gdbcore.h"
c906108c
SS
24#include "expression.h"
25#include "value.h"
26#include "demangle.h"
27#include "valprint.h"
28#include "language.h"
29#include "jv-lang.h"
30#include "c-lang.h"
7a292a7a 31#include "annotate.h"
392a587b
JM
32/* Local functions */
33
8e069a98 34void
79a45b7d
TT
35java_value_print (struct value *val, struct ui_file *stream,
36 const struct value_print_options *options)
c906108c 37{
50810684 38 struct gdbarch *gdbarch = get_type_arch (value_type (val));
e17a4113 39 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
c906108c
SS
40 struct type *type;
41 CORE_ADDR address;
42 int i;
0d5cff50 43 const char *name;
79a45b7d 44 struct value_print_options opts;
c906108c 45
df407dfe 46 type = value_type (val);
42ae5230 47 address = value_address (val);
c906108c
SS
48
49 if (is_object_type (type))
50 {
51 CORE_ADDR obj_addr;
b7b189f3 52 struct value *tem = val;
c906108c 53
1777feb0 54 /* Get the run-time type, and cast the object into that. */
b7b189f3
TT
55 while (TYPE_CODE (value_type (tem)) == TYPE_CODE_PTR)
56 tem = value_ind (tem);
c906108c 57
b7b189f3 58 obj_addr = value_address (tem);
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);
9f1f738a 66 type = value_type (val);
c906108c
SS
67 }
68 }
69
c5aa993b 70 if (TYPE_CODE (type) == TYPE_CODE_PTR && !value_logical_not (val))
c906108c
SS
71 type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
72
73 name = TYPE_TAG_NAME (type);
74 if (TYPE_CODE (type) == TYPE_CODE_STRUCT && name != NULL
c5aa993b 75 && (i = strlen (name), name[i - 1] == ']'))
c906108c 76 {
c68a6671 77 gdb_byte buf4[4];
c906108c
SS
78 long length;
79 unsigned int things_printed = 0;
c5aa993b 80 int reps;
0daa2b63
UW
81 struct type *el_type
82 = java_primitive_type_from_name (gdbarch, name, i - 2);
e0881a8e 83
c906108c 84 i = 0;
45d5d5ca 85 read_memory (address + get_java_object_header_size (gdbarch), buf4, 4);
c906108c 86
e17a4113 87 length = (long) extract_signed_integer (buf4, 4, byte_order);
c906108c
SS
88 fprintf_filtered (stream, "{length: %ld", length);
89
90 if (el_type == NULL)
91 {
c65ecaf3 92 CORE_ADDR element;
1777feb0 93 CORE_ADDR next_element = -1; /* Dummy initial value. */
c906108c 94
1777feb0 95 /* Skip object header and length. */
45d5d5ca 96 address += get_java_object_header_size (gdbarch) + 4;
c906108c 97
79a45b7d 98 while (i < length && things_printed < options->print_max)
c906108c 99 {
c68a6671 100 gdb_byte *buf;
c906108c 101
45d5d5ca 102 buf = alloca (gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT);
c906108c
SS
103 fputs_filtered (", ", stream);
104 wrap_here (n_spaces (2));
105
106 if (i > 0)
107 element = next_element;
108 else
109 {
c5aa993b 110 read_memory (address, buf, sizeof (buf));
45d5d5ca 111 address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
b276f1bb
AC
112 /* FIXME: cagney/2003-05-24: Bogus or what. It
113 pulls a host sized pointer out of the target and
114 then extracts that as an address (while assuming
115 that the address is unsigned)! */
e17a4113
UW
116 element = extract_unsigned_integer (buf, sizeof (buf),
117 byte_order);
c906108c
SS
118 }
119
c5aa993b 120 for (reps = 1; i + reps < length; reps++)
c906108c 121 {
c5aa993b 122 read_memory (address, buf, sizeof (buf));
45d5d5ca 123 address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
b276f1bb
AC
124 /* FIXME: cagney/2003-05-24: Bogus or what. It
125 pulls a host sized pointer out of the target and
126 then extracts that as an address (while assuming
127 that the address is unsigned)! */
e17a4113
UW
128 next_element = extract_unsigned_integer (buf, sizeof (buf),
129 byte_order);
c906108c
SS
130 if (next_element != element)
131 break;
132 }
133
134 if (reps == 1)
135 fprintf_filtered (stream, "%d: ", i);
136 else
137 fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
138
139 if (element == 0)
140 fprintf_filtered (stream, "null");
141 else
5af949e3 142 fprintf_filtered (stream, "@%s", paddress (gdbarch, element));
c906108c
SS
143
144 things_printed++;
145 i += reps;
146 }
147 }
148 else
149 {
75c9979e
AC
150 struct value *v = allocate_value (el_type);
151 struct value *next_v = allocate_value (el_type);
c906108c 152
45d5d5ca
UW
153 set_value_address (v, (address
154 + get_java_object_header_size (gdbarch) + 4));
42ae5230 155 set_value_address (next_v, value_raw_address (v));
c906108c 156
79a45b7d 157 while (i < length && things_printed < options->print_max)
c906108c
SS
158 {
159 fputs_filtered (", ", stream);
160 wrap_here (n_spaces (2));
161
162 if (i > 0)
163 {
75c9979e 164 struct value *tmp;
c906108c
SS
165
166 tmp = next_v;
167 next_v = v;
168 v = tmp;
169 }
170 else
171 {
dfa52d88 172 set_value_lazy (v, 1);
f5cf64a7 173 set_value_offset (v, 0);
c906108c
SS
174 }
175
f5cf64a7 176 set_value_offset (next_v, value_offset (v));
c906108c 177
c5aa993b 178 for (reps = 1; i + reps < length; reps++)
c906108c 179 {
dfa52d88 180 set_value_lazy (next_v, 1);
1777feb0
MS
181 set_value_offset (next_v, value_offset (next_v)
182 + TYPE_LENGTH (el_type));
c8c1c22f 183 value_fetch_lazy (next_v);
9a0dc9e3
PA
184 if (!value_contents_eq (v, value_embedded_offset (v),
185 next_v,
186 value_embedded_offset (next_v),
187 TYPE_LENGTH (el_type)))
c906108c
SS
188 break;
189 }
190
191 if (reps == 1)
192 fprintf_filtered (stream, "%d: ", i);
193 else
194 fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
195
79a45b7d
TT
196 opts = *options;
197 opts.deref_ref = 1;
198 common_val_print (v, stream, 1, &opts, current_language);
c906108c
SS
199
200 things_printed++;
201 i += reps;
202 }
203 }
204
205 if (i < length)
206 fprintf_filtered (stream, "...");
207
208 fprintf_filtered (stream, "}");
209
8e069a98 210 return;
c906108c
SS
211 }
212
1777feb0 213 /* If it's type String, print it. */
c906108c
SS
214
215 if (TYPE_CODE (type) == TYPE_CODE_PTR
216 && TYPE_TARGET_TYPE (type)
d4cad8db
TT
217 && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type))
218 && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)),
219 "java.lang.String") == 0
79a45b7d 220 && (options->format == 0 || options->format == 's')
8dccf761 221 && address != 0
1aa20aa8 222 && value_as_address (val) != 0)
c906108c 223 {
0daa2b63 224 struct type *char_type;
75c9979e 225 struct value *data_val;
c906108c 226 CORE_ADDR data;
75c9979e 227 struct value *boffset_val;
c906108c 228 unsigned long boffset;
75c9979e 229 struct value *count_val;
c906108c 230 unsigned long count;
75c9979e 231 struct value *mark;
c906108c 232
b012acdd
TT
233 fputs_filtered (" ", stream);
234
1777feb0 235 mark = value_mark (); /* Remember start of new values. */
c906108c
SS
236
237 data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
1aa20aa8 238 data = value_as_address (data_val);
c906108c
SS
239
240 boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
1aa20aa8 241 boffset = value_as_address (boffset_val);
c906108c
SS
242
243 count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
1aa20aa8 244 count = value_as_address (count_val);
c906108c 245
1777feb0 246 value_free_to_mark (mark); /* Release unnecessary values. */
c906108c 247
0daa2b63 248 char_type = builtin_java_type (gdbarch)->builtin_char;
09ca9e2e
TT
249 val_print_string (char_type, NULL, data + boffset, count, stream,
250 options);
c906108c 251
8e069a98 252 return;
c906108c
SS
253 }
254
79a45b7d
TT
255 opts = *options;
256 opts.deref_ref = 1;
8e069a98 257 common_val_print (val, stream, 0, &opts, current_language);
c906108c
SS
258}
259
79a45b7d 260/* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
c906108c
SS
261 same meanings as in cp_print_value and c_val_print.
262
263 DONT_PRINT is an array of baseclass types that we
264 should not print, or zero if called from top level. */
265
392a587b 266static void
fc1a4b47 267java_print_value_fields (struct type *type, const gdb_byte *valaddr,
490f124f 268 int offset,
a2bd3dcd 269 CORE_ADDR address, struct ui_file *stream,
79a45b7d 270 int recurse,
0e03807e 271 const struct value *val,
79a45b7d 272 const struct value_print_options *options)
c906108c
SS
273{
274 int i, len, n_baseclasses;
275
276 CHECK_TYPEDEF (type);
277
278 fprintf_filtered (stream, "{");
279 len = TYPE_NFIELDS (type);
280 n_baseclasses = TYPE_N_BASECLASSES (type);
281
282 if (n_baseclasses > 0)
283 {
284 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
285
286 for (i = 0; i < n_baseclasses; i++)
287 {
288 int boffset;
289 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
0d5cff50 290 const char *basename = TYPE_NAME (baseclass);
fc1a4b47 291 const gdb_byte *base_valaddr;
c5aa993b 292
c906108c
SS
293 if (BASETYPE_VIA_VIRTUAL (type, i))
294 continue;
295
296 if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
297 continue;
298
299 boffset = 0;
300
2a998fc0 301 if (options->prettyformat)
c906108c
SS
302 {
303 fprintf_filtered (stream, "\n");
c5aa993b 304 print_spaces_filtered (2 * (recurse + 1), stream);
c906108c
SS
305 }
306 fputs_filtered ("<", stream);
307 /* Not sure what the best notation is in the case where there is no
308 baseclass name. */
309 fputs_filtered (basename ? basename : "", stream);
310 fputs_filtered ("> = ", stream);
311
312 base_valaddr = valaddr;
313
490f124f
PA
314 java_print_value_fields (baseclass, base_valaddr,
315 offset + boffset, address,
0e03807e 316 stream, recurse + 1, val, options);
c906108c 317 fputs_filtered (", ", stream);
c906108c 318 }
c906108c
SS
319 }
320
321 if (!len && n_baseclasses == 1)
322 fprintf_filtered (stream, "<No data fields>");
323 else
324 {
c906108c
SS
325 int fields_seen = 0;
326
327 for (i = n_baseclasses; i < len; i++)
328 {
329 /* If requested, skip printing of static fields. */
d6a843b5 330 if (field_is_static (&TYPE_FIELD (type, i)))
c906108c 331 {
0d5cff50 332 const char *name = TYPE_FIELD_NAME (type, i);
e0881a8e 333
79a45b7d 334 if (!options->static_field_print)
c906108c
SS
335 continue;
336 if (name != NULL && strcmp (name, "class") == 0)
337 continue;
338 }
339 if (fields_seen)
340 fprintf_filtered (stream, ", ");
341 else if (n_baseclasses > 0)
342 {
2a998fc0 343 if (options->prettyformat)
c906108c
SS
344 {
345 fprintf_filtered (stream, "\n");
346 print_spaces_filtered (2 + 2 * recurse, stream);
347 fputs_filtered ("members of ", stream);
348 fputs_filtered (type_name_no_tag (type), stream);
349 fputs_filtered (": ", stream);
350 }
351 }
352 fields_seen = 1;
353
2a998fc0 354 if (options->prettyformat)
c906108c
SS
355 {
356 fprintf_filtered (stream, "\n");
357 print_spaces_filtered (2 + 2 * recurse, stream);
358 }
c5aa993b 359 else
c906108c
SS
360 {
361 wrap_here (n_spaces (2 + 2 * recurse));
362 }
e93a8774
TT
363
364 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
365
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 annotate_field_name_end ();
372 fputs_filtered (": ", stream);
373 annotate_field_value ();
c906108c 374
d6a843b5
JK
375 if (!field_is_static (&TYPE_FIELD (type, i))
376 && TYPE_FIELD_PACKED (type, i))
c906108c 377 {
75c9979e 378 struct value *v;
c906108c
SS
379
380 /* Bitfields require special handling, especially due to byte
c5aa993b 381 order problems. */
c906108c
SS
382 if (TYPE_FIELD_IGNORE (type, i))
383 {
c5aa993b 384 fputs_filtered ("<optimized out or zero length>", stream);
c906108c 385 }
8cf6f0b1
TT
386 else if (value_bits_synthetic_pointer (val,
387 TYPE_FIELD_BITPOS (type,
388 i),
389 TYPE_FIELD_BITSIZE (type,
390 i)))
391 {
392 fputs_filtered (_("<synthetic pointer>"), stream);
393 }
c906108c
SS
394 else
395 {
79a45b7d
TT
396 struct value_print_options opts;
397
5467c6c8 398 v = value_field_bitfield (type, i, valaddr, offset, val);
c906108c 399
79a45b7d
TT
400 opts = *options;
401 opts.deref_ref = 0;
402 common_val_print (v, stream, recurse + 1,
403 &opts, current_language);
c906108c
SS
404 }
405 }
406 else
407 {
408 if (TYPE_FIELD_IGNORE (type, i))
409 {
c5aa993b 410 fputs_filtered ("<optimized out or zero length>", stream);
c906108c 411 }
d6a843b5 412 else if (field_is_static (&TYPE_FIELD (type, i)))
c906108c 413 {
686d4def 414 struct value_print_options opts;
75c9979e 415 struct value *v = value_static_field (type, i);
686d4def 416 struct type *t = check_typedef (value_type (v));
e0881a8e 417
686d4def
PA
418 if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
419 v = value_addr (v);
420 opts = *options;
421 opts.deref_ref = 0;
422 common_val_print (v, stream, recurse + 1,
423 &opts, current_language);
c906108c 424 }
7a292a7a
SS
425 else if (TYPE_FIELD_TYPE (type, i) == NULL)
426 fputs_filtered ("<unknown type>", stream);
c906108c
SS
427 else
428 {
79a45b7d 429 struct value_print_options opts = *options;
e0881a8e 430
79a45b7d 431 opts.deref_ref = 0;
c5aa993b 432 val_print (TYPE_FIELD_TYPE (type, i),
490f124f
PA
433 valaddr,
434 offset + TYPE_FIELD_BITPOS (type, i) / 8,
435 address, stream, recurse + 1, val, &opts,
d8ca156b 436 current_language);
c906108c
SS
437 }
438 }
439 annotate_field_end ();
440 }
441
2a998fc0 442 if (options->prettyformat)
c906108c
SS
443 {
444 fprintf_filtered (stream, "\n");
445 print_spaces_filtered (2 * recurse, stream);
446 }
447 }
448 fprintf_filtered (stream, "}");
449}
450
32b72a42 451/* See val_print for a description of the various parameters of this
d3eab38a 452 function; they are identical. */
c906108c 453
d3eab38a 454void
fc1a4b47 455java_val_print (struct type *type, const gdb_byte *valaddr,
a2bd3dcd 456 int embedded_offset, CORE_ADDR address,
79a45b7d 457 struct ui_file *stream, int recurse,
0e03807e 458 const struct value *val,
79a45b7d 459 const struct value_print_options *options)
c906108c 460{
5af949e3 461 struct gdbarch *gdbarch = get_type_arch (type);
c906108c
SS
462 struct type *target_type;
463 CORE_ADDR addr;
464
465 CHECK_TYPEDEF (type);
466 switch (TYPE_CODE (type))
467 {
468 case TYPE_CODE_PTR:
79a45b7d 469 if (options->format && options->format != 's')
c906108c 470 {
ab2188aa
PA
471 val_print_scalar_formatted (type, valaddr, embedded_offset,
472 val, options, 0, stream);
c906108c
SS
473 break;
474 }
490f124f 475 addr = unpack_pointer (type, valaddr + embedded_offset);
c906108c
SS
476 if (addr == 0)
477 {
478 fputs_filtered ("null", stream);
d3eab38a 479 return;
c906108c
SS
480 }
481 target_type = check_typedef (TYPE_TARGET_TYPE (type));
482
483 if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
484 {
485 /* Try to print what function it points to. */
edf0c1b7 486 print_address_demangle (options, gdbarch, addr, stream, demangle);
d3eab38a 487 return;
c906108c
SS
488 }
489
79a45b7d 490 if (options->addressprint && options->format != 's')
c906108c
SS
491 {
492 fputs_filtered ("@", stream);
493 print_longest (stream, 'x', 0, (ULONGEST) addr);
494 }
495
d3eab38a 496 return;
c906108c
SS
497
498 case TYPE_CODE_CHAR:
c906108c 499 case TYPE_CODE_INT:
c55a3f73
TT
500 /* Can't just call c_val_print because that prints bytes as C
501 chars. */
79a45b7d
TT
502 if (options->format || options->output_format)
503 {
504 struct value_print_options opts = *options;
e0881a8e 505
79a45b7d
TT
506 opts.format = (options->format ? options->format
507 : options->output_format);
ab2188aa
PA
508 val_print_scalar_formatted (type, valaddr, embedded_offset,
509 val, &opts, 0, stream);
79a45b7d 510 }
c55a3f73
TT
511 else if (TYPE_CODE (type) == TYPE_CODE_CHAR
512 || (TYPE_CODE (type) == TYPE_CODE_INT
513 && TYPE_LENGTH (type) == 2
514 && strcmp (TYPE_NAME (type), "char") == 0))
490f124f
PA
515 LA_PRINT_CHAR ((int) unpack_long (type, valaddr + embedded_offset),
516 type, stream);
c906108c 517 else
490f124f 518 val_print_type_code_int (type, valaddr + embedded_offset, stream);
c906108c
SS
519 break;
520
521 case TYPE_CODE_STRUCT:
490f124f
PA
522 java_print_value_fields (type, valaddr, embedded_offset,
523 address, stream, recurse, val, options);
c906108c
SS
524 break;
525
526 default:
d3eab38a
TT
527 c_val_print (type, valaddr, embedded_offset, address, stream,
528 recurse, val, options);
529 break;
c906108c 530 }
c906108c 531}