We have a code duplication in riscv_set_arch_by_subset_list() and
riscv_parse_arch_string(), where the latter function parses an ISA string
into a subset_list before doing the same as the former function.

riscv_parse_arch_string() is used to process command line options and
riscv_set_arch_by_subset_list() processes target attributes.
So, it is obvious that both functions should do the same.
Let's deduplicate the code to enforce this.

gcc/ChangeLog:

        * common/config/riscv/riscv-common.cc (riscv_set_arch_by_subset_list):
        Fix overlong line.
        (riscv_parse_arch_string): Replace duplicated code by a call to
        riscv_set_arch_by_subset_list.

(cherry picked from commit 85fa334fbcaa8e4b98ab197a8c9410dde87f0ae3)
Signed-off-by: Christoph Müllner <christoph.muell...@vrull.eu>
---
 gcc/common/config/riscv/riscv-common.cc | 32 +++++--------------------
 1 file changed, 6 insertions(+), 26 deletions(-)

diff --git a/gcc/common/config/riscv/riscv-common.cc 
b/gcc/common/config/riscv/riscv-common.cc
index 43b7549e3ec..cc43c8dd6b4 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -1779,7 +1779,8 @@ riscv_set_arch_by_subset_list (riscv_subset_list 
*subset_list,
       else if (subset_list->xlen () == 64)
        opts->x_target_flags |= MASK_64BIT;
 
-      for (arch_ext_flag_tab = &riscv_ext_flag_table[0]; 
arch_ext_flag_tab->ext;
+      for (arch_ext_flag_tab = &riscv_ext_flag_table[0];
+          arch_ext_flag_tab->ext;
           ++arch_ext_flag_tab)
        {
          if (subset_list->lookup (arch_ext_flag_tab->ext))
@@ -1803,30 +1804,6 @@ riscv_parse_arch_string (const char *isa,
   if (!subset_list)
     return;
 
-  if (opts)
-    {
-      const riscv_ext_flag_table_t *arch_ext_flag_tab;
-      /* Clean up target flags before we set.  */
-      for (arch_ext_flag_tab = &riscv_ext_flag_table[0];
-          arch_ext_flag_tab->ext;
-          ++arch_ext_flag_tab)
-       opts->*arch_ext_flag_tab->var_ref &= ~arch_ext_flag_tab->mask;
-
-      if (subset_list->xlen () == 32)
-       opts->x_target_flags &= ~MASK_64BIT;
-      else if (subset_list->xlen () == 64)
-       opts->x_target_flags |= MASK_64BIT;
-
-
-      for (arch_ext_flag_tab = &riscv_ext_flag_table[0];
-          arch_ext_flag_tab->ext;
-          ++arch_ext_flag_tab)
-       {
-         if (subset_list->lookup (arch_ext_flag_tab->ext))
-           opts->*arch_ext_flag_tab->var_ref |= arch_ext_flag_tab->mask;
-       }
-    }
-
   /* Avoid double delete if current_subset_list equals cmdline_subset_list.  */
   if (current_subset_list && current_subset_list != cmdline_subset_list)
     delete current_subset_list;
@@ -1834,7 +1811,10 @@ riscv_parse_arch_string (const char *isa,
   if (cmdline_subset_list)
     delete cmdline_subset_list;
 
-  current_subset_list = cmdline_subset_list = subset_list;
+  cmdline_subset_list = subset_list;
+  /* current_subset_list is set in the call below.  */
+
+  riscv_set_arch_by_subset_list (subset_list, opts);
 }
 
 /* Return the riscv_cpu_info entry for CPU, NULL if not found.  */
-- 
2.45.2

Reply via email to