Actions

icon Post
text/html Subscribe
text/html Unsubscribe

[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~