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                                                                     \
 {                                                                      \

Reply via email to