diff options
author | Richard Henderson <rth@redhat.com> | 2003-05-07 15:11:38 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2003-05-07 15:11:38 -0700 |
commit | a944ceb94a99f5a271e2bd84a5a922858e5f699f (patch) | |
tree | c4966921e4085694a93888d4028afb2a1818fda4 /libstdc++-v3/libsupc++/eh_catch.cc | |
parent | a21d83cd14f80ebd8b9ab6c4d87c42bf06bfec08 (diff) | |
download | gcc-a944ceb94a99f5a271e2bd84a5a922858e5f699f.tar.gz |
except.c: Revert 04-01 and 04-02 forced-unwind changes.
gcc/
* except.c: Revert 04-01 and 04-02 forced-unwind changes.
* flags.h, toplev.c, doc/invoke.texi: Likewise.
* unwind-dw2.c (_Unwind_GetCFA): Fix ptr->int conversion warning.
* unwind.inc (_Unwind_DeleteException): Check for null
exception_cleanup.
* unwind-sjlj.c (_Unwind_SjLj_Resume_or_Rethrow): New.
* unwind.inc (_Unwind_Resume_or_Rethrow): New.
* unwind.h: Declare them.
* libgcc-std.ver (GCC_3.3): Export them.
gcc/cp/
* cfns.gperf: Comment out POSIX thread cancellation points,
plus abort and raise.
* cfns.h: Regenerate.
gcc/testsuite/
* g++.dg/eh/forced1.C: Expect catch-all handlers to run.
Verify exception_cleanup not called for rethrows.
* g++.dg/eh/forced2.C: Test that exception_cleanup is called
when exiting catch block without rethrowing.
* g++.dg/eh/forced3.C: New.
* g++.dg/eh/forced4.C: New.
libstdc++-v3/
* libsupc++/eh_catch.cc (__cxa_begin_catch): Handle foreign exceptions.
(__cxa_end_catch): Likewise.
* libsupc++/eh_throw.cc (__cxa_rethrow): Likewise. Use
_Unwind_Resume_or_Rethrow.
* libsupc++/eh_personality.cc (empty_exception_spec): New.
(PERSONALITY_FUNCTION): Don't ignore terminate or catch-all
for _UA_FORCE_UNWIND. Honor empty filter spec for foreign
exceptions. Don't push terminate/unexpected to cxa functions.
(__cxa_call_unexpected): Remove foreign exception fixmes.
From-SVN: r66583
Diffstat (limited to 'libstdc++-v3/libsupc++/eh_catch.cc')
-rw-r--r-- | libstdc++-v3/libsupc++/eh_catch.cc | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/libstdc++-v3/libsupc++/eh_catch.cc b/libstdc++-v3/libsupc++/eh_catch.cc index ba49dfe7e44..4a678eb9fb2 100644 --- a/libstdc++-v3/libsupc++/eh_catch.cc +++ b/libstdc++-v3/libsupc++/eh_catch.cc @@ -1,5 +1,5 @@ // -*- C++ -*- Exception handling routines for catching. -// Copyright (C) 2001 Free Software Foundation, Inc. +// Copyright (C) 2001, 2003 Free Software Foundation, Inc. // // This file is part of GNU CC. // @@ -39,15 +39,28 @@ __cxa_begin_catch (void *exc_obj_in) { _Unwind_Exception *exceptionObject = reinterpret_cast <_Unwind_Exception *>(exc_obj_in); - - // ??? Foreign exceptions can't be stacked here, and there doesn't - // appear to be any place to store for __cxa_end_catch to destroy. - - __cxa_exception *header = __get_exception_header_from_ue (exceptionObject); __cxa_eh_globals *globals = __cxa_get_globals (); __cxa_exception *prev = globals->caughtExceptions; - int count = header->handlerCount; + __cxa_exception *header = __get_exception_header_from_ue (exceptionObject); + + // Foreign exceptions can't be stacked here. If the exception stack is + // empty, then fine. Otherwise we really have no choice but to terminate. + // Note that this use of "header" is a lie. It's fine so long as we only + // examine header->unwindHeader though. + if (header->unwindHeader.exception_class != __gxx_exception_class) + { + if (prev != 0) + std::terminate (); + + // Remember for end_catch and rethrow. + globals->caughtExceptions = header; + + // ??? No sensible value to return; we don't know what the + // object is, much less where it is in relation to the header. + return 0; + } + int count = header->handlerCount; if (count < 0) // This exception was rethrown from an immediately enclosing region. count = -count + 1; @@ -71,8 +84,22 @@ __cxa_end_catch () { __cxa_eh_globals *globals = __cxa_get_globals_fast (); __cxa_exception *header = globals->caughtExceptions; - int count = header->handlerCount; + // A rethrow of a foreign exception will be removed from the + // the exception stack immediately by __cxa_rethrow. + if (!header) + return; + + // A foreign exception couldn't have been stacked (see above), + // so by definition processing must be complete. + if (header->unwindHeader.exception_class != __gxx_exception_class) + { + globals->caughtExceptions = 0; + _Unwind_DeleteException (&header->unwindHeader); + return; + } + + int count = header->handlerCount; if (count < 0) { // This exception was rethrown. Decrement the (inverted) catch @@ -92,7 +119,7 @@ __cxa_end_catch () } else if (count < 0) // A bug in the exception handling library or compiler. - std::abort (); + std::terminate (); header->handlerCount = count; } |