15796c8dcSSimon Schubert /* Support for printing Java values for GDB, the GNU debugger.
25796c8dcSSimon Schubert
3*ef5ccd6cSJohn Marino Copyright (C) 1997-2013 Free Software Foundation, Inc.
45796c8dcSSimon Schubert
55796c8dcSSimon Schubert This file is part of GDB.
65796c8dcSSimon Schubert
75796c8dcSSimon Schubert This program is free software; you can redistribute it and/or modify
85796c8dcSSimon Schubert it under the terms of the GNU General Public License as published by
95796c8dcSSimon Schubert the Free Software Foundation; either version 3 of the License, or
105796c8dcSSimon Schubert (at your option) any later version.
115796c8dcSSimon Schubert
125796c8dcSSimon Schubert This program is distributed in the hope that it will be useful,
135796c8dcSSimon Schubert but WITHOUT ANY WARRANTY; without even the implied warranty of
145796c8dcSSimon Schubert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
155796c8dcSSimon Schubert GNU General Public License for more details.
165796c8dcSSimon Schubert
175796c8dcSSimon Schubert You should have received a copy of the GNU General Public License
185796c8dcSSimon Schubert along with this program. If not, see <http://www.gnu.org/licenses/>. */
195796c8dcSSimon Schubert
205796c8dcSSimon Schubert #include "defs.h"
215796c8dcSSimon Schubert #include "symtab.h"
225796c8dcSSimon Schubert #include "gdbtypes.h"
235796c8dcSSimon Schubert #include "gdbcore.h"
245796c8dcSSimon Schubert #include "expression.h"
255796c8dcSSimon Schubert #include "value.h"
265796c8dcSSimon Schubert #include "demangle.h"
275796c8dcSSimon Schubert #include "valprint.h"
285796c8dcSSimon Schubert #include "language.h"
295796c8dcSSimon Schubert #include "jv-lang.h"
305796c8dcSSimon Schubert #include "c-lang.h"
315796c8dcSSimon Schubert #include "annotate.h"
325796c8dcSSimon Schubert #include "gdb_string.h"
335796c8dcSSimon Schubert
345796c8dcSSimon Schubert /* Local functions */
355796c8dcSSimon Schubert
36*ef5ccd6cSJohn Marino void
java_value_print(struct value * val,struct ui_file * stream,const struct value_print_options * options)375796c8dcSSimon Schubert java_value_print (struct value *val, struct ui_file *stream,
385796c8dcSSimon Schubert const struct value_print_options *options)
395796c8dcSSimon Schubert {
405796c8dcSSimon Schubert struct gdbarch *gdbarch = get_type_arch (value_type (val));
415796c8dcSSimon Schubert enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
425796c8dcSSimon Schubert struct type *type;
435796c8dcSSimon Schubert CORE_ADDR address;
445796c8dcSSimon Schubert int i;
45*ef5ccd6cSJohn Marino const char *name;
465796c8dcSSimon Schubert struct value_print_options opts;
475796c8dcSSimon Schubert
485796c8dcSSimon Schubert type = value_type (val);
495796c8dcSSimon Schubert address = value_address (val);
505796c8dcSSimon Schubert
515796c8dcSSimon Schubert if (is_object_type (type))
525796c8dcSSimon Schubert {
535796c8dcSSimon Schubert CORE_ADDR obj_addr;
54*ef5ccd6cSJohn Marino struct value *tem = val;
555796c8dcSSimon Schubert
56c50c785cSJohn Marino /* Get the run-time type, and cast the object into that. */
57*ef5ccd6cSJohn Marino while (TYPE_CODE (value_type (tem)) == TYPE_CODE_PTR)
58*ef5ccd6cSJohn Marino tem = value_ind (tem);
595796c8dcSSimon Schubert
60*ef5ccd6cSJohn Marino obj_addr = value_address (tem);
615796c8dcSSimon Schubert
625796c8dcSSimon Schubert if (obj_addr != 0)
635796c8dcSSimon Schubert {
645796c8dcSSimon Schubert type = type_from_class (gdbarch, java_class_from_object (val));
655796c8dcSSimon Schubert type = lookup_pointer_type (type);
665796c8dcSSimon Schubert
675796c8dcSSimon Schubert val = value_at (type, address);
685796c8dcSSimon Schubert }
695796c8dcSSimon Schubert }
705796c8dcSSimon Schubert
715796c8dcSSimon Schubert if (TYPE_CODE (type) == TYPE_CODE_PTR && !value_logical_not (val))
725796c8dcSSimon Schubert type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
735796c8dcSSimon Schubert
745796c8dcSSimon Schubert name = TYPE_TAG_NAME (type);
755796c8dcSSimon Schubert if (TYPE_CODE (type) == TYPE_CODE_STRUCT && name != NULL
765796c8dcSSimon Schubert && (i = strlen (name), name[i - 1] == ']'))
775796c8dcSSimon Schubert {
785796c8dcSSimon Schubert gdb_byte buf4[4];
795796c8dcSSimon Schubert long length;
805796c8dcSSimon Schubert unsigned int things_printed = 0;
815796c8dcSSimon Schubert int reps;
825796c8dcSSimon Schubert struct type *el_type
835796c8dcSSimon Schubert = java_primitive_type_from_name (gdbarch, name, i - 2);
84cf7f2e2dSJohn Marino
855796c8dcSSimon Schubert i = 0;
865796c8dcSSimon Schubert read_memory (address + get_java_object_header_size (gdbarch), buf4, 4);
875796c8dcSSimon Schubert
885796c8dcSSimon Schubert length = (long) extract_signed_integer (buf4, 4, byte_order);
895796c8dcSSimon Schubert fprintf_filtered (stream, "{length: %ld", length);
905796c8dcSSimon Schubert
915796c8dcSSimon Schubert if (el_type == NULL)
925796c8dcSSimon Schubert {
935796c8dcSSimon Schubert CORE_ADDR element;
94c50c785cSJohn Marino CORE_ADDR next_element = -1; /* Dummy initial value. */
955796c8dcSSimon Schubert
965796c8dcSSimon Schubert /* Skip object header and length. */
975796c8dcSSimon Schubert address += get_java_object_header_size (gdbarch) + 4;
985796c8dcSSimon Schubert
995796c8dcSSimon Schubert while (i < length && things_printed < options->print_max)
1005796c8dcSSimon Schubert {
1015796c8dcSSimon Schubert gdb_byte *buf;
1025796c8dcSSimon Schubert
1035796c8dcSSimon Schubert buf = alloca (gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT);
1045796c8dcSSimon Schubert fputs_filtered (", ", stream);
1055796c8dcSSimon Schubert wrap_here (n_spaces (2));
1065796c8dcSSimon Schubert
1075796c8dcSSimon Schubert if (i > 0)
1085796c8dcSSimon Schubert element = next_element;
1095796c8dcSSimon Schubert else
1105796c8dcSSimon Schubert {
1115796c8dcSSimon Schubert read_memory (address, buf, sizeof (buf));
1125796c8dcSSimon Schubert address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
1135796c8dcSSimon Schubert /* FIXME: cagney/2003-05-24: Bogus or what. It
1145796c8dcSSimon Schubert pulls a host sized pointer out of the target and
1155796c8dcSSimon Schubert then extracts that as an address (while assuming
1165796c8dcSSimon Schubert that the address is unsigned)! */
1175796c8dcSSimon Schubert element = extract_unsigned_integer (buf, sizeof (buf),
1185796c8dcSSimon Schubert byte_order);
1195796c8dcSSimon Schubert }
1205796c8dcSSimon Schubert
1215796c8dcSSimon Schubert for (reps = 1; i + reps < length; reps++)
1225796c8dcSSimon Schubert {
1235796c8dcSSimon Schubert read_memory (address, buf, sizeof (buf));
1245796c8dcSSimon Schubert address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
1255796c8dcSSimon Schubert /* FIXME: cagney/2003-05-24: Bogus or what. It
1265796c8dcSSimon Schubert pulls a host sized pointer out of the target and
1275796c8dcSSimon Schubert then extracts that as an address (while assuming
1285796c8dcSSimon Schubert that the address is unsigned)! */
1295796c8dcSSimon Schubert next_element = extract_unsigned_integer (buf, sizeof (buf),
1305796c8dcSSimon Schubert byte_order);
1315796c8dcSSimon Schubert if (next_element != element)
1325796c8dcSSimon Schubert break;
1335796c8dcSSimon Schubert }
1345796c8dcSSimon Schubert
1355796c8dcSSimon Schubert if (reps == 1)
1365796c8dcSSimon Schubert fprintf_filtered (stream, "%d: ", i);
1375796c8dcSSimon Schubert else
1385796c8dcSSimon Schubert fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
1395796c8dcSSimon Schubert
1405796c8dcSSimon Schubert if (element == 0)
1415796c8dcSSimon Schubert fprintf_filtered (stream, "null");
1425796c8dcSSimon Schubert else
1435796c8dcSSimon Schubert fprintf_filtered (stream, "@%s", paddress (gdbarch, element));
1445796c8dcSSimon Schubert
1455796c8dcSSimon Schubert things_printed++;
1465796c8dcSSimon Schubert i += reps;
1475796c8dcSSimon Schubert }
1485796c8dcSSimon Schubert }
1495796c8dcSSimon Schubert else
1505796c8dcSSimon Schubert {
1515796c8dcSSimon Schubert struct value *v = allocate_value (el_type);
1525796c8dcSSimon Schubert struct value *next_v = allocate_value (el_type);
1535796c8dcSSimon Schubert
1545796c8dcSSimon Schubert set_value_address (v, (address
1555796c8dcSSimon Schubert + get_java_object_header_size (gdbarch) + 4));
1565796c8dcSSimon Schubert set_value_address (next_v, value_raw_address (v));
1575796c8dcSSimon Schubert
1585796c8dcSSimon Schubert while (i < length && things_printed < options->print_max)
1595796c8dcSSimon Schubert {
1605796c8dcSSimon Schubert fputs_filtered (", ", stream);
1615796c8dcSSimon Schubert wrap_here (n_spaces (2));
1625796c8dcSSimon Schubert
1635796c8dcSSimon Schubert if (i > 0)
1645796c8dcSSimon Schubert {
1655796c8dcSSimon Schubert struct value *tmp;
1665796c8dcSSimon Schubert
1675796c8dcSSimon Schubert tmp = next_v;
1685796c8dcSSimon Schubert next_v = v;
1695796c8dcSSimon Schubert v = tmp;
1705796c8dcSSimon Schubert }
1715796c8dcSSimon Schubert else
1725796c8dcSSimon Schubert {
1735796c8dcSSimon Schubert set_value_lazy (v, 1);
1745796c8dcSSimon Schubert set_value_offset (v, 0);
1755796c8dcSSimon Schubert }
1765796c8dcSSimon Schubert
1775796c8dcSSimon Schubert set_value_offset (next_v, value_offset (v));
1785796c8dcSSimon Schubert
1795796c8dcSSimon Schubert for (reps = 1; i + reps < length; reps++)
1805796c8dcSSimon Schubert {
1815796c8dcSSimon Schubert set_value_lazy (next_v, 1);
182c50c785cSJohn Marino set_value_offset (next_v, value_offset (next_v)
183c50c785cSJohn Marino + TYPE_LENGTH (el_type));
184c50c785cSJohn Marino value_fetch_lazy (next_v);
185c50c785cSJohn Marino if (!(value_available_contents_eq
186c50c785cSJohn Marino (v, value_embedded_offset (v),
187c50c785cSJohn Marino next_v, value_embedded_offset (next_v),
188c50c785cSJohn Marino TYPE_LENGTH (el_type))))
1895796c8dcSSimon Schubert break;
1905796c8dcSSimon Schubert }
1915796c8dcSSimon Schubert
1925796c8dcSSimon Schubert if (reps == 1)
1935796c8dcSSimon Schubert fprintf_filtered (stream, "%d: ", i);
1945796c8dcSSimon Schubert else
1955796c8dcSSimon Schubert fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
1965796c8dcSSimon Schubert
1975796c8dcSSimon Schubert opts = *options;
1985796c8dcSSimon Schubert opts.deref_ref = 1;
1995796c8dcSSimon Schubert common_val_print (v, stream, 1, &opts, current_language);
2005796c8dcSSimon Schubert
2015796c8dcSSimon Schubert things_printed++;
2025796c8dcSSimon Schubert i += reps;
2035796c8dcSSimon Schubert }
2045796c8dcSSimon Schubert }
2055796c8dcSSimon Schubert
2065796c8dcSSimon Schubert if (i < length)
2075796c8dcSSimon Schubert fprintf_filtered (stream, "...");
2085796c8dcSSimon Schubert
2095796c8dcSSimon Schubert fprintf_filtered (stream, "}");
2105796c8dcSSimon Schubert
211*ef5ccd6cSJohn Marino return;
2125796c8dcSSimon Schubert }
2135796c8dcSSimon Schubert
214c50c785cSJohn Marino /* If it's type String, print it. */
2155796c8dcSSimon Schubert
2165796c8dcSSimon Schubert if (TYPE_CODE (type) == TYPE_CODE_PTR
2175796c8dcSSimon Schubert && TYPE_TARGET_TYPE (type)
2185796c8dcSSimon Schubert && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type))
2195796c8dcSSimon Schubert && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)),
2205796c8dcSSimon Schubert "java.lang.String") == 0
2215796c8dcSSimon Schubert && (options->format == 0 || options->format == 's')
2225796c8dcSSimon Schubert && address != 0
2235796c8dcSSimon Schubert && value_as_address (val) != 0)
2245796c8dcSSimon Schubert {
2255796c8dcSSimon Schubert struct type *char_type;
2265796c8dcSSimon Schubert struct value *data_val;
2275796c8dcSSimon Schubert CORE_ADDR data;
2285796c8dcSSimon Schubert struct value *boffset_val;
2295796c8dcSSimon Schubert unsigned long boffset;
2305796c8dcSSimon Schubert struct value *count_val;
2315796c8dcSSimon Schubert unsigned long count;
2325796c8dcSSimon Schubert struct value *mark;
2335796c8dcSSimon Schubert
234*ef5ccd6cSJohn Marino fputs_filtered (" ", stream);
235*ef5ccd6cSJohn Marino
236c50c785cSJohn Marino mark = value_mark (); /* Remember start of new values. */
2375796c8dcSSimon Schubert
2385796c8dcSSimon Schubert data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
2395796c8dcSSimon Schubert data = value_as_address (data_val);
2405796c8dcSSimon Schubert
2415796c8dcSSimon Schubert boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
2425796c8dcSSimon Schubert boffset = value_as_address (boffset_val);
2435796c8dcSSimon Schubert
2445796c8dcSSimon Schubert count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
2455796c8dcSSimon Schubert count = value_as_address (count_val);
2465796c8dcSSimon Schubert
247c50c785cSJohn Marino value_free_to_mark (mark); /* Release unnecessary values. */
2485796c8dcSSimon Schubert
2495796c8dcSSimon Schubert char_type = builtin_java_type (gdbarch)->builtin_char;
250c50c785cSJohn Marino val_print_string (char_type, NULL, data + boffset, count, stream,
251c50c785cSJohn Marino options);
2525796c8dcSSimon Schubert
253*ef5ccd6cSJohn Marino return;
2545796c8dcSSimon Schubert }
2555796c8dcSSimon Schubert
2565796c8dcSSimon Schubert opts = *options;
2575796c8dcSSimon Schubert opts.deref_ref = 1;
258*ef5ccd6cSJohn Marino common_val_print (val, stream, 0, &opts, current_language);
2595796c8dcSSimon Schubert }
2605796c8dcSSimon Schubert
2615796c8dcSSimon Schubert /* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
2625796c8dcSSimon Schubert same meanings as in cp_print_value and c_val_print.
2635796c8dcSSimon Schubert
2645796c8dcSSimon Schubert DONT_PRINT is an array of baseclass types that we
2655796c8dcSSimon Schubert should not print, or zero if called from top level. */
2665796c8dcSSimon Schubert
2675796c8dcSSimon Schubert static void
java_print_value_fields(struct type * type,const gdb_byte * valaddr,int offset,CORE_ADDR address,struct ui_file * stream,int recurse,const struct value * val,const struct value_print_options * options)2685796c8dcSSimon Schubert java_print_value_fields (struct type *type, const gdb_byte *valaddr,
269c50c785cSJohn Marino int offset,
2705796c8dcSSimon Schubert CORE_ADDR address, struct ui_file *stream,
2715796c8dcSSimon Schubert int recurse,
272cf7f2e2dSJohn Marino const struct value *val,
2735796c8dcSSimon Schubert const struct value_print_options *options)
2745796c8dcSSimon Schubert {
2755796c8dcSSimon Schubert int i, len, n_baseclasses;
2765796c8dcSSimon Schubert
2775796c8dcSSimon Schubert CHECK_TYPEDEF (type);
2785796c8dcSSimon Schubert
2795796c8dcSSimon Schubert fprintf_filtered (stream, "{");
2805796c8dcSSimon Schubert len = TYPE_NFIELDS (type);
2815796c8dcSSimon Schubert n_baseclasses = TYPE_N_BASECLASSES (type);
2825796c8dcSSimon Schubert
2835796c8dcSSimon Schubert if (n_baseclasses > 0)
2845796c8dcSSimon Schubert {
2855796c8dcSSimon Schubert int i, n_baseclasses = TYPE_N_BASECLASSES (type);
2865796c8dcSSimon Schubert
2875796c8dcSSimon Schubert for (i = 0; i < n_baseclasses; i++)
2885796c8dcSSimon Schubert {
2895796c8dcSSimon Schubert int boffset;
2905796c8dcSSimon Schubert struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
291*ef5ccd6cSJohn Marino const char *basename = TYPE_NAME (baseclass);
2925796c8dcSSimon Schubert const gdb_byte *base_valaddr;
2935796c8dcSSimon Schubert
2945796c8dcSSimon Schubert if (BASETYPE_VIA_VIRTUAL (type, i))
2955796c8dcSSimon Schubert continue;
2965796c8dcSSimon Schubert
2975796c8dcSSimon Schubert if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
2985796c8dcSSimon Schubert continue;
2995796c8dcSSimon Schubert
3005796c8dcSSimon Schubert boffset = 0;
3015796c8dcSSimon Schubert
3025796c8dcSSimon Schubert if (options->pretty)
3035796c8dcSSimon Schubert {
3045796c8dcSSimon Schubert fprintf_filtered (stream, "\n");
3055796c8dcSSimon Schubert print_spaces_filtered (2 * (recurse + 1), stream);
3065796c8dcSSimon Schubert }
3075796c8dcSSimon Schubert fputs_filtered ("<", stream);
3085796c8dcSSimon Schubert /* Not sure what the best notation is in the case where there is no
3095796c8dcSSimon Schubert baseclass name. */
3105796c8dcSSimon Schubert fputs_filtered (basename ? basename : "", stream);
3115796c8dcSSimon Schubert fputs_filtered ("> = ", stream);
3125796c8dcSSimon Schubert
3135796c8dcSSimon Schubert base_valaddr = valaddr;
3145796c8dcSSimon Schubert
315c50c785cSJohn Marino java_print_value_fields (baseclass, base_valaddr,
316c50c785cSJohn Marino offset + boffset, address,
317cf7f2e2dSJohn Marino stream, recurse + 1, val, options);
3185796c8dcSSimon Schubert fputs_filtered (", ", stream);
3195796c8dcSSimon Schubert }
3205796c8dcSSimon Schubert }
3215796c8dcSSimon Schubert
3225796c8dcSSimon Schubert if (!len && n_baseclasses == 1)
3235796c8dcSSimon Schubert fprintf_filtered (stream, "<No data fields>");
3245796c8dcSSimon Schubert else
3255796c8dcSSimon Schubert {
3265796c8dcSSimon Schubert int fields_seen = 0;
3275796c8dcSSimon Schubert
3285796c8dcSSimon Schubert for (i = n_baseclasses; i < len; i++)
3295796c8dcSSimon Schubert {
3305796c8dcSSimon Schubert /* If requested, skip printing of static fields. */
3315796c8dcSSimon Schubert if (field_is_static (&TYPE_FIELD (type, i)))
3325796c8dcSSimon Schubert {
333*ef5ccd6cSJohn Marino const char *name = TYPE_FIELD_NAME (type, i);
334cf7f2e2dSJohn Marino
3355796c8dcSSimon Schubert if (!options->static_field_print)
3365796c8dcSSimon Schubert continue;
3375796c8dcSSimon Schubert if (name != NULL && strcmp (name, "class") == 0)
3385796c8dcSSimon Schubert continue;
3395796c8dcSSimon Schubert }
3405796c8dcSSimon Schubert if (fields_seen)
3415796c8dcSSimon Schubert fprintf_filtered (stream, ", ");
3425796c8dcSSimon Schubert else if (n_baseclasses > 0)
3435796c8dcSSimon Schubert {
3445796c8dcSSimon Schubert if (options->pretty)
3455796c8dcSSimon Schubert {
3465796c8dcSSimon Schubert fprintf_filtered (stream, "\n");
3475796c8dcSSimon Schubert print_spaces_filtered (2 + 2 * recurse, stream);
3485796c8dcSSimon Schubert fputs_filtered ("members of ", stream);
3495796c8dcSSimon Schubert fputs_filtered (type_name_no_tag (type), stream);
3505796c8dcSSimon Schubert fputs_filtered (": ", stream);
3515796c8dcSSimon Schubert }
3525796c8dcSSimon Schubert }
3535796c8dcSSimon Schubert fields_seen = 1;
3545796c8dcSSimon Schubert
3555796c8dcSSimon Schubert if (options->pretty)
3565796c8dcSSimon Schubert {
3575796c8dcSSimon Schubert fprintf_filtered (stream, "\n");
3585796c8dcSSimon Schubert print_spaces_filtered (2 + 2 * recurse, stream);
3595796c8dcSSimon Schubert }
3605796c8dcSSimon Schubert else
3615796c8dcSSimon Schubert {
3625796c8dcSSimon Schubert wrap_here (n_spaces (2 + 2 * recurse));
3635796c8dcSSimon Schubert }
364*ef5ccd6cSJohn Marino
3655796c8dcSSimon Schubert annotate_field_begin (TYPE_FIELD_TYPE (type, i));
3665796c8dcSSimon Schubert
3675796c8dcSSimon Schubert if (field_is_static (&TYPE_FIELD (type, i)))
3685796c8dcSSimon Schubert fputs_filtered ("static ", stream);
3695796c8dcSSimon Schubert fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
3705796c8dcSSimon Schubert language_cplus,
3715796c8dcSSimon Schubert DMGL_PARAMS | DMGL_ANSI);
3725796c8dcSSimon Schubert annotate_field_name_end ();
3735796c8dcSSimon Schubert fputs_filtered (": ", stream);
3745796c8dcSSimon Schubert annotate_field_value ();
3755796c8dcSSimon Schubert
3765796c8dcSSimon Schubert if (!field_is_static (&TYPE_FIELD (type, i))
3775796c8dcSSimon Schubert && TYPE_FIELD_PACKED (type, i))
3785796c8dcSSimon Schubert {
3795796c8dcSSimon Schubert struct value *v;
3805796c8dcSSimon Schubert
3815796c8dcSSimon Schubert /* Bitfields require special handling, especially due to byte
3825796c8dcSSimon Schubert order problems. */
3835796c8dcSSimon Schubert if (TYPE_FIELD_IGNORE (type, i))
3845796c8dcSSimon Schubert {
3855796c8dcSSimon Schubert fputs_filtered ("<optimized out or zero length>", stream);
3865796c8dcSSimon Schubert }
387c50c785cSJohn Marino else if (value_bits_synthetic_pointer (val,
388c50c785cSJohn Marino TYPE_FIELD_BITPOS (type,
389c50c785cSJohn Marino i),
390c50c785cSJohn Marino TYPE_FIELD_BITSIZE (type,
391c50c785cSJohn Marino i)))
392c50c785cSJohn Marino {
393c50c785cSJohn Marino fputs_filtered (_("<synthetic pointer>"), stream);
394c50c785cSJohn Marino }
395cf7f2e2dSJohn Marino else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
396cf7f2e2dSJohn Marino TYPE_FIELD_BITSIZE (type, i)))
397cf7f2e2dSJohn Marino {
398c50c785cSJohn Marino val_print_optimized_out (stream);
399cf7f2e2dSJohn Marino }
4005796c8dcSSimon Schubert else
4015796c8dcSSimon Schubert {
4025796c8dcSSimon Schubert struct value_print_options opts;
4035796c8dcSSimon Schubert
404c50c785cSJohn Marino v = value_field_bitfield (type, i, valaddr, offset, val);
4055796c8dcSSimon Schubert
4065796c8dcSSimon Schubert opts = *options;
4075796c8dcSSimon Schubert opts.deref_ref = 0;
4085796c8dcSSimon Schubert common_val_print (v, stream, recurse + 1,
4095796c8dcSSimon Schubert &opts, current_language);
4105796c8dcSSimon Schubert }
4115796c8dcSSimon Schubert }
4125796c8dcSSimon Schubert else
4135796c8dcSSimon Schubert {
4145796c8dcSSimon Schubert if (TYPE_FIELD_IGNORE (type, i))
4155796c8dcSSimon Schubert {
4165796c8dcSSimon Schubert fputs_filtered ("<optimized out or zero length>", stream);
4175796c8dcSSimon Schubert }
4185796c8dcSSimon Schubert else if (field_is_static (&TYPE_FIELD (type, i)))
4195796c8dcSSimon Schubert {
4205796c8dcSSimon Schubert struct value *v = value_static_field (type, i);
421cf7f2e2dSJohn Marino
4225796c8dcSSimon Schubert if (v == NULL)
423c50c785cSJohn Marino val_print_optimized_out (stream);
4245796c8dcSSimon Schubert else
4255796c8dcSSimon Schubert {
4265796c8dcSSimon Schubert struct value_print_options opts;
4275796c8dcSSimon Schubert struct type *t = check_typedef (value_type (v));
428cf7f2e2dSJohn Marino
4295796c8dcSSimon Schubert if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
4305796c8dcSSimon Schubert v = value_addr (v);
4315796c8dcSSimon Schubert opts = *options;
4325796c8dcSSimon Schubert opts.deref_ref = 0;
4335796c8dcSSimon Schubert common_val_print (v, stream, recurse + 1,
4345796c8dcSSimon Schubert &opts, current_language);
4355796c8dcSSimon Schubert }
4365796c8dcSSimon Schubert }
4375796c8dcSSimon Schubert else if (TYPE_FIELD_TYPE (type, i) == NULL)
4385796c8dcSSimon Schubert fputs_filtered ("<unknown type>", stream);
4395796c8dcSSimon Schubert else
4405796c8dcSSimon Schubert {
4415796c8dcSSimon Schubert struct value_print_options opts = *options;
442cf7f2e2dSJohn Marino
4435796c8dcSSimon Schubert opts.deref_ref = 0;
4445796c8dcSSimon Schubert val_print (TYPE_FIELD_TYPE (type, i),
445c50c785cSJohn Marino valaddr,
446c50c785cSJohn Marino offset + TYPE_FIELD_BITPOS (type, i) / 8,
447c50c785cSJohn Marino address, stream, recurse + 1, val, &opts,
4485796c8dcSSimon Schubert current_language);
4495796c8dcSSimon Schubert }
4505796c8dcSSimon Schubert }
4515796c8dcSSimon Schubert annotate_field_end ();
4525796c8dcSSimon Schubert }
4535796c8dcSSimon Schubert
4545796c8dcSSimon Schubert if (options->pretty)
4555796c8dcSSimon Schubert {
4565796c8dcSSimon Schubert fprintf_filtered (stream, "\n");
4575796c8dcSSimon Schubert print_spaces_filtered (2 * recurse, stream);
4585796c8dcSSimon Schubert }
4595796c8dcSSimon Schubert }
4605796c8dcSSimon Schubert fprintf_filtered (stream, "}");
4615796c8dcSSimon Schubert }
4625796c8dcSSimon Schubert
463c50c785cSJohn Marino /* See val_print for a description of the various parameters of this
464*ef5ccd6cSJohn Marino function; they are identical. */
4655796c8dcSSimon Schubert
466*ef5ccd6cSJohn Marino void
java_val_print(struct type * type,const gdb_byte * valaddr,int embedded_offset,CORE_ADDR address,struct ui_file * stream,int recurse,const struct value * val,const struct value_print_options * options)4675796c8dcSSimon Schubert java_val_print (struct type *type, const gdb_byte *valaddr,
4685796c8dcSSimon Schubert int embedded_offset, CORE_ADDR address,
4695796c8dcSSimon Schubert struct ui_file *stream, int recurse,
470cf7f2e2dSJohn Marino const struct value *val,
4715796c8dcSSimon Schubert const struct value_print_options *options)
4725796c8dcSSimon Schubert {
4735796c8dcSSimon Schubert struct gdbarch *gdbarch = get_type_arch (type);
4745796c8dcSSimon Schubert struct type *target_type;
4755796c8dcSSimon Schubert CORE_ADDR addr;
4765796c8dcSSimon Schubert
4775796c8dcSSimon Schubert CHECK_TYPEDEF (type);
4785796c8dcSSimon Schubert switch (TYPE_CODE (type))
4795796c8dcSSimon Schubert {
4805796c8dcSSimon Schubert case TYPE_CODE_PTR:
4815796c8dcSSimon Schubert if (options->format && options->format != 's')
4825796c8dcSSimon Schubert {
483c50c785cSJohn Marino val_print_scalar_formatted (type, valaddr, embedded_offset,
484c50c785cSJohn Marino val, options, 0, stream);
4855796c8dcSSimon Schubert break;
4865796c8dcSSimon Schubert }
487c50c785cSJohn Marino addr = unpack_pointer (type, valaddr + embedded_offset);
4885796c8dcSSimon Schubert if (addr == 0)
4895796c8dcSSimon Schubert {
4905796c8dcSSimon Schubert fputs_filtered ("null", stream);
491*ef5ccd6cSJohn Marino return;
4925796c8dcSSimon Schubert }
4935796c8dcSSimon Schubert target_type = check_typedef (TYPE_TARGET_TYPE (type));
4945796c8dcSSimon Schubert
4955796c8dcSSimon Schubert if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
4965796c8dcSSimon Schubert {
4975796c8dcSSimon Schubert /* Try to print what function it points to. */
498*ef5ccd6cSJohn Marino print_address_demangle (options, gdbarch, addr, stream, demangle);
499*ef5ccd6cSJohn Marino return;
5005796c8dcSSimon Schubert }
5015796c8dcSSimon Schubert
5025796c8dcSSimon Schubert if (options->addressprint && options->format != 's')
5035796c8dcSSimon Schubert {
5045796c8dcSSimon Schubert fputs_filtered ("@", stream);
5055796c8dcSSimon Schubert print_longest (stream, 'x', 0, (ULONGEST) addr);
5065796c8dcSSimon Schubert }
5075796c8dcSSimon Schubert
508*ef5ccd6cSJohn Marino return;
5095796c8dcSSimon Schubert
5105796c8dcSSimon Schubert case TYPE_CODE_CHAR:
5115796c8dcSSimon Schubert case TYPE_CODE_INT:
5125796c8dcSSimon Schubert /* Can't just call c_val_print because that prints bytes as C
5135796c8dcSSimon Schubert chars. */
5145796c8dcSSimon Schubert if (options->format || options->output_format)
5155796c8dcSSimon Schubert {
5165796c8dcSSimon Schubert struct value_print_options opts = *options;
517cf7f2e2dSJohn Marino
5185796c8dcSSimon Schubert opts.format = (options->format ? options->format
5195796c8dcSSimon Schubert : options->output_format);
520c50c785cSJohn Marino val_print_scalar_formatted (type, valaddr, embedded_offset,
521c50c785cSJohn Marino val, &opts, 0, stream);
5225796c8dcSSimon Schubert }
5235796c8dcSSimon Schubert else if (TYPE_CODE (type) == TYPE_CODE_CHAR
5245796c8dcSSimon Schubert || (TYPE_CODE (type) == TYPE_CODE_INT
5255796c8dcSSimon Schubert && TYPE_LENGTH (type) == 2
5265796c8dcSSimon Schubert && strcmp (TYPE_NAME (type), "char") == 0))
527c50c785cSJohn Marino LA_PRINT_CHAR ((int) unpack_long (type, valaddr + embedded_offset),
528c50c785cSJohn Marino type, stream);
5295796c8dcSSimon Schubert else
530c50c785cSJohn Marino val_print_type_code_int (type, valaddr + embedded_offset, stream);
5315796c8dcSSimon Schubert break;
5325796c8dcSSimon Schubert
5335796c8dcSSimon Schubert case TYPE_CODE_STRUCT:
534c50c785cSJohn Marino java_print_value_fields (type, valaddr, embedded_offset,
535c50c785cSJohn Marino address, stream, recurse, val, options);
5365796c8dcSSimon Schubert break;
5375796c8dcSSimon Schubert
5385796c8dcSSimon Schubert default:
539*ef5ccd6cSJohn Marino c_val_print (type, valaddr, embedded_offset, address, stream,
540cf7f2e2dSJohn Marino recurse, val, options);
541*ef5ccd6cSJohn Marino break;
5425796c8dcSSimon Schubert }
5435796c8dcSSimon Schubert }
544