On Mon, Jul 21, 2025 at 11:03:08PM +0800, Xi Ruoyao wrote:
> On Mon, 2025-07-21 at 16:57 +0200, Stefan Schulze Frielinghaus wrote:
> > The generated file tm-preds.h contains now:
> > 
> > static inline size_t
> > insn_constraint_len (char fc, const char *str)
> > {
> >   ...
> > 
> >   if (str[0] == '{')
> >       return ((const char *) rawmemchr (str + 1, '}') - str) + 1;
> >   return 1;
> > }
> > 
> > For some reason on all targets I tested, string.h is included.  I will
> > have a look and see whether string.h may be included easily here, too.
> > If the dependency to string.h is not wanted, I could also come up with a
> > simple loop.
> 
> It's not if string.h is included.  It's if string.h provides rawmemchr.
> 
> rawmemchr is not a standard C function.  It's a GNU extension and GCC is
> expected to work on various non-GNU systems.

Yea, I didn't have that on my radar and hadn't seen Rainer's mail until
now.  I will bootstrap the following patch and post it shortly:

diff --git a/gcc/genpreds.cc b/gcc/genpreds.cc
index c6a2983419a..4f8beeb0514 100644
--- a/gcc/genpreds.cc
+++ b/gcc/genpreds.cc
@@ -1184,7 +1184,12 @@ write_insn_constraint_len (void)
   puts ("    default: break;\n"
        "    }\n"
        "  if (str[0] == '{')\n"
-       "      return ((const char *) rawmemchr (str + 1, '}') - str) + 1;\n"
+       "    {\n"
+       "      size_t len = 1;\n"
+       "      while (str[len] != '}' && str[len] != '\\0')\n"
+       "        ++len;\n"
+       "      return len + 1;\n"
+       "    }\n"
        "  return 1;\n"
        "}\n");
 }

Reply via email to