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

Jan Hubicka <[email protected]>
Newsgroups gmane.comp.gcc.devel,gmane.comp.gcc.java.devel
Message-ID <[email protected]>
> 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;

OK, pragma_java_exceptions variable is not there, does something like
this work for you?

I would like to commit this to mainline so the MUST_NOT_THROW fix can go
as well.  I am commiting it to pretty-ipa in meantime.

Honza

Index: cp/except.c
===================================================================
*** cp/except.c	(revision 145101)
--- cp/except.c	(working copy)
*************** choose_personality_routine (enum languag
*** 353,358 ****
--- 353,359 ----
  
      case lang_java:
        state = chose_java;
+       terminate_node = built_in_decls [BUILT_IN_ABORT];
        eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
  						 ? "__gcj_personality_sj0"
  						 : "__gcj_personality_v0");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.