| Index: gdb/c-valprint.c
|
| diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
|
| index 7a1bb02be630d141b8c178ef00a7d2bbc933413f..5a21f55afb34de4e47d250c94283cfd674ae5173 100644
|
| --- a/gdb/c-valprint.c
|
| +++ b/gdb/c-valprint.c
|
| @@ -1,7 +1,6 @@
|
| /* Support for printing C values for GDB, the GNU debugger.
|
|
|
| - Copyright (C) 1986, 1988-1989, 1991-2001, 2003, 2005-2012 Free
|
| - Software Foundation, Inc.
|
| + Copyright (C) 1986-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -19,7 +18,7 @@
|
| along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
| #include "defs.h"
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
| #include "symtab.h"
|
| #include "gdbtypes.h"
|
| #include "expression.h"
|
| @@ -162,7 +161,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
|
|
|
| eltlen = TYPE_LENGTH (elttype);
|
| len = high_bound - low_bound + 1;
|
| - if (options->prettyprint_arrays)
|
| + if (options->prettyformat_arrays)
|
| {
|
| print_spaces_filtered (2 + 2 * recurse, stream);
|
| }
|
| @@ -177,6 +176,8 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
|
| TARGET_CHAR_BIT * embedded_offset,
|
| TARGET_CHAR_BIT * TYPE_LENGTH (type)))
|
| {
|
| + int force_ellipses = 0;
|
| +
|
| /* If requested, look for the first null char and only
|
| print elements up to it. */
|
| if (options->stop_print_at_null)
|
| @@ -191,12 +192,26 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
|
| eltlen, byte_order) != 0);
|
| ++temp_len)
|
| ;
|
| +
|
| + /* Force LA_PRINT_STRING to print ellipses if
|
| + we've printed the maximum characters and
|
| + the next character is not \000. */
|
| + if (temp_len == options->print_max && temp_len < len)
|
| + {
|
| + ULONGEST val
|
| + = extract_unsigned_integer (valaddr + embedded_offset
|
| + + temp_len * eltlen,
|
| + eltlen, byte_order);
|
| + if (val != 0)
|
| + force_ellipses = 1;
|
| + }
|
| +
|
| len = temp_len;
|
| }
|
|
|
| LA_PRINT_STRING (stream, unresolved_elttype,
|
| valaddr + embedded_offset, len,
|
| - NULL, 0, options);
|
| + NULL, force_ellipses, options);
|
| i = len;
|
| }
|
| else
|
| @@ -295,18 +310,18 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
|
| CORE_ADDR vt_address = unpack_pointer (type,
|
| valaddr
|
| + embedded_offset);
|
| - struct minimal_symbol *msymbol =
|
| - lookup_minimal_symbol_by_pc (vt_address);
|
| + struct bound_minimal_symbol msymbol =
|
| + lookup_minimal_symbol_by_pc (vt_address);
|
|
|
| /* If 'symbol_print' is set, we did the work above. */
|
| if (!options->symbol_print
|
| - && (msymbol != NULL)
|
| - && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
|
| + && (msymbol.minsym != NULL)
|
| + && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol.minsym)))
|
| {
|
| if (want_space)
|
| fputs_filtered (" ", stream);
|
| fputs_filtered (" <", stream);
|
| - fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
|
| + fputs_filtered (SYMBOL_PRINT_NAME (msymbol.minsym), stream);
|
| fputs_filtered (">", stream);
|
| want_space = 1;
|
| }
|
| @@ -317,13 +332,13 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
|
| struct symbol *wsym = (struct symbol *) NULL;
|
| struct type *wtype;
|
| struct block *block = (struct block *) NULL;
|
| - int is_this_fld;
|
| + struct field_of_this_result is_this_fld;
|
|
|
| if (want_space)
|
| fputs_filtered (" ", stream);
|
|
|
| - if (msymbol != NULL)
|
| - wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol),
|
| + if (msymbol.minsym != NULL)
|
| + wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol.minsym),
|
| block, VAR_DOMAIN,
|
| &is_this_fld);
|
|
|
| @@ -338,7 +353,7 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
|
| vt_val = value_at (wtype, vt_address);
|
| common_val_print (vt_val, stream, recurse + 1,
|
| options, current_language);
|
| - if (options->pretty)
|
| + if (options->prettyformat)
|
| {
|
| fprintf_filtered (stream, "\n");
|
| print_spaces_filtered (2 + 2 * recurse, stream);
|
| @@ -482,18 +497,11 @@ c_value_print (struct value *val, struct ui_file *stream,
|
| else if (options->objectprint
|
| && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS))
|
| {
|
| + int is_ref = TYPE_CODE (type) == TYPE_CODE_REF;
|
| +
|
| + if (is_ref)
|
| + val = value_addr (val);
|
|
|
| - if (TYPE_CODE(type) == TYPE_CODE_REF)
|
| - {
|
| - /* Copy value, change to pointer, so we don't get an
|
| - error about a non-pointer type in
|
| - value_rtti_target_type. */
|
| - struct value *temparg;
|
| - temparg=value_copy(val);
|
| - deprecated_set_value_type
|
| - (temparg, lookup_pointer_type (TYPE_TARGET_TYPE (type)));
|
| - val = temparg;
|
| - }
|
| /* Pointer to class, check real type of object. */
|
| fprintf_filtered (stream, "(");
|
|
|
| @@ -507,7 +515,14 @@ c_value_print (struct value *val, struct ui_file *stream,
|
| type = real_type;
|
|
|
| /* Need to adjust pointer value. */
|
| - val = value_from_pointer (type, value_as_address (val) - top);
|
| + val = value_from_pointer (real_type,
|
| + value_as_address (val) - top);
|
| +
|
| + if (is_ref)
|
| + {
|
| + val = value_ref (value_ind (val));
|
| + type = value_type (val);
|
| + }
|
|
|
| /* Note: When we look up RTTI entries, we don't get
|
| any information on const or volatile
|
|
|