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++)

Reply via email to