diff options
author | Tom Tromey <tromey@redhat.com> | 2013-04-15 18:09:02 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2013-04-15 18:09:02 +0000 |
commit | 72f1fe8a88c4dc9219c4263eff2bbcf61173e607 (patch) | |
tree | a0500c8be84baf95cff28fb6f70b240be4de4f44 /gdb/testsuite | |
parent | fc4746a2bd1dbe2a0fd983af292568a7ee05517f (diff) | |
download | gdb-72f1fe8a88c4dc9219c4263eff2bbcf61173e607.zip gdb-72f1fe8a88c4dc9219c4263eff2bbcf61173e607.tar.gz gdb-72f1fe8a88c4dc9219c4263eff2bbcf61173e607.tar.bz2 |
PR c++/15176:
* NEWS: Update.
* break-catch-throw.c (compute_exception): New function.
(exception_funcs): New global.
(_initialize_break_catch_throw): Create $_exception.
* cp-abi.c (cplus_type_from_type_info): New function.
* cp-abi.h (cplus_type_from_type_info): Declare.
(struct cp_abi_ops) <get_type_from_type_info>: New field.
* gnu-v3-abi.c (gnuv3_get_typename_from_type_info)
(gnuv3_get_type_from_type_info): New functions.
(init_gnuv3_ops): Set get_type_from_type_info ABI field.
gdb/doc
* gdb.texinfo (Set Catchpoints): Document $_exception.
(Convenience Vars): Mention $_exception.
gdb/testsuite
* gdb.base/default.exp: Update for $_exception.
* gdb.cp/exceptprint.cc: New file.
* gdb.cp/exceptprint.exp: New file.
* lib/gdb.exp (skip_libstdcxx_probe_tests): New proc.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/default.exp | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/exceptprint.cc | 65 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/exceptprint.exp | 73 | ||||
-rw-r--r-- | gdb/testsuite/lib/gdb.exp | 18 |
5 files changed, 164 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 7da3ff0..855ce19 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2013-04-15 Tom Tromey <tromey@redhat.com> + * gdb.base/default.exp: Update for $_exception. + * gdb.cp/exceptprint.cc: New file. + * gdb.cp/exceptprint.exp: New file. + * lib/gdb.exp (skip_libstdcxx_probe_tests): New proc. + +2013-04-15 Tom Tromey <tromey@redhat.com> + * gdb.cp/typeid.cc: New file. * gdb.cp/typeid.exp: New file. diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp index aaedadc..6920090 100644 --- a/gdb/testsuite/gdb.base/default.exp +++ b/gdb/testsuite/gdb.base/default.exp @@ -604,6 +604,7 @@ set show_conv_list \ {$_sdata = void} \ {$_siginfo = void} \ {$_thread = 0} \ + {$_exception = <error: No frame selected>} \ {$_probe_argc = <error: No frame selected>} \ {$_probe_arg0 = <error: No frame selected>} \ {$_probe_arg1 = <error: No frame selected>} \ diff --git a/gdb/testsuite/gdb.cp/exceptprint.cc b/gdb/testsuite/gdb.cp/exceptprint.cc new file mode 100644 index 0000000..994b501 --- /dev/null +++ b/gdb/testsuite/gdb.cp/exceptprint.cc @@ -0,0 +1,65 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2013 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/>. */ + +template<typename T> +void +throwit (T val) +{ + throw val; +} + +template<typename T> +void +rethrowit (T val) +{ + try + { + try + { + throwit (val); + } + catch (...) + { + throw; + } + } + catch (...) + { + // Ignore. + } +} + +struct maude +{ + int mv; + + maude (int x) : mv (x) { } +}; + +int +main (int argc, char **argv) +{ + maude mm (77); + maude &mmm (mm); + + rethrowit ("hi bob"); + rethrowit (23); + rethrowit (mm); + rethrowit (mmm); + + return 0; +} diff --git a/gdb/testsuite/gdb.cp/exceptprint.exp b/gdb/testsuite/gdb.cp/exceptprint.exp new file mode 100644 index 0000000..6e03fd9 --- /dev/null +++ b/gdb/testsuite/gdb.cp/exceptprint.exp @@ -0,0 +1,73 @@ +# Copyright 2013 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/>. + +standard_testfile .cc + +if {[skip_cplus_tests]} { + return -1 +} + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { + return -1 +} + +if {![runto_main]} { + return -1 +} + +if {![skip_libstdcxx_probe_tests]} { + untested "could not find libstdc++ stap probe" + return -1 +} + +proc do_continue_to_catchpoint {name} { + global gdb_prompt + + gdb_test_multiple "continue" $name { + -re "Continuing.*Catchpoint \[0-9\].*\r\n$gdb_prompt $" { + pass $name + } + } +} + +proc do_exceptprint_tests {prefix output} { + with_test_prefix $prefix { + do_continue_to_catchpoint "continue to throw" + gdb_test "print \$_exception" " = $output" \ + "print exception value at throw" + + do_continue_to_catchpoint "continue to catch" + gdb_test "print \$_exception" " = $output" \ + "print exception value at catch" + + do_continue_to_catchpoint "continue to rethrow" + gdb_test "print \$_exception" " = $output" \ + "print exception value at rethrow" + + do_continue_to_catchpoint "continue to final catch" + } +} + +gdb_test "catch catch" "Catchpoint \[0-9\]+ \\(catch\\)" \ + "catch catch" +gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \ + "catch throw" +gdb_test "catch rethrow" "Catchpoint \[0-9\]+ \\(rethrow\\)" \ + "catch rethrow" + +do_exceptprint_tests string "$hex \"hi bob\"" +do_exceptprint_tests int 23 +do_exceptprint_tests struct "{mv = 77}" +do_exceptprint_tests "reference to struct" "{mv = 77}" diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index d05257d..3273bf4 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -2310,6 +2310,24 @@ proc skip_unwinder_tests {} { return $ok } +# Return 0 if we should skip tests that require the libstdc++ stap +# probes. This must be invoked while gdb is running, after shared +# libraries have been loaded. + +proc skip_libstdcxx_probe_tests {} { + global gdb_prompt + + set ok 0 + gdb_test_multiple "info probe" "check for stap probe in libstdc++" { + -re ".*libstdcxx.*catch.*\r\n$gdb_prompt $" { + set ok 1 + } + -re "\r\n$gdb_prompt $" { + } + } + return $ok +} + set compiler_info "unknown" set gcc_compiled 0 set hp_cc_compiler 0 |