Projects
openEuler:24.03:SP1:Everything
gcc
_service:tar_scm:0105-Backport-SME-AArch64-Clea...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0105-Backport-SME-AArch64-Cleanup-option-processing-code.patch of Package gcc
From ba32885874fc6caa90f6ae5e264bc3d51f64a26e Mon Sep 17 00:00:00 2001 From: Wilco Dijkstra <wilco.dijkstra@arm.com> Date: Wed, 1 Jun 2022 16:46:36 +0100 Subject: [PATCH 006/157] [Backport][SME] AArch64: Cleanup option processing code Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=ae54c1b09963779c5c3914782324ff48af32e2f1 Further cleanup option processing. Remove the duplication of global variables for CPU and tune settings so that CPU option processing is simplified even further. Move global variables that need save and restore due to target option processing into aarch64.opt. This removes the need for explicit saving/restoring and unnecessary reparsing of options. gcc/ * config/aarch64/aarch64.opt (explicit_tune_core): Rename to selected_tune. (explicit_arch): Rename to selected_arch. (x_aarch64_override_tune_string): Remove. (aarch64_ra_sign_key): Add as TargetVariable so it gets saved/restored. (aarch64_override_tune_string): Add Save so it gets saved/restored. * config/aarch64/aarch64.h (aarch64_architecture_version): Remove. * config/aarch64/aarch64.cc (aarch64_architecture_version): Remove. (processor): Remove archtecture_version field. (selected_arch): Remove global. (selected_cpu): Remove global. (selected_tune): Remove global. (aarch64_ra_sign_key): Move global to aarch64.opt so it is saved. (aarch64_override_options_internal): Use aarch64_get_tune_cpu. (aarch64_override_options): Further simplify code to only set selected_arch and selected_tune globals. (aarch64_option_save): Remove now that target options are saved. (aarch64_option_restore): Remove redundant target option restores. * config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins): Use AARCH64_ISA_V9. * config/aarch64/aarch64-opts.h (aarch64_key_type): Add, moved from... * config/aarch64/aarch64-protos.h (aarch64_key_type): Remove. (aarch64_ra_sign_key): Remove. --- gcc/config/aarch64/aarch64-c.cc | 2 +- gcc/config/aarch64/aarch64-opts.h | 6 + gcc/config/aarch64/aarch64-protos.h | 8 -- gcc/config/aarch64/aarch64.cc | 183 ++++++++++------------------ gcc/config/aarch64/aarch64.h | 3 - gcc/config/aarch64/aarch64.opt | 12 +- 6 files changed, 76 insertions(+), 138 deletions(-) diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc index a4c407724..90d45e45d 100644 --- a/gcc/config/aarch64/aarch64-c.cc +++ b/gcc/config/aarch64/aarch64-c.cc @@ -82,7 +82,7 @@ aarch64_update_cpp_builtins (cpp_reader *pfile) { aarch64_def_or_undef (flag_unsafe_math_optimizations, "__ARM_FP_FAST", pfile); - builtin_define_with_int_value ("__ARM_ARCH", aarch64_architecture_version); + builtin_define_with_int_value ("__ARM_ARCH", AARCH64_ISA_V9 ? 9 : 8); builtin_define_with_int_value ("__ARM_SIZEOF_MINIMAL_ENUM", flag_short_enums ? 1 : 4); diff --git a/gcc/config/aarch64/aarch64-opts.h b/gcc/config/aarch64/aarch64-opts.h index 93572fe83..421648a15 100644 --- a/gcc/config/aarch64/aarch64-opts.h +++ b/gcc/config/aarch64/aarch64-opts.h @@ -98,4 +98,10 @@ enum stack_protector_guard { SSP_GLOBAL /* global canary */ }; +/* The key type that -msign-return-address should use. */ +enum aarch64_key_type { + AARCH64_KEY_A, + AARCH64_KEY_B +}; + #endif diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 475d174dd..e60ce3c36 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -672,14 +672,6 @@ enum simd_immediate_check { AARCH64_CHECK_MOV = AARCH64_CHECK_ORR | AARCH64_CHECK_BIC }; -/* The key type that -msign-return-address should use. */ -enum aarch64_key_type { - AARCH64_KEY_A, - AARCH64_KEY_B -}; - -extern enum aarch64_key_type aarch64_ra_sign_key; - extern struct tune_params aarch64_tune_params; /* The available SVE predicate patterns, known in the ACLE as "svpattern". */ diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index ba888beb0..254ecfaa2 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -306,9 +306,6 @@ static bool aarch64_print_address_internal (FILE*, machine_mode, rtx, aarch64_addr_query_type); static HOST_WIDE_INT aarch64_clamp_to_uimm12_shift (HOST_WIDE_INT val); -/* Major revision number of the ARM Architecture implemented by the target. */ -unsigned aarch64_architecture_version; - /* The processor for which instructions should be scheduled. */ enum aarch64_processor aarch64_tune = cortexa53; @@ -2931,7 +2928,6 @@ struct processor enum aarch64_processor ident; enum aarch64_processor sched_core; enum aarch64_arch arch; - unsigned architecture_version; const uint64_t flags; const struct tune_params *const tune; }; @@ -2940,9 +2936,9 @@ struct processor static const struct processor all_architectures[] = { #define AARCH64_ARCH(NAME, CORE, ARCH_IDENT, ARCH_REV, FLAGS) \ - {NAME, CORE, CORE, AARCH64_ARCH_##ARCH_IDENT, ARCH_REV, FLAGS, NULL}, + {NAME, CORE, CORE, AARCH64_ARCH_##ARCH_IDENT, FLAGS, NULL}, #include "aarch64-arches.def" - {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, 0, NULL} + {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, NULL} }; /* Processor cores implementing AArch64. */ @@ -2950,23 +2946,13 @@ static const struct processor all_cores[] = { #define AARCH64_CORE(NAME, IDENT, SCHED, ARCH, FLAGS, COSTS, IMP, PART, VARIANT) \ {NAME, IDENT, SCHED, AARCH64_ARCH_##ARCH, \ - all_architectures[AARCH64_ARCH_##ARCH].architecture_version, \ FLAGS, &COSTS##_tunings}, #include "aarch64-cores.def" - {"generic", generic, cortexa53, AARCH64_ARCH_8A, 8, + {"generic", generic, cortexa53, AARCH64_ARCH_8A, AARCH64_FL_FOR_ARCH8, &generic_tunings}, - {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, 0, NULL} + {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, NULL} }; - -/* Target specification. These are populated by the -march, -mtune, -mcpu - handling code or by target attributes. */ -static const struct processor *selected_arch; -static const struct processor *selected_cpu; -static const struct processor *selected_tune; - -enum aarch64_key_type aarch64_ra_sign_key = AARCH64_KEY_A; - /* The current tuning set. */ struct tune_params aarch64_tune_params = generic_tunings; @@ -10633,8 +10619,8 @@ aarch64_case_values_threshold (void) /* Use the specified limit for the number of cases before using jump tables at higher optimization levels. */ if (optimize > 2 - && selected_cpu->tune->max_case_values != 0) - return selected_cpu->tune->max_case_values; + && aarch64_tune_params.max_case_values != 0) + return aarch64_tune_params.max_case_values; else return optimize_size ? 8 : 11; } @@ -17769,6 +17755,26 @@ initialize_aarch64_tls_size (struct gcc_options *opts) return; } +/* Return the CPU corresponding to the enum CPU. */ + +static const struct processor * +aarch64_get_tune_cpu (enum aarch64_processor cpu) +{ + gcc_assert (cpu != aarch64_none); + + return &all_cores[cpu]; +} + +/* Return the architecture corresponding to the enum ARCH. */ + +static const struct processor * +aarch64_get_arch (enum aarch64_arch arch) +{ + gcc_assert (arch != aarch64_no_arch); + + return &all_architectures[arch]; +} + /* Parse STRING looking for options in the format: string :: option:string option :: name=substring @@ -17879,18 +17885,18 @@ aarch64_override_options_after_change_1 (struct gcc_options *opts) void aarch64_override_options_internal (struct gcc_options *opts) { - aarch64_tune_flags = selected_tune->flags; - aarch64_tune = selected_tune->sched_core; + const struct processor *tune = aarch64_get_tune_cpu (opts->x_selected_tune); + aarch64_tune_flags = tune->flags; + aarch64_tune = tune->sched_core; /* Make a copy of the tuning parameters attached to the core, which we may later overwrite. */ - aarch64_tune_params = *(selected_tune->tune); - aarch64_architecture_version = selected_arch->architecture_version; - if (selected_tune->tune == &generic_tunings) + aarch64_tune_params = *(tune->tune); + if (tune->tune == &generic_tunings) aarch64_adjust_generic_arch_tuning (aarch64_tune_params); if (opts->x_aarch64_override_tune_string) aarch64_parse_override_string (opts->x_aarch64_override_tune_string, - &aarch64_tune_params); + &aarch64_tune_params); /* This target defaults to strict volatile bitfields. */ if (opts->x_flag_strict_volatile_bitfields < 0 && abi_version_at_least (2)) @@ -18051,13 +18057,6 @@ aarch64_override_options_internal (struct gcc_options *opts) && opts->x_optimize >= aarch64_tune_params.prefetch->default_opt_level) opts->x_flag_prefetch_loop_arrays = 1; - if (opts->x_aarch64_arch_string == NULL) - opts->x_aarch64_arch_string = selected_arch->name; - if (opts->x_aarch64_cpu_string == NULL) - opts->x_aarch64_cpu_string = selected_cpu->name; - if (opts->x_aarch64_tune_string == NULL) - opts->x_aarch64_tune_string = selected_tune->name; - aarch64_override_options_after_change_1 (opts); } @@ -18409,26 +18408,6 @@ aarch64_validate_mtune (const char *str, const struct processor **res) return false; } -/* Return the CPU corresponding to the enum CPU. */ - -static const struct processor * -aarch64_get_tune_cpu (enum aarch64_processor cpu) -{ - gcc_assert (cpu != aarch64_none); - - return &all_cores[cpu]; -} - -/* Return the architecture corresponding to the enum ARCH. */ - -static const struct processor * -aarch64_get_arch (enum aarch64_arch arch) -{ - gcc_assert (arch != aarch64_no_arch); - - return &all_architectures[arch]; -} - /* Return the VG value associated with -msve-vector-bits= value VALUE. */ static poly_uint16 @@ -18464,9 +18443,9 @@ aarch64_override_options (void) uint64_t arch_isa = 0; aarch64_isa_flags = 0; - selected_cpu = NULL; - selected_arch = NULL; - selected_tune = NULL; + const struct processor *cpu = NULL; + const struct processor *arch = NULL; + const struct processor *tune = NULL; if (aarch64_harden_sls_string) aarch64_validate_sls_mitigation (aarch64_harden_sls_string); @@ -18478,56 +18457,52 @@ aarch64_override_options (void) If either of -march or -mtune is given, they override their respective component of -mcpu. */ if (aarch64_cpu_string) - aarch64_validate_mcpu (aarch64_cpu_string, &selected_cpu, &cpu_isa); + aarch64_validate_mcpu (aarch64_cpu_string, &cpu, &cpu_isa); if (aarch64_arch_string) - aarch64_validate_march (aarch64_arch_string, &selected_arch, &arch_isa); + aarch64_validate_march (aarch64_arch_string, &arch, &arch_isa); if (aarch64_tune_string) - aarch64_validate_mtune (aarch64_tune_string, &selected_tune); + aarch64_validate_mtune (aarch64_tune_string, &tune); #ifdef SUBTARGET_OVERRIDE_OPTIONS SUBTARGET_OVERRIDE_OPTIONS; #endif - if (selected_cpu && selected_arch) + if (cpu && arch) { /* If both -mcpu and -march are specified, warn if they are not architecturally compatible and prefer the -march ISA flags. */ - if (selected_arch->arch != selected_cpu->arch) + if (arch->arch != cpu->arch) { warning (0, "switch %<-mcpu=%s%> conflicts with %<-march=%s%> switch", aarch64_cpu_string, aarch64_arch_string); } + selected_arch = arch->arch; aarch64_isa_flags = arch_isa; } - else if (selected_cpu) + else if (cpu) { - selected_arch = &all_architectures[selected_cpu->arch]; + selected_arch = cpu->arch; aarch64_isa_flags = cpu_isa; } - else if (selected_arch) + else if (arch) { - selected_cpu = &all_cores[selected_arch->ident]; + cpu = &all_cores[arch->ident]; + selected_arch = arch->arch; aarch64_isa_flags = arch_isa; } else { /* No -mcpu or -march specified, so use the default CPU. */ - selected_cpu = &all_cores[TARGET_CPU_DEFAULT]; - selected_arch = &all_architectures[selected_cpu->arch]; - aarch64_isa_flags = selected_cpu->flags; + cpu = &all_cores[TARGET_CPU_DEFAULT]; + selected_arch = cpu->arch; + aarch64_isa_flags = cpu->flags; } - explicit_arch = selected_arch->arch; - if (!selected_tune) - selected_tune = selected_cpu; - explicit_tune_core = selected_tune->ident; - - gcc_assert (explicit_tune_core != aarch64_none); - gcc_assert (explicit_arch != aarch64_no_arch); + selected_tune = tune ? tune->ident : cpu->ident; if (aarch64_enable_bti == 2) { @@ -18646,38 +18621,14 @@ initialize_aarch64_code_model (struct gcc_options *opts) } } -/* Implement TARGET_OPTION_SAVE. */ - -static void -aarch64_option_save (struct cl_target_option *ptr, struct gcc_options *opts, - struct gcc_options */* opts_set */) -{ - ptr->x_aarch64_override_tune_string = opts->x_aarch64_override_tune_string; - ptr->x_aarch64_branch_protection_string - = opts->x_aarch64_branch_protection_string; -} - /* Implements TARGET_OPTION_RESTORE. Restore the backend codegen decisions using the information saved in PTR. */ static void aarch64_option_restore (struct gcc_options *opts, - struct gcc_options */* opts_set */, - struct cl_target_option *ptr) + struct gcc_options * /* opts_set */, + struct cl_target_option * /* ptr */) { - opts->x_explicit_arch = ptr->x_explicit_arch; - selected_arch = aarch64_get_arch (ptr->x_explicit_arch); - opts->x_explicit_tune_core = ptr->x_explicit_tune_core; - selected_tune = aarch64_get_tune_cpu (ptr->x_explicit_tune_core); - opts->x_aarch64_override_tune_string = ptr->x_aarch64_override_tune_string; - opts->x_aarch64_branch_protection_string - = ptr->x_aarch64_branch_protection_string; - if (opts->x_aarch64_branch_protection_string) - { - aarch64_parse_branch_protection (opts->x_aarch64_branch_protection_string, - NULL); - } - aarch64_override_options_internal (opts); } @@ -18687,11 +18638,11 @@ static void aarch64_option_print (FILE *file, int indent, struct cl_target_option *ptr) { const struct processor *cpu - = aarch64_get_tune_cpu (ptr->x_explicit_tune_core); - uint64_t isa_flags = ptr->x_aarch64_isa_flags; - const struct processor *arch = aarch64_get_arch (ptr->x_explicit_arch); + = aarch64_get_tune_cpu (ptr->x_selected_tune); + const struct processor *arch = aarch64_get_arch (ptr->x_selected_arch); std::string extension - = aarch64_get_extension_string_for_isa_flags (isa_flags, arch->flags); + = aarch64_get_extension_string_for_isa_flags (ptr->x_aarch64_isa_flags, + arch->flags); fprintf (file, "%*sselected tune = %s\n", indent, "", cpu->name); fprintf (file, "%*sselected arch = %s%s\n", indent, "", @@ -18804,8 +18755,7 @@ aarch64_handle_attr_arch (const char *str) if (parse_res == AARCH64_PARSE_OK) { gcc_assert (tmp_arch); - selected_arch = tmp_arch; - explicit_arch = selected_arch->arch; + selected_arch = tmp_arch->arch; return true; } @@ -18843,11 +18793,8 @@ aarch64_handle_attr_cpu (const char *str) if (parse_res == AARCH64_PARSE_OK) { gcc_assert (tmp_cpu); - selected_tune = tmp_cpu; - explicit_tune_core = selected_tune->ident; - - selected_arch = &all_architectures[tmp_cpu->arch]; - explicit_arch = selected_arch->arch; + selected_tune = tmp_cpu->ident; + selected_arch = tmp_cpu->arch; return true; } @@ -18915,8 +18862,7 @@ aarch64_handle_attr_tune (const char *str) if (parse_res == AARCH64_PARSE_OK) { gcc_assert (tmp_tune); - selected_tune = tmp_tune; - explicit_tune_core = selected_tune->ident; + selected_tune = tmp_tune->ident; return true; } @@ -22821,7 +22767,7 @@ aarch64_declare_function_name (FILE *stream, const char* name, gcc_assert (targ_options); const struct processor *this_arch - = aarch64_get_arch (targ_options->x_explicit_arch); + = aarch64_get_arch (targ_options->x_selected_arch); uint64_t isa_flags = targ_options->x_aarch64_isa_flags; std::string extension @@ -22840,7 +22786,7 @@ aarch64_declare_function_name (FILE *stream, const char* name, useful to readers of the generated asm. Do it only when it changes from function to function and verbose assembly is requested. */ const struct processor *this_tune - = aarch64_get_tune_cpu (targ_options->x_explicit_tune_core); + = aarch64_get_tune_cpu (targ_options->x_selected_tune); if (flag_debug_asm && aarch64_last_printed_tune_string != this_tune->name) { @@ -22952,7 +22898,7 @@ aarch64_start_file (void) = TREE_TARGET_OPTION (target_option_default_node); const struct processor *default_arch - = aarch64_get_arch (default_options->x_explicit_arch); + = aarch64_get_arch (default_options->x_selected_arch); uint64_t default_isa_flags = default_options->x_aarch64_isa_flags; std::string extension = aarch64_get_extension_string_for_isa_flags (default_isa_flags, @@ -27950,9 +27896,6 @@ aarch64_libgcc_floating_mode_supported_p #undef TARGET_OFFLOAD_OPTIONS #define TARGET_OFFLOAD_OPTIONS aarch64_offload_options -#undef TARGET_OPTION_SAVE -#define TARGET_OPTION_SAVE aarch64_option_save - #undef TARGET_OPTION_RESTORE #define TARGET_OPTION_RESTORE aarch64_option_restore diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index 14e2af054..7d73689e4 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -144,9 +144,6 @@ #define PCC_BITFIELD_TYPE_MATTERS 1 -/* Major revision number of the ARM Architecture implemented by the target. */ -extern unsigned aarch64_architecture_version; - /* Instruction tuning/selection flags. */ /* Bit values used to identify processor capabilities. */ diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt index 101664c7c..836a3c784 100644 --- a/gcc/config/aarch64/aarch64.opt +++ b/gcc/config/aarch64/aarch64.opt @@ -22,13 +22,10 @@ HeaderInclude config/aarch64/aarch64-opts.h TargetVariable -enum aarch64_processor explicit_tune_core = aarch64_none +enum aarch64_processor selected_tune = aarch64_none TargetVariable -enum aarch64_arch explicit_arch = aarch64_no_arch - -TargetSave -const char *x_aarch64_override_tune_string +enum aarch64_arch selected_arch = aarch64_no_arch TargetVariable uint64_t aarch64_isa_flags = 0 @@ -36,6 +33,9 @@ uint64_t aarch64_isa_flags = 0 TargetVariable unsigned aarch64_enable_bti = 2 +TargetVariable +enum aarch64_key_type aarch64_ra_sign_key = AARCH64_KEY_A + ; The TLS dialect names to use with -mtls-dialect. Enum @@ -139,7 +139,7 @@ Target RejectNegative Joined Enum(aarch64_abi) Var(aarch64_abi) Init(AARCH64_ABI Generate code that conforms to the specified ABI. moverride= -Target RejectNegative ToLower Joined Var(aarch64_override_tune_string) +Target RejectNegative ToLower Joined Var(aarch64_override_tune_string) Save -moverride=<string> Power users only! Override CPU optimization parameters. Enum -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2