diff options
author | Andrew Carlotti <andrew.carlotti@arm.com> | 2025-01-08 23:52:01 +0000 |
---|---|---|
committer | Andrew Carlotti <andrew.carlotti@arm.com> | 2025-01-24 19:01:05 +0000 |
commit | 1ba5027ebfe96b507d32f884a0ee8064cbbbc15d (patch) | |
tree | 2b519de691f20b06fd7137bb82af391989d5404d /gcc/config/aarch64 | |
parent | 5a674214b9fe96db4c1a033c585e40cd97592d5b (diff) | |
download | gcc-1ba5027ebfe96b507d32f884a0ee8064cbbbc15d.zip gcc-1ba5027ebfe96b507d32f884a0ee8064cbbbc15d.tar.gz gcc-1ba5027ebfe96b507d32f884a0ee8064cbbbc15d.tar.bz2 |
aarch64: Adjust option parsing parameter types.
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.
Diffstat (limited to 'gcc/config/aarch64')
-rw-r--r-- | gcc/config/aarch64/aarch64.cc | 174 |
1 files changed, 93 insertions, 81 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 4d3b28b..56c9f66 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -18224,16 +18224,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; @@ -18257,21 +18257,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; } } @@ -18280,16 +18280,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; @@ -18312,21 +18312,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; } } @@ -18335,12 +18335,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; @@ -18349,7 +18349,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; } } @@ -18944,12 +18944,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); @@ -18961,16 +18961,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; @@ -18981,19 +18981,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 (); @@ -19077,16 +19082,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; @@ -19097,18 +19102,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 (); @@ -19119,14 +19129,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; @@ -19254,9 +19264,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); @@ -19282,7 +19292,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 @@ -19300,29 +19310,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) { @@ -19628,7 +19640,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 @@ -19636,8 +19648,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; @@ -19655,7 +19667,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 (); @@ -19669,7 +19681,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 @@ -19677,9 +19689,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; @@ -19697,7 +19709,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 (); @@ -19720,14 +19732,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; } |