From c6941e052e1d22469519a1b7c7067518b6714526 Mon Sep 17 00:00:00 2001 From: chastain Date: Tue, 15 Jul 2003 16:28:20 +0000 Subject: [PATCH] 2003-07-15 Michael Chastain * gdb.base/gdb1250.exp: New file. * gdb.base/gdb1250.c: New file. --- gdb/testsuite/ChangeLog | 5 +++ gdb/testsuite/gdb.base/gdb1250.c | 57 +++++++++++++++++++++++++++ gdb/testsuite/gdb.base/gdb1250.exp | 80 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 gdb/testsuite/gdb.base/gdb1250.c create mode 100644 gdb/testsuite/gdb.base/gdb1250.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f957ee845e..60d1a6e988 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-07-15 Michael Chastain + + * gdb.base/gdb1250.exp: New file. + * gdb.base/gdb1250.c: New file. + 2003-07-09 Michal Ludvig * gdb.c++/templates.exp (test_ptype_of_templates): Recognize diff --git a/gdb/testsuite/gdb.base/gdb1250.c b/gdb/testsuite/gdb.base/gdb1250.c new file mode 100644 index 0000000000..9d73f6735c --- /dev/null +++ b/gdb/testsuite/gdb.base/gdb1250.c @@ -0,0 +1,57 @@ +/* Test program for stack trace through noreturn function. + + Copyright 2003 Free Software Foundation, Inc. + + This file is part of the gdb testsuite. + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + This file was written by Michael Elizabeth Chastain (mec@shout.net). */ + +#include + +int global = 0; + +void gamma (int *parray) +{ + return; +} + +void beta () +{ + int array [4]; + array [0] = global++; + array [1] = global++; + array [2] = global++; + array [3] = global++; + gamma (array); + abort (); +} + +int alpha () +{ + global++; + beta (); + return 0; +} + +int main () +{ + int i; + global++; + i = alpha (); + return i; +} diff --git a/gdb/testsuite/gdb.base/gdb1250.exp b/gdb/testsuite/gdb.base/gdb1250.exp new file mode 100644 index 0000000000..60a6f5971c --- /dev/null +++ b/gdb/testsuite/gdb.base/gdb1250.exp @@ -0,0 +1,80 @@ +# Copyright 2003 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for PR gdb/1250. +# 2003-07-15 Michael Chastain + +# This file is part of the gdb testsuite. + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "gdb1250" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto abort] then { + perror "couldn't run to breakpoint" + continue +} + +# See http://sources.redhat.com/gdb/bugs/1250 +# +# In a nutshell: the function 'beta' ends with a call to 'abort', which +# is a noreturn function. So the last instruction of 'beta' is a call +# to 'abort'. When gdb looks for information about the caller of +# 'beta', it looks at the instruction after the call to 'abort' -- which +# is the first instruction of 'alpha'! So gdb uses the wrong frame +# information. It thinks that the test program is in 'alpha' and that +# the prologue "push %ebp / mov %esp,%ebp" has not been executed yet, +# and grabs the wrong values. +# +# By the nature of the bug, it could pass if the C compiler is not smart +# enough to implement 'abort' as a noreturn function. This is okay. +# The real point is that users often put breakpoints on noreturn +# functions such as 'abort' or some kind of exitting function, and those +# breakpoints should work. + +gdb_test_multiple "backtrace" "backtrace from abort" { + -re "#0.*abort.*\r\n#1.*beta.*\r\n#2.*alpha.*\r\n#3.*main.*\r\n$gdb_prompt $" { + pass "backtrace from abort" + } + -re "#0.*abort.*\r\n#1.*beta.*\r\n$gdb_prompt $" { + # This happens with gdb HEAD as of 2003-07-13, with gcc 3.3, + # binutils 2.14, either -gdwarf-2 or -gstabs+, on native + # i686-pc-linux-gnu. + # + # gdb gets 'abort' and 'beta' right and then goes into the + # weeds. + kfail "gdb/1250" "backtrace from abort" + } +} -- 2.11.0