On Fri, Jan 09, 2015 at 12:07:26PM +0100, Thomas Schwinge wrote:
> On Thu, 8 Jan 2015 15:11:49 +0100, Jakub Jelinek <ja...@redhat.com> wrote:
> > On Thu, Nov 20, 2014 at 01:27:08PM +0100, Bernd Schmidt wrote:
> > > On 11/13/2014 05:06 AM, Jan Hubicka wrote:
> > > >this patch adds infrastructure for proper streaming and merging of
> > > >TREE_TARGET_OPTION.
> > > 
> > > This breaks the offloading path via LTO since it introduces an
> > > incompatibility in LTO format between host and offload machine.
> > > 
> > > A very quick patch to fix it is below - the OpenACC testcase I was using
> > > seems to be working again with this. Thoughts, suggestions?
> > 
> > I actually think
> 
> Thanks for picking up this issue!

Richard said on IRC he doesn't like the string comparisons, so here is
untested modification of the patch.  If it looks good, I'll test it today:

2015-01-09  Bernd Schmidt  <ber...@codesourcery.com>
            Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/64412
        * lto-streamer.h (lto_stream_offload_p): New declaration.
        * lto-streamer.c (lto_stream_offload_p): New variable.
        * cgraphunit.c (ipa_passes): Set lto_stream_offload_p
        at the same time as section_name_prefix.
        * lto-streamer-out.c (hash_tree): Don't hash TREE_TARGET_OPTION
        if lto_stream_offload_p.
        * tree-streamer-out.c (streamer_pack_tree_bitfields): Don't
        stream TREE_TARGET_OPTION if lto_stream_offload_p.
        (write_ts_function_decl_tree_pointers): Don't
        stream DECL_FUNCTION_SPECIFIC_TARGET if lto_stream_offload_p.
        * tree-streamer-in.c (unpack_value_fields): Don't stream
        TREE_TARGET_OPTION in if ACCEL_COMPILER.
        (lto_input_ts_function_decl_tree_pointers): Don't stream
        DECL_FUNCTION_SPECIFIC_TARGET in if ACCEL_COMPILER.
        * lto-opts.c (lto_write_options): Use lto_stream_offload_p
        instead of section_name_prefix string comparisons.
lto/
        * lto.c (read_cgraph_and_symbols): Set lto_stream_offload_p
        if ACCEL_COMPILER.

--- gcc/lto-streamer.h.jj       2015-01-05 13:07:13.000000000 +0100
+++ gcc/lto-streamer.h  2015-01-09 12:18:26.199842482 +0100
@@ -744,6 +744,10 @@ extern void lto_append_block (struct lto
 
 
 /* In lto-streamer.c.  */
+
+/* Set when streaming LTO for offloading compiler.  */
+extern bool lto_stream_offload_p;
+
 extern const char *lto_tag_name (enum LTO_tags);
 extern bitmap lto_bitmap_alloc (void);
 extern void lto_bitmap_free (bitmap);
--- gcc/lto-streamer.c.jj       2015-01-05 13:07:13.000000000 +0100
+++ gcc/lto-streamer.c  2015-01-09 12:16:04.909269917 +0100
@@ -61,6 +61,8 @@ static bitmap_obstack lto_obstack;
 static bool lto_obstack_initialized;
 
 const char *section_name_prefix = LTO_SECTION_NAME_PREFIX;
+/* Set when streaming LTO for offloading compiler.  */
+bool lto_stream_offload_p;
 
 /* Return a string representing LTO tag TAG.  */
 
--- gcc/cgraphunit.c.jj 2015-01-09 12:01:33.000000000 +0100
+++ gcc/cgraphunit.c    2015-01-09 12:22:27.742692667 +0100
@@ -2108,11 +2108,14 @@ ipa_passes (void)
       if (g->have_offload)
        {
          section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
+         lto_stream_offload_p = true;
          ipa_write_summaries (true);
+         lto_stream_offload_p = false;
        }
       if (flag_lto)
        {
          section_name_prefix = LTO_SECTION_NAME_PREFIX;
+         lto_stream_offload_p = false;
          ipa_write_summaries (false);
        }
     }
--- gcc/lto-streamer-out.c.jj   2015-01-08 18:10:23.633598629 +0100
+++ gcc/lto-streamer-out.c      2015-01-09 12:14:41.017711211 +0100
@@ -944,7 +944,9 @@ hash_tree (struct streamer_tree_cache_d
     hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
                        strlen (TRANSLATION_UNIT_LANGUAGE (t)));
 
