Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: gdb/c-lang.c

Issue 124383005: GDB 7.6.50 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@upstream
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gdb/c-lang.h ('k') | gdb/c-typeprint.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
};
« no previous file with comments | « gdb/c-lang.h ('k') | gdb/c-typeprint.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698