diff options
-rw-r--r-- | libitm/ChangeLog | 12 | ||||
-rw-r--r-- | libitm/eh_cpp.cc | 26 | ||||
-rw-r--r-- | libitm/libitm.h | 17 |
3 files changed, 38 insertions, 17 deletions
diff --git a/libitm/ChangeLog b/libitm/ChangeLog index 37a1b443e11..295fb944067 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -1,3 +1,15 @@ +2020-05-12 Nathan Sidwell <nathan@acm.org> + + Fix throw specifiers on interface. + * libitm/libitm.h (_ITM_NOTHROW): Define. + (_ITM_cxa_allocate_exception, _ITM_cxa_free_exception) + (_ITM_cxa_begin_catch): Use it. + * eh_cpp.cc: Add throw() to __cxa_allocate_exception, + __cxa_free_exception, __cxa_begin_catch, __cxa_tm_cleanup, + __cxa_get_globals. + (_ITM_cxa_allocate_exception, _ITM_cxa_free_exception) + (_ITM_cxa_begin_catch): Likewise. + 2020-05-05 Nathan Sidwell <nathan@acm.org> * testsuite/lib/libitm.exp (libitm_init): Add diff --git a/libitm/eh_cpp.cc b/libitm/eh_cpp.cc index 7d570e74fc2..6c9da2d06e4 100644 --- a/libitm/eh_cpp.cc +++ b/libitm/eh_cpp.cc @@ -87,23 +87,23 @@ struct __cxa_eh_globals unsigned int uncaughtExceptions; }; -extern void *__cxa_allocate_exception (size_t) WEAK; -extern void __cxa_free_exception (void *) WEAK; +extern void *__cxa_allocate_exception (size_t) _ITM_NOTHROW WEAK; +extern void __cxa_free_exception (void *) _ITM_NOTHROW WEAK; extern void __cxa_throw (void *, void *, void (*) (void *)) WEAK; -extern void *__cxa_begin_catch (void *) WEAK; +extern void *__cxa_begin_catch (void *) _ITM_NOTHROW WEAK; extern void __cxa_end_catch (void) WEAK; -extern void __cxa_tm_cleanup (void *, void *, unsigned int) WEAK; -extern __cxa_eh_globals *__cxa_get_globals (void) WEAK; +extern void __cxa_tm_cleanup (void *, void *, unsigned int) throw () WEAK; +extern __cxa_eh_globals *__cxa_get_globals (void) _ITM_NOTHROW WEAK; #if !defined (HAVE_ELF_STYLE_WEAKREF) -void *__cxa_allocate_exception (size_t) { return NULL; } -void __cxa_free_exception (void *) { return; } +void *__cxa_allocate_exception (size_t) _ITM_NOTHROW { return NULL; } +void __cxa_free_exception (void *) _ITM_NOTHROW { return; } void __cxa_throw (void *, void *, void (*) (void *)) { return; } -void *__cxa_begin_catch (void *) { return NULL; } +void *__cxa_begin_catch (void *) _ITM_NOTHROW { return NULL; } void __cxa_end_catch (void) { return; } -void __cxa_tm_cleanup (void *, void *, unsigned int) { return; } +void __cxa_tm_cleanup (void *, void *, unsigned int) throw () { return; } void _Unwind_DeleteException (_Unwind_Exception *) { return; } -__cxa_eh_globals *__cxa_get_globals (void) { return NULL; } +__cxa_eh_globals *__cxa_get_globals (void) _ITM_NOTHROW { return NULL; } #endif /* HAVE_ELF_STYLE_WEAKREF */ } @@ -117,7 +117,7 @@ free_any_exception (void *exc_ptr) } void * -_ITM_cxa_allocate_exception (size_t size) +_ITM_cxa_allocate_exception (size_t size) _ITM_NOTHROW { void *r = __cxa_allocate_exception (size); gtm_thr()->record_allocation (r, free_any_exception); @@ -125,7 +125,7 @@ _ITM_cxa_allocate_exception (size_t size) } void -_ITM_cxa_free_exception (void *exc_ptr) +_ITM_cxa_free_exception (void *exc_ptr) _ITM_NOTHROW { // __cxa_free_exception can be called from user code directly if // construction of an exception object throws another exception, in which @@ -143,7 +143,7 @@ _ITM_cxa_throw (void *obj, void *tinfo, void (*dest) (void *)) } void * -_ITM_cxa_begin_catch (void *exc_ptr) +_ITM_cxa_begin_catch (void *exc_ptr) _ITM_NOTHROW { // If this exception object has been allocated by this transaction, we // discard the undo log entry for the allocation; we are entering phase (3) diff --git a/libitm/libitm.h b/libitm/libitm.h index 69f551e2675..4f8051bdfb7 100644 --- a/libitm/libitm.h +++ b/libitm/libitm.h @@ -45,6 +45,15 @@ extern "C" { #define ITM_NORETURN __attribute__((noreturn)) #define ITM_PURE __attribute__((transaction_pure)) +#ifdef _GLIBCXX_NOTHROW +# define _ITM_NOTHROW _GLIBCXX_NOTHROW +#elif !defined (__cplusplus) +# define _ITM_NOTHROW __attribute__((__nothrow__)) +#elif __cplusplus < 201103L +# define _ITM_NOTHROW throw () +#else +# define _ITM_NOTHROW noexcept +#endif /* The following are externally visible definitions and functions, though only very few of these should be called by user code. */ @@ -282,11 +291,11 @@ extern void *_ITM_getTMCloneSafe (void *) ITM_REGPARM; extern void _ITM_registerTMCloneTable (void *, size_t); extern void _ITM_deregisterTMCloneTable (void *); -extern void *_ITM_cxa_allocate_exception (size_t); -extern void _ITM_cxa_free_exception (void *exc_ptr); +extern void *_ITM_cxa_allocate_exception (size_t) _ITM_NOTHROW; +extern void _ITM_cxa_free_exception (void *exc_ptr) _ITM_NOTHROW; extern void _ITM_cxa_throw (void *obj, void *tinfo, void (*dest) (void *)); -extern void *_ITM_cxa_begin_catch (void *exc_ptr); -extern void _ITM_cxa_end_catch (void); +extern void *_ITM_cxa_begin_catch (void *exc_ptr) _ITM_NOTHROW; +extern void _ITM_cxa_end_catch (void); /* This can throw. */ extern void _ITM_commitTransactionEH(void *exc_ptr) ITM_REGPARM; #ifdef __cplusplus |