On February 10, 2019 11:48:01 AM GMT+01:00, Jan Hubicka <hubi...@ucw.cz> wrote:
>> 
>> This caused:
>> 
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89272
>
>My apologizes for that. Fixed by the attached patch. This is about ICE
>with -fno-lto-odr-type-merging which is option I think we should drop
>(probably next stage1 but if it shows to cause troubles, I would not be
>against dropping it from gcc 9)
>
>It is not useful and only leads to code duplication.
>
>lto-bootstrapped/regtested x86_64-linux, comitted.

Looks like you attached the wrong patch. BTW, the option is new, right? If it 
is and it serves no purpose please remove it now. 

Richard. 

>Honza
>
>Index: ChangeLog
>===================================================================
>--- ChangeLog  (revision 267609)
>+++ ChangeLog  (working copy)
>@@ -1,4 +1,14 @@
>+2019-01-03  Jan Hubicka  <hubi...@ucw.cz>
>+      Backport from mainline
>+      2018-08-29  Jan Hubicka  <j...@suse.cz>
>+
>+      PR lto/86517
>+      PR lto/88185
>+      * lto-opts.c (lto_write_options): Always stream PIC/PIE mode.
>+      * lto-wrapper.c (merge_and_complain): Fix merging of PIC/PIE.
>+
> 2019-01-04  Aaron Sawdey  <acsaw...@linux.ibm.com>
>+
>       Backport from mainline
>       2018-11-28  Aaron Sawdey  <acsaw...@linux.ibm.com>
> 
>Index: lto-opts.c
>===================================================================
>--- lto-opts.c (revision 267609)
>+++ lto-opts.c (working copy)
>@@ -78,6 +78,21 @@ lto_write_options (void)
>       && !global_options.x_flag_openacc)
>     append_to_collect_gcc_options (&temporary_obstack, &first_p,
>                                  "-fno-openacc");
>+  /* Append PIC/PIE mode because its default depends on target and it
>is
>+     subject of merging in lto-wrapper.  */
>+  if (!global_options_set.x_flag_pic &&
>!global_options_set.x_flag_pie)
>+    {
>+       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");
>+    }
> 
>/* Append options from target hook and store them to offload_lto
>section.  */
>   if (lto_stream_offload_p)
>Index: lto-wrapper.c
>===================================================================
>--- lto-wrapper.c      (revision 267609)
>+++ lto-wrapper.c      (working copy)
>@@ -408,6 +408,11 @@ merge_and_complain (struct cl_decoded_op
>It is a common mistake to mix few -fPIC compiled objects into otherwise
>      non-PIC code.  We do not want to build everything with PIC then.
> 
>+     Similarly we merge PIE options, however in addition we keep
>+      -fPIC + -fPIE = -fPIE
>+      -fpic + -fPIE = -fpie
>+      -fPIC/-fpic + -fpie = -fpie
>+
>    It would be good to warn on mismatches, but it is bit hard to do as
>      we do not know what nothing translates to.  */
>     
>@@ -415,11 +420,38 @@ merge_and_complain (struct cl_decoded_op
>     if ((*decoded_options)[j].opt_index == OPT_fPIC
>         || (*decoded_options)[j].opt_index == OPT_fpic)
>       {
>-      if (!pic_option
>-          || (pic_option->value > 0) != ((*decoded_options)[j].value > 0))
>-        remove_option (decoded_options, j, decoded_options_count);
>-      else if (pic_option->opt_index == OPT_fPIC
>-               && (*decoded_options)[j].opt_index == OPT_fpic)
>+      /* -fno-pic in one unit implies -fno-pic everywhere.  */
>+      if ((*decoded_options)[j].value == 0)
>+        j++;
>+      /* If we have no pic option or merge in -fno-pic, we still may turn
>+         existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present.  */
>+      else if ((pic_option && pic_option->value == 0)
>+               || !pic_option)
>+        {
>+          if (pie_option)
>+            {
>+              bool big = (*decoded_options)[j].opt_index == OPT_fPIC
>+                         && pie_option->opt_index == OPT_fPIE;
>+              (*decoded_options)[j].opt_index = big ? OPT_fPIE : OPT_fpie;
>+              if (pie_option->value)
>+                (*decoded_options)[j].canonical_option[0] = big ? "-fPIE" :
>"-fpie";
>+              else
>+                (*decoded_options)[j].canonical_option[0] = big ?
>"-fno-pie" : "-fno-pie";
>+              (*decoded_options)[j].value = pie_option->value;
>+              j++;
>+            }
>+          else if (pic_option)
>+            {
>+              (*decoded_options)[j] = *pic_option;
>+              j++;
>+            }
>+          /* We do not know if target defaults to pic or not, so just
>remove
>+             option if it is missing in one unit but enabled in other.  */
>+          else
>+            remove_option (decoded_options, j, decoded_options_count);
>+        }
>+      else if (pic_option->opt_index == OPT_fpic
>+               && (*decoded_options)[j].opt_index == OPT_fPIC)
>         {
>           (*decoded_options)[j] = *pic_option;
>           j++;
>@@ -430,11 +462,42 @@ merge_and_complain (struct cl_decoded_op
>    else if ((*decoded_options)[j].opt_index == OPT_fPIE
>             || (*decoded_options)[j].opt_index == OPT_fpie)
>       {
>-      if (!pie_option
>-          || pie_option->value != (*decoded_options)[j].value)
>-        remove_option (decoded_options, j, decoded_options_count);
>-      else if (pie_option->opt_index == OPT_fPIE
>-               && (*decoded_options)[j].opt_index == OPT_fpie)
>+      /* -fno-pie in one unit implies -fno-pie everywhere.  */
>+      if ((*decoded_options)[j].value == 0)
>+        j++;
>+      /* If we have no pie option or merge in -fno-pie, we still preserve
>+         PIE/pie if pic/PIC is present.  */
>+      else if ((pie_option && pie_option->value == 0)
>+               || !pie_option)
>+        {
>+          /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie.  */
>+          if (pic_option)
>+            {
>+              if (pic_option->opt_index == OPT_fpic
>+                  && (*decoded_options)[j].opt_index == OPT_fPIE)
>+                {
>+                  (*decoded_options)[j].opt_index = OPT_fpie;
>+                  (*decoded_options)[j].canonical_option[0]
>+                       = pic_option->value ? "-fpie" : "-fno-pie";
>+                }
>+              else if (!pic_option->value)
>+                (*decoded_options)[j].canonical_option[0] = "-fno-pie";
>+              (*decoded_options)[j].value = pic_option->value;
>+              j++;
>+            }
>+          else if (pie_option)
>+            {
>+              (*decoded_options)[j] = *pie_option;
>+              j++;
>+            }
>+          /* Because we always append pic/PIE options this code path should
>+             not happen unless the LTO object was built by old lto1 which
>+             did not contain that logic yet.  */
>+          else
>+            remove_option (decoded_options, j, decoded_options_count);
>+        }
>+      else if (pie_option->opt_index == OPT_fpie
>+               && (*decoded_options)[j].opt_index == OPT_fPIE)
>         {
>           (*decoded_options)[j] = *pie_option;
>           j++;

Reply via email to