On Fri, Jun 20, 2014 at 07:36:41PM +0200, Marek Polacek wrote:
> 2014-06-20  Marek Polacek  <pola...@redhat.com>
> 
>       * genpreds.c (verify_rtx_codes): New function.
>       (main): Call it.
>       * rtl.h (RTX_FLD_WIDTH, RTX_HWINT_WIDTH): Define.
>       (struct rtx_def): Use them.
Note, e.g. Coverity also complains about this stuff loudly too,
apparently not just in the problematic case where rtx_def is used
in a middle of structure, but also when used in flexible array
like spot.  Most RTLs are allocated through rtx_alloc and the size
is determined from RTX_HDR_SIZE (i.e. offsetof) and/or RTX_CODE_SIZE,
so your rtl.h change IMHO shouldn't affect anything but make the
expmed.c init_expmed_rtl structure somewhat longer.

> --- gcc/genpreds.c
> +++ gcc/genpreds.c
> @@ -1471,6 +1471,40 @@ parse_option (const char *opt)
>      return 0;
>  }
>  
> +/* Verify RTX codes.  We can't call fatal_error here, so call
> +   gcc_unreachable after error to really abort.  */
> +
> +static void
> +verify_rtx_codes (void)
> +{
> +  unsigned int i, j;
> +
> +  for (i = 0; i < NUM_RTX_CODE; i++)
> +    if (strchr (GET_RTX_FORMAT (i), 'w') == NULL)
> +      {
> +     if (strlen (GET_RTX_FORMAT (i)) > RTX_FLD_WIDTH)
> +       {
> +         error ("insufficient size of RTX_FLD_WIDTH");
> +         gcc_unreachable ();

I think it would be nice to be more verbose, i.e. say
which rtx has longer format string than RTX_FLD_WIDTH, and perhaps also
the size and RTX_FLD_WIDTH value.  Also, can't you use internal_error
instead of error + gcc_unreachable ?

So perhaps
            internal_error ("%s format %s longer than RTX_FLD_WIDTH %d\n",
                            GET_RTX_NAME (i), GET_RTX_FORMAT (i),
                            (int) RTX_FLD_WIDTH);
?

> +       }
> +      }
> +    else
> +      {
> +     const size_t len = strlen (GET_RTX_FORMAT (i));
> +     for (j = 0; j < len; j++)
> +       if (GET_RTX_FORMAT (i)[j] != 'w')
> +         {
> +           error ("rtx format does not contain only hwint entries");
> +           gcc_unreachable ();
> +         }
> +     if (len > RTX_HWINT_WIDTH)
> +       {
> +         error ("insufficient size of RTL_MAX_HWINT_WIDTH");
> +         gcc_unreachable ();
> +       }
> +      }

And similarly here.

Otherwise, LGTM, but as I've been discussing this with Marek,
I'd prefer somebody else to review it.

        Jakub

Reply via email to