mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
Fix crash with "finish" in Rust
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. Note that the enclosed test case comes with an xfail. This is needed because for this function, rustc doesn't follow the platform ABI. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30090
This commit is contained in:
parent
810fbe39b2
commit
debd0556e5
@ -470,7 +470,7 @@ rust_language::print_enum (struct value *val, struct ui_file *stream,
|
||||
}
|
||||
|
||||
int variant_fieldno = rust_enum_variant (type);
|
||||
val = value_field (val, variant_fieldno);
|
||||
val = val->primitive_field (0, variant_fieldno, type);
|
||||
struct type *variant_type = type->field (variant_fieldno).type ();
|
||||
|
||||
int nfields = variant_type->num_fields ();
|
||||
|
39
gdb/testsuite/gdb.rust/finish.exp
Normal file
39
gdb/testsuite/gdb.rust/finish.exp
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
# 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 rust}]} {
|
||||
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 " = finish::MyResult::Some(97)"]
|
||||
gdb_test "next"
|
||||
gdb_test "print dei" [string_to_regexp " = finish::MyResult::Some(97)"]
|
30
gdb/testsuite/gdb.rust/finish.rs
Normal file
30
gdb/testsuite/gdb.rust/finish.rs
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
#![allow(warnings)]
|
||||
|
||||
enum MyResult {
|
||||
None,
|
||||
Some(u32)
|
||||
}
|
||||
|
||||
fn return_some() -> MyResult {
|
||||
MyResult::Some(97) // BREAK
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let dei = return_some();
|
||||
let another = return_some();
|
||||
}
|
Loading…
Reference in New Issue
Block a user