LGTM and committed to trunk for this patch :)
On Thu, Oct 24, 2024 at 3:12 PM Yangyu Chen <c...@cyyself.name> wrote: > > This patch splits static bool riscv_process_target_attr > (tree args, location_t loc) into two functions: > > - bool riscv_process_target_attr (const char *args, location_t loc) > - static bool riscv_process_target_attr (tree args, location_t loc) > > Thus, we can call `riscv_process_target_attr` with a `const char *` > argument. This is useful for implementation of `target_version` > attribute. > > gcc/ChangeLog: > > * config/riscv/riscv-target-attr.cc (riscv_process_target_attr): > Split into two functions with const char *args argument > --- > gcc/config/riscv/riscv-protos.h | 2 + > gcc/config/riscv/riscv-target-attr.cc | 65 +++++++++++++++------------ > 2 files changed, 39 insertions(+), 28 deletions(-) > > diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h > index d690162bb0c..cee6bbddc10 100644 > --- a/gcc/config/riscv/riscv-protos.h > +++ b/gcc/config/riscv/riscv-protos.h > @@ -799,6 +799,8 @@ extern bool riscv_use_divmod_expander (void); > void riscv_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, int); > extern bool > riscv_option_valid_attribute_p (tree, tree, tree, int); > +extern bool > +riscv_process_target_attr (const char *, location_t); > extern void > riscv_override_options_internal (struct gcc_options *); > extern void riscv_option_override (void); > diff --git a/gcc/config/riscv/riscv-target-attr.cc > b/gcc/config/riscv/riscv-target-attr.cc > index bf14ade5ce0..8ce9607b3c9 100644 > --- a/gcc/config/riscv/riscv-target-attr.cc > +++ b/gcc/config/riscv/riscv-target-attr.cc > @@ -304,35 +304,13 @@ num_occurrences_in_str (char c, char *str) > return res; > } > > -/* Parse the tree in ARGS that contains the target attribute information > +/* Parse the string in ARGS that contains the target attribute information > and update the global target options space. */ > > -static bool > -riscv_process_target_attr (tree args, location_t loc) > +bool > +riscv_process_target_attr (const char *args, location_t loc) > { > - if (TREE_CODE (args) == TREE_LIST) > - { > - do > - { > - tree head = TREE_VALUE (args); > - if (head) > - { > - if (!riscv_process_target_attr (head, loc)) > - return false; > - } > - args = TREE_CHAIN (args); > - } while (args); > - > - return true; > - } > - > - if (TREE_CODE (args) != STRING_CST) > - { > - error_at (loc, "attribute %<target%> argument not a string"); > - return false; > - } > - > - size_t len = strlen (TREE_STRING_POINTER (args)); > + size_t len = strlen (args); > > /* No need to emit warning or error on empty string here, generic code > already > handle this case. */ > @@ -343,7 +321,7 @@ riscv_process_target_attr (tree args, location_t loc) > > std::unique_ptr<char[]> buf (new char[len+1]); > char *str_to_check = buf.get (); > - strcpy (str_to_check, TREE_STRING_POINTER (args)); > + strcpy (str_to_check, args); > > /* Used to catch empty spaces between semi-colons i.e. > attribute ((target ("attr1;;attr2"))). */ > @@ -366,7 +344,7 @@ riscv_process_target_attr (tree args, location_t loc) > if (num_attrs != num_semicolons + 1) > { > error_at (loc, "malformed %<target(\"%s\")%> attribute", > - TREE_STRING_POINTER (args)); > + args); > return false; > } > > @@ -376,6 +354,37 @@ riscv_process_target_attr (tree args, location_t loc) > return true; > } > > +/* Parse the tree in ARGS that contains the target attribute information > + and update the global target options space. */ > + > +static bool > +riscv_process_target_attr (tree args, location_t loc) > +{ > + if (TREE_CODE (args) == TREE_LIST) > + { > + do > + { > + tree head = TREE_VALUE (args); > + if (head) > + { > + if (!riscv_process_target_attr (head, loc)) > + return false; > + } > + args = TREE_CHAIN (args); > + } while (args); > + > + return true; > + } > + > + if (TREE_CODE (args) != STRING_CST) > + { > + error_at (loc, "attribute %<target%> argument not a string"); > + return false; > + } > + > + return riscv_process_target_attr (TREE_STRING_POINTER (args), loc); > +} > + > /* Implement TARGET_OPTION_VALID_ATTRIBUTE_P. > This is used to process attribute ((target ("..."))). > Note, that riscv_set_current_function() has not been called before, > -- > 2.45.2 >