gcc/libitm/testsuite/libitm.c++/eh-5.C
Torvald Riegel 258c1d0722 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
2015-11-20 00:10:08 +00:00

47 lines
725 B
C

// 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;
}