From patchwork Mon Feb 24 00:02:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 38279 Received: (qmail 93179 invoked by alias); 24 Feb 2020 00:02:18 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 93157 invoked by uid 89); 24 Feb 2020 00:02:17 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT autolearn=ham version=3.3.1 spammy=3417, CLI, UD:rs, 18926 X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Feb 2020 00:02:14 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 32E86201AD; Sun, 23 Feb 2020 19:02:13 -0500 (EST) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [IPv6:2620:52:3:1:5054:ff:fe06:16ca]) by mx1.osci.io (Postfix) with ESMTP id E0E4A20ABC; Sun, 23 Feb 2020 19:02:10 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 4B2A528173; Sun, 23 Feb 2020 19:02:10 -0500 (EST) X-Gerrit-PatchSet: 2 Date: Sun, 23 Feb 2020 19:02:10 -0500 From: "Sourceware to Gerrit sync (Code Review)" To: Tom Tromey , gdb-patches@sourceware.org Auto-Submitted: auto-generated X-Gerrit-MessageType: merged Subject: [pushed] Style field names in "print" X-Gerrit-Change-Id: I070e1293c6cc830c9ea916af8243410aa384e944 X-Gerrit-Change-Number: 702 X-Gerrit-ChangeURL: X-Gerrit-Commit: 3f0cbb04d0fbb0923f2972efa95a4c767592860b In-Reply-To: References: Reply-To: noreply@gnutoolchain-gerrit.osci.io, tromey@sourceware.org, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-79-g83ff7f88f1 Message-Id: <20200224000210.4B2A528173@gnutoolchain-gerrit.osci.io> Sourceware to Gerrit sync has submitted this change. Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/702 ...................................................................... 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 --- M gdb/ChangeLog M gdb/ada-typeprint.c M gdb/ada-valprint.c M gdb/c-typeprint.c M gdb/cp-valprint.c M gdb/f-typeprint.c M gdb/f-valprint.c M gdb/m2-typeprint.c M gdb/p-valprint.c M gdb/rust-lang.c M gdb/testsuite/ChangeLog M gdb/testsuite/gdb.base/style.c M gdb/testsuite/gdb.base/style.exp A gdb/testsuite/gdb.rust/rust-style.exp A gdb/testsuite/gdb.rust/rust-style.rs M gdb/valprint.c 16 files changed, 190 insertions(+), 32 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 782f600..ecdce31 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 89ce290..db4634c 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -326,7 +326,8 @@ 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 88b74cd..b918caf 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -418,7 +418,8 @@ } 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 @@ 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 a8c9705..1f27b56 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -148,7 +148,7 @@ 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 @@ 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 288ebaf..e936e3f 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -235,11 +235,16 @@ 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 @@ 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 72a4188..e4a2beb 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -435,7 +435,8 @@ 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 71247a7..a25e614 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -341,7 +341,8 @@ 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 0fe4fad..a4a7689 100644 --- a/gdb/m2-typeprint.c +++ b/gdb/m2-typeprint.c @@ -563,7 +563,8 @@ 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 @@ 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 aaeb4b6..7d08755 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -605,10 +605,16 @@ 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 18dc6a5..fc48e34 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -436,7 +436,8 @@ 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 @@ 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 @@ 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 @@ && 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 5dd1d33..d3f555e 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 805f500..cb75b3b 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 0457c3d..47ef8c9 100644 --- a/gdb/testsuite/gdb.base/style.exp +++ b/gdb/testsuite/gdb.base/style.exp @@ -87,6 +87,13 @@ # 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 0000000..ec7e8a1 --- /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 0000000..9952f66 --- /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 ee37022..8adbb3d 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -625,7 +625,8 @@ } 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 @@ 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 @@ && 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 @@ 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