]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Extend syntax for cpuinfo feature string checks
authorAlice Carlotti <alice.carlotti@arm.com>
Mon, 10 Nov 2025 16:15:34 +0000 (16:15 +0000)
committerAlice Carlotti <alice.carlotti@arm.com>
Thu, 13 Nov 2025 13:18:21 +0000 (13:18 +0000)
Some SVE features in the toolchain need to be enabled when either of two
different kernel HWCAPS (and corresponding cpuinfo strings) are enabled
(one for non-streaming mode and one for streaming mode).

Add support for using "|" to separate alternative lists of required
features.

gcc/ChangeLog:

* config/aarch64/driver-aarch64.cc
(host_detect_local_cpu): Extend feature string syntax.

gcc/config/aarch64/driver-aarch64.cc

index 0333746ee00422e47a8349fad1127a1abface877..be98c5b5d1bcb33b44927e6e365a3a39e46ee203 100644 (file)
@@ -368,18 +368,30 @@ host_detect_local_cpu (int argc, const char **argv)
                  continue;
                }
 
+             /* This may be a multi-token feature string.  We need to match
+                all parts in one of the "|" separated sublists.  */
              bool enabled = true;
-
-             /* This may be a multi-token feature string.  We need
-                to match all parts, which could be in any order.  */
-             std::set<std::string> tokens;
-             split_words (val, tokens);
-             std::set<std::string>::iterator it;
-
-             /* Iterate till the first feature isn't found or all of them
-                are found.  */
-             for (it = tokens.begin (); enabled && it != tokens.end (); ++it)
-               enabled = enabled && features.count (*it);
+             size_t cur = 0;
+             while (cur < val.length ())
+               {
+                 size_t end = val.find_first_of (" ", cur);
+                 if (end == std::string::npos)
+                   end = val.length ();
+                 std::string word = val.substr (cur, end - cur);
+                 cur = end + 1;
+
+                 if (word == "|")
+                   {
+                     /* If we've matched everything in the current sublist, we
+                        can stop now.  */
+                     if (enabled)
+                       break;
+                     /* Otherwise, start again with the next sublist.  */
+                     enabled = true;
+                     continue;
+                   }
+                 enabled = enabled && features.count (word);
+               }
 
              if (enabled)
                extension_flags |= aarch64_extensions[i].flag;