From 3f0cbb04d0fbb0923f2972efa95a4c767592860b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 22 Feb 2020 10:02:42 -0700 Subject: [PATCH] Style field names in "print" This changes gdb to use the "variable" style when printing field names. I've added new tests for C and Rust, but not other languages. I chose "variable" because that seemed most straightforward. However, another option would be to introduce a new "field" style. Similarly, this patch uses the variable style for enumerator constants -- but again, a new style could be used if that's preferred. gdb/ChangeLog 2020-02-22 Tom Tromey * valprint.c (generic_val_print_enum_1) (val_print_type_code_flags): Style member names. * rust-lang.c (val_print_struct, rust_print_enum) (rust_print_struct_def, rust_internal_print_type): Style member names. * p-valprint.c (pascal_object_print_value_fields): Style member names. Only call fprintf_symbol_filtered for static members. * m2-typeprint.c (m2_record_fields, m2_enum): Style member names. * f-valprint.c (f_val_print): Style member names. * f-typeprint.c (f_type_print_base): Style member names. * cp-valprint.c (cp_print_value_fields): Style member names. Only call fprintf_symbol_filtered for static members. (cp_print_class_member): Style member names. * c-typeprint.c (c_print_type_1, c_type_print_base_1): Style member names. * ada-valprint.c (ada_print_scalar): Style enum names. (ada_val_print_enum): Likewise. * ada-typeprint.c (print_enum_type): Style enum names. gdb/testsuite/ChangeLog 2020-02-22 Tom Tromey * gdb.rust/rust-style.rs: New file. * gdb.rust/rust-style.exp: New file. * gdb.base/style.exp: Test structure printing. * gdb.base/style.c (struct some_struct): New type. (enum etype): New type. (struct_value): New global. Change-Id: I070e1293c6cc830c9ea916af8243410aa384e944 --- gdb/ChangeLog | 21 +++++++++++++ gdb/ada-typeprint.c | 3 +- gdb/ada-valprint.c | 9 ++++-- gdb/c-typeprint.c | 5 +-- gdb/cp-valprint.c | 18 +++++++---- gdb/f-typeprint.c | 3 +- gdb/f-valprint.c | 3 +- gdb/m2-typeprint.c | 6 ++-- gdb/p-valprint.c | 14 ++++++--- gdb/rust-lang.c | 19 ++++++++---- gdb/testsuite/ChangeLog | 9 ++++++ gdb/testsuite/gdb.base/style.c | 15 +++++++++ gdb/testsuite/gdb.base/style.exp | 7 +++++ gdb/testsuite/gdb.rust/rust-style.exp | 44 +++++++++++++++++++++++++++ gdb/testsuite/gdb.rust/rust-style.rs | 29 ++++++++++++++++++ gdb/valprint.c | 17 +++++++---- 16 files changed, 190 insertions(+), 32 deletions(-) create mode 100644 gdb/testsuite/gdb.rust/rust-style.exp create mode 100644 gdb/testsuite/gdb.rust/rust-style.rs diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 782f6008c3..ecdce315f7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +2020-02-22 Tom Tromey + + * valprint.c (generic_val_print_enum_1) + (val_print_type_code_flags): Style member names. + * rust-lang.c (val_print_struct, rust_print_enum) + (rust_print_struct_def, rust_internal_print_type): Style member + names. + * p-valprint.c (pascal_object_print_value_fields): Style member + names. Only call fprintf_symbol_filtered for static members. + * m2-typeprint.c (m2_record_fields, m2_enum): Style member names. + * f-valprint.c (f_val_print): Style member names. + * f-typeprint.c (f_type_print_base): Style member names. + * cp-valprint.c (cp_print_value_fields): Style member names. Only + call fprintf_symbol_filtered for static members. + (cp_print_class_member): Style member names. + * c-typeprint.c (c_print_type_1, c_type_print_base_1): Style + member names. + * ada-valprint.c (ada_print_scalar): Style enum names. + (ada_val_print_enum): Likewise. + * ada-typeprint.c (print_enum_type): Style enum names. + 2020-02-21 Tom Tromey * psympriv.h (struct partial_symtab): Update comment. diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 89ce290de7..db4634c0f3 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -326,7 +326,8 @@ print_enum_type (struct type *type, struct ui_file *stream) if (i) fprintf_filtered (stream, ", "); wrap_here (" "); - fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream); + fputs_styled (ada_enum_name (TYPE_FIELD_NAME (type, i)), + variable_name_style.style (), stream); if (lastval != TYPE_FIELD_ENUMVAL (type, i)) { fprintf_filtered (stream, " => %s", diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index 88b74cd061..b918caf473 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -418,7 +418,8 @@ ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream) } if (i < len) { - fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream); + fputs_styled (ada_enum_name (TYPE_FIELD_NAME (type, i)), + variable_name_style.style (), stream); } else { @@ -956,9 +957,11 @@ ada_val_print_enum (struct type *type, const gdb_byte *valaddr, const char *name = ada_enum_name (TYPE_FIELD_NAME (type, i)); if (name[0] == '\'') - fprintf_filtered (stream, "%ld %s", (long) val, name); + fprintf_filtered (stream, "%ld %ps", (long) val, + styled_string (variable_name_style.style (), + name)); else - fputs_filtered (name, stream); + fputs_styled (name, variable_name_style.style (), stream); } else print_longest (stream, 'd', 0, val); diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index a8c9705c03..1f27b56646 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -148,7 +148,7 @@ c_print_type_1 (struct type *type, if (code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD) fputs_styled (varstring, function_name_style.style (), stream); else - fputs_filtered (varstring, stream); + fputs_styled (varstring, variable_name_style.style (), stream); /* For demangled function names, we have the arglist as part of the name, so don't print an additional pair of ()'s. */ @@ -1595,7 +1595,8 @@ c_type_print_base_1 (struct type *type, struct ui_file *stream, if (i) fprintf_filtered (stream, ", "); wrap_here (" "); - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); if (lastval != TYPE_FIELD_ENUMVAL (type, i)) { fprintf_filtered (stream, " = %s", diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 288ebafec7..e936e3ffa3 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -235,11 +235,16 @@ cp_print_value_fields (struct type *type, struct type *real_type, annotate_field_begin (TYPE_FIELD_TYPE (type, i)); if (field_is_static (&TYPE_FIELD (type, i))) - fputs_filtered ("static ", stream); - fprintf_symbol_filtered (stream, - TYPE_FIELD_NAME (type, i), - current_language->la_language, - DMGL_PARAMS | DMGL_ANSI); + { + fputs_filtered ("static ", stream); + fprintf_symbol_filtered (stream, + TYPE_FIELD_NAME (type, i), + current_language->la_language, + DMGL_PARAMS | DMGL_ANSI); + } + else + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); annotate_field_name_end (); /* We tweak various options in a few cases below. */ @@ -782,7 +787,8 @@ cp_print_class_member (const gdb_byte *valaddr, struct type *type, else c_type_print_base (self_type, stream, 0, 0, &type_print_raw_options); fprintf_filtered (stream, "::"); - fputs_filtered (TYPE_FIELD_NAME (self_type, fieldno), stream); + fputs_styled (TYPE_FIELD_NAME (self_type, fieldno), + variable_name_style.style (), stream); } else fprintf_filtered (stream, "%ld", (long) val); diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index 72a4188fbb..e4a2beb930 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -435,7 +435,8 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, f_type_print_base (TYPE_FIELD_TYPE (type, index), stream, show - 1, level + 4); fputs_filtered (" :: ", stream); - fputs_filtered (TYPE_FIELD_NAME (type, index), stream); + fputs_styled (TYPE_FIELD_NAME (type, index), + variable_name_style.style (), stream); f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index), stream, show - 1, 0, 0, 0, false); fputs_filtered ("\n", stream); diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index 71247a7143..a25e614732 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -341,7 +341,8 @@ f_val_print (struct type *type, int embedded_offset, field_name = TYPE_FIELD_NAME (type, index); if (field_name != NULL) { - fputs_filtered (field_name, stream); + fputs_styled (field_name, variable_name_style.style (), + stream); fputs_filtered (" = ", stream); } diff --git a/gdb/m2-typeprint.c b/gdb/m2-typeprint.c index 0fe4fad0be..a4a7689c33 100644 --- a/gdb/m2-typeprint.c +++ b/gdb/m2-typeprint.c @@ -563,7 +563,8 @@ m2_record_fields (struct type *type, struct ui_file *stream, int show, QUIT; print_spaces_filtered (level + 4, stream); - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); fputs_filtered (" : ", stream); m2_print_type (TYPE_FIELD_TYPE (type, i), "", @@ -608,7 +609,8 @@ m2_enum (struct type *type, struct ui_file *stream, int show, int level) if (i > 0) fprintf_filtered (stream, ", "); wrap_here (" "); - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); if (lastval != TYPE_FIELD_ENUMVAL (type, i)) { fprintf_filtered (stream, " = %s", diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index aaeb4b67e9..7d087557fd 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -605,10 +605,16 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr, annotate_field_begin (TYPE_FIELD_TYPE (type, i)); if (field_is_static (&TYPE_FIELD (type, i))) - fputs_filtered ("static ", stream); - fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i), - language_cplus, - DMGL_PARAMS | DMGL_ANSI); + { + fputs_filtered ("static ", stream); + fprintf_symbol_filtered (stream, + TYPE_FIELD_NAME (type, i), + current_language->la_language, + DMGL_PARAMS | DMGL_ANSI); + } + else + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); annotate_field_name_end (); fputs_filtered (" = ", stream); annotate_field_value (); diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 18dc6a5647..fc48e3486a 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -436,7 +436,8 @@ val_print_struct (struct type *type, int embedded_offset, if (!is_tuple && !is_tuple_struct) { - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); fputs_filtered (": ", stream); } @@ -515,8 +516,9 @@ rust_print_enum (struct type *type, int embedded_offset, first_field = false; if (!is_tuple) - fprintf_filtered (stream, "%s: ", - TYPE_FIELD_NAME (variant_type, j)); + fprintf_filtered (stream, "%ps: ", + styled_string (variable_name_style.style (), + TYPE_FIELD_NAME (variant_type, j))); val_print (TYPE_FIELD_TYPE (variant_type, j), (embedded_offset @@ -792,9 +794,12 @@ rust_print_struct_def (struct type *type, const char *varstring, if (!for_rust_enum || flags->print_offsets) print_spaces_filtered (level + 2, stream); if (is_enum) - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), variable_name_style.style (), + stream); else if (!is_tuple_struct) - fprintf_filtered (stream, "%s: ", TYPE_FIELD_NAME (type, i)); + fprintf_filtered (stream, "%ps: ", + styled_string (variable_name_style.style (), + TYPE_FIELD_NAME (type, i))); rust_internal_print_type (TYPE_FIELD_TYPE (type, i), NULL, stream, (is_enum ? show : show - 1), @@ -943,7 +948,9 @@ rust_internal_print_type (struct type *type, const char *varstring, && name[len] == ':' && name[len + 1] == ':') name += len + 2; - fprintfi_filtered (level + 2, stream, "%s,\n", name); + fprintfi_filtered (level + 2, stream, "%ps,\n", + styled_string (variable_name_style.style (), + name)); } fputs_filtered ("}", stream); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5dd1d3386a..d3f555ef5b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2020-02-22 Tom Tromey + + * gdb.rust/rust-style.rs: New file. + * gdb.rust/rust-style.exp: New file. + * gdb.base/style.exp: Test structure printing. + * gdb.base/style.c (struct some_struct): New type. + (enum etype): New type. + (struct_value): New global. + 2020-02-21 Tom de Vries PR go/18926 diff --git a/gdb/testsuite/gdb.base/style.c b/gdb/testsuite/gdb.base/style.c index 805f500f95..cb75b3b915 100644 --- a/gdb/testsuite/gdb.base/style.c +++ b/gdb/testsuite/gdb.base/style.c @@ -15,6 +15,21 @@ #define SOME_MACRO 23 +enum etype +{ + VALUE_ONE = 1, + VALUE_TWO = 2 +}; + +struct some_struct +{ + int int_field; + char *string_field; + enum etype e_field; +}; + +struct some_struct struct_value = { 23, "skidoo", VALUE_TWO }; + int some_called_function (void) { return 0; diff --git a/gdb/testsuite/gdb.base/style.exp b/gdb/testsuite/gdb.base/style.exp index 0457c3dc4a..47ef8c93c7 100644 --- a/gdb/testsuite/gdb.base/style.exp +++ b/gdb/testsuite/gdb.base/style.exp @@ -87,6 +87,13 @@ save_vars { env(TERM) } { # Somewhere should see the call to the function. gdb_test "disassemble main" "[style $hex address].*$func.*" + set ifield [style int_field variable] + set sfield [style string_field variable] + set efield [style e_field variable] + set evalue [style VALUE_TWO variable] + gdb_test "print struct_value" \ + "\{$ifield = 23,.*$sfield = .*,.*$efield = $evalue.*" + gdb_exit gdb_spawn diff --git a/gdb/testsuite/gdb.rust/rust-style.exp b/gdb/testsuite/gdb.rust/rust-style.exp new file mode 100644 index 0000000000..ec7e8a1764 --- /dev/null +++ b/gdb/testsuite/gdb.rust/rust-style.exp @@ -0,0 +1,44 @@ +# Copyright 2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test CLI output styling for Rust. + +load_lib rust-support.exp +if {[skip_rust_tests]} { + continue +} + +save_vars { env(TERM) } { + # We need an ANSI-capable terminal to get the output. + setenv TERM ansi + + standard_testfile .rs + if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ + {debug rust}]} { + return -1 + } + + set line [gdb_get_line_number "breakpoint"] + if {![runto ${srcfile}:$line]} { + untested "could not run to breakpoint" + return -1 + } + + set vfield [style value variable] + set v2field [style value2 variable] + gdb_test "print v" \ + "Two\{$vfield: 23, $v2field: 97\}" + +} diff --git a/gdb/testsuite/gdb.rust/rust-style.rs b/gdb/testsuite/gdb.rust/rust-style.rs new file mode 100644 index 0000000000..9952f66578 --- /dev/null +++ b/gdb/testsuite/gdb.rust/rust-style.rs @@ -0,0 +1,29 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_assignments)] + +enum EnumType { + One(i32), + Two{value: i32, value2: i32}, +} + +fn main() { + let v = EnumType::Two{ value: 23, value2: 97 }; + + println!(""); // breakpoint +} diff --git a/gdb/valprint.c b/gdb/valprint.c index ee370228ed..8adbb3df45 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -625,7 +625,8 @@ generic_val_print_enum_1 (struct type *type, LONGEST val, } if (i < len) { - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), variable_name_style.style (), + stream); } else if (TYPE_FLAG_ENUM (type)) { @@ -655,7 +656,8 @@ generic_val_print_enum_1 (struct type *type, LONGEST val, fputs_filtered (" | ", stream); val &= ~TYPE_FIELD_ENUMVAL (type, i); - fputs_filtered (TYPE_FIELD_NAME (type, i), stream); + fputs_styled (TYPE_FIELD_NAME (type, i), + variable_name_style.style (), stream); } } @@ -1268,8 +1270,10 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr, && TYPE_FIELD_BITSIZE (type, field) == 1) { if (val & ((ULONGEST)1 << TYPE_FIELD_BITPOS (type, field))) - fprintf_filtered (stream, " %s", - TYPE_FIELD_NAME (type, field)); + fprintf_filtered + (stream, " %ps", + styled_string (variable_name_style.style (), + TYPE_FIELD_NAME (type, field))); } else { @@ -1279,8 +1283,9 @@ val_print_type_code_flags (struct type *type, const gdb_byte *valaddr, if (field_len < sizeof (ULONGEST) * TARGET_CHAR_BIT) field_val &= ((ULONGEST) 1 << field_len) - 1; - fprintf_filtered (stream, " %s=", - TYPE_FIELD_NAME (type, field)); + fprintf_filtered (stream, " %ps=", + styled_string (variable_name_style.style (), + TYPE_FIELD_NAME (type, field))); if (TYPE_CODE (field_type) == TYPE_CODE_ENUM) generic_val_print_enum_1 (field_type, field_val, stream); else -- 2.34.1