Jan Hubicka wrote: > 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,
Please don't. > or use -fno-non-call-exceptions No, because it might segfault, and we need to catch it. > to build this file or somehow restruture > code to avoid this case? /* Gimplify a MUST_NOT_THROW_EXPR. */ static enum gimplify_status gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p) { tree stmt = *expr_p; tree temp = voidify_wrapper_expr (stmt, NULL); tree body = TREE_OPERAND (stmt, 0); tree termination; if (pragma_java_exceptions) termination = terminate_node; else termination = abort_node; stmt = build_gimple_eh_filter_tree (body, NULL_TREE, build_call_n (termination, 0)); Andrew.