On Tue, Nov 26, 2024 at 06:51:40AM +0100, Heiko Eißfeldt wrote:
> Would it make sense to have a nullptr check for asmspec at the
> beginning, too?
No.
There is already
if (asmspec != 0)
around it which guarantees it and strip_reg_name will never return NULL.
> diff --git a/gcc/varasm.cc b/gcc/varasm.cc
> index dd67dd441c0..3e3e4bc5b42 100644
> --- a/gcc/varasm.cc
> +++ b/gcc/varasm.cc
> @@ -988,16 +988,21 @@ decode_reg_name_and_count (const char *asmspec, int
> *pnregs)
> asmspec = strip_reg_name (asmspec);
>
> /* Allow a decimal number as a "register name". */
> - for (i = strlen (asmspec) - 1; i >= 0; i--)
> - if (! ISDIGIT (asmspec[i]))
> - break;
> - if (asmspec[0] != 0 && i < 0)
> + if (ISDIGIT (asmspec[0]))
> {
> - i = atoi (asmspec);
> - if (i < FIRST_PSEUDO_REGISTER && i >= 0 && reg_names[i][0])
> - return i;
> - else
> - return -2;
> + char *pend;
> + errno = 0;
> + unsigned long j = strtoul (asmspec, &pend, 10);
> + if (*pend == '\0')
> + {
> + static_assert( FIRST_PSEUDO_REGISTER <= INT_MAX );
This is wrongly formatted and valid only in C++17 and later, while
GCC is currently written in C++14.
So it needs to be
static_assert (FIRST_PSEUDO_REGISTER <= INT_MAX, "");
> + if (errno != ERANGE
> + && j < FIRST_PSEUDO_REGISTER
> + && reg_names[j][0])
> + return j;
> + else
> + return -2;
> + }
> }
>
> for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
Ok for trunk with that change.
Jakub