GCC EH unwinding bug and libjava calling std::terminate ()

Jan Hubicka hubicka@ucw.cz
Fri Mar 27 12:38:00 GMT 2009


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


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /