258c1d0722
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
47 lines
725 B
C
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;
|
|
}
|