From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2126) id B35C13858D32; Mon, 27 Feb 2023 18:19:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B35C13858D32 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677521982; bh=8zjg4dEf9kt1S54JvW6xapSNlNOhDTU/CvmLDDV/wKQ=; h=From:To:Subject:Date:From; b=TqboyDrg+hVHQHFx1iLu2VC0gWno8oHZoJyxk9LReRXCpC8wa/zxATTi21lzZkT5g Dtf250LhIBQ3p8uNQdO8kHNqFYuEZxlYy/Ay5eekDs/7881aR/fVkt80DffLnZKGgQ TMVsXpNMq7FrT5KINz8aazTusZt/zrVcI+XCIEMg= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Tom Tromey To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Fix crash with "finish" in Rust X-Act-Checkin: binutils-gdb X-Git-Author: Tom Tromey X-Git-Refname: refs/heads/master X-Git-Oldrev: 810fbe39b2712853d08df74469f373254b5f30cc X-Git-Newrev: debd0556e519c3d258299cf5f14a44cc01c795da Message-Id: <20230227181942.B35C13858D32@sourceware.org> Date: Mon, 27 Feb 2023 18:19:42 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Ddebd0556e519= c3d258299cf5f14a44cc01c795da commit debd0556e519c3d258299cf5f14a44cc01c795da Author: Tom Tromey Date: Thu Feb 9 12:12:42 2023 -0700 Fix crash with "finish" in Rust =20 PR rust/30090 points out that a certain "finish" in a Rust program will cause gdb to crash. This happens due to some confusion about field indices in rust_language::print_enum. The fix is to use value_primitive_field so that the correct type can be passed; other spots in rust-lang.c already do this. =20 Note that the enclosed test case comes with an xfail. This is needed because for this function, rustc doesn't follow the platform ABI. =20 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=3D30090 Diff: --- gdb/rust-lang.c | 2 +- gdb/testsuite/gdb.rust/finish.exp | 39 +++++++++++++++++++++++++++++++++++= ++++ gdb/testsuite/gdb.rust/finish.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index fe260f175f8..6fc73b262f5 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -470,7 +470,7 @@ rust_language::print_enum (struct value *val, struct ui= _file *stream, } =20 int variant_fieldno =3D rust_enum_variant (type); - val =3D value_field (val, variant_fieldno); + val =3D val->primitive_field (0, variant_fieldno, type); struct type *variant_type =3D type->field (variant_fieldno).type (); =20 int nfields =3D variant_type->num_fields (); diff --git a/gdb/testsuite/gdb.rust/finish.exp b/gdb/testsuite/gdb.rust/fin= ish.exp new file mode 100644 index 00000000000..ab0250df277 --- /dev/null +++ b/gdb/testsuite/gdb.rust/finish.exp @@ -0,0 +1,39 @@ +# Copyright (C) 2023 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 a certain 'finish' in Rust. + +load_lib rust-support.exp +require allow_rust_tests + +standard_testfile .rs +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug rus= t}]} { + return -1 +} + +set line [gdb_get_line_number "BREAK"] +if {![runto ${srcfile}:$line]} { + untested "could not run to breakpoint" + return -1 +} + +# This 'finish' used to crash. See PR rust/30090. Also, this does +# not currently print the correct value, because rustc does not use +# the standard ABI here. This is being tracked here: +# https://github.com/rust-lang/rust/issues/85641 +setup_xfail *-*-* +gdb_test "finish" [string_to_regexp " =3D finish::MyResult::Some(97)"] +gdb_test "next" +gdb_test "print dei" [string_to_regexp " =3D finish::MyResult::Some(97)"] diff --git a/gdb/testsuite/gdb.rust/finish.rs b/gdb/testsuite/gdb.rust/fini= sh.rs new file mode 100644 index 00000000000..e9dfcd89b0f --- /dev/null +++ b/gdb/testsuite/gdb.rust/finish.rs @@ -0,0 +1,30 @@ +// Copyright (C) 2023 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(warnings)] + +enum MyResult { + None, + Some(u32) +} + +fn return_some() -> MyResult { + MyResult::Some(97) // BREAK +} + +fn main() { + let dei =3D return_some(); + let another =3D return_some(); +}