Andrew Carlotti <andrew.carlo...@arm.com> writes: > Replace `const struct processor *` in output parameters with > `aarch64_arch` or `aarch64_cpu`. > > Replace `std:string` parameter in aarch64_print_hint_for_extensions with > `char *`. > > Also name the return parameters more clearly and consistently. > > gcc/ChangeLog: > > * config/aarch64/aarch64.cc > (aarch64_print_hint_for_extensions): Receive string as a char *. > (aarch64_parse_arch): Don't return a const struct processor *. > (aarch64_parse_cpu): Ditto. > (aarch64_parse_tune): Ditto. > (aarch64_validate_mtune): Ditto. > (aarch64_validate_mcpu): Ditto, and use temporary variables for > march/mcpu cross-check. > (aarch64_validate_march): Ditto. > (aarch64_override_options): Adjust for changed parameter types. > (aarch64_handle_attr_arch): Ditto. > (aarch64_handle_attr_cpu): Ditto. > (aarch64_handle_attr_tune): Ditto.
OK, thanks. Richard > diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc > index > d8a2916d8230cc25122f21818b88fd347e72693a..9b44d08f3e5fe6b4a7aa8f040e7001e3070b362d > 100644 > --- a/gcc/config/aarch64/aarch64.cc > +++ b/gcc/config/aarch64/aarch64.cc > @@ -18217,16 +18217,16 @@ better_main_loop_than_p (const vector_costs > *uncast_other) const > > static void initialize_aarch64_code_model (struct gcc_options *); > > -/* Parse the TO_PARSE string and put the architecture struct that it > - selects into RES and the architectural features into ISA_FLAGS. > +/* Parse the TO_PARSE string and put the architecture that it > + selects into RES_ARCH and the architectural features into RES_FLAGS. > Return an aarch_parse_opt_result describing the parse result. > - If there is an error parsing, RES and ISA_FLAGS are left unchanged. > + If there is an error parsing, RES_ARCH and RES_FLAGS are left unchanged. > When the TO_PARSE string contains an invalid extension, > a copy of the string is created and stored to INVALID_EXTENSION. */ > > static enum aarch_parse_opt_result > -aarch64_parse_arch (const char *to_parse, const struct processor **res, > - aarch64_feature_flags *isa_flags, > +aarch64_parse_arch (const char *to_parse, aarch64_arch *res_arch, > + aarch64_feature_flags *res_flags, > std::string *invalid_extension) > { > const char *ext; > @@ -18250,21 +18250,21 @@ aarch64_parse_arch (const char *to_parse, const > struct processor **res, > if (strlen (arch->name) == len > && strncmp (arch->name, to_parse, len) == 0) > { > - auto isa_temp = arch->flags; > + auto isa_flags = arch->flags; > > if (ext != NULL) > { > /* TO_PARSE string contains at least one extension. */ > enum aarch_parse_opt_result ext_res > - = aarch64_parse_extension (ext, &isa_temp, invalid_extension); > + = aarch64_parse_extension (ext, &isa_flags, invalid_extension); > > if (ext_res != AARCH_PARSE_OK) > return ext_res; > } > /* Extension parsing was successful. Confirm the result > arch and ISA flags. */ > - *res = arch; > - *isa_flags = isa_temp; > + *res_arch = arch->arch; > + *res_flags = isa_flags; > return AARCH_PARSE_OK; > } > } > @@ -18273,16 +18273,16 @@ aarch64_parse_arch (const char *to_parse, const > struct processor **res, > return AARCH_PARSE_INVALID_ARG; > } > > -/* Parse the TO_PARSE string and put the result tuning in RES and the > - architecture flags in ISA_FLAGS. Return an aarch_parse_opt_result > - describing the parse result. If there is an error parsing, RES and > - ISA_FLAGS are left unchanged. > +/* Parse the TO_PARSE string and put the result tuning in RES_CPU and the > + architecture flags in RES_FLAGS. Return an aarch_parse_opt_result > + describing the parse result. If there is an error parsing, RES_CPU and > + RES_FLAGS are left unchanged. > When the TO_PARSE string contains an invalid extension, > a copy of the string is created and stored to INVALID_EXTENSION. */ > > static enum aarch_parse_opt_result > -aarch64_parse_cpu (const char *to_parse, const struct processor **res, > - aarch64_feature_flags *isa_flags, > +aarch64_parse_cpu (const char *to_parse, aarch64_cpu *res_cpu, > + aarch64_feature_flags *res_flags, > std::string *invalid_extension) > { > const char *ext; > @@ -18305,21 +18305,21 @@ aarch64_parse_cpu (const char *to_parse, const > struct processor **res, > { > if (strlen (cpu->name) == len && strncmp (cpu->name, to_parse, len) == > 0) > { > - auto isa_temp = cpu->flags; > + auto isa_flags = cpu->flags; > > if (ext != NULL) > { > /* TO_PARSE string contains at least one extension. */ > enum aarch_parse_opt_result ext_res > - = aarch64_parse_extension (ext, &isa_temp, invalid_extension); > + = aarch64_parse_extension (ext, &isa_flags, invalid_extension); > > if (ext_res != AARCH_PARSE_OK) > return ext_res; > } > /* Extension parsing was successfull. Confirm the result > cpu and ISA flags. */ > - *res = cpu; > - *isa_flags = isa_temp; > + *res_cpu = cpu->ident; > + *res_flags = isa_flags; > return AARCH_PARSE_OK; > } > } > @@ -18328,12 +18328,12 @@ aarch64_parse_cpu (const char *to_parse, const > struct processor **res, > return AARCH_PARSE_INVALID_ARG; > } > > -/* Parse the TO_PARSE string and put the cpu it selects into RES. > +/* Parse the TO_PARSE string and put the cpu it selects into RES_CPU. > Return an aarch_parse_opt_result describing the parse result. > - If the parsing fails the RES does not change. */ > + If the parsing fails then RES_CPU does not change. */ > > static enum aarch_parse_opt_result > -aarch64_parse_tune (const char *to_parse, const struct processor **res) > +aarch64_parse_tune (const char *to_parse, aarch64_cpu *res_cpu) > { > const struct processor *cpu; > > @@ -18342,7 +18342,7 @@ aarch64_parse_tune (const char *to_parse, const > struct processor **res) > { > if (strcmp (cpu->name, to_parse) == 0) > { > - *res = cpu; > + *res_cpu = cpu->ident; > return AARCH_PARSE_OK; > } > } > @@ -18937,12 +18937,12 @@ aarch64_print_hint_for_arch (const char *str) > that most closely resembles what the user passed in STR. */ > > void > -aarch64_print_hint_for_extensions (const std::string &str) > +aarch64_print_hint_for_extensions (const char *str) > { > auto_vec<const char *> candidates; > aarch64_get_all_extension_candidates (&candidates); > char *s; > - const char *hint = candidates_list_and_hint (str.c_str (), s, candidates); > + const char *hint = candidates_list_and_hint (str, s, candidates); > if (hint) > inform (input_location, "valid arguments are: %s;" > " did you mean %qs?", s, hint); > @@ -18954,16 +18954,16 @@ aarch64_print_hint_for_extensions (const > std::string &str) > > /* Validate a command-line -mcpu option. Parse the cpu and extensions (if > any) > specified in STR and throw errors if appropriate. Put the results if > - they are valid in RES and ISA_FLAGS. Return whether the option is > + they are valid in RES_CPU and RES_FLAGS. Return whether the option is > valid. */ > > static bool > -aarch64_validate_mcpu (const char *str, const struct processor **res, > - aarch64_feature_flags *isa_flags) > +aarch64_validate_mcpu (const char *str, aarch64_cpu *res_cpu, > + aarch64_feature_flags *res_flags) > { > std::string invalid_extension; > enum aarch_parse_opt_result parse_res > - = aarch64_parse_cpu (str, res, isa_flags, &invalid_extension); > + = aarch64_parse_cpu (str, res_cpu, res_flags, &invalid_extension); > > if (parse_res == AARCH_PARSE_OK) > return true; > @@ -18974,19 +18974,24 @@ aarch64_validate_mcpu (const char *str, const > struct processor **res, > error ("missing cpu name in %<-mcpu=%s%>", str); > break; > case AARCH_PARSE_INVALID_ARG: > - error ("unknown value %qs for %<-mcpu%>", str); > - aarch64_print_hint_for_core (str); > - /* A common user error is confusing -march and -mcpu. > - If the -mcpu string matches a known architecture then suggest > - -march=. */ > - parse_res = aarch64_parse_arch (str, res, isa_flags, > &invalid_extension); > - if (parse_res == AARCH_PARSE_OK) > - inform (input_location, "did you mean %<-march=%s%>?", str); > - break; > + { > + error ("unknown value %qs for %<-mcpu%>", str); > + aarch64_print_hint_for_core (str); > + /* A common user error is confusing -march and -mcpu. > + If the -mcpu string matches a known architecture then suggest > + -march=. */ > + aarch64_arch temp_arch; > + aarch64_feature_flags temp_flags; > + parse_res = aarch64_parse_arch (str, &temp_arch, &temp_flags, > + &invalid_extension); > + if (parse_res == AARCH_PARSE_OK) > + inform (input_location, "did you mean %<-march=%s%>?", str); > + break; > + } > case AARCH_PARSE_INVALID_FEATURE: > error ("invalid feature modifier %qs in %<-mcpu=%s%>", > invalid_extension.c_str (), str); > - aarch64_print_hint_for_extensions (invalid_extension); > + aarch64_print_hint_for_extensions (invalid_extension.c_str ()); > break; > default: > gcc_unreachable (); > @@ -19070,16 +19075,16 @@ aarch64_validate_sls_mitigation (const char > *const_str) > > /* Validate a command-line -march option. Parse the arch and extensions > (if any) specified in STR and throw errors if appropriate. Put the > - results, if they are valid, in RES and ISA_FLAGS. Return whether the > + results, if they are valid, in RES_ARCH and RES_FLAGS. Return whether the > option is valid. */ > > static bool > -aarch64_validate_march (const char *str, const struct processor **res, > - aarch64_feature_flags *isa_flags) > +aarch64_validate_march (const char *str, aarch64_arch *res_arch, > + aarch64_feature_flags *res_flags) > { > std::string invalid_extension; > enum aarch_parse_opt_result parse_res > - = aarch64_parse_arch (str, res, isa_flags, &invalid_extension); > + = aarch64_parse_arch (str, res_arch, res_flags, &invalid_extension); > > if (parse_res == AARCH_PARSE_OK) > return true; > @@ -19090,18 +19095,23 @@ aarch64_validate_march (const char *str, const > struct processor **res, > error ("missing arch name in %<-march=%s%>", str); > break; > case AARCH_PARSE_INVALID_ARG: > - error ("unknown value %qs for %<-march%>", str); > - aarch64_print_hint_for_arch (str); > - /* A common user error is confusing -march and -mcpu. > - If the -march string matches a known CPU suggest -mcpu. */ > - parse_res = aarch64_parse_cpu (str, res, isa_flags, &invalid_extension); > - if (parse_res == AARCH_PARSE_OK) > - inform (input_location, "did you mean %<-mcpu=%s%>?", str); > - break; > + { > + error ("unknown value %qs for %<-march%>", str); > + aarch64_print_hint_for_arch (str); > + /* A common user error is confusing -march and -mcpu. > + If the -march string matches a known CPU suggest -mcpu. */ > + aarch64_cpu temp_cpu; > + aarch64_feature_flags temp_flags; > + parse_res = aarch64_parse_cpu (str, &temp_cpu, &temp_flags, > + &invalid_extension); > + if (parse_res == AARCH_PARSE_OK) > + inform (input_location, "did you mean %<-mcpu=%s%>?", str); > + break; > + } > case AARCH_PARSE_INVALID_FEATURE: > error ("invalid feature modifier %qs in %<-march=%s%>", > invalid_extension.c_str (), str); > - aarch64_print_hint_for_extensions (invalid_extension); > + aarch64_print_hint_for_extensions (invalid_extension.c_str ()); > break; > default: > gcc_unreachable (); > @@ -19112,14 +19122,14 @@ aarch64_validate_march (const char *str, const > struct processor **res, > > /* Validate a command-line -mtune option. Parse the cpu > specified in STR and throw errors if appropriate. Put the > - result, if it is valid, in RES. Return whether the option is > + result, if it is valid, in RES_CPU. Return whether the option is > valid. */ > > static bool > -aarch64_validate_mtune (const char *str, const struct processor **res) > +aarch64_validate_mtune (const char *str, aarch64_cpu *res_cpu) > { > enum aarch_parse_opt_result parse_res > - = aarch64_parse_tune (str, res); > + = aarch64_parse_tune (str, res_cpu); > > if (parse_res == AARCH_PARSE_OK) > return true; > @@ -19247,9 +19257,9 @@ aarch64_override_options (void) > aarch64_feature_flags arch_isa = 0; > aarch64_set_asm_isa_flags (0); > > - const struct processor *cpu = NULL; > - const struct processor *arch = NULL; > - const struct processor *tune = NULL; > + aarch64_cpu cpu = aarch64_no_cpu; > + aarch64_arch arch = aarch64_no_arch; > + aarch64_cpu tune = aarch64_no_cpu; > > if (aarch64_harden_sls_string) > aarch64_validate_sls_mitigation (aarch64_harden_sls_string); > @@ -19275,7 +19285,7 @@ aarch64_override_options (void) > SUBTARGET_OVERRIDE_OPTIONS; > #endif > > - if (cpu && arch) > + if (cpu != aarch64_no_cpu && arch != aarch64_no_arch) > { > /* If both -mcpu and -march are specified, warn if they are not > feature compatible. feature compatible means that the inclusion of the > @@ -19293,29 +19303,31 @@ aarch64_override_options (void) > ext_diff.c_str ()); > } > > - selected_arch = arch->arch; > + selected_arch = arch; > aarch64_set_asm_isa_flags (arch_isa | AARCH64_FL_DEFAULT_ISA_MODE); > } > - else if (cpu) > + else if (cpu != aarch64_no_cpu) > { > - selected_arch = cpu->arch; > + selected_arch = aarch64_get_tune_cpu (cpu)->arch; > aarch64_set_asm_isa_flags (cpu_isa | AARCH64_FL_DEFAULT_ISA_MODE); > } > - else if (arch) > + else if (arch != aarch64_no_arch) > { > - cpu = &all_cores[arch->ident]; > - selected_arch = arch->arch; > + cpu = aarch64_get_arch (arch)->ident; > + selected_arch = arch; > aarch64_set_asm_isa_flags (arch_isa | AARCH64_FL_DEFAULT_ISA_MODE); > } > else > { > /* No -mcpu or -march specified, so use the default CPU. */ > - cpu = &all_cores[TARGET_CPU_DEFAULT]; > - selected_arch = cpu->arch; > - aarch64_set_asm_isa_flags (cpu->flags | AARCH64_FL_DEFAULT_ISA_MODE); > + cpu = TARGET_CPU_DEFAULT; > + const processor *cpu_info = aarch64_get_tune_cpu (cpu); > + selected_arch = cpu_info->arch; > + aarch64_set_asm_isa_flags (cpu_info->flags > + | AARCH64_FL_DEFAULT_ISA_MODE); > } > > - selected_tune = tune ? tune->ident : cpu->ident; > + selected_tune = (tune != aarch64_no_cpu) ? tune : cpu; > > if (aarch_enable_bti == 2) > { > @@ -19619,7 +19631,7 @@ struct aarch64_attribute_info > static bool > aarch64_handle_attr_arch (const char *str) > { > - const struct processor *tmp_arch = NULL; > + aarch64_arch tmp_arch = aarch64_no_arch; > std::string invalid_extension; > aarch64_feature_flags tmp_flags; > enum aarch_parse_opt_result parse_res > @@ -19627,8 +19639,8 @@ aarch64_handle_attr_arch (const char *str) > > if (parse_res == AARCH_PARSE_OK) > { > - gcc_assert (tmp_arch); > - selected_arch = tmp_arch->arch; > + gcc_assert (tmp_arch != aarch64_no_arch); > + selected_arch = tmp_arch; > aarch64_set_asm_isa_flags (tmp_flags | (aarch64_asm_isa_flags > & AARCH64_FL_ISA_MODES)); > return true; > @@ -19646,7 +19658,7 @@ aarch64_handle_attr_arch (const char *str) > case AARCH_PARSE_INVALID_FEATURE: > error ("invalid feature modifier %s of value %qs in " > "%<target()%> pragma or attribute", invalid_extension.c_str (), > str); > - aarch64_print_hint_for_extensions (invalid_extension); > + aarch64_print_hint_for_extensions (invalid_extension.c_str ()); > break; > default: > gcc_unreachable (); > @@ -19660,7 +19672,7 @@ aarch64_handle_attr_arch (const char *str) > static bool > aarch64_handle_attr_cpu (const char *str) > { > - const struct processor *tmp_cpu = NULL; > + aarch64_cpu tmp_cpu = aarch64_no_cpu; > std::string invalid_extension; > aarch64_feature_flags tmp_flags; > enum aarch_parse_opt_result parse_res > @@ -19668,9 +19680,9 @@ aarch64_handle_attr_cpu (const char *str) > > if (parse_res == AARCH_PARSE_OK) > { > - gcc_assert (tmp_cpu); > - selected_tune = tmp_cpu->ident; > - selected_arch = tmp_cpu->arch; > + gcc_assert (tmp_cpu != aarch64_no_cpu); > + selected_tune = tmp_cpu; > + selected_arch = aarch64_get_tune_cpu (tmp_cpu)->arch; > aarch64_set_asm_isa_flags (tmp_flags | (aarch64_asm_isa_flags > & AARCH64_FL_ISA_MODES)); > return true; > @@ -19688,7 +19700,7 @@ aarch64_handle_attr_cpu (const char *str) > case AARCH_PARSE_INVALID_FEATURE: > error ("invalid feature modifier %qs of value %qs in " > "%<target()%> pragma or attribute", invalid_extension.c_str (), > str); > - aarch64_print_hint_for_extensions (invalid_extension); > + aarch64_print_hint_for_extensions (invalid_extension.c_str ()); > break; > default: > gcc_unreachable (); > @@ -19711,14 +19723,14 @@ aarch64_handle_attr_branch_protection (const char* > str) > static bool > aarch64_handle_attr_tune (const char *str) > { > - const struct processor *tmp_tune = NULL; > + aarch64_cpu tmp_tune = aarch64_no_cpu; > enum aarch_parse_opt_result parse_res > = aarch64_parse_tune (str, &tmp_tune); > > if (parse_res == AARCH_PARSE_OK) > { > - gcc_assert (tmp_tune); > - selected_tune = tmp_tune->ident; > + gcc_assert (tmp_tune != aarch64_no_cpu); > + selected_tune = tmp_tune; > return true; > } >