There are three important parts missing. I don't see you in MAINTAINERS file, so you need to decide if you assign copyright to FSF or submit this under DCO.
I wonder if it is ok to add myself to MAINTAINERS file?
Seehttps://gcc.gnu.org/contribute.html#legal for more details (if you already have FSF assignment on file, somebody would need to check that, I don't have access to that).
I wanted to assign copyright to FSF but got no answer from [email protected] (nor from [email protected]) for my request of the required documents yet. So for now I go with DCO.
Another part is that a ChangeLog entry is missing (as documented in https://gcc.gnu.org/codingconventions.html#ChangeLogs). For your patch, that would be something like: PR middle-end/114540 * varasm.cc (decode_reg_name_and_count): Use strtoul instead of atoi and simplify verification the whole asmspec contains just decimal digits. (if testcase is added, empty line and * testcase_filename_relative_to_gcc/testsuite/: New test. added too; and if you go with DCO, followed by empty line and Signed-Off-By: line).The third part is missing testcase, for PR like this it should be probably in gcc/testsuite/gcc.dg/pr114540.c, have /* PR middle-end/114540 */ /* { dg-do compile } */ and add /* { dg-error "whatever error to expect" } */ directives to the lines on which errors will appear after the patch.
Done.
diff --git a/ChangeLog b/ChangeLog index a0b48aa45cb..9b8dac9fc91 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2024-11-28 Heiko Eißfeldt <[email protected]> + + * MAINTAINERS: Add myself to write after approval. + 2024-11-25 Sandra Loosemore <[email protected]> * MAINTAINERS: Remove references to nios2. diff --git a/MAINTAINERS b/MAINTAINERS index 26455d1cabf..0fab8de6ac7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -453,6 +453,7 @@ David Edelsohn dje <[email protected]> Bernd Edlinger edlinger <[email protected]> Phil Edwards pme <[email protected]> Mark Eggleston markeggleston <[email protected]> +Heiko Eißfeldt - <[email protected]> Steve Ellcey sje <[email protected]> Ben Elliston bje <[email protected]> Mohan Embar membar <[email protected]> diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2be87f2079c..53295e34434 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2024-11-28 Heiko Eißfeldt <[email protected]> + + PR middle-end/114540 + * varasm.cc (decode_reg_name_and_count): Use strtoul instead of atoi + and simplify verification the whole asmspec contains just decimal + digits. + + * gcc.dg/pr114540.c: New test. + + Signed-off-by: Heiko Eißfeldt <[email protected]> + Co-authored-by: Jakub Jelinek <[email protected]> + + 2024-11-27 Uros Bizjak <[email protected]> PR target/36503 diff --git a/gcc/testsuite/gcc.dg/pr114540.c b/gcc/testsuite/gcc.dg/pr114540.c new file mode 100644 index 00000000000..6d1aadc443f --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr114540.c @@ -0,0 +1,25 @@ +/* PR middle-end/114540 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void f() +{ + asm("":::"2147483648"); /* INT_MAX + 1 { dg-error "unknown register name" } */ + asm("":::"4294967296"); /* UINT_MAX + 1 { dg-error "unknown register name" } */ + asm("":::"18446744073709551616"); /* ULONG_MAX + 1 { dg-error "unknown register name" } */ + asm("":::"9223372036854775808"); /* LONG_MAX + 1 { dg-error "unknown register name" } */ + asm("":::"9223372036854775807"); /* LONG_MAX { dg-error "unknown register name" } */ + asm("":::"2147483647"); /* INT_MAX { dg-error "unknown register name" } */ + asm("":::"2147483647&"); /* INT_MAX + garbage char { dg-error "unknown register name" } */ + asm("":::"0"); /* real reg */ + + register int a asm("2147483648"); /* INT_MAX + 1 { dg-error "invalid register name for" } */ + register int b asm("4294967296"); /* UINT_MAX + 1 { dg-error "invalid register name for" } */ + register int c asm("18446744073709551616"); /* ULONG_MAX + 1 { dg-error "invalid register name for" } */ + register int d asm("9223372036854775808"); /* LONG_MAX + 1 { dg-error "invalid register name for" } */ + register int e asm("9223372036854775807"); /* LONG_MAX { dg-error "invalid register name for" } */ + register int f asm("2147483647"); /* INT_MAX { dg-error "invalid register name for" } */ + register int g asm("2147483647&"); /* INT_MAX + garbage char { dg-error "invalid register name for" } */ + register int h asm("0"); /* real reg */ +} + diff --git a/gcc/varasm.cc b/gcc/varasm.cc index be11123180c..261621a18c7 100644 --- a/gcc/varasm.cc +++ b/gcc/varasm.cc @@ -990,16 +990,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, ""); + if (errno != ERANGE + && j < FIRST_PSEUDO_REGISTER + && reg_names[j][0]) + return j; + else + return -2; + } } for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