-  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
+  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
+      /* We don't stream these when passing things to a different target.  */
+      && !lto_stream_offload_p)
     hstate.add_wide_int (cl_target_option_hash (TREE_TARGET_OPTION (t)));
 
   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
--- gcc/tree-streamer-out.c.jj  2015-01-08 18:10:23.631598663 +0100
+++ gcc/tree-streamer-out.c     2015-01-09 12:14:41.018711194 +0100
@@ -472,7 +472,9 @@ streamer_pack_tree_bitfields (struct out
   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
     bp_pack_var_len_unsigned (bp, CONSTRUCTOR_NELTS (expr));
 
-  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
+  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
+      /* Don't stream these when passing things to a different target.  */
+      && !lto_stream_offload_p)
     cl_target_option_stream_out (ob, bp, TREE_TARGET_OPTION (expr));
 
   if (code == OMP_CLAUSE)
@@ -687,7 +689,9 @@ write_ts_function_decl_tree_pointers (st
   stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
-  stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
+  /* Don't stream these when passing things to a different target.  */
+  if (!lto_stream_offload_p)
+    stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
   stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
 }
 
--- gcc/tree-streamer-in.c.jj   2015-01-08 18:10:23.561599843 +0100
+++ gcc/tree-streamer-in.c      2015-01-09 12:14:41.017711211 +0100
@@ -520,8 +520,10 @@ unpack_value_fields (struct data_in *dat
        vec_safe_grow (CONSTRUCTOR_ELTS (expr), length);
     }
 
+#ifndef ACCEL_COMPILER
   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
     cl_target_option_stream_in (data_in, bp, TREE_TARGET_OPTION (expr));
+#endif
 
   if (code == OMP_CLAUSE)
     unpack_ts_omp_clause_value_fields (data_in, bp, expr);
@@ -785,7 +787,9 @@ lto_input_ts_function_decl_tree_pointers
   DECL_VINDEX (expr) = stream_read_tree (ib, data_in);
   /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body.  */
   DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in);
+#ifndef ACCEL_COMPILER
   DECL_FUNCTION_SPECIFIC_TARGET (expr) = stream_read_tree (ib, data_in);
+#endif
   DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, data_in);
 
   /* If the file contains a function with an EH personality set,
--- gcc/lto-opts.c.jj   2015-01-05 13:07:12.000000000 +0100
+++ gcc/lto-opts.c      2015-01-09 12:21:04.203127914 +0100
@@ -160,7 +160,7 @@ lto_write_options (void)
                               "-fno-strict-overflow");
 
   /* Append options from target hook and store them to offload_lto section.  */
-  if (strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) == 0)
+  if (lto_stream_offload_p)
     {
       char *offload_opts = targetm.offload_options ();
       char *offload_ptr = offload_opts;
@@ -201,7 +201,7 @@ lto_write_options (void)
 
       /* Do not store target-specific options in offload_lto section.  */
       if ((cl_options[option->opt_index].flags & CL_TARGET)
-        && strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) == 0)
+         && lto_stream_offload_p)
        continue;
 
       /* Drop options created from the gcc driver that will be rejected
@@ -214,8 +214,7 @@ lto_write_options (void)
         We do not need those.  The only exception is -foffload option, if we
         write it in offload_lto section.  Also drop all diagnostic options.  */
       if ((cl_options[option->opt_index].flags & (CL_DRIVER|CL_WARNING))
-         && (strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) != 0
-             || option->opt_index != OPT_foffload_))
+         && (!lto_stream_offload_p || option->opt_index != OPT_foffload_))
        continue;
 
       for (j = 0; j < option->canonical_option_num_elements; ++j)
--- gcc/lto/lto.c.jj    2015-01-05 13:07:19.000000000 +0100
+++ gcc/lto/lto.c       2015-01-09 12:21:50.479332868 +0100
@@ -2900,7 +2900,8 @@ read_cgraph_and_symbols (unsigned nfiles
   timevar_push (TV_IPA_LTO_DECL_IN);
 
 #ifdef ACCEL_COMPILER
-    section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
+  section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
+  lto_stream_offload_p = true;
 #endif
 
   real_file_decl_data

        Jakub

Reply via email to