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

Reply via email to