exceptions: gross hideous hack works, need guru to tell me if I have caused major breakage

Andrew Haley aph@cambridge.redhat.com
Sat Dec 15 02:43:00 GMT 2001


Adam Megacz writes:
 > 
 > Anyways, there's an exception-handling example where they do little
 > more than register an exception handler, check the type of the
 > exception, and then throw a language exception (not an OS exception)
 > right out of the OS-exception handler.
 > 
 > I tried this, and it works. Incredibly simple, but it works.
 > 
 > I also found code on the mailing list from a while back that had some
 > rather complex technique for unrolling the stack to the appropriate
 > java exception handler, then figuring out the appropriate EBP/EIP/ESP
 > values for that handler and returning them from the signal handler,
 > along with instructions to the OS saying "take these register values
 > and resume from there". Unfortunately it used an interface to GCC's
 > exception logic that no longer works.

This logic has been moved from Java's own signal handler to
MD_FALLBACK_FRAME_STATE_FOR in the various gcc back ends.  There are
versions for x86, ppc, Alpha and recently IA-64.

 > So I'm wondering which of these is true:
 > 
 > 1) I've done something horribly wrong, and it will come back to bite
 >    me when I start incurring NullPointerExceptions in larger programs

If you have setjmp/longjmp exceptions you'll be fine: there is no need
to do anything special for NullPointerExceptions.

However, the DWARF exception unwinder needs a complete stack chain
that it can unwind.  The code in MD_FALLBACK_FRAME_STATE_FOR
recognizes a signal handler frame and unwinds it so that the DWARF
exception unwinder can continue.

 > 2) The author of the old SEGV-to-NullPointerException code

me

 >    did something way more complex than was required. 

Not exactly: it was necessary at the time, but is no longer necessary.

 >    Perhaps this is because you can't just throw a language-level
 >    exception out of a POSIX exception handler,

The C++ standard says this.  The only strictly legal way to jump out
of such a signal handler is with a longjmp.  So, if you're using
setjmp/longjmp exceptions you'll be fine.

 > but you _can_ do this on Win32?

 > 3) What I've done works, but yields invalid stack traces (which don't
 >    work on Win32 anyways due to SJLJ, so it's all moot).

Well, that's a shame, but only to be expected.

 > Anyways, I know very, very little about signal handlers, either on
 > POSIX or Win32, but my gross hack works, and I'd appreciate input
 > from somebody who knows more than me on whether I need to take a
 > closer look at this.

You'll still need the magic in i386.h HANDLE_DIVIDE_OVERFLOW even if
you're using setjmp/longjmp exceptions.  There's a comment at the top
of this code which explains why.  Try running the test case
libjava.lang/Divide_1.java to see if your handler works.

If making this work is too much hassle, you could define
DIVIDESPEC=-fuse-divide-subroutine in libjava/configure.host.  This
would in any case be a perfectly reasonable stopgap.

Andrew.



More information about the Java mailing list