 |
|
|
|
Actions
|
|
[ Date Prev][ Date Next][ Thread Prev][ Thread Next][ Date Index][ Thread Index]
Flaws in spec for __cxa_begin_catch
- To: cxx-abi-dev@xxxxxxxxxxxxxxxx
- Subject: Flaws in spec for __cxa_begin_catch
- From: Cary Coutant <cary@xxxxxxxxxx>
- Date: Thu, 18 Nov 2004 11:40:15 -0800
The attached message from Richard H. in August '03 mentions a problem
in the ABI spec regarding __cxa_begin_catch. As Richard says, we also
implemented __cxa_begin_catch to return the adjusted pointer to the
exception object, as determined by the personality routine. I haven't
seen any further conversation on this topic since then.
There's one other problem with __cxa_begin_catch that we ought to
address at the same time. This one was raised by Martin Sebor just this
past August. When a thrown object has a copy constructor, the exception
isn't supposed to be considered caught until the copy constructor has
finished. The best we can do as we've implemented the ABI is to run the
copy constructor after calling __cxa_begin_catch. Since the exception
is marked as caught once __cxa_begin_catch is called,
uncaught_exception() will return false while the copy constructor is
running. There's a discussion on this topic in the Bugzilla database:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10606
It seems to me that the ABI spec for __cxa_begin_catch() may have been
OK after all, but we really needed another interface to get the
adjusted pointer prior to calling __cxa_begin_catch(). In the Bugzilla
discussion, Richard suggests "__cxa_begin_catch_part1" and
"__cxa_begin_catch_part2", but I'd suggest leaving __cxa_begin_catch()
as specified (with a void return), and adding a new interface
void *__cxa_get_exception_ptr(void *exceptionObject);
The generated code can call this interface, run the copy constructor,
and then call __cxa_begin_catch().
Perhaps an improvement on this would be to have __cxa_begin_catch()
also return the adjusted pointer, so that we can avoid the extra call
in cases where we don't have a copy constructor.
-cary
Begin forwarded message:
From: Richard Henderson <rth@xxxxxxxxxx>
Date: August 25, 2003 3:41:31 PM PDT
To: Chris Lattner <sabre@xxxxxxxxxx>
Cc: Nathan Sidwell <nathan@xxxxxxxxxxxxxxxx>,
cxx-abi-dev@xxxxxxxxxxxxxxxx, gcc@xxxxxxxxxxx
Subject: [cxx-abi-dev] Re: G++ ABI mismatches
On Mon, Aug 25, 2003 at 05:37:42PM -0500, Chris Lattner wrote:
But how does cxa_begin catch know what the requested type is for
the object? I thought that was the job of the personality routine?
It is. The personality routine computes the transformed pointer
as part of the type matching phase. It stores this pointer in a
c++ language private superclass of _Unwind_Exception. Which is
then returned by __cxa_begin_catch.
Regardless, if G++ does not meet the ABI spec,
either G++ or the ABI should be fixed. Which one? :)
The ABI. IIRC when I implemented this, I talked to one of the
HP guys and they do the same thing.
r~
|
|