This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
GCC EH unwinding bug and libjava calling std::terminate ()
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc at gcc dot gnu dot org, java at gcc dot gnu dot org
- Date: Fri, 27 Mar 2009 13:37:54 +0100
- Subject: GCC EH unwinding bug and libjava calling std::terminate ()
Hi,
current mainline is buggy in EH unwinding effectivly ignoring
MUST_NOT_THROW regions when reached via RESX from local handlers.
See http://gcc.gnu.org/ml/gcc-patches/2009-03/msg01285.html for details.
Unfortunately this patch causes bootstrap failure when building libjava,
because std::terminate() is now called. The call comes from
run_proxy in natVMProxy.cc where we have cleanup code calling
destructor of:
_Jv_InterpFrame frame_desc (self->self, thread, proxyClass,
NULL, frame_proxy);
Now the desctuctor is pretty simple but because of:
'if a destructor called during stack unwinding exits with an exception,
std::terminate is called'
and because we use -fnon-call-excpetion and destructor is accessing
memory, we keep MUST_NOT_THROW terminate () call accessible
because after inlining the destructor, cleanup might unwind up
to that MUST_NOT_THROW.
Questio is how to fix this situation? Shall we link with C++ runtime,
or use -fno-non-call-exceptions to build this file or somehow restruture
code to avoid this case?
Honza