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

--- Comment #6 from igor.v.tsimbalist at intel dot com ---
(In reply to H.J. Lu from comment #5)
> (In reply to igor.v.tsimbalist from comment #4)
> > Created attachment 43280 [details]
> > updated patch
> 
> -      mem = gen_rtx_MEM (Pmode, plus_constant (Pmode, operands[0],
> -                                            3 * GET_MODE_SIZE (Pmode)));
> -      reg_ssp = gen_reg_rtx (Pmode);
> +      mem = gen_rtx_MEM (word_mode, plus_constant (Pmode, operands[0],
> +                                           3 * GET_MODE_SIZE (Pmode)));
> 
> The first 3 fields are SP, FP and IP, which are in ptr_mode, not Pmode.

ok.

>        /* Compute the numebr of frames to adjust.  */
> +      reg_adj = gen_rtx_SUBREG (Pmode, reg_ssp, 0);
> 
> reg_ssp must be in word_mode, not in Pmode.

reg_ssp is word_mode. It's reg_adj that is Pmode (it's increment to shadow
stack).

> Please show the assembly outputs of __builtin_setjmp and __builtin_longjmp
> with the updated patch.

A snippet for __builtin_longjmp for -mx32

        movl    $0, %eax
        rdsspq  %rax
        subq    buf+12(%rip), %rax
        je      .L2
        negl    %eax
        shrl    $2, %eax
        cmpl    $255, %eax
        jbe     .L3
.L4:
        incsspq %rax
        subl    $255, %eax
        cmpl    $255, %eax
        ja      .L4
.L3:
        incsspq %rax
.L2:

Snippet for __builtin_setjmp for -mx32

        movl    %eax, buf(%rip)
        movl    $.L8, buf+4(%rip)
        movl    %esp, buf+8(%rip)
        movl    $0, %eax
        rdsspq  %rax
        movq    %rax, buf+12(%rip)

Reply via email to