diff options
-rw-r--r-- | gdb/frame.c | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/main-crash.exp | 35 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/main.rs | 30 |
3 files changed, 73 insertions, 0 deletions
diff --git a/gdb/frame.c b/gdb/frame.c index 9b867b6..de3c7de 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -2551,6 +2551,14 @@ inside_main_func (frame_info_ptr this_frame) if (bs.symbol == nullptr) return false; + /* We might have found some unrelated symbol. For example, the + Rust compiler can emit both a subprogram and a namespace with + the same name in the same scope; and due to how gdb's symbol + tables currently work, we can't request the one we'd + prefer. */ + if (bs.symbol->aclass () != LOC_BLOCK) + return false; + const struct block *block = bs.symbol->value_block (); gdb_assert (block != nullptr); sym_addr = block->start (); diff --git a/gdb/testsuite/gdb.rust/main-crash.exp b/gdb/testsuite/gdb.rust/main-crash.exp new file mode 100644 index 0000000..9c513f9 --- /dev/null +++ b/gdb/testsuite/gdb.rust/main-crash.exp @@ -0,0 +1,35 @@ +# 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/>. + +# Regression test for a crash in inside_main_func. + +load_lib rust-support.exp +require allow_rust_tests + +standard_testfile main.rs +if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ + {debug rust}]} { + return -1 +} + +set line [gdb_get_line_number "BREAK"] +# The bug was that this would crash. +if {![runto ${srcfile}:$line]} { + untested "could not run to breakpoint" + return -1 +} + +# Test that gdb is alive. +gdb_test "print 23" " = 23" diff --git a/gdb/testsuite/gdb.rust/main.rs b/gdb/testsuite/gdb.rust/main.rs new file mode 100644 index 0000000..8902446 --- /dev/null +++ b/gdb/testsuite/gdb.rust/main.rs @@ -0,0 +1,30 @@ +// Copyright (C) 2016-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(dead_code)] +#![allow(unused_variables)] +#![allow(unused_assignments)] + +fn global_fn(x: u8) { + // BREAK +} + +fn main() { + fn nested(y: u8) { + global_fn(y) + } + + nested(23); +} |