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

Reply via email to