aboutsummaryrefslogtreecommitdiff
path: root/libitm/testsuite
diff options
context:
space:
mode:
authorTorvald Riegel <triegel@redhat.com>2015-11-20 00:10:08 +0000
committerTorvald Riegel <torvald@gcc.gnu.org>2015-11-20 00:10:08 +0000
commit258c1d072225bac0a5063ce486907c9b6eb357e2 (patch)
treea5f0213fc60fbb82a4c54b886984d2979e44646d /libitm/testsuite
parent9afebea2d5e12b574d70497a87f0d2fd1b1d7f90 (diff)
downloadgcc-258c1d072225bac0a5063ce486907c9b6eb357e2.zip
gcc-258c1d072225bac0a5063ce486907c9b6eb357e2.tar.gz
gcc-258c1d072225bac0a5063ce486907c9b6eb357e2.tar.bz2
Support __cxa_free_exception and fix exception handling.
gcc/cp/ * except.c (do_free_exception): Use transactional wrapper. libitm/ * testsuite/libitm.c++/eh-5.C: New. * libitm.h (_ITM_cxa_free_exception): New. * libitm.map (_ITM_cxa_free_exception): Add it. * libitm.texi: Update ABI docs. * libitm_i.h (gtm_transaction_cp::cxa_unthrown): Remove. (gtm_transaction_cp::cxa_uncaught_count): Add. (gtm_thread::cxa_unthrown): Remove. (gtm_thread::cxa_uncaught_count_ptr): Add. (gtm_thread::cxa_uncaught_count): Add. (gtm_thread::drop_references_allocations): Rename to... (gtm_thread::discard_allocation): ... this and adapt. (gtm_thread::init_cpp_exceptions): New. * beginend.cc (gtm_thread::gtm_thread): Adapt EH handling. (gtm_thread::begin_transaction): Likewise. (gtm_transaction_cp::save): Likewise. (gtm_thread::trycommit): Likewise. * eh_cpp.cc: Add overview comments. (__cxa_eh_globals, __cxa_get_globals, __cxa_free_exception): Declare. (free_any_exception, _ITM_cxa_free_exception): New. (gtm_thread::init_cpp_exceptions): Define. (_ITM_cxa_allocate_exception, _ITM_cxa_throw): Adapt. (_ITM_cxa_begin_catch, _ITM_cxa_end_catch): Likewise. (gtm_thread::revert_cpp_exceptions): Likewise. From-SVN: r230634
Diffstat (limited to 'libitm/testsuite')
-rw-r--r--libitm/testsuite/libitm.c++/eh-5.C46
1 files changed, 46 insertions, 0 deletions
diff --git a/libitm/testsuite/libitm.c++/eh-5.C b/libitm/testsuite/libitm.c++/eh-5.C
new file mode 100644
index 0000000..ae38bba
--- /dev/null
+++ b/libitm/testsuite/libitm.c++/eh-5.C
@@ -0,0 +1,46 @@
+// Test throwing an exception whose constructor might throw. This tests that
+// _cxa_free_exception is instrumented.
+
+// { dg-do run }
+// { dg-options "-fgnu-tm" }
+
+void __attribute__ ((transaction_pure,noinline)) dontoptimize (int *i)
+{ }
+
+struct test
+{
+ int* data;
+ test (int i)
+ {
+ // new may throw
+ data = new int[1];
+ data[0] = i;
+ dontoptimize (data);
+ }
+ test (const test& t) : test (t.data[0])
+ { }
+ ~test ()
+ {
+ delete data;
+ }
+ bool operator !=(const test& other)
+ {
+ return data[0] != other.data[0];
+ }
+};
+
+int main()
+{
+ try
+ {
+ atomic_commit
+ {
+ throw test(23);
+ }
+ }
+ catch (test ex)
+ {
+ if (ex.data[0] != 23) __builtin_abort ();
+ }
+ return 0;
+}