On Sun, Oct 16, 2011 at 8:35 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> As explained in length in the PR [1], we fail to mark signal frames >> correctly, leading to the abort in EH support library. >> >> As suggested by Eric, attached patch marks fs->signal_frame in the >> same way as other dwarf2 targets. >> >> 2011-10-16 Uros Bizjak <ubiz...@gmail.com> >> Eric Botcazou <ebotca...@adacore.com> >> >> * config/alpha/linux-unwind.h (alpha_fallback_frame_state): Set >> fs->signal_frame to 1. >> >> Patch was bootstrapped and regression tested on alphaev68-pc-linux-gnu >> where it fixes all libjava failures [2]. > > I didn't notice new Java failure: > > === libjava tests === > > > Running target unix > FAIL: Array_3 execution - source compiled test > FAIL: Array_3 -findirect-dispatch execution - source compiled test > FAIL: Array_3 -O3 execution - source compiled test > FAIL: Array_3 -O3 -findirect-dispatch execution - source compiled test > > === libjava Summary === > > # of expected passes 2578 > # of unexpected failures 4 > # of untested testcases 4 > > Running failing test manually with new libgcc_s.so, we get: > > ./Array_3.exe > Exception in thread "main" java.lang.NullPointerException > at Array_3.main(Array_3.java:37) > > It looks that NullPointerException handler was not reached for some reason... As again suggested by Eric in the PR, following patch fixes all failures: libgcc/ChangeLog: 2011-10-16 Uros Bizjak <ubiz...@gmail.com> Eric Botcazou <ebotca...@adacore.com> PR target/50737 * config/alpha/linux-unwind.h (alpha_fallback_frame_state): Set fs->signal_frame to 1. libjava/ChangeLog: 2011-10-16 Uros Bizjak <ubiz...@gmail.com> Eric Botcazou <ebotca...@adacore.com> PR target/50737 * include/dwarf2-signal.h [__alpha__]: Remove MAKE_THROW_FRAME definition. Uros.
Index: libgcc/config/alpha/linux-unwind.h =================================================================== --- libgcc/config/alpha/linux-unwind.h (revision 180054) +++ libgcc/config/alpha/linux-unwind.h (working copy) @@ -74,5 +74,7 @@ fs->regs.reg[64].how = REG_SAVED_OFFSET; fs->regs.reg[64].loc.offset = (long)&sc->sc_pc - new_cfa; fs->retaddr_column = 64; + fs->signal_frame = 1; + return _URC_NO_REASON; } Index: libjava/include/dwarf2-signal.h =================================================================== --- libjava/include/dwarf2-signal.h (revision 180054) +++ libjava/include/dwarf2-signal.h (working copy) @@ -29,21 +29,8 @@ // then throw an exception. With the dwarf2 unwinder we don't usually // need to do anything, with some minor exceptions. -#ifdef __alpha__ -#define MAKE_THROW_FRAME(_exception) \ -do \ -{ \ - /* Alpha either leaves PC pointing at a faulting instruction or the \ - following instruction, depending on the signal. SEGV always does \ - the former, so we adjust the saved PC to point to the following \ - instruction; this is what the handler in libgcc expects. */ \ - struct sigcontext *_sc = (struct sigcontext *)_p; \ - _sc->sc_pc += 4; \ -} \ -while (0) +#ifdef __ia64__ -#elif defined(__ia64__) - #define MAKE_THROW_FRAME(_exception) \ do \ { \