On Fri, 2021-04-09 at 17:09 -0400, Michael Meissner wrote:
> Fix logic error in 32-bit trampolines, PR target/98952.
> 
> The test in the PowerPC 32-bit trampoline support is backwards.  It aborts
> if the trampoline size is greater than the expected size.  It should abort
> when the trampoline size is less than the expected size.
> 
> I verified this by creating a 32-bit trampoline program and manually
> changing the size of the trampoline to be 48 instead of 40.  The program
> aborted with the larger size.  I updated this code and ran the test again
> and it passed.
> 
> I did a bootstrap build on a big endian power8 system that supports both
> 32-bit and 64-bit executables, and there were no regressions.  Can I check
> this patch into the trunk?
> 
> libgcc/
> 2021-04-09  Michael Meissner  <meiss...@linux.ibm.com>
> 
>       PR target/98952
>       * config/rs6000/tramp.S (__trampoline_setup): Fix trampoline size
>       comparison in 32-bit.
> ---
>  libgcc/config/rs6000/tramp.S | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/libgcc/config/rs6000/tramp.S b/libgcc/config/rs6000/tramp.S
> index 4236a82b402..6b61d892da6 100644
> --- a/libgcc/config/rs6000/tramp.S
> +++ b/libgcc/config/rs6000/tramp.S
> @@ -64,8 +64,7 @@ FUNC_START(__trampoline_setup)
>          mflr r11
>          addi r7,r11,trampoline_initial-4-.LCF0 /* trampoline address -4 */
> 
> -     li      r8,trampoline_size      /* verify that the trampoline is big 
> enough */
> -     cmpw    cr1,r8,r4
> +     cmpwi   cr1,r4,trampoline_size  /* verify that the trampoline is big 
> enough */


Hmm, I spent several minutes trying to determine how cmpw behaves
differently than cmpwi before noticing you also swapped the
order of the r4,r8 operands. 

That seems OK.

A statement in the description indicating that you used a cmpwi instead
of a cmpw since you were in the neighborhood would help call that out. 


The #elif  _CALL_ELF == 2  portion of tramp.S (line 159 or so) has a
similar compare stanza with respect to the order of operands on the
compare.  Will this also have a backwards greater-than less-than issue?

        li      r8,trampoline_size      /* verify that the trampoline is big 
enough */
        cmpw    cr1,r8,r4
        srwi    r4,r4,3         /* # doublewords to move */
        addi    r9,r3,-8        /* adjust pointer for stdu */
        mtctr   r4
        blt     cr1,.Labort




thanks
-Will


>       srwi    r4,r4,2         /* # words to move */
>       addi    r9,r3,-4        /* adjust pointer for lwzu */
>       mtctr   r4
> -- 
> 2.22.0
> 
> 

Reply via email to