https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90963

--- Comment #4 from dave.anglin at bell dot net ---
On 2019-06-24 12:59 p.m., wilco at gcc dot gnu.org wrote:
> Looking into this, pa.md is one of a few targets which defines 
> builtin_longjmp.
> This subtracts 8 from the loaded frame pointer, but that's now wrong since the
> hard frame pointer is store. So this also needs to be updated like
> nonlocal_goto:
>
> --- a/gcc/config/pa/pa.md
> +++ b/gcc/config/pa/pa.md
> @@ -8713,7 +8710,7 @@ add,l %2,%3,%3\;bv,n %%r0(%3)"
>    emit_insn (gen_blockage ());
>    emit_clobber (hard_frame_pointer_rtx);
>    emit_clobber (frame_pointer_rtx);
> -  emit_move_insn (hard_frame_pointer_rtx, plus_constant (Pmode, fp, -8));
> +  emit_move_insn (hard_frame_pointer_rtx, fp);
>
>    emit_use (hard_frame_pointer_rtx);
>    emit_use (stack_pointer_rtx);
>
> After this setjmp-1.c looks correct:
>
> sub2:
>         .PROC
>         .CALLINFO FRAME=64,NO_CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
>         .ENTRY
>         copy %r3,%r1
>         stw %r2,-20(%r30)
>         copy %r30,%r3
>         stwm %r1,64(%r30)
>         addil LR'buf-$global$,%r27
>         ldo RR'buf-$global$(%r1),%r28
>         ldw 0(%r28),%r19  // load hard frame pointer
>         ldw 4(%r28),%r1
>         ldw 8(%r28),%r30
>         copy %r19,%r3    // assign hfp with offset 0
>         be,n 0(%sr4,%r1)
>
>
> main
>         ...
>         stw %r30,8(%r1)
>         stw %r28,4(%r1)
>         ldo 512(%r30),%r30
>         depi 0,31,3,%r20
>         stw %r3,0(%r1)     // store hard frame pointer
>         ldi 0,%r28
>         ldi 115,%r21
>
> I can commit this if you like or do you want to test it first?
The change fixes all the test failures on hppa-unknown-linux-gnu.

Would you please commit with comment update.

Thanks,
Dave

Reply via email to