@@ -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);
@@ -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,