| Index: gdb/c-lang.c
|
| diff --git a/gdb/c-lang.c b/gdb/c-lang.c
|
| index b5135d57cc7e59600a2347f67a489e64c7f10495..2c075f46f4b262f0a1bffe05b3fb253a7a8c168e 100644
|
| --- a/gdb/c-lang.c
|
| +++ b/gdb/c-lang.c
|
| @@ -1,7 +1,6 @@
|
| /* C language support routines for GDB, the GNU debugger.
|
|
|
| - Copyright (C) 1992-1996, 1998-2000, 2002-2005, 2007-2012 Free
|
| - Software Foundation, Inc.
|
| + Copyright (C) 1992-2013 Free Software Foundation, Inc.
|
|
|
| This file is part of GDB.
|
|
|
| @@ -24,18 +23,20 @@
|
| #include "expression.h"
|
| #include "parser-defs.h"
|
| #include "language.h"
|
| +#include "varobj.h"
|
| #include "c-lang.h"
|
| #include "valprint.h"
|
| #include "macroscope.h"
|
| #include "gdb_assert.h"
|
| #include "charset.h"
|
| -#include "gdb_string.h"
|
| +#include <string.h>
|
| #include "demangle.h"
|
| #include "cp-abi.h"
|
| #include "cp-support.h"
|
| #include "gdb_obstack.h"
|
| #include <ctype.h>
|
| #include "exceptions.h"
|
| +#include "gdbcore.h"
|
|
|
| extern void _initialize_c_language (void);
|
|
|
| @@ -197,17 +198,6 @@ c_printstr (struct ui_file *stream, struct type *type,
|
| const char *type_encoding;
|
| const char *encoding;
|
|
|
| - enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
|
| - unsigned int i;
|
| - unsigned int things_printed = 0;
|
| - int in_quotes = 0;
|
| - int need_comma = 0;
|
| - struct obstack wchar_buf, output;
|
| - struct cleanup *cleanup;
|
| - struct wchar_iterator *iter;
|
| - int finished = 0;
|
| - int need_escape = 0;
|
| -
|
| str_type = (classify_type (type, get_type_arch (type), &type_encoding)
|
| & ~C_CHAR);
|
| switch (str_type)
|
| @@ -237,9 +227,13 @@ c_printstr (struct ui_file *stream, struct type *type,
|
| until a null character of the appropriate width is found, otherwise
|
| the string is read to the length of characters specified. The size
|
| of a character is determined by the length of the target type of
|
| - the pointer or array. If VALUE is an array with a known length,
|
| - the function will not read past the end of the array. On
|
| - completion, *LENGTH will be set to the size of the string read in
|
| + the pointer or array.
|
| +
|
| + If VALUE is an array with a known length, and *LENGTH is -1,
|
| + the function will not read past the end of the array. However, any
|
| + declared size of the array is ignored if *LENGTH > 0.
|
| +
|
| + On completion, *LENGTH will be set to the size of the string read in
|
| characters. (If a length of -1 is specified, the length returned
|
| will not include the null character). CHARSET is always set to the
|
| target charset. */
|
| @@ -256,7 +250,6 @@ c_get_string (struct value *value, gdb_byte **buffer,
|
| int req_length = *length;
|
| enum bfd_endian byte_order
|
| = gdbarch_byte_order (get_type_arch (type));
|
| - enum c_string_type kind;
|
|
|
| if (element_type == NULL)
|
| goto error;
|
| @@ -285,9 +278,7 @@ c_get_string (struct value *value, gdb_byte **buffer,
|
|
|
| if (! c_textual_element_type (element_type, 0))
|
| goto error;
|
| - kind = classify_type (element_type,
|
| - get_type_arch (element_type),
|
| - charset);
|
| + classify_type (element_type, get_type_arch (element_type), charset);
|
| width = TYPE_LENGTH (element_type);
|
|
|
| /* If the string lives in GDB's memory instead of the inferior's,
|
| @@ -322,17 +313,27 @@ c_get_string (struct value *value, gdb_byte **buffer,
|
| {
|
| CORE_ADDR addr = value_as_address (value);
|
|
|
| + /* Prior to the fix for PR 16196 read_string would ignore fetchlimit
|
| + if length > 0. The old "broken" behaviour is the behaviour we want:
|
| + The caller may want to fetch 100 bytes from a variable length array
|
| + implemented using the common idiom of having an array of length 1 at
|
| + the end of a struct. In this case we want to ignore the declared
|
| + size of the array. However, it's counterintuitive to implement that
|
| + behaviour in read_string: what does fetchlimit otherwise mean if
|
| + length > 0. Therefore we implement the behaviour we want here:
|
| + If *length > 0, don't specify a fetchlimit. This preserves the
|
| + previous behaviour. We could move this check above where we know
|
| + whether the array is declared with a fixed size, but we only want
|
| + to apply this behaviour when calling read_string. PR 16286. */
|
| + if (*length > 0)
|
| + fetchlimit = UINT_MAX;
|
| +
|
| err = read_string (addr, *length, width, fetchlimit,
|
| byte_order, buffer, length);
|
| if (err)
|
| {
|
| xfree (*buffer);
|
| - if (err == EIO)
|
| - throw_error (MEMORY_ERROR, "Address %s out of bounds",
|
| - paddress (get_type_arch (type), addr));
|
| - else
|
| - error (_("Error reading string from inferior: %s"),
|
| - safe_strerror (err));
|
| + memory_error (err, addr);
|
| }
|
| }
|
|
|
| @@ -551,7 +552,7 @@ parse_one_string (struct obstack *output, char *data, int len,
|
| /* If we saw a run of characters, convert them all. */
|
| if (p > data)
|
| convert_between_encodings (host_charset (), dest_charset,
|
| - data, p - data, 1,
|
| + (gdb_byte *) data, p - data, 1,
|
| output, translit_none);
|
| /* If we saw an escape, convert it. */
|
| if (p < limit)
|
| @@ -673,7 +674,7 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp,
|
| if (obstack_object_size (&output) != TYPE_LENGTH (type))
|
| error (_("Could not convert character "
|
| "constant to target character set"));
|
| - value = unpack_long (type, obstack_base (&output));
|
| + value = unpack_long (type, (gdb_byte *) obstack_base (&output));
|
| result = value_from_longest (type, value);
|
| }
|
| else
|
| @@ -747,6 +748,7 @@ const struct op_print c_op_print_tab[] =
|
| {"/", BINOP_DIV, PREC_MUL, 0},
|
| {"%", BINOP_REM, PREC_MUL, 0},
|
| {"@", BINOP_REPEAT, PREC_REPEAT, 0},
|
| + {"+", UNOP_PLUS, PREC_PREFIX, 0},
|
| {"-", UNOP_NEG, PREC_PREFIX, 0},
|
| {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
|
| {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
|
| @@ -829,9 +831,9 @@ const struct exp_descriptor exp_descriptor_c =
|
| const struct language_defn c_language_defn =
|
| {
|
| "c", /* Language name */
|
| + "C",
|
| language_c,
|
| range_check_off,
|
| - type_check_off,
|
| case_sensitive_on,
|
| array_row_major,
|
| macro_expansion_c,
|
| @@ -865,6 +867,7 @@ const struct language_defn c_language_defn =
|
| c_get_string,
|
| NULL, /* la_get_symbol_name_cmp */
|
| iterate_over_symbols,
|
| + &c_varobj_ops,
|
| LANG_MAGIC
|
| };
|
|
|
| @@ -953,9 +956,9 @@ cplus_language_arch_info (struct gdbarch *gdbarch,
|
| const struct language_defn cplus_language_defn =
|
| {
|
| "c++", /* Language name */
|
| + "C++",
|
| language_cplus,
|
| range_check_off,
|
| - type_check_off,
|
| case_sensitive_on,
|
| array_row_major,
|
| macro_expansion_c,
|
| @@ -975,7 +978,7 @@ const struct language_defn cplus_language_defn =
|
| "this", /* name_of_this */
|
| cp_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
|
| cp_lookup_transparent_type, /* lookup_transparent_type */
|
| - cplus_demangle, /* Language specific symbol demangler */
|
| + gdb_demangle, /* Language specific symbol demangler */
|
| cp_class_name_from_physname, /* Language specific
|
| class_name_from_physname */
|
| c_op_print_tab, /* expression operators for printing */
|
| @@ -989,15 +992,16 @@ const struct language_defn cplus_language_defn =
|
| c_get_string,
|
| NULL, /* la_get_symbol_name_cmp */
|
| iterate_over_symbols,
|
| + &cplus_varobj_ops,
|
| LANG_MAGIC
|
| };
|
|
|
| const struct language_defn asm_language_defn =
|
| {
|
| "asm", /* Language name */
|
| + "assembly",
|
| language_asm,
|
| range_check_off,
|
| - type_check_off,
|
| case_sensitive_on,
|
| array_row_major,
|
| macro_expansion_c,
|
| @@ -1031,6 +1035,7 @@ const struct language_defn asm_language_defn =
|
| c_get_string,
|
| NULL, /* la_get_symbol_name_cmp */
|
| iterate_over_symbols,
|
| + &default_varobj_ops,
|
| LANG_MAGIC
|
| };
|
|
|
| @@ -1042,9 +1047,9 @@ const struct language_defn asm_language_defn =
|
| const struct language_defn minimal_language_defn =
|
| {
|
| "minimal", /* Language name */
|
| + "Minimal",
|
| language_minimal,
|
| range_check_off,
|
| - type_check_off,
|
| case_sensitive_on,
|
| array_row_major,
|
| macro_expansion_c,
|
| @@ -1078,6 +1083,7 @@ const struct language_defn minimal_language_defn =
|
| c_get_string,
|
| NULL, /* la_get_symbol_name_cmp */
|
| iterate_over_symbols,
|
| + &default_varobj_ops,
|
| LANG_MAGIC
|
| };
|
|
|
|
|