aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/frame.c8
-rw-r--r--gdb/testsuite/gdb.rust/main-crash.exp35
-rw-r--r--gdb/testsuite/gdb.rust/main.rs30
3 files changed, 73 insertions, 0 deletions
diff --git a/gdb/frame.c b/gdb/frame.c
index 2f9622a..3eb823e 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -2453,6 +2453,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..8eb1aaa
--- /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
+if {[skip_rust_tests]} { return }
+
+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);
+}