{"id":2226694,"url":"http://patchwork.ozlabs.org/api/patches/2226694/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhuodmon6a.gcc.gcc-TEST.alfie.richards.49.1.3@forge-stage.sourceware.org/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<bmm.hhuodmon6a.gcc.gcc-TEST.alfie.richards.49.1.3@forge-stage.sourceware.org>","list_archive_url":null,"date":"2026-04-22T18:21:51","name":"[v1,03/13] riscv: Refactor riscv target parsing to take string_slice.","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"d398b94bd5a72f5dc9a3b061b2edb949155778e6","submitter":{"id":93228,"url":"http://patchwork.ozlabs.org/api/people/93228/?format=json","name":"\\\"alfie.richards via Sourceware Forge\\\"","email":"forge-bot+alfie.richards@forge-stage.sourceware.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhuodmon6a.gcc.gcc-TEST.alfie.richards.49.1.3@forge-stage.sourceware.org/mbox/","series":[{"id":501072,"url":"http://patchwork.ozlabs.org/api/series/501072/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=501072","date":"2026-04-22T18:21:54","name":"FMV refactor and ACLE compliance for C++","version":1,"mbox":"http://patchwork.ozlabs.org/series/501072/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2226694/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2226694/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org; dmarc=none (p=none dis=none)\n header.from=forge-stage.sourceware.org","sourceware.org;\n spf=pass smtp.mailfrom=forge-stage.sourceware.org","server2.sourceware.org;\n arc=none smtp.remote-ip=38.145.34.39"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g17DK5NsDz1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 04:34:25 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id B8BC542DF731\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 18:34:23 +0000 (GMT)","from forge-stage.sourceware.org (vm08.sourceware.org [38.145.34.39])\n by sourceware.org (Postfix) with ESMTPS id 736724423335\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 18:23:30 +0000 (GMT)","from forge-stage.sourceware.org (localhost [IPv6:::1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256)\n (No client certificate requested)\n by forge-stage.sourceware.org (Postfix) with ESMTPS id 4C63743456\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 18:23:30 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org B8BC542DF731","OpenDKIM Filter v2.11.0 sourceware.org 736724423335"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 736724423335","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 736724423335","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776882210; cv=none;\n b=Kvmbxh7qOxrcJcVb12KiAZuZpy7LCJUuPHNTB9X6ulWImyPjJ93nI1mHoXJby+9xrYRuyTvXmKXXpHHLMfMrXxuV5TtFFf0W8vg6HVawr4Wn752ycVMJMIWNHM4DQkyog08VD/DyBmUn/Su5Hjlw70SeOTyLYYKNy8txcVf3c1I=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776882210; c=relaxed/simple;\n bh=Jnp9SzwMtduV+EfGRx1vi/jPtInCYSno+D3TNVlx0dk=;\n h=From:Date:Subject:To:Message-ID;\n b=S6FP4zsrmx+d+/Ciy54UTi/tA07BeRCEVn9a86iMzBWVe5H+dt53kqxrEiHYgMBtED+AXRuJhsFq02Lm+fmFHYVDL+0Fwel8UaqfOUzCT1NoBVB9th5BfiP1Qux4HjuIrh8X2mGv0hVaPI+NB13y26zUb2MGVhP/r9oSuURmCUk=","ARC-Authentication-Results":"i=1; server2.sourceware.org","From":"\"\\\"alfie.richards via Sourceware Forge\\\"\"\n <forge-bot+alfie.richards@forge-stage.sourceware.org>","Date":"Wed, 22 Apr 2026 18:21:51 +0000","Subject":"[PATCH v1 03/13] riscv: Refactor riscv target parsing to take\n string_slice.","To":"gcc-patches mailing list <gcc-patches@gcc.gnu.org>","Message-ID":"\n <bmm.hhuodmon6a.gcc.gcc-TEST.alfie.richards.49.1.3@forge-stage.sourceware.org>","X-Mailer":"batrachomyomachia","X-Requested-Reviewer":["rsandifo","rearnsha"],"X-Pull-Request-Organization":"gcc","X-Pull-Request-Repository":"gcc-TEST","X-Pull-Request":"https://forge.sourceware.org/gcc/gcc-TEST/pulls/49","References":"\n <bmm.hhuodmon6a.gcc.gcc-TEST.alfie.richards.49.1.0@forge-stage.sourceware.org>","In-Reply-To":"\n <bmm.hhuodmon6a.gcc.gcc-TEST.alfie.richards.49.1.0@forge-stage.sourceware.org>","X-Patch-URL":"\n https://forge.sourceware.org/alfie.richards/gcc-TEST/commit/c74ffbc38dc91e0dd07da02c0efd4a3b7063144e","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Reply-To":"gcc-patches mailing list <gcc-patches@gcc.gnu.org>,\n alfierichards@sourceware.org","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"From: Alfie Richards <alfie.richards@arm.com>\n\nThis is a quick refactor of the riscv target processing code\nto take a string_slice rather than a decl.\n\nThe reason for this is to enable it to work with target_clones\nwhere merging logic requires reasoning about each version string\nindividually in the front end.\n\nThis refactor primarily serves just to get this working. Ideally the\nlogic here would be further refactored as currently there is no way to\ncheck if a parse fails or not without emitting an error.\nThis makes things difficult for later patches which intends to emit a\nwarning and ignoring unrecognised/not parsed target_clone values rather\nthan erroring which can't currently be achieved with the current riscv\ncode.\n\ngcc/ChangeLog:\n\n\t* config/riscv/riscv-protos.h (riscv_process_target_version_str): New function..\n\t* config/riscv/riscv-target-attr.cc (riscv_process_target_attr): Refactor to take\n\tstring_slice.\n\t(riscv_process_target_version_str): Ditto.\n\t* config/riscv/riscv.cc (parse_features_for_version): Refactor to take\n\tstring_slice.\n\t(riscv_compare_version_priority): Ditto.\n\t(dispatch_function_versions): Change to pass location.\n---\n gcc/config/riscv/riscv-protos.h       |  2 ++\n gcc/config/riscv/riscv-target-attr.cc | 14 +++++---\n gcc/config/riscv/riscv.cc             | 50 ++++++++++++++-------------\n 3 files changed, 37 insertions(+), 29 deletions(-)","diff":"diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h\nindex b49732515352..9eaa8ce160d5 100644\n--- a/gcc/config/riscv/riscv-protos.h\n+++ b/gcc/config/riscv/riscv-protos.h\n@@ -837,6 +837,8 @@ riscv_option_valid_attribute_p (tree, tree, tree, int);\n extern bool\n riscv_option_valid_version_attribute_p (tree, tree, tree, int);\n extern bool\n+riscv_process_target_version_str (string_slice, location_t);\n+extern bool\n riscv_process_target_version_attr (tree, location_t);\n extern void\n riscv_override_options_internal (struct gcc_options *);\ndiff --git a/gcc/config/riscv/riscv-target-attr.cc b/gcc/config/riscv/riscv-target-attr.cc\nindex 8ad3025579b2..c255bd3906f0 100644\n--- a/gcc/config/riscv/riscv-target-attr.cc\n+++ b/gcc/config/riscv/riscv-target-attr.cc\n@@ -350,11 +350,11 @@ num_occurrences_in_str (char c, char *str)\n    and update the global target options space.  */\n \n bool\n-riscv_process_target_attr (const char *args,\n+riscv_process_target_attr (string_slice args,\n \t\t\t   location_t loc,\n \t\t\t   const struct riscv_attribute_info *attrs)\n {\n-  size_t len = strlen (args);\n+  size_t len = args.size ();\n \n   /* No need to emit warning or error on empty string here, generic code already\n      handle this case.  */\n@@ -365,7 +365,7 @@ riscv_process_target_attr (const char *args,\n \n   std::unique_ptr<char[]> buf (new char[len+1]);\n   char *str_to_check = buf.get ();\n-  strcpy (str_to_check, args);\n+  strncpy (str_to_check, args.begin (), args.size ());\n \n   /* Used to catch empty spaces between semi-colons i.e.\n      attribute ((target (\"attr1;;attr2\"))).  */\n@@ -387,8 +387,7 @@ riscv_process_target_attr (const char *args,\n \n   if (num_attrs != num_semicolons + 1)\n     {\n-      error_at (loc, \"malformed %<target(\\\"%s\\\")%> attribute\",\n-\t\targs);\n+      error_at (loc, \"malformed %<target(\\\"%B\\\")%> attribute\", &args);\n       return false;\n     }\n \n@@ -509,6 +508,11 @@ riscv_process_target_version_attr (tree args, location_t loc)\n   return riscv_process_target_attr (str, loc, riscv_target_version_attrs);\n }\n \n+bool\n+riscv_process_target_version_str (string_slice str, location_t loc)\n+{\n+  return riscv_process_target_attr (str, loc, riscv_target_version_attrs);\n+}\n \n /* Implement TARGET_OPTION_VALID_VERSION_ATTRIBUTE_P.  This is used to\n    process attribute ((target_version (\"...\"))).  */\ndiff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc\nindex 257bb56886fb..6bbbe65b32f6 100644\n--- a/gcc/config/riscv/riscv.cc\n+++ b/gcc/config/riscv/riscv.cc\n@@ -13949,31 +13949,22 @@ riscv_c_mode_for_floating_type (enum tree_index ti)\n   return default_mode_for_floating_type (ti);\n }\n \n-/* This parses the attribute arguments to target_version in DECL and modifies\n-   the feature mask and priority required to select those targets.  */\n-static void\n-parse_features_for_version (tree decl,\n+/* This parses STR and modifies the feature mask and priority required to\n+   select those targets.  */\n+static bool\n+parse_features_for_version (string_slice version_str,\n+\t\t\t    location_t loc,\n \t\t\t    struct riscv_feature_bits &res,\n \t\t\t    int &priority)\n {\n-  tree version_attr = lookup_attribute (\"target_version\",\n-\t\t\t\t\tDECL_ATTRIBUTES (decl));\n-  if (version_attr == NULL_TREE)\n+  gcc_assert (version_str.is_valid ());\n+  if (version_str == \"default\")\n     {\n       res.length = 0;\n       priority = 0;\n-      return;\n+      return true;\n     }\n \n-  const char *version_string = TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE\n-\t\t\t\t\t\t    (version_attr)));\n-  gcc_assert (version_string != NULL);\n-  if (strcmp (version_string, \"default\") == 0)\n-    {\n-      res.length = 0;\n-      priority = 0;\n-      return;\n-    }\n   struct cl_target_option cur_target;\n   cl_target_option_save (&cur_target, &global_options,\n \t\t\t &global_options_set);\n@@ -13983,18 +13974,17 @@ parse_features_for_version (tree decl,\n   cl_target_option_restore (&global_options, &global_options_set,\n \t\t\t    default_opts);\n \n-  riscv_process_target_version_attr (TREE_VALUE (version_attr),\n-\t\t\t\t     DECL_SOURCE_LOCATION (decl));\n+  riscv_process_target_version_str (version_str, loc);\n \n   priority = global_options.x_riscv_fmv_priority;\n   const char *arch_string = global_options.x_riscv_arch_string;\n   bool parse_res\n     = riscv_minimal_hwprobe_feature_bits (arch_string, &res,\n-\t\t\t\t\t  DECL_SOURCE_LOCATION (decl));\n-  gcc_assert (parse_res);\n+\t\t\t\t\t  loc);\n \n   cl_target_option_restore (&global_options, &global_options_set,\n \t\t\t    &cur_target);\n+  return parse_res;\n }\n \n /* Compare priorities of two feature masks.  Return:\n@@ -14047,8 +14037,16 @@ riscv_compare_version_priority (tree decl1, tree decl2)\n   struct riscv_feature_bits mask1, mask2;\n   int prio1, prio2;\n \n-  parse_features_for_version (decl1, mask1, prio1);\n-  parse_features_for_version (decl2, mask2, prio2);\n+  string_slice v1 = get_target_version (decl1);\n+  string_slice v2 = get_target_version (decl2);\n+\n+  if (!v1.is_valid ())\n+    v1 = \"default\";\n+  if (!v2.is_valid ())\n+    v2 = \"default\";\n+\n+  parse_features_for_version (v1, DECL_SOURCE_LOCATION (decl1), mask1, prio1);\n+  parse_features_for_version (v2, DECL_SOURCE_LOCATION (decl1), mask2, prio2);\n \n   return compare_fmv_features (mask1, mask2, prio1, prio2);\n }\n@@ -14349,7 +14347,11 @@ dispatch_function_versions (tree dispatch_decl,\n       struct function_version_info version_info;\n       version_info.version_decl = version_decl;\n       // Get attribute string, parse it and find the right features.\n-      parse_features_for_version (version_decl,\n+      string_slice v = get_target_version (version_decl);\n+      if (!v.is_valid ())\n+\tv = \"default\";\n+      parse_features_for_version (v,\n+\t\t\t\t  DECL_SOURCE_LOCATION (version_decl),\n \t\t\t\t  version_info.features,\n \t\t\t\t  version_info.prio);\n       function_versions.push_back (version_info);\n","prefixes":["v1","03/13"]}