On Tue, 2020-05-05 at 16:08 -0400, Nathan Sidwell wrote:
> I discovered that libitm:
> (a) declares __cxa_allocate_exception and friends directly,
> (b) doesn't mark them as 'throw()'
> (c) doesn't mark the replacment fns _ITM_$foo as nothrow either
>
> We happen to get away with it because of code in the compiler that,
> although it checks the parameter types, doesn't check the exception
> specification. (One reason being they used to not be part of the
> language's type system, but now they are.) I suspect this can lead us
> to generate pessimal code later, if we've seen one of these decls
> earlier. Anyway, with modules it becomes trickier[*], so I'm trying to
> clean it up and not be a problem. I see Jakub fixed part of the problem
> (https://gcc.gnu.org/pipermail/gcc-patches/2018-December/513302.html)
> AFAICT, he did fix libitm's decls, but left the lax parm-type checking
> in the compiler.
>
> libitm.h is not very informative about specification:
> in version 1 of http://www.intel.com/some/path/here.pdf. */
>
> Anyway, it was too fiddly to have libitm pick up the declarations from
> libsupc++. Besides it makes them weak declarations, and then provides
> definitions for non-elf systems. So this patch adds the expected 'throw()'
>
> While I can't be sure, I suspect the _ITM entry points are supposed to
> have the same exception specification as the original entry points. So
> those are also made 'throw ()'. libstdc++'s _GLIBCXX_NOTHROW didn't
> seem available, so I make use of a new _ITM_NOTHROW macro, suitably defined.
>
> Because of the lax checking in the compiler, and old compiler with a
> patched libitm.h will be ok... Until I change the compiler :)
>
> booted & tested on x86_64-linux, ok?
>
> nathan
>
> [*] modules make it harder to have ODR violations, that's why it finds
> ODR violations in existing code.
>
> > 2020-05-05 Nathan Sidwell <nat...@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.
> >
OK
jeff