Use common_val_print in c-valprint.c
This changes c_value_print to call common_val_print. This is more complicated than the usual sort of common_val_print change, due to the handling of RTTI. gdb/ChangeLog 2020-03-13 Tom Tromey <tom@tromey.com> * c-valprint.c (c_value_print): Use common_val_print. gdb/testsuite/ChangeLog 2020-03-13 Tom Tromey <tom@tromey.com> * gdb.base/printcmds.exp (test_print_strings): Add regression test. * gdb.base/printcmds.c (charptr): New typedef. (teststring2): New global.
This commit is contained in:
parent
410cf31501
commit
a1f6a07c3d
5 changed files with 37 additions and 37 deletions
|
@ -1,3 +1,7 @@
|
|||
2020-03-13 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* c-valprint.c (c_value_print): Use common_val_print.
|
||||
|
||||
2020-03-13 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* cp-valprint.c (cp_print_static_field): Use common_val_print.
|
||||
|
|
|
@ -567,7 +567,7 @@ void
|
|||
c_value_print (struct value *val, struct ui_file *stream,
|
||||
const struct value_print_options *options)
|
||||
{
|
||||
struct type *type, *real_type, *val_type;
|
||||
struct type *type, *real_type;
|
||||
int full, using_enc;
|
||||
LONGEST top;
|
||||
struct value_print_options opts = *options;
|
||||
|
@ -581,24 +581,22 @@ c_value_print (struct value *val, struct ui_file *stream,
|
|||
C++: if it is a member pointer, we will take care
|
||||
of that when we print it. */
|
||||
|
||||
/* Preserve the original type before stripping typedefs. We prefer
|
||||
to pass down the original type when possible, but for local
|
||||
checks it is better to look past the typedefs. */
|
||||
val_type = value_type (val);
|
||||
type = check_typedef (val_type);
|
||||
type = check_typedef (value_type (val));
|
||||
|
||||
if (TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_IS_REFERENCE (type))
|
||||
{
|
||||
struct type *original_type = value_type (val);
|
||||
|
||||
/* Hack: remove (char *) for char strings. Their
|
||||
type is indicated by the quoted string anyway.
|
||||
(Don't use c_textual_element_type here; quoted strings
|
||||
are always exactly (char *), (wchar_t *), or the like. */
|
||||
if (TYPE_CODE (val_type) == TYPE_CODE_PTR
|
||||
&& TYPE_NAME (val_type) == NULL
|
||||
&& TYPE_NAME (TYPE_TARGET_TYPE (val_type)) != NULL
|
||||
&& (strcmp (TYPE_NAME (TYPE_TARGET_TYPE (val_type)),
|
||||
if (TYPE_CODE (original_type) == TYPE_CODE_PTR
|
||||
&& TYPE_NAME (original_type) == NULL
|
||||
&& TYPE_NAME (TYPE_TARGET_TYPE (original_type)) != NULL
|
||||
&& (strcmp (TYPE_NAME (TYPE_TARGET_TYPE (original_type)),
|
||||
"char") == 0
|
||||
|| textual_name (TYPE_NAME (TYPE_TARGET_TYPE (val_type)))))
|
||||
|| textual_name (TYPE_NAME (TYPE_TARGET_TYPE (original_type)))))
|
||||
{
|
||||
/* Print nothing. */
|
||||
}
|
||||
|
@ -624,7 +622,6 @@ c_value_print (struct value *val, struct ui_file *stream,
|
|||
if (real_type)
|
||||
{
|
||||
/* RTTI entry found. */
|
||||
type = real_type;
|
||||
|
||||
/* Need to adjust pointer value. */
|
||||
val = value_from_pointer (real_type,
|
||||
|
@ -637,14 +634,11 @@ c_value_print (struct value *val, struct ui_file *stream,
|
|||
}
|
||||
|
||||
if (is_ref)
|
||||
{
|
||||
val = value_ref (value_ind (val), refcode);
|
||||
type = value_type (val);
|
||||
}
|
||||
val = value_ref (value_ind (val), refcode);
|
||||
|
||||
type = value_type (val);
|
||||
type_print (type, "", stream, -1);
|
||||
fprintf_filtered (stream, ") ");
|
||||
val_type = type;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -667,36 +661,25 @@ c_value_print (struct value *val, struct ui_file *stream,
|
|||
/* We have RTTI information, so use it. */
|
||||
val = value_full_object (val, real_type,
|
||||
full, top, using_enc);
|
||||
/* In a destructor we might see a real type that is a
|
||||
superclass of the object's type. In this case it is
|
||||
better to leave the object as-is. */
|
||||
if (!(full
|
||||
&& (TYPE_LENGTH (real_type)
|
||||
< TYPE_LENGTH (value_enclosing_type (val)))))
|
||||
val = value_cast (real_type, val);
|
||||
fprintf_filtered (stream, "(%s%s) ",
|
||||
TYPE_NAME (real_type),
|
||||
full ? "" : _(" [incomplete object]"));
|
||||
/* Print out object: enclosing type is same as real_type if
|
||||
full. */
|
||||
val_print (value_enclosing_type (val),
|
||||
0,
|
||||
value_address (val), stream, 0,
|
||||
val, &opts, current_language);
|
||||
return;
|
||||
/* Note: When we look up RTTI entries, we don't get any
|
||||
information on const or volatile attributes. */
|
||||
}
|
||||
else if (type != check_typedef (value_enclosing_type (val)))
|
||||
{
|
||||
/* No RTTI information, so let's do our best. */
|
||||
fprintf_filtered (stream, "(%s ?) ",
|
||||
TYPE_NAME (value_enclosing_type (val)));
|
||||
val_print (value_enclosing_type (val),
|
||||
0,
|
||||
value_address (val), stream, 0,
|
||||
val, &opts, current_language);
|
||||
return;
|
||||
val = value_cast (value_enclosing_type (val), val);
|
||||
}
|
||||
/* Otherwise, we end up at the return outside this "if". */
|
||||
}
|
||||
|
||||
val_print (val_type,
|
||||
value_embedded_offset (val),
|
||||
value_address (val),
|
||||
stream, 0,
|
||||
val, &opts, current_language);
|
||||
common_val_print (val, stream, 0, &opts, current_language);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2020-03-13 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* gdb.base/printcmds.exp (test_print_strings): Add regression
|
||||
test.
|
||||
* gdb.base/printcmds.c (charptr): New typedef.
|
||||
(teststring2): New global.
|
||||
|
||||
2020-03-13 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* gdb.base/break-interp.exp: Use the tail of the filename, not the
|
||||
|
|
|
@ -72,6 +72,9 @@ int int4dim[1][2][3][2] = {{{{0,1},{2,3},{4,5}},{{6,7},{8,9},{10,11}}}};
|
|||
|
||||
char *teststring = (char*)"teststring contents";
|
||||
|
||||
typedef char *charptr;
|
||||
charptr teststring2 = "more contents";
|
||||
|
||||
/* Test printing of a struct containing character arrays. */
|
||||
|
||||
struct some_arrays {
|
||||
|
|
|
@ -519,6 +519,9 @@ proc test_print_strings {} {
|
|||
gdb_test "p teststring" \
|
||||
" = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 20"
|
||||
|
||||
gdb_test "print teststring2" \
|
||||
" = (charptr) \"more contents\""
|
||||
|
||||
gdb_test_no_output "set print elements 8"
|
||||
|
||||
# Set the target-charset to ASCII, because the output varies from
|
||||
|
|
Loading…
Add table
Reference in a new issue