diff options
author | Tom Tromey <tom@tromey.com> | 2021-05-14 19:54:35 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-05-14 20:01:12 -0600 |
commit | 887e71588b295a4d4f4bd7480b1a8c8507dfddb8 (patch) | |
tree | 7a40b0b55efa561569dd468ca7a45453e1faadc8 /gdb | |
parent | 2fbe9507bfba58a6a000d231fe735bad1f245b55 (diff) | |
download | gdb-887e71588b295a4d4f4bd7480b1a8c8507dfddb8.zip gdb-887e71588b295a4d4f4bd7480b1a8c8507dfddb8.tar.gz gdb-887e71588b295a4d4f4bd7480b1a8c8507dfddb8.tar.bz2 |
Fix Python pretty-printing bug in Rust
An upstream Rust bug notes notes that the Python pretty-printing
feature is broken for values that appear as members of certain types
in Rust.
The bug here is that some of the Rust value-printing code calls
value_print_inner, a method on rust_language. This bypasses the
common code that calls into Python.
I'm checking this in.
gdb/ChangeLog
2021-05-14 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_language::val_print_struct)
(rust_language::print_enum): Use common_val_print, not
value_print_inner.
gdb/testsuite/ChangeLog
2021-05-14 Tom Tromey <tom@tromey.com>
* gdb.rust/pp.exp: New file.
* gdb.rust/pp.py: New file.
* gdb.rust/pp.rs: New file.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/rust-lang.c | 6 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/pp.exp | 42 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/pp.py | 49 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/pp.rs | 26 |
6 files changed, 133 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d44b06d..8e1e002 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2021-05-14 Tom Tromey <tom@tromey.com> + + * rust-lang.c (rust_language::val_print_struct) + (rust_language::print_enum): Use common_val_print, not + value_print_inner. + 2021-05-14 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * python/py-inferior.c (infpy_get_connection_num): New function. diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 8c4d209..3b15bb2 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -386,7 +386,8 @@ rust_language::val_print_struct fputs_filtered (": ", stream); } - value_print_inner (value_field (val, i), stream, recurse + 1, &opts); + common_val_print (value_field (val, i), stream, recurse + 1, &opts, + this); } if (options->prettyformat) @@ -464,7 +465,8 @@ rust_language::print_enum (struct value *val, struct ui_file *stream, styled_string (variable_name_style.style (), TYPE_FIELD_NAME (variant_type, j))); - value_print_inner (value_field (val, j), stream, recurse + 1, &opts); + common_val_print (value_field (val, j), stream, recurse + 1, &opts, + this); } if (is_tuple) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c723a9a..c7e7152 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2021-05-14 Tom Tromey <tom@tromey.com> + + * gdb.rust/pp.exp: New file. + * gdb.rust/pp.py: New file. + * gdb.rust/pp.rs: New file. + 2021-05-14 Bernd Edlinger <bernd.edlinger@hotmail.de> * gdb.base/index-cache.exp: Cleanup $cache_dir/*.gdb-index and diff --git a/gdb/testsuite/gdb.rust/pp.exp b/gdb/testsuite/gdb.rust/pp.exp new file mode 100644 index 0000000..abe2168 --- /dev/null +++ b/gdb/testsuite/gdb.rust/pp.exp @@ -0,0 +1,42 @@ +# Copyright (C) 2021 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 <http://www.gnu.org/licenses/>. + +# Test expression parsing and evaluation that requires Rust compiler. + +load_lib gdb-python.exp +load_lib rust-support.exp +if {[skip_rust_tests]} { + continue +} + +standard_testfile .rs +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug rust}]} { + return -1 +} + +if { [skip_python_tests] } { continue } + +set remote_python_file [gdb_remote_download host \ + ${srcdir}/${subdir}/${testfile}.py] +gdb_test_no_output "source ${remote_python_file}" "load python file" + +set line [gdb_get_line_number "set breakpoint here"] +if {![runto ${srcfile}:$line]} { + untested "could not run to breakpoint" + return -1 +} + +gdb_test "print outer" " = pp::Outer \\(x\\(5\\)\\)" +gdb_test "print outer.0" " = x\\(5\\)" diff --git a/gdb/testsuite/gdb.rust/pp.py b/gdb/testsuite/gdb.rust/pp.py new file mode 100644 index 0000000..57c8cc3 --- /dev/null +++ b/gdb/testsuite/gdb.rust/pp.py @@ -0,0 +1,49 @@ +# Copyright (C) 2021 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 <http://www.gnu.org/licenses/>. + +# This file is part of the GDB testsuite. It tests python pretty +# printers. + +import re +import gdb + + +# Printer for Inner. +class inner_print(object): + def __init__(self, val): + self.val = val + + def to_string(self): + return "x(" + str(self.val["x"]) + ")" + + +def lookup_function(val): + "Look-up and return a pretty-printer that can print val." + + # Get the type. + type = val.type + + # Get the type name. + typename = type.tag + + if typename == None: + return None + + if typename == "pp::Inner": + return inner_print(val) + return None + + +gdb.pretty_printers.append(lookup_function) diff --git a/gdb/testsuite/gdb.rust/pp.rs b/gdb/testsuite/gdb.rust/pp.rs new file mode 100644 index 0000000..23e85af --- /dev/null +++ b/gdb/testsuite/gdb.rust/pp.rs @@ -0,0 +1,26 @@ +// Copyright (C) 2021 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 <http://www.gnu.org/licenses/>. + +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_assignments)] + +struct Inner{ x : u8 } +struct Outer(Inner); + +fn main () { + let outer = Outer(Inner{x: 5}); + println!("{}", outer.0.x); // set breakpoint here +} |