AArch64: Cleanup option processing code

Message ID DB6PR0801MB18793CAACBA575026C6F9A6883D69@DB6PR0801MB1879.eurprd08.prod.outlook.com
State New
Headers
Series AArch64: Cleanup option processing code |

Commit Message

Wilco Dijkstra May 25, 2022, 4:18 p.m. UTC
  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?

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.

---
  

Comments

Richard Sandiford May 26, 2022, 4:01 p.m. UTC | #1
Wilco Dijkstra <Wilco.Dijkstra@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
  

Patch

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