Hi Jakub,

On Mon, Nov 26, 2018 at 09:43:47PM +0100, Jakub Jelinek wrote:
> The following patch fixes a bunch of ICEs in rs6000 print_operand; we
> shouldn't ICE on them when users write mess in their inline asm.

> 2018-11-26  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR target/88188
>       * config/rs6000/rs6000.c (print_operand) <case 'D'>: Use
>       output_operand_lossage instead of gcc_assert.
>       <case 't'>: Likewise.
>       <case 'z'>: Likewise.
>       <case 'V'>: Use output_operand_lossage instead of gcc_unreachable.
> 
>       * gcc.target/powerpc/pr88188.c: New test.


> --- gcc/config/rs6000/rs6000.c.jj     2018-11-16 21:35:42.497982764 +0100
> +++ gcc/config/rs6000/rs6000.c        2018-11-26 10:56:28.079516458 +0100
> @@ -20644,7 +20644,11 @@ print_operand (FILE *file, rtx x, int co
>  
>      case 'D':
>        /* Like 'J' but get to the GT bit only.  */
> -      gcc_assert (REG_P (x));
> +      if (!REG_P (x))
> +     {
> +       output_operand_lossage ("invalid %%D value");
> +       return;
> +     }
>  
>        /* Bit 1 is GT bit.  */
>        i = 4 * (REGNO (x) - CR0_REGNO) + 1;

'D' just blows up if you pass it something not a CR field (well, it compiles
into something that doesn't assemble).

'J' uses ccr_bit.  This actually explodes (a gcc_assert, an ICE).

> @@ -20900,7 +20904,11 @@ print_operand (FILE *file, rtx x, int co
>  
>      case 't':
>        /* Like 'J' but get to the OVERFLOW/UNORDERED bit.  */
> -      gcc_assert (REG_P (x) && GET_MODE (x) == CCmode);
> +      if (!REG_P (x) || GET_MODE (x) != CCmode)
> +     {
> +       output_operand_lossage ("invalid %%t value");
> +       return;
> +     }
>  
>        /* Bit 3 is OV bit.  */
>        i = 4 * (REGNO (x) - CR0_REGNO) + 3;

't' does not seem easy to blow up, heh.

Both 'D' and 't', as well as ccr_bit, should use cc_reg_operand I think?
That allows some pseudos as well, but that doesn't matter.

> @@ -21059,7 +21067,11 @@ print_operand (FILE *file, rtx x, int co
>        names.  If we are configured for System V (or the embedded ABI) on
>        the PowerPC, do not emit the period, since those systems do not use
>        TOCs and the like.  */
> -      gcc_assert (GET_CODE (x) == SYMBOL_REF);
> +      if (GET_CODE (x) != SYMBOL_REF)

SYMBOL_REF_P please.

Okay for trunk.  Thanks!


Segher

Reply via email to