From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 852C13857C75 for ; Sun, 16 Aug 2020 11:31:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 852C13857C75 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id DE0B8B6DB for ; Sun, 16 Aug 2020 11:31:50 +0000 (UTC) Date: Sun, 16 Aug 2020 13:31:25 +0200 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [committed][gdb/testsuite] Add gdb.base/eh_return.exp Message-ID: <20200816113123.GA29297@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 Aug 2020 11:31:29 -0000 Hi, 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. Committed to trunk. Thanks, - Tom [gdb/testsuite] Add gdb.base/eh_return.exp 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/gdb.base/eh_return.c | 98 ++++++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/eh_return.exp | 47 +++++++++++++++++ 2 files changed, 145 insertions(+) diff --git a/gdb/testsuite/gdb.base/eh_return.c b/gdb/testsuite/gdb.base/eh_return.c new file mode 100644 index 0000000000..80eea9c783 --- /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 0000000000..e38398ed37 --- /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"