From: Michael Chastain Date: Fri, 9 Jan 2004 05:19:13 +0000 (+0000) Subject: 2004-01-08 Michael Chastain X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=42b190adc91a72248aa914b2dcc33241e547281b;p=binutils-gdb.git 2004-01-08 Michael Chastain * gdb.cp/exception.cc: Renamed from gdb.hp/gdb.aCC/exception.cc. * gdb.cp/exception.exp: Renamed from gdb.hp/gdb.aCC/exception.exp. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2ceaf62e15b..f69c9b8ed09 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-01-08 Michael Chastain + + * gdb.cp/exception.cc: Renamed from gdb.hp/gdb.aCC/exception.cc. + * gdb.cp/exception.exp: Renamed from gdb.hp/gdb.aCC/exception.exp. + 2004-01-08 Michael Chastain * gdb.cp/classes.exp: Accept gnu abi 2. diff --git a/gdb/testsuite/gdb.cp/exception.cc b/gdb/testsuite/gdb.cp/exception.cc new file mode 100644 index 00000000000..27459329a8b --- /dev/null +++ b/gdb/testsuite/gdb.cp/exception.cc @@ -0,0 +1,48 @@ +// Test file for exception handling support. + +#include + +int foo (int i) +{ + if (i < 32) + throw (int) 13; + else + return i * 2; +} + +extern "C" int bar (int k, unsigned long eharg, int flag); + +int bar (int k, unsigned long eharg, int flag) +{ + cout << "k is " << k << " eharg is " << eharg << " flag is " << flag << endl; + return 1; +} + +int main() +{ + int j; + + try { + j = foo (20); + } + catch (int x) { + cout << "Got an except " << x << endl; + } + + try { + try { + j = foo (20); + } + catch (int x) { + cout << "Got an except " << x << endl; + throw; + } + } + catch (int y) { + cout << "Got an except (rethrown) " << y << endl; + } + + // Not caught + foo (20); + +} diff --git a/gdb/testsuite/gdb.cp/exception.exp b/gdb/testsuite/gdb.cp/exception.exp new file mode 100644 index 00000000000..a0914ae5ba4 --- /dev/null +++ b/gdb/testsuite/gdb.cp/exception.exp @@ -0,0 +1,439 @@ +# Copyright (C) 1997, 1998 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. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# +# tests for exception-handling support +# Written by Satish Pai 1997-07-23 + +# This file is part of the gdb testsuite + +# Note: These tests are geared to the HP aCC compiler, +# which has an idiosyncratic way of emitting debug info +# for exceptions -- it uses a callback mechanism, which +# is different from the way g++ records exception info +# for debugging + +# The tests are in two parts; the first part deals with +# statically linked (archive-bound) executables, and the +# second part repeats those tests with dynamically linked +# (shared bound) executables. (In the latter case we use +# a different mechanism to get the address of the notification +# hook in the C++ support library.) The tests themselves are +# the same in both parts. +# +# IMPORTANT: +# --------- +# IF YOU CHANGE A TEST IN ONE PART MAKE SURE YOU CHANGE IT +# -------------------------------------------------------- +# IN THE OTHER PART TOO! +# ---------------------- + + + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_hp_tests] } then { continue } + +# +# test running programs +# + +# Part I : Archive-bound executables +# ---------------------------------- + +set testfile "exception" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + + +if { $gcc_compiled } then { continue } + +set cmdline "$CXX_FOR_TARGET ${srcdir}/${subdir}/${srcfile} +A -Wl,-a,archive -g -o ${binfile}" + +remote_exec build $cmdline + +# Start with a fresh gdb + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# Set a catch catchpoint + +send_gdb "catch catch\n" +gdb_expect { + -re "Catchpoint \[0-9\]* \\(catch\\)\r\n$gdb_prompt $" { + pass "catch catch (static executable)" + } + -re ".*$gdb_prompt $" { fail "catch catch (static executable)" } + timeout { fail "(timeout) catch catch (static executable)" } +} + +# Set a throw catchpoint + +send_gdb "catch throw\n" +gdb_expect { + -re "Catchpoint \[0-9\]* \\(throw\\)\r\n$gdb_prompt $" { + pass "catch throw (static executable)" + } + -re ".*$gdb_prompt $" { fail "catch throw (static executable)" } + timeout { fail "(timeout) catch throw (static executable)" } +} + +# The catchpoints should be listed in the list of breakpoints. + +send_gdb "info break\n" +gdb_expect { + -re ".*\[0-9\]*\[ \]*catch catch\[ \]*keep y\[ \]*exception catch\[ \]*\r\n\[0-9\]*\[ \]*catch throw\[ \]*keep y\[ \]*exception throw\[ \]*\r\n$gdb_prompt $" { + pass "info break with catchpoints (static executable)" + } + -re ".*$gdb_prompt $" { fail "info break (static executable)" } + timeout { fail "(timeout) info break (static executable)" } +} + +# Info catch currently does not work with HP aCC. No easy way to +# list the active handlers on the stack. + +send_gdb "info catch\n" +gdb_expect { + -re "Info catch not supported with this target/compiler combination.\r\n$gdb_prompt $" { + pass "info catch (static executable)" + } + -re ".*$gdb_prompt $" { fail "info catch (static executable)" } + timeout { fail "(timeout) info catch (static executable)" } +} + +# Get the first exception thrown + +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { + pass "caught a throw (static executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a throw (static executable)" } + timeout { fail "(timeout) after continue -- didn't catch a throw? (static executable)" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_THROW.*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { + pass "backtrace after throw (static executable)" + } + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { + pass "backtrace after throw (static executable)" + } + -re ".*$gdb_prompt $" { fail "backtrace after throw (static executable)" } + timeout { fail "(timeout) backtrace after throw (static executable)" } +} + +# Now intercept it when it is caught. + +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { + pass "caught a catch (static executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a catch (static executable)" } + timeout { fail "(timeout) after continue -- didn't catch a catch? (static executable)" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { + pass "backtrace after catch (static executable)" + } + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { + pass "backtrace after catch (static executable)" + } + -re ".*$gdb_prompt $" { fail "backtrace after catch (static executable)" } + timeout { fail "(timeout) backtrace after catch (static executable)" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { + pass "caught a throw (2) (static executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a throw (2) (static executable)" } + timeout { fail "(timeout) after continue -- didn't catch a throw (2)? (static executable)" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { + pass "caught a catch (2) (static executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a catch (2) (static executable)" } + timeout { fail "(timeout) after continue -- didn't catch a catch (2)? (static executable)" } +} + +# Now the exception will be rethrown. + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:38, catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { + pass "caught a rethrow (static executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a rethrow (static executable)" } + timeout { fail "(timeout) after continue -- didn't catch a rethrow? (static executable)" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:3\[68\], catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { + # FIXME: guo: why XFAIL? need comment + xfail "caught a catch (3) (static executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a catch (3) (static executable)" } + timeout { fail "(timeout) after continue -- didn't catch a catch (3)? (static executable)" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { + # FIXME: guo: why XFAIL? need comment + xfail "backtrace after catch (3) (static executable)" + } + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { + # FIXME: guo: why XFAIL? need comment + xfail "backtrace after catch (3) (static executable)" + } + -re ".*$gdb_prompt $" { fail "backtrace after catch (3) (static executable)" } + timeout { fail "(timeout) backtrace after catch (3) (static executable)" } +} + +# Now the exception will be thrown, but not catch-able anywhere. + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location unknown\r\n.*$gdb_prompt $" { + pass "caught an uncatchable throw (static executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch an uncatchable throw (static executable)" } + timeout { fail "(timeout) after continue -- didn't catch an uncatchable throw? (static executable)" } +} + +# Part II : Shared-bound executables +# ---------------------------------- + +# Start with a fresh gdb +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +set prms_id 0 +set bug_id 0 + +set testfile "exception" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will a +utomatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# Set a catch catchpoint + +send_gdb "catch catch\n" +gdb_expect { + -re "Catchpoint \[0-9\]* \\(catch\\)\r\n$gdb_prompt $" { + pass "catch catch (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "catch catch (dynamic executable)" } + timeout { fail "(timeout) catch catch (dynamic executable)" } +} + +# Set a throw catchpoint + +send_gdb "catch throw\n" +gdb_expect { + -re "Catchpoint \[0-9\]* \\(throw\\)\r\n$gdb_prompt $" { + pass "catch throw (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "catch throw (dynamic executable)" } + timeout { fail "(timeout) catch throw (dynamic executable)" } +} + +# The catchpoints should be listed in the list of breakpoints. + +send_gdb "info break\n" +gdb_expect { + -re ".*\[0-9\]*\[ \]*catch catch\[ \]*keep y\[ \]*exception catch\[ \]*\r\n\[0-9\]*\[ \]*catch throw\[ \]*keep y\[ \]*exception throw\[ \]*\r\n$gdb_prompt $" { + pass "info break with catchpoints (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "info break (dynamic executable)" } + timeout { fail "(timeout) info break (dynamic executable)" } +} + +# Info catch currently does not work with HP aCC. No easy way to +# list the active handlers on the stack. + +send_gdb "info catch\n" +gdb_expect { + -re "Info catch not supported with this target/compiler combination.\r\n$gdb_prompt $" { + pass "info catch (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "info catch (dynamic executable)" } + timeout { fail "(timeout) info catch (dynamic executable)" } +} + +# Get the first exception thrown + +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { + pass "caught a throw (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a throw (dynamic executable)" } + timeout { fail "(timeout) after continue -- didn't catch a throw? (dynamic executable)" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_THROW.*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { + pass "backtrace after throw (dynamic executable)" + } + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { + pass "backtrace after throw (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "backtrace after throw (dynamic executable)" } + timeout { fail "(timeout) backtrace after throw (dynamic executable)" } +} + +# Now intercept it when it is caught. + +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { + pass "caught a catch (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a catch (dynamic executable)" } + timeout { fail "(timeout) after continue -- didn't catch a catch? (dynamic executable)" } +} + +send_gdb "backtrace\n" +gdb_expect { + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { + pass "backtrace after catch (dynamic executable)" + } + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { + pass "backtrace after catch (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "backtrace after catch (dynamic executable)" } + timeout { fail "(timeout) backtrace after catch (dynamic executable)" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { + pass "caught a throw (2) (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a throw (2) (dynamic executable)" } + timeout { fail "(timeout) after continue -- didn't catch a throw (2)? (dynamic executable)" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { + pass "caught a catch (2) (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a catch (2) (dynamic executable)" } + timeout { fail "(timeout) after continue -- didn't catch a catch (2)? (dynamic executable)" } +} + +# Now the exception will be rethrown. + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:38, catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { + pass "caught a rethrow (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a rethrow (dynamic executable)" } + timeout { fail "(timeout) after continue -- didn't catch a rethrow? (dynamic executable)" } +} + +#DTS CLLbs14858 +#The throw location should be at line 38 instead of 36. +setup_xfail hppa*-*-* CLLbs14858 +send_gdb "continue\n" +gdb_expect { + -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:3\[68\], catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { + # FIXME: guo: according to comment above the RE is wrong! + pass "caught a catch (3) (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch a catch (3) (dynamic executable)" } + timeout { fail "(timeout) after continue -- didn't catch a catch (3)? (dynamic executable)" } +} + +#DTS CLLbs14858 +#The line number for main() should be at exception.cc:38 instead of exception.cc:36 +setup_xfail hppa*-*-* CLLbs14858 +send_gdb "backtrace\n" +gdb_expect { + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { + # FIXME: guo: according to comment above the RE is wrong! + pass "backtrace after catch (3) (dynamic executable)" + } + -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { + # FIXME: guo: according to comment above the RE is wrong! + pass "backtrace after catch (3) (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "backtrace after catch (3) (dynamic executable)" } + timeout { fail "(timeout) backtrace after catch (3) (dynamic executable)" } +} + +# Now the exception will be thrown, but not catch-able anywhere. + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location unknown\r\n.*$gdb_prompt $" { + pass "caught an uncatchable throw (dynamic executable)" + } + -re ".*$gdb_prompt $" { fail "didn't catch an uncatchable throw (dynamic executable)" } + timeout { fail "(timeout) after continue -- didn't catch an uncatchable throw? (dynamic executable)" } +} + diff --git a/gdb/testsuite/gdb.hp/gdb.aCC/exception.cc b/gdb/testsuite/gdb.hp/gdb.aCC/exception.cc deleted file mode 100644 index 27459329a8b..00000000000 --- a/gdb/testsuite/gdb.hp/gdb.aCC/exception.cc +++ /dev/null @@ -1,48 +0,0 @@ -// Test file for exception handling support. - -#include - -int foo (int i) -{ - if (i < 32) - throw (int) 13; - else - return i * 2; -} - -extern "C" int bar (int k, unsigned long eharg, int flag); - -int bar (int k, unsigned long eharg, int flag) -{ - cout << "k is " << k << " eharg is " << eharg << " flag is " << flag << endl; - return 1; -} - -int main() -{ - int j; - - try { - j = foo (20); - } - catch (int x) { - cout << "Got an except " << x << endl; - } - - try { - try { - j = foo (20); - } - catch (int x) { - cout << "Got an except " << x << endl; - throw; - } - } - catch (int y) { - cout << "Got an except (rethrown) " << y << endl; - } - - // Not caught - foo (20); - -} diff --git a/gdb/testsuite/gdb.hp/gdb.aCC/exception.exp b/gdb/testsuite/gdb.hp/gdb.aCC/exception.exp deleted file mode 100644 index a0914ae5ba4..00000000000 --- a/gdb/testsuite/gdb.hp/gdb.aCC/exception.exp +++ /dev/null @@ -1,439 +0,0 @@ -# Copyright (C) 1997, 1998 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. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# -# tests for exception-handling support -# Written by Satish Pai 1997-07-23 - -# This file is part of the gdb testsuite - -# Note: These tests are geared to the HP aCC compiler, -# which has an idiosyncratic way of emitting debug info -# for exceptions -- it uses a callback mechanism, which -# is different from the way g++ records exception info -# for debugging - -# The tests are in two parts; the first part deals with -# statically linked (archive-bound) executables, and the -# second part repeats those tests with dynamically linked -# (shared bound) executables. (In the latter case we use -# a different mechanism to get the address of the notification -# hook in the C++ support library.) The tests themselves are -# the same in both parts. -# -# IMPORTANT: -# --------- -# IF YOU CHANGE A TEST IN ONE PART MAKE SURE YOU CHANGE IT -# -------------------------------------------------------- -# IN THE OTHER PART TOO! -# ---------------------- - - - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_hp_tests] } then { continue } - -# -# test running programs -# - -# Part I : Archive-bound executables -# ---------------------------------- - -set testfile "exception" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if [get_compiler_info ${binfile} "c++"] { - return -1; -} - - -if { $gcc_compiled } then { continue } - -set cmdline "$CXX_FOR_TARGET ${srcdir}/${subdir}/${srcfile} +A -Wl,-a,archive -g -o ${binfile}" - -remote_exec build $cmdline - -# Start with a fresh gdb - -set prms_id 0 -set bug_id 0 - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -# Set a catch catchpoint - -send_gdb "catch catch\n" -gdb_expect { - -re "Catchpoint \[0-9\]* \\(catch\\)\r\n$gdb_prompt $" { - pass "catch catch (static executable)" - } - -re ".*$gdb_prompt $" { fail "catch catch (static executable)" } - timeout { fail "(timeout) catch catch (static executable)" } -} - -# Set a throw catchpoint - -send_gdb "catch throw\n" -gdb_expect { - -re "Catchpoint \[0-9\]* \\(throw\\)\r\n$gdb_prompt $" { - pass "catch throw (static executable)" - } - -re ".*$gdb_prompt $" { fail "catch throw (static executable)" } - timeout { fail "(timeout) catch throw (static executable)" } -} - -# The catchpoints should be listed in the list of breakpoints. - -send_gdb "info break\n" -gdb_expect { - -re ".*\[0-9\]*\[ \]*catch catch\[ \]*keep y\[ \]*exception catch\[ \]*\r\n\[0-9\]*\[ \]*catch throw\[ \]*keep y\[ \]*exception throw\[ \]*\r\n$gdb_prompt $" { - pass "info break with catchpoints (static executable)" - } - -re ".*$gdb_prompt $" { fail "info break (static executable)" } - timeout { fail "(timeout) info break (static executable)" } -} - -# Info catch currently does not work with HP aCC. No easy way to -# list the active handlers on the stack. - -send_gdb "info catch\n" -gdb_expect { - -re "Info catch not supported with this target/compiler combination.\r\n$gdb_prompt $" { - pass "info catch (static executable)" - } - -re ".*$gdb_prompt $" { fail "info catch (static executable)" } - timeout { fail "(timeout) info catch (static executable)" } -} - -# Get the first exception thrown - -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { - pass "caught a throw (static executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a throw (static executable)" } - timeout { fail "(timeout) after continue -- didn't catch a throw? (static executable)" } -} - -send_gdb "backtrace\n" -gdb_expect { - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_THROW.*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { - pass "backtrace after throw (static executable)" - } - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { - pass "backtrace after throw (static executable)" - } - -re ".*$gdb_prompt $" { fail "backtrace after throw (static executable)" } - timeout { fail "(timeout) backtrace after throw (static executable)" } -} - -# Now intercept it when it is caught. - -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { - pass "caught a catch (static executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a catch (static executable)" } - timeout { fail "(timeout) after continue -- didn't catch a catch? (static executable)" } -} - -send_gdb "backtrace\n" -gdb_expect { - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { - pass "backtrace after catch (static executable)" - } - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { - pass "backtrace after catch (static executable)" - } - -re ".*$gdb_prompt $" { fail "backtrace after catch (static executable)" } - timeout { fail "(timeout) backtrace after catch (static executable)" } -} - -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { - pass "caught a throw (2) (static executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a throw (2) (static executable)" } - timeout { fail "(timeout) after continue -- didn't catch a throw (2)? (static executable)" } -} - -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { - pass "caught a catch (2) (static executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a catch (2) (static executable)" } - timeout { fail "(timeout) after continue -- didn't catch a catch (2)? (static executable)" } -} - -# Now the exception will be rethrown. - -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:38, catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { - pass "caught a rethrow (static executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a rethrow (static executable)" } - timeout { fail "(timeout) after continue -- didn't catch a rethrow? (static executable)" } -} - -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:3\[68\], catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { - # FIXME: guo: why XFAIL? need comment - xfail "caught a catch (3) (static executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a catch (3) (static executable)" } - timeout { fail "(timeout) after continue -- didn't catch a catch (3)? (static executable)" } -} - -send_gdb "backtrace\n" -gdb_expect { - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { - # FIXME: guo: why XFAIL? need comment - xfail "backtrace after catch (3) (static executable)" - } - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { - # FIXME: guo: why XFAIL? need comment - xfail "backtrace after catch (3) (static executable)" - } - -re ".*$gdb_prompt $" { fail "backtrace after catch (3) (static executable)" } - timeout { fail "(timeout) backtrace after catch (3) (static executable)" } -} - -# Now the exception will be thrown, but not catch-able anywhere. - -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location unknown\r\n.*$gdb_prompt $" { - pass "caught an uncatchable throw (static executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch an uncatchable throw (static executable)" } - timeout { fail "(timeout) after continue -- didn't catch an uncatchable throw? (static executable)" } -} - -# Part II : Shared-bound executables -# ---------------------------------- - -# Start with a fresh gdb -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir - -set prms_id 0 -set bug_id 0 - -set testfile "exception" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will a -utomatically fail." -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -# Set a catch catchpoint - -send_gdb "catch catch\n" -gdb_expect { - -re "Catchpoint \[0-9\]* \\(catch\\)\r\n$gdb_prompt $" { - pass "catch catch (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "catch catch (dynamic executable)" } - timeout { fail "(timeout) catch catch (dynamic executable)" } -} - -# Set a throw catchpoint - -send_gdb "catch throw\n" -gdb_expect { - -re "Catchpoint \[0-9\]* \\(throw\\)\r\n$gdb_prompt $" { - pass "catch throw (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "catch throw (dynamic executable)" } - timeout { fail "(timeout) catch throw (dynamic executable)" } -} - -# The catchpoints should be listed in the list of breakpoints. - -send_gdb "info break\n" -gdb_expect { - -re ".*\[0-9\]*\[ \]*catch catch\[ \]*keep y\[ \]*exception catch\[ \]*\r\n\[0-9\]*\[ \]*catch throw\[ \]*keep y\[ \]*exception throw\[ \]*\r\n$gdb_prompt $" { - pass "info break with catchpoints (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "info break (dynamic executable)" } - timeout { fail "(timeout) info break (dynamic executable)" } -} - -# Info catch currently does not work with HP aCC. No easy way to -# list the active handlers on the stack. - -send_gdb "info catch\n" -gdb_expect { - -re "Info catch not supported with this target/compiler combination.\r\n$gdb_prompt $" { - pass "info catch (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "info catch (dynamic executable)" } - timeout { fail "(timeout) info catch (dynamic executable)" } -} - -# Get the first exception thrown - -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { - pass "caught a throw (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a throw (dynamic executable)" } - timeout { fail "(timeout) after continue -- didn't catch a throw? (dynamic executable)" } -} - -send_gdb "backtrace\n" -gdb_expect { - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_THROW.*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { - pass "backtrace after throw (dynamic executable)" - } - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n#2\[ \]*$hex in __eh_notify_throw.*\r\n#3\[ \]*$hex in foo \\(i=20\\) at .*exception\\.cc:8\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:26\r\n$gdb_prompt $" { - pass "backtrace after throw (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "backtrace after throw (dynamic executable)" } - timeout { fail "(timeout) backtrace after throw (dynamic executable)" } -} - -# Now intercept it when it is caught. - -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:28\r\n.*$gdb_prompt $" { - pass "caught a catch (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a catch (dynamic executable)" } - timeout { fail "(timeout) after continue -- didn't catch a catch? (dynamic executable)" } -} - -send_gdb "backtrace\n" -gdb_expect { - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { - pass "backtrace after catch (dynamic executable)" - } - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __throw__.*\r\n#4\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#5\[ \]*$hex in main.* at .*exception.cc:26\r\n$gdb_prompt $" { - pass "backtrace after catch (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "backtrace after catch (dynamic executable)" } - timeout { fail "(timeout) backtrace after catch (dynamic executable)" } -} - -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { - pass "caught a throw (2) (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a throw (2) (dynamic executable)" } - timeout { fail "(timeout) after continue -- didn't catch a throw (2)? (dynamic executable)" } -} - -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:8, catch location .*exception\\.cc:36\r\n.*$gdb_prompt $" { - pass "caught a catch (2) (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a catch (2) (dynamic executable)" } - timeout { fail "(timeout) after continue -- didn't catch a catch (2)? (dynamic executable)" } -} - -# Now the exception will be rethrown. - -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:38, catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { - pass "caught a rethrow (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a rethrow (dynamic executable)" } - timeout { fail "(timeout) after continue -- didn't catch a rethrow? (dynamic executable)" } -} - -#DTS CLLbs14858 -#The throw location should be at line 38 instead of 36. -setup_xfail hppa*-*-* CLLbs14858 -send_gdb "continue\n" -gdb_expect { - -re "Continuing.*Catchpoint \[0-9\]* \\(exception caught\\), throw location.*exception\\.cc:3\[68\], catch location .*exception\\.cc:41\r\n.*$gdb_prompt $" { - # FIXME: guo: according to comment above the RE is wrong! - pass "caught a catch (3) (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch a catch (3) (dynamic executable)" } - timeout { fail "(timeout) after continue -- didn't catch a catch (3)? (dynamic executable)" } -} - -#DTS CLLbs14858 -#The line number for main() should be at exception.cc:38 instead of exception.cc:36 -setup_xfail hppa*-*-* CLLbs14858 -send_gdb "backtrace\n" -gdb_expect { - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=__EH_NOTIFY_CATCH.*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { - # FIXME: guo: according to comment above the RE is wrong! - pass "backtrace after catch (3) (dynamic executable)" - } - -re "#0\[ \]*__d_eh_break.*\r\n#1\[ \]*$hex in __d_eh_notify_callback \\(eh_type=\[0-9\].*\r\n.*\r\n#3\[ \]*$hex in __rethrow.*\r\n#4\[ \]*$hex in main.* at .*exception\\.cc:3\[68\]\r\n#5\[ \]*$hex in foo \\(i=20\\) at .*exception.cc:8\r\n#6\[ \]*$hex in main.* at .*exception.cc:34\r\n$gdb_prompt $" { - # FIXME: guo: according to comment above the RE is wrong! - pass "backtrace after catch (3) (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "backtrace after catch (3) (dynamic executable)" } - timeout { fail "(timeout) backtrace after catch (3) (dynamic executable)" } -} - -# Now the exception will be thrown, but not catch-able anywhere. - -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\nGot.*\r\nCatchpoint \[0-9\]* \\(exception thrown\\), throw location.*exception\\.cc:8, catch location unknown\r\n.*$gdb_prompt $" { - pass "caught an uncatchable throw (dynamic executable)" - } - -re ".*$gdb_prompt $" { fail "didn't catch an uncatchable throw (dynamic executable)" } - timeout { fail "(timeout) after continue -- didn't catch an uncatchable throw? (dynamic executable)" } -} -