]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/jv-valprint.c
Add casts to memory allocation related calls
[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
224c3ddb
SM
102 buf = ((gdb_byte *)
103 alloca (gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT));
c906108c
SS
104 fputs_filtered (", ", stream);
105 wrap_here (n_spaces (2));
106
107 if (i > 0)
108 element = next_element;
109 else
110 {
c5aa993b 111 read_memory (address, buf, sizeof (buf));
45d5d5ca 112 address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
b276f1bb
AC
113 /* FIXME: cagney/2003-05-24: Bogus or what. It
114 pulls a host sized pointer out of the target and
115 then extracts that as an address (while assuming
116 that the address is unsigned)! */
e17a4113
UW
117 element = extract_unsigned_integer (buf, sizeof (buf),
118 byte_order);
c906108c
SS
119 }
120
c5aa993b 121 for (reps = 1; i + reps < length; reps++)
c906108c 122 {
c5aa993b 123 read_memory (address, buf, sizeof (buf));
45d5d5ca 124 address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
b276f1bb
AC
125 /* FIXME: cagney/2003-05-24: Bogus or what. It
126 pulls a host sized pointer out of the target and
127 then extracts that as an address (while assuming
128 that the address is unsigned)! */
e17a4113
UW
129 next_element = extract_unsigned_integer (buf, sizeof (buf),
130 byte_order);
c906108c
SS
131 if (next_element != element)
132 break;
133 }
134
135 if (reps == 1)
136 fprintf_filtered (stream, "%d: ", i);
137 else
138 fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
139
140 if (element == 0)
141 fprintf_filtered (stream, "null");
142 else
5af949e3 143 fprintf_filtered (stream, "@%s", paddress (gdbarch, element));
c906108c
SS
144
145 things_printed++;
146 i += reps;
147 }
148 }
149 else
150 {
75c9979e
AC
151 struct value *v = allocate_value (el_type);
152 struct value *next_v = allocate_value (el_type);
c906108c 153
45d5d5ca
UW
154 set_value_address (v, (address
155 + get_java_object_header_size (gdbarch) + 4));
42ae5230 156 set_value_address (next_v, value_raw_address (v));
c906108c 157
79a45b7d 158 while (i < length && things_printed < options->print_max)
c906108c
SS
159 {
160 fputs_filtered (", ", stream);
161 wrap_here (n_spaces (2));
162
163 if (i > 0)
164 {
75c9979e 165 struct value *tmp;
c906108c
SS
166
167 tmp = next_v;
168 next_v = v;
169 v = tmp;
170 }
171 else
172 {
dfa52d88 173 set_value_lazy (v, 1);
f5cf64a7 174 set_value_offset (v, 0);
c906108c
SS
175 }
176
f5cf64a7 177 set_value_offset (next_v, value_offset (v));
c906108c 178
c5aa993b 179 for (reps = 1; i + reps < length; reps++)
c906108c 180 {
dfa52d88 181 set_value_lazy (next_v, 1);
1777feb0
MS
182 set_value_offset (next_v, value_offset (next_v)
183 + TYPE_LENGTH (el_type));
c8c1c22f 184 value_fetch_lazy (next_v);
9a0dc9e3
PA
185 if (!value_contents_eq (v, value_embedded_offset (v),
186 next_v,
187 value_embedded_offset (next_v),
188 TYPE_LENGTH (el_type)))
c906108c
SS
189 break;
190 }
191
192 if (reps == 1)
193 fprintf_filtered (stream, "%d: ", i);
194 else
195 fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
196
79a45b7d
TT
197 opts = *options;
198 opts.deref_ref = 1;
199 common_val_print (v, stream, 1, &opts, current_language);
c906108c
SS
200
201 things_printed++;
202 i += reps;
203 }
204 }
205
206 if (i < length)
207 fprintf_filtered (stream, "...");
208
209 fprintf_filtered (stream, "}");
210
8e069a98 211 return;
c906108c
SS
212 }
213
1777feb0 214 /* If it's type String, print it. */
c906108c
SS
215
216 if (TYPE_CODE (type) == TYPE_CODE_PTR
217 && TYPE_TARGET_TYPE (type)
d4cad8db
TT
218 && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type))
219 && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)),
220 "java.lang.String") == 0
79a45b7d 221 && (options->format == 0 || options->format == 's')
8dccf761 222 && address != 0
1aa20aa8 223 && value_as_address (val) != 0)
c906108c 224 {
0daa2b63 225 struct type *char_type;
75c9979e 226 struct value *data_val;
c906108c 227 CORE_ADDR data;
75c9979e 228 struct value *boffset_val;
c906108c 229 unsigned long boffset;
75c9979e 230 struct value *count_val;
c906108c 231 unsigned long count;
75c9979e 232 struct value *mark;
c906108c 233
b012acdd
TT
234 fputs_filtered (" ", stream);
235
1777feb0 236 mark = value_mark (); /* Remember start of new values. */
c906108c
SS
237
238 data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
1aa20aa8 239 data = value_as_address (data_val);
c906108c
SS
240
241 boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
1aa20aa8 242 boffset = value_as_address (boffset_val);
c906108c
SS
243
244 count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
1aa20aa8 245 count = value_as_address (count_val);
c906108c 246
1777feb0 247 value_free_to_mark (mark); /* Release unnecessary values. */
c906108c 248
0daa2b63 249 char_type = builtin_java_type (gdbarch)->builtin_char;
09ca9e2e
TT
250 val_print_string (char_type, NULL, data + boffset, count, stream,
251 options);
c906108c 252
8e069a98 253 return;
c906108c
SS
254 }
255
79a45b7d
TT
256 opts = *options;
257 opts.deref_ref = 1;
8e069a98 258 common_val_print (val, stream, 0, &opts, current_language);
c906108c
SS
259}
260
79a45b7d 261/* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
c906108c
SS
262 same meanings as in cp_print_value and c_val_print.
263
264 DONT_PRINT is an array of baseclass types that we
265 should not print, or zero if called from top level. */
266
392a587b 267static void
fc1a4b47 268java_print_value_fields (struct type *type, const gdb_byte *valaddr,
490f124f 269 int offset,
a2bd3dcd 270 CORE_ADDR address, struct ui_file *stream,
79a45b7d 271 int recurse,
0e03807e 272 const struct value *val,
79a45b7d 273 const struct value_print_options *options)
c906108c
SS
274{
275 int i, len, n_baseclasses;
276
f168693b 277 type = check_typedef (type);
c906108c
SS
278
279 fprintf_filtered (stream, "{");
280 len = TYPE_NFIELDS (type);
281 n_baseclasses = TYPE_N_BASECLASSES (type);
282
283 if (n_baseclasses > 0)
284 {
285 int i, n_baseclasses = TYPE_N_BASECLASSES (type);
286
287 for (i = 0; i < n_baseclasses; i++)
288 {
289 int boffset;
290 struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
0d5cff50 291 const char *basename = TYPE_NAME (baseclass);
fc1a4b47 292 const gdb_byte *base_valaddr;
c5aa993b 293
c906108c
SS
294 if (BASETYPE_VIA_VIRTUAL (type, i))
295 continue;
296
297 if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
298 continue;
299
300 boffset = 0;
301
2a998fc0 302 if (options->prettyformat)
c906108c
SS
303 {
304 fprintf_filtered (stream, "\n");
c5aa993b 305 print_spaces_filtered (2 * (recurse + 1), stream);
c906108c
SS
306 }
307 fputs_filtered ("<", stream);
308 /* Not sure what the best notation is in the case where there is no
309 baseclass name. */
310 fputs_filtered (basename ? basename : "", stream);
311 fputs_filtered ("> = ", stream);
312
313 base_valaddr = valaddr;
314
490f124f
PA
315 java_print_value_fields (baseclass, base_valaddr,
316 offset + boffset, address,
0e03807e 317 stream, recurse + 1, val, options);
c906108c 318 fputs_filtered (", ", stream);
c906108c 319 }
c906108c
SS
320 }
321
322 if (!len && n_baseclasses == 1)
323 fprintf_filtered (stream, "<No data fields>");
324 else
325 {
c906108c
SS
326 int fields_seen = 0;
327
328 for (i = n_baseclasses; i < len; i++)
329 {
330 /* If requested, skip printing of static fields. */
d6a843b5 331 if (field_is_static (&TYPE_FIELD (type, i)))
c906108c 332 {
0d5cff50 333 const char *name = TYPE_FIELD_NAME (type, i);
e0881a8e 334
79a45b7d 335 if (!options->static_field_print)
c906108c
SS
336 continue;
337 if (name != NULL && strcmp (name, "class") == 0)
338 continue;
339 }
340 if (fields_seen)
341 fprintf_filtered (stream, ", ");
342 else if (n_baseclasses > 0)
343 {
2a998fc0 344 if (options->prettyformat)
c906108c
SS
345 {
346 fprintf_filtered (stream, "\n");
347 print_spaces_filtered (2 + 2 * recurse, stream);
348 fputs_filtered ("members of ", stream);
349 fputs_filtered (type_name_no_tag (type), stream);
350 fputs_filtered (": ", stream);
351 }
352 }
353 fields_seen = 1;
354
2a998fc0 355 if (options->prettyformat)
c906108c
SS
356 {
357 fprintf_filtered (stream, "\n");
358 print_spaces_filtered (2 + 2 * recurse, stream);
359 }
c5aa993b 360 else
c906108c
SS
361 {
362 wrap_here (n_spaces (2 + 2 * recurse));
363 }
e93a8774
TT
364
365 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
366
367 if (field_is_static (&TYPE_FIELD (type, i)))
368 fputs_filtered ("static ", stream);
369 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
370 language_cplus,
371 DMGL_PARAMS | DMGL_ANSI);
372 annotate_field_name_end ();
373 fputs_filtered (": ", stream);
374 annotate_field_value ();
c906108c 375
d6a843b5
JK
376 if (!field_is_static (&TYPE_FIELD (type, i))
377 && TYPE_FIELD_PACKED (type, i))
c906108c 378 {
75c9979e 379 struct value *v;
c906108c
SS
380
381 /* Bitfields require special handling, especially due to byte
c5aa993b 382 order problems. */
c906108c
SS
383 if (TYPE_FIELD_IGNORE (type, i))
384 {
c5aa993b 385 fputs_filtered ("<optimized out or zero length>", stream);
c906108c 386 }
8cf6f0b1
TT
387 else if (value_bits_synthetic_pointer (val,
388 TYPE_FIELD_BITPOS (type,
389 i),
390 TYPE_FIELD_BITSIZE (type,
391 i)))
392 {
393 fputs_filtered (_("<synthetic pointer>"), stream);
394 }
c906108c
SS
395 else
396 {
79a45b7d
TT
397 struct value_print_options opts;
398
5467c6c8 399 v = value_field_bitfield (type, i, valaddr, offset, val);
c906108c 400
79a45b7d
TT
401 opts = *options;
402 opts.deref_ref = 0;
403 common_val_print (v, stream, recurse + 1,
404 &opts, current_language);
c906108c
SS
405 }
406 }
407 else
408 {
409 if (TYPE_FIELD_IGNORE (type, i))
410 {
c5aa993b 411 fputs_filtered ("<optimized out or zero length>", stream);
c906108c 412 }
d6a843b5 413 else if (field_is_static (&TYPE_FIELD (type, i)))
c906108c 414 {
686d4def 415 struct value_print_options opts;
75c9979e 416 struct value *v = value_static_field (type, i);
686d4def 417 struct type *t = check_typedef (value_type (v));
e0881a8e 418
686d4def
PA
419 if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
420 v = value_addr (v);
421 opts = *options;
422 opts.deref_ref = 0;
423 common_val_print (v, stream, recurse + 1,
424 &opts, current_language);
c906108c 425 }
7a292a7a
SS
426 else if (TYPE_FIELD_TYPE (type, i) == NULL)
427 fputs_filtered ("<unknown type>", stream);
c906108c
SS
428 else
429 {
79a45b7d 430 struct value_print_options opts = *options;
e0881a8e 431
79a45b7d 432 opts.deref_ref = 0;
c5aa993b 433 val_print (TYPE_FIELD_TYPE (type, i),
490f124f
PA
434 valaddr,
435 offset + TYPE_FIELD_BITPOS (type, i) / 8,
436 address, stream, recurse + 1, val, &opts,
d8ca156b 437 current_language);
c906108c
SS
438 }
439 }
440 annotate_field_end ();
441 }
442
2a998fc0 443 if (options->prettyformat)
c906108c
SS
444 {
445 fprintf_filtered (stream, "\n");
446 print_spaces_filtered (2 * recurse, stream);
447 }
448 }
449 fprintf_filtered (stream, "}");
450}
451
32b72a42 452/* See val_print for a description of the various parameters of this
d3eab38a 453 function; they are identical. */
c906108c 454
d3eab38a 455void
fc1a4b47 456java_val_print (struct type *type, const gdb_byte *valaddr,
a2bd3dcd 457 int embedded_offset, CORE_ADDR address,
79a45b7d 458 struct ui_file *stream, int recurse,
0e03807e 459 const struct value *val,
79a45b7d 460 const struct value_print_options *options)
c906108c 461{
5af949e3 462 struct gdbarch *gdbarch = get_type_arch (type);
c906108c
SS
463 struct type *target_type;
464 CORE_ADDR addr;
465
f168693b 466 type = check_typedef (type);
c906108c
SS
467 switch (TYPE_CODE (type))
468 {
469 case TYPE_CODE_PTR:
79a45b7d 470 if (options->format && options->format != 's')
c906108c 471 {
ab2188aa
PA
472 val_print_scalar_formatted (type, valaddr, embedded_offset,
473 val, options, 0, stream);
c906108c
SS
474 break;
475 }
490f124f 476 addr = unpack_pointer (type, valaddr + embedded_offset);
c906108c
SS
477 if (addr == 0)
478 {
479 fputs_filtered ("null", stream);
d3eab38a 480 return;
c906108c
SS
481 }
482 target_type = check_typedef (TYPE_TARGET_TYPE (type));
483
484 if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
485 {
486 /* Try to print what function it points to. */
edf0c1b7 487 print_address_demangle (options, gdbarch, addr, stream, demangle);
d3eab38a 488 return;
c906108c
SS
489 }
490
79a45b7d 491 if (options->addressprint && options->format != 's')
c906108c
SS
492 {
493 fputs_filtered ("@", stream);
494 print_longest (stream, 'x', 0, (ULONGEST) addr);
495 }
496
d3eab38a 497 return;
c906108c
SS
498
499 case TYPE_CODE_CHAR:
c906108c 500 case TYPE_CODE_INT:
c55a3f73
TT
501 /* Can't just call c_val_print because that prints bytes as C
502 chars. */
79a45b7d
TT
503 if (options->format || options->output_format)
504 {
505 struct value_print_options opts = *options;
e0881a8e 506
79a45b7d
TT
507 opts.format = (options->format ? options->format
508 : options->output_format);
ab2188aa
PA
509 val_print_scalar_formatted (type, valaddr, embedded_offset,
510 val, &opts, 0, stream);
79a45b7d 511 }
c55a3f73
TT
512 else if (TYPE_CODE (type) == TYPE_CODE_CHAR
513 || (TYPE_CODE (type) == TYPE_CODE_INT
514 && TYPE_LENGTH (type) == 2
515 && strcmp (TYPE_NAME (type), "char") == 0))
490f124f
PA
516 LA_PRINT_CHAR ((int) unpack_long (type, valaddr + embedded_offset),
517 type, stream);
c906108c 518 else
490f124f 519 val_print_type_code_int (type, valaddr + embedded_offset, stream);
c906108c
SS
520 break;
521
522 case TYPE_CODE_STRUCT:
490f124f
PA
523 java_print_value_fields (type, valaddr, embedded_offset,
524 address, stream, recurse, val, options);
c906108c
SS
525 break;
526
527 default:
d3eab38a
TT
528 c_val_print (type, valaddr, embedded_offset, address, stream,
529 recurse, val, options);
530 break;
c906108c 531 }
c906108c 532}