On Fri, Jun 20, 2014 at 07:36:41PM +0200, Marek Polacek wrote:
> 2014-06-20 Marek Polacek <[email protected]>
>
> * 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