This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: -fno-exceptions documentation


Paolo Carlini wrote:
Hi Peter,

The actual throwing is done by using X<void>::throw_bad_alloc. The
helper template is only necessary to give the correct "linkage" to
throw_bad_alloc so that multiple definitions do not result in an
error.

A compiled library that wishes to be "exception neutral" (such as
libstdc++ itself) should #define _EXCEPTION_NEUTRAL and would receive
no definition of throw_bad_alloc, leaving the calls unresolved.

User code just #includes the above header (indirectly via any
libstdc++ include) and receives an appropriate (for the current
__EXCEPTIONS setting) definition for X<void>::throw_bad_alloc because
of the explicit instantiation.

I'm trying to catch up on this (after a few days spent on something completely different...)

First, thanks of course both to you and Howard for the interesting
feedback.

Peter, at the moment, I have trouble understanding what you are
suggesting specifically for libsupc++, for things like operator new...

I'm not familiar with the internal structure of libstdc++, so please forgive me if I'm not making any sense.


Howard's request was to come up with a way that would allow libstdc++ to work with

1. Programs compiled without -fno-exceptions

and

2. Programs compiled with -fno-exceptions

without a recompile of libstdc++.

The approach I present achieves this by making libstdc++ (and libsupc++) issue calls to X<void>::throw_...; since these functions are declared but not defined when _EXCEPTION_NEUTRAL is in effect, this will result in libstdc++ containing unresolved references to these functions.

When a program includes a libstdc++ header, these functions will be defined as either throwing or aborting depending on the current state of __EXCEPTIONS, then an explicit template instantiation will inject these definitions into the .o file that is produced.

These definitions will satisfy the unresolved references in libstdc++ and libsupc++ when the program is linked.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]