X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fc-valprint.c;h=62552ec7fd9090fb03c5f33f39fd8ba61e12f780;hb=f3abeff575541dd80e1facd6d0f920e10f77fede;hp=0a61d7a6151eaa8d346f44b2d1539fd047d54dda;hpb=49f7fe2880dc08ae701d9cdb84c8217642ef637a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index 0a61d7a615..62552ec7fd 100644 --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c @@ -1,6 +1,6 @@ /* Support for printing C values for GDB, the GNU debugger. - Copyright (C) 1986-2015 Free Software Foundation, Inc. + Copyright (C) 1986-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -193,9 +193,9 @@ print_unpacked_pointer (struct type *type, struct type *elttype, if (vt_address && options->vtblprint) { struct value *vt_val; - struct symbol *wsym = (struct symbol *) NULL; + struct symbol *wsym = NULL; struct type *wtype; - struct block *block = (struct block *) NULL; + struct block *block = NULL; struct field_of_this_result is_this_fld; if (want_space) @@ -203,7 +203,7 @@ print_unpacked_pointer (struct type *type, struct type *elttype, if (msymbol.minsym != NULL) wsym = lookup_symbol (MSYMBOL_LINKAGE_NAME(msymbol.minsym), block, - VAR_DOMAIN, &is_this_fld); + VAR_DOMAIN, &is_this_fld).symbol; if (wsym) { @@ -236,6 +236,8 @@ c_val_print_array (struct type *type, const gdb_byte *valaddr, { struct type *unresolved_elttype = TYPE_TARGET_TYPE (type); struct type *elttype = check_typedef (unresolved_elttype); + struct gdbarch *arch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (arch); if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (unresolved_elttype) > 0) { @@ -276,7 +278,8 @@ c_val_print_array (struct type *type, const gdb_byte *valaddr, for (temp_len = 0; (temp_len < len && temp_len < options->print_max - && extract_unsigned_integer (valaddr + embedded_offset + && extract_unsigned_integer (valaddr + + embedded_offset * unit_size + temp_len * eltlen, eltlen, byte_order) != 0); ++temp_len) @@ -288,7 +291,8 @@ c_val_print_array (struct type *type, const gdb_byte *valaddr, if (temp_len == options->print_max && temp_len < len) { ULONGEST val - = extract_unsigned_integer (valaddr + embedded_offset + = extract_unsigned_integer (valaddr + + embedded_offset * unit_size + temp_len * eltlen, eltlen, byte_order); if (val != 0) @@ -299,7 +303,7 @@ c_val_print_array (struct type *type, const gdb_byte *valaddr, } LA_PRINT_STRING (stream, unresolved_elttype, - valaddr + embedded_offset, len, + valaddr + embedded_offset * unit_size, len, NULL, force_ellipses, options); i = len; } @@ -342,6 +346,9 @@ c_val_print_ptr (struct type *type, const gdb_byte *valaddr, const struct value *original_value, const struct value_print_options *options) { + struct gdbarch *arch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (arch); + if (options->format && options->format != 's') { val_print_scalar_formatted (type, valaddr, embedded_offset, @@ -363,7 +370,8 @@ c_val_print_ptr (struct type *type, const gdb_byte *valaddr, { struct type *unresolved_elttype = TYPE_TARGET_TYPE (type); struct type *elttype = check_typedef (unresolved_elttype); - CORE_ADDR addr = unpack_pointer (type, valaddr + embedded_offset); + CORE_ADDR addr = unpack_pointer (type, + valaddr + embedded_offset * unit_size); print_unpacked_pointer (type, elttype, unresolved_elttype, valaddr, embedded_offset, addr, stream, recurse, options); @@ -430,6 +438,9 @@ c_val_print_int (struct type *type, struct type *unresolved_type, struct ui_file *stream, const struct value *original_value, const struct value_print_options *options) { + struct gdbarch *arch = get_type_arch (type); + int unit_size = gdbarch_addressable_memory_unit_size (arch); + if (options->format || options->output_format) { struct value_print_options opts = *options; @@ -441,7 +452,7 @@ c_val_print_int (struct type *type, struct type *unresolved_type, } else { - val_print_type_code_int (type, valaddr + embedded_offset, + val_print_type_code_int (type, valaddr + embedded_offset * unit_size, stream); /* C and C++ has no single byte int type, char is used instead. Since we don't know whether the value is really @@ -450,12 +461,33 @@ c_val_print_int (struct type *type, struct type *unresolved_type, if (c_textual_element_type (unresolved_type, options->format)) { fputs_filtered (" ", stream); - LA_PRINT_CHAR (unpack_long (type, valaddr + embedded_offset), + LA_PRINT_CHAR (unpack_long (type, + valaddr + embedded_offset * unit_size), unresolved_type, stream); } } } +/* c_val_print helper for TYPE_CODE_MEMBERPTR. */ + +static void +c_val_print_memberptr (struct type *type, const gdb_byte *valaddr, + int embedded_offset, CORE_ADDR address, + struct ui_file *stream, int recurse, + const struct value *original_value, + const struct value_print_options *options) +{ + if (!options->format) + { + cp_print_class_member (valaddr + embedded_offset, type, stream, "&"); + } + else + { + generic_val_print (type, valaddr, embedded_offset, address, stream, + recurse, original_value, options, &c_decorations); + } +} + /* See val_print for a description of the various parameters of this function; they are identical. */ @@ -468,7 +500,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr, { struct type *unresolved_type = type; - CHECK_TYPEDEF (type); + type = check_typedef (type); switch (TYPE_CODE (type)) { case TYPE_CODE_ARRAY: @@ -501,12 +533,9 @@ c_val_print (struct type *type, const gdb_byte *valaddr, break; case TYPE_CODE_MEMBERPTR: - if (!options->format) - { - cp_print_class_member (valaddr + embedded_offset, type, stream, "&"); - break; - } - /* FALLTHROUGH */ + c_val_print_memberptr (type, valaddr, embedded_offset, address, stream, + recurse, original_value, options); + break; case TYPE_CODE_REF: case TYPE_CODE_ENUM: