From f569c1c51a1ff643fc7ba961555fe1067dcf5304 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Sun, 16 Aug 2020 13:30:34 +0200 Subject: [PATCH] [gdb/testsuite] Add gdb.base/eh_return.exp In PR25350, an internal error was reported: ... (gdb) break *eh2+0x7e Breakpoint 1 at 0x13e2: file small.c, line 38. (gdb) run Starting program: a.out [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib/libthread_db.so.1". Breakpoint 1, 0x00005555555553e2 in eh2 ( frame.c:558: internal-error: frame_id get_frame_id(frame_info*): \ Assertion `stashed' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. ... The internal error does not reproduce after recent commit 547ce8f00b "[gdb/backtrace] Fix printing of fortran string args". Add the corresponding test-case as regression test, given that the code is rather atypical. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2020-08-16 Tom de Vries PR gdb/25350 * gdb.base/eh_return.c: New test. * gdb.base/eh_return.exp: New file. --- gdb/testsuite/ChangeLog | 6 ++ gdb/testsuite/gdb.base/eh_return.c | 98 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/eh_return.exp | 47 +++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 gdb/testsuite/gdb.base/eh_return.c create mode 100644 gdb/testsuite/gdb.base/eh_return.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d8556159e5f..f0b7949fd61 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-08-16 Tom de Vries + + PR gdb/25350 + * gdb.base/eh_return.c: New test. + * gdb.base/eh_return.exp: New file. + 2020-08-15 Tom de Vries * gdb.fortran/mixed-lang-stack.c (fortran_charlen_t): New type. diff --git a/gdb/testsuite/gdb.base/eh_return.c b/gdb/testsuite/gdb.base/eh_return.c new file mode 100644 index 00000000000..80eea9c783a --- /dev/null +++ b/gdb/testsuite/gdb.base/eh_return.c @@ -0,0 +1,98 @@ +/* This testcase is part of GDB, the GNU debugger. + + It was copied from gcc repo, gcc/testsuite/gcc.target/aarch64/eh_return.c. + + Copyright 2020 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 . */ + +#include +#include + +int val, test, failed; + +int main (void); + +void +eh0 (void *p) +{ + val = (int)(long)p & 7; + if (val) + abort (); +} + +void +eh1 (void *p, int x) +{ + void *q = __builtin_alloca (x); + eh0 (q); + __builtin_eh_return (0, p); +} + +void +eh2a (int a,int b,int c,int d,int e,int f,int g,int h, void *p) +{ + val = a + b + c + d + e + f + g + h + (int)(long)p & 7; +} + +void +eh2 (void *p) +{ + eh2a (val, val, val, val, val, val, val, val, p); + __builtin_eh_return (0, p); +} + + +void +continuation (void) +{ + test++; + main (); +} + +void +fail (void) +{ + failed = 1; + printf ("failed\n"); + continuation (); +} + +void +do_test1 (void) +{ + if (!val) + eh1 (continuation, 100); + fail (); +} + +void +do_test2 (void) +{ + if (!val) + eh2 (continuation); + fail (); +} + +int +main (void) +{ + if (test == 0) + do_test1 (); + if (test == 1) + do_test2 (); + if (failed || test != 2) + exit (1); + exit (0); +} diff --git a/gdb/testsuite/gdb.base/eh_return.exp b/gdb/testsuite/gdb.base/eh_return.exp new file mode 100644 index 00000000000..e38398ed37c --- /dev/null +++ b/gdb/testsuite/gdb.base/eh_return.exp @@ -0,0 +1,47 @@ +# Copyright 2020 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 . */ + +# Check if executable generated from eh_return.c assert when setting a +# breakpoint at the last insn of eh, and running to it. + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { + return -1 +} + +set address -1 + +# Get the address of the last insn in function eh2. +gdb_test_multiple "disassemble eh2" "" { + -re -wrap "($hex)\[^\r\n\]*\r\nEnd of assembler dump." { + set address $expect_out(1,string) + pass $gdb_test_name + } +} + +if { $address == -1 } { + return 0 +} + +clean_restart ${binfile} + +gdb_breakpoint "*$address" message + +# The assert did not reproduce when running to main, and continuing to the +# breakpoint, so instead, run to the breakpoint. +gdb_run_cmd + +gdb_test "" "Breakpoint .*" "hit breakpoint" -- 2.30.2