https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110812
--- Comment #9 from Palmer Dabbelt <palmer at gcc dot gnu.org> --- Which means we just need something like this? diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 38f3ae7cd84..5ed6c54ff1c 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -10868,14 +10868,75 @@ riscv_save_restore_target_globals (tree new_tree) TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts (); } +/* Implements TARGET_OPTION_SAVE. Restore the backend codegen decisions + using the information saved in PTR. */ + +static void +riscv_option_save (struct cl_target_option *ptr, + struct gcc_options * /* opts_set */, + struct gcc_options *opts) +{ + ptr->x_target_flags = opts->x_target_flags; + ptr->x_riscv_stack_protector_guard_reg = opts->x_riscv_stack_protector_guard_reg; + ptr->x_riscv_stack_protector_guard_offset = opts->x_riscv_stack_protector_guard_offset; + ptr->x_riscv_zi_subext = opts->x_riscv_zi_subext; + ptr->x_riscv_za_subext = opts->x_riscv_za_subext; + ptr->x_riscv_zb_subext = opts->x_riscv_zb_subext; + ptr->x_riscv_zinx_subext = opts->x_riscv_zinx_subext; + ptr->x_riscv_zk_subext = opts->x_riscv_zk_subext; + ptr->x_riscv_vector_elen_flags = opts->x_riscv_vector_elen_flags; + ptr->x_riscv_zvl_flags = opts->x_riscv_zvl_flags; + ptr->x_riscv_zvb_subext = opts->x_riscv_zvb_subext; + ptr->x_riscv_zvk_subext = opts->x_riscv_zvk_subext; + ptr->x_riscv_zicmo_subext = opts->x_riscv_zicmo_subext; + ptr->x_riscv_mop_subext = opts->x_riscv_mop_subext; + ptr->x_riscv_zf_subext = opts->x_riscv_zf_subext; + ptr->x_riscv_zfa_subext = opts->x_riscv_zfa_subext; + ptr->x_riscv_zm_subext = opts->x_riscv_zm_subext; + ptr->x_riscv_zc_subext = opts->x_riscv_zc_subext; + ptr->x_riscv_sv_subext = opts->x_riscv_sv_subext; + ptr->x_riscv_ztso_subext = opts->x_riscv_ztso_subext; + ptr->x_riscv_xcv_subext = opts->x_riscv_xcv_subext; + ptr->x_riscv_xthead_subext = opts->x_riscv_xthead_subext; + ptr->x_riscv_xventana_subext = opts->x_riscv_xventana_subext; + ptr->x_riscv_sifive_subext = opts->x_riscv_sifive_subext; + ptr->x_riscv_fmv_priority = opts->x_riscv_fmv_priority; + +} + /* Implements TARGET_OPTION_RESTORE. Restore the backend codegen decisions using the information saved in PTR. */ static void riscv_option_restore (struct gcc_options *opts, struct gcc_options * /* opts_set */, - struct cl_target_option * /* ptr */) -{ + struct cl_target_option *ptr) +{ + opts->x_target_flags = ptr->x_target_flags; + opts->x_riscv_stack_protector_guard_reg = ptr->x_riscv_stack_protector_guard_reg; + opts->x_riscv_stack_protector_guard_offset = ptr->x_riscv_stack_protector_guard_offset; + opts->x_riscv_zi_subext = ptr->x_riscv_zi_subext; + opts->x_riscv_za_subext = ptr->x_riscv_za_subext; + opts->x_riscv_zb_subext = ptr->x_riscv_zb_subext; + opts->x_riscv_zinx_subext = ptr->x_riscv_zinx_subext; + opts->x_riscv_zk_subext = ptr->x_riscv_zk_subext; + opts->x_riscv_vector_elen_flags = ptr->x_riscv_vector_elen_flags; + opts->x_riscv_zvl_flags = ptr->x_riscv_zvl_flags; + opts->x_riscv_zvb_subext = ptr->x_riscv_zvb_subext; + opts->x_riscv_zvk_subext = ptr->x_riscv_zvk_subext; + opts->x_riscv_zicmo_subext = ptr->x_riscv_zicmo_subext; + opts->x_riscv_mop_subext = ptr->x_riscv_mop_subext; + opts->x_riscv_zf_subext = ptr->x_riscv_zf_subext; + opts->x_riscv_zfa_subext = ptr->x_riscv_zfa_subext; + opts->x_riscv_zm_subext = ptr->x_riscv_zm_subext; + opts->x_riscv_zc_subext = ptr->x_riscv_zc_subext; + opts->x_riscv_sv_subext = ptr->x_riscv_sv_subext; + opts->x_riscv_ztso_subext = ptr->x_riscv_ztso_subext; + opts->x_riscv_xcv_subext = ptr->x_riscv_xcv_subext; + opts->x_riscv_xthead_subext = ptr->x_riscv_xthead_subext; + opts->x_riscv_xventana_subext = ptr->x_riscv_xventana_subext; + opts->x_riscv_sifive_subext = ptr->x_riscv_sifive_subext; + opts->x_riscv_fmv_priority = ptr->x_riscv_fmv_priority; riscv_override_options_internal (opts); } @@ -14046,6 +14107,9 @@ bool need_shadow_stack_push_pop_p () #undef TARGET_OPTION_OVERRIDE #define TARGET_OPTION_OVERRIDE riscv_option_override +#undef TARGET_OPTION_SAVE +#define TARGET_OPTION_SAVE riscv_option_save + #undef TARGET_OPTION_RESTORE #define TARGET_OPTION_RESTORE riscv_option_restore