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
ass...@fsf.org (nor from ass...@gnu.org)
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 <he...@hexco.de>
+
+ * MAINTAINERS: Add myself to write after approval.
+
2024-11-25 Sandra Loosemore <sloosem...@baylibre.com>
* 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
<dje....@gmail.com>
Bernd Edlinger edlinger <bernd.edlin...@hotmail.de>
Phil Edwards pme <p...@gcc.gnu.org>
Mark Eggleston markeggleston
<mark.eggles...@codethink.co.uk>
+Heiko Eißfeldt - <he...@hexco.de>
Steve Ellcey sje <sell...@caviumnetworks.com>
Ben Elliston bje <config-patc...@gnu.org>
Mohan Embar membar <gnust...@thisiscool.com>
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 <he...@hexco.de>
+
+ 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 <he...@hexco.de>
+ Co-authored-by: Jakub Jelinek <ja...@redhat.com>
+
+
2024-11-27 Uros Bizjak <ubiz...@gmail.com>
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++)