https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119625

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think
--- gcc/lto-opts.cc.jj  2025-01-02 11:23:09.939608681 +0100
+++ gcc/lto-opts.cc     2025-04-04 15:02:17.881941293 +0200
@@ -96,17 +96,17 @@ lto_write_options (void)

   if (!OPTION_SET_P (flag_cf_protection))
     {
-      append_to_collect_gcc_options (
-       &temporary_obstack, &first_p,
-       global_options.x_flag_cf_protection == CF_NONE
-       ? "-fcf-protection=none"
-       : global_options.x_flag_cf_protection == CF_FULL
-       ? "-fcf-protection=full"
-       : global_options.x_flag_cf_protection == CF_BRANCH
-       ? "-fcf-protection=branch"
-       : global_options.x_flag_cf_protection == CF_RETURN
-       ? "-fcf-protection=return"
-       : "");
+      const char *cf_protection = NULL;
+      switch (global_options.x_flag_cf_protection)
+       {
+       case CF_NONE: cf_protection = "-fcf-protection=none"; break;
+       case CF_FULL: cf_protection = "-fcf-protection=full"; break;
+       case CF_BRANCH: cf_protection = "-fcf-protection=branch"; break;
+       case CF_RETURN: cf_protection = "-fcf-protection=return"; break;
+       }
+      if (cf_protection)
+       append_to_collect_gcc_options (&temporary_obstack, &first_p,
+                                      cf_protection);
     }

   /* If debug info is enabled append -g.  */
would fix this but whether it fixes also the propagation of "" into the @ file,
I have no idea.  With -fhardened flag_cf_protection is CF_FULL | CF_SET,
CF_FULL set by -fhardened handling and CF_SET by the i386 backend:
      opts->x_flag_cf_protection
      = (cf_protection_level) (opts->x_flag_cf_protection | CF_SET);
Now, whether lto-opts.cc should also switch
(global_options.x_flag_cf_protection & ~CF_SET), I have no idea.
Note,
       append_to_collect_gcc_options (&temporary_obstack, &first_p,
                                      global_options.x_flag_pic == 2
                                      ? "-fPIC"
                                      : global_options.x_flag_pic == 1
                                      ? "-fpic"
                                      : global_options.x_flag_pie == 2
                                      ? "-fPIE"
                                      : global_options.x_flag_pie == 1
                                      ? "-fpie"
                                      : "-fno-pie");
is also weird.  Because I get -fPIC even when I haven't specified that, I've
used -fhardened which implies in this case -fPIE.  But for -fPIE, both flag_pic
and flag_pie are equal to 2.  So IMHO we should test for flag_pie first before
flag_pic.

Reply via email to