Wilco Dijkstra <wilco.dijks...@arm.com> writes: > 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. > > Bootstrap OK, regress pass, OK for commit?
OK, thanks. It looks like this makes the AARCH64_ARCH ARCH_REV parameter redundant, is that right? Richard > 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. > > --- > > diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc > index > 767ee0c763c56a022089a647c7425afb00644644..3d2fb5ec2ef33e66aaa59d216c53a29737262794 > 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 > 93572fe8330218568435f485a366101eb2c58da9..421648a156a02cc1f43660eddc5de38c2f366a72 > 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 > df311812e8d4b87c0ad8692adacedcd79a8e0f64..dabd047d7ba2c532238720d59ecd59f0f5ba822f > 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.h b/gcc/config/aarch64/aarch64.h > index > f835da33b72f36bbf25a0e1328135411bd8ab4f6..80cfe4b740798072ed2a3d08089ff889943f916a > 100644 > --- a/gcc/config/aarch64/aarch64.h > +++ b/gcc/config/aarch64/aarch64.h > @@ -148,9 +148,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.cc b/gcc/config/aarch64/aarch64.cc > index > 060c67a93b95b717563ed063509e3e31c978d891..6bdfd55bcd6308c71fb6cfccb5922b71830c7c4f > 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; > > @@ -2677,7 +2674,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; > }; > @@ -2686,9 +2682,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. */ > @@ -2696,23 +2692,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; > > @@ -10353,8 +10339,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; > } > @@ -17415,6 +17401,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 > @@ -17525,18 +17531,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)) > @@ -17697,13 +17703,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); > } > > @@ -18055,26 +18054,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 > @@ -18110,9 +18089,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); > @@ -18124,56 +18103,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) > { > @@ -18292,38 +18267,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); > } > > @@ -18333,11 +18284,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, "", > @@ -18450,8 +18401,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; > } > > @@ -18489,11 +18439,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; > } > > @@ -18561,8 +18508,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; > } > > @@ -22467,7 +22413,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 > @@ -22486,7 +22432,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) > { > @@ -22572,7 +22518,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, > @@ -27445,9 +27391,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.opt b/gcc/config/aarch64/aarch64.opt > index > 92220b26ee2bf9f95c9a387c3155779596ee5ad5..d8e1f42a3a683c6d2cb7d930a41ec2e0415e2bf1 > 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