diff mbox

Fix regressions in libgomp testsuite: set flag_fat_lto_objects for offload

Message ID 20141127234538.GB30075@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Verbin Nov. 27, 2014, 11:45 p.m. UTC
On 27 Nov 16:00, Richard Biener wrote:
> On Thu, Nov 27, 2014 at 2:31 PM, Ilya Verbin <iverbin@gmail.com> wrote:
> > On 25 Nov 10:51, Richard Biener wrote:
> >> In the patch adding flag_generate_offload sounds like a good solution,
> >> I didn't like emitting fat LTO objects unconditionally just because we offload.
> >
> > Here is updated patch.  Bootstrap and make check passed on i686-linux and
> > x86_64-linux.  Tests with offloading also passed with trunk binutils.
> > OK for trunk?
> 
> If it also works without the new __gnu_offload symbol then I'd prefer
> to re-use __gnu_LTO here.
> 
> Ok with that change.

Do you mean a patch like this?  Yes, it also works.
Bootstrap and make check passed.  OK?

  -- Ilya


gcc/
	* cgraphunit.c (ipa_passes): Handle flag_generate_offload.
	(symbol_table::compile): Set flag_generate_offload if there is something
	to offload.
	* common.opt (flag_generate_offload): New Variable declaration.
	* dwarf2out.c (dwarf2out_finish): Handle flag_generate_offload.
	* ipa-inline-analysis.c (inline_generate_summary): Do not skip if
	flag_generate_offload is set.
	* lto-streamer.c (gate_lto_out): Handle flag_generate_offload.
	* passes.c (ipa_write_summaries): Do not skip if flag_generate_offload
	is set.
	* toplev.c (compile_file): Emit LTO marker if offload info has been
	previously emitted.  Do not emit lto_slim marker if
	flag_generate_offload is without flag_generate_lto.
	* tree.c (free_lang_data): Do not skip if flag_generate_offload is set.

Comments

Richard Biener Nov. 28, 2014, 9:35 a.m. UTC | #1
On Fri, Nov 28, 2014 at 12:45 AM, Ilya Verbin <iverbin@gmail.com> wrote:
> On 27 Nov 16:00, Richard Biener wrote:
>> On Thu, Nov 27, 2014 at 2:31 PM, Ilya Verbin <iverbin@gmail.com> wrote:
>> > On 25 Nov 10:51, Richard Biener wrote:
>> >> In the patch adding flag_generate_offload sounds like a good solution,
>> >> I didn't like emitting fat LTO objects unconditionally just because we offload.
>> >
>> > Here is updated patch.  Bootstrap and make check passed on i686-linux and
>> > x86_64-linux.  Tests with offloading also passed with trunk binutils.
>> > OK for trunk?
>>
>> If it also works without the new __gnu_offload symbol then I'd prefer
>> to re-use __gnu_LTO here.
>>
>> Ok with that change.
>
> Do you mean a patch like this?  Yes, it also works.
> Bootstrap and make check passed.  OK?

Yes - thanks.

Richard.

>   -- Ilya
>
>
> gcc/
>         * cgraphunit.c (ipa_passes): Handle flag_generate_offload.
>         (symbol_table::compile): Set flag_generate_offload if there is something
>         to offload.
>         * common.opt (flag_generate_offload): New Variable declaration.
>         * dwarf2out.c (dwarf2out_finish): Handle flag_generate_offload.
>         * ipa-inline-analysis.c (inline_generate_summary): Do not skip if
>         flag_generate_offload is set.
>         * lto-streamer.c (gate_lto_out): Handle flag_generate_offload.
>         * passes.c (ipa_write_summaries): Do not skip if flag_generate_offload
>         is set.
>         * toplev.c (compile_file): Emit LTO marker if offload info has been
>         previously emitted.  Do not emit lto_slim marker if
>         flag_generate_offload is without flag_generate_lto.
>         * tree.c (free_lang_data): Do not skip if flag_generate_offload is set.
>
>
> diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
> index 2fd99a7..fed1a3e 100644
> --- a/gcc/cgraphunit.c
> +++ b/gcc/cgraphunit.c
> @@ -2075,7 +2075,7 @@ ipa_passes (void)
>      }
>
>    /* Some targets need to handle LTO assembler output specially.  */
> -  if (flag_generate_lto)
> +  if (flag_generate_lto || flag_generate_offload)
>      targetm.asm_out.lto_start ();
>
>    if (!in_lto_p)
> @@ -2092,7 +2092,7 @@ ipa_passes (void)
>         }
>      }
>
> -  if (flag_generate_lto)
> +  if (flag_generate_lto || flag_generate_offload)
>      targetm.asm_out.lto_end ();
>
>    if (!flag_ltrans && (in_lto_p || !flag_lto || flag_fat_lto_objects))
> @@ -2176,10 +2176,10 @@ symbol_table::compile (void)
>
>    /* Offloading requires LTO infrastructure.  */
>    if (!in_lto_p && g->have_offload)
> -    flag_generate_lto = 1;
> +    flag_generate_offload = 1;
>
>    /* If LTO is enabled, initialize the streamer hooks needed by GIMPLE.  */
> -  if (flag_generate_lto)
> +  if (flag_generate_lto || flag_generate_offload)
>      lto_streamer_hooks_init ();
>
>    /* Don't run the IPA passes if there was any error or sorry messages.  */
> diff --git a/gcc/common.opt b/gcc/common.opt
> index 41c8d4e..752d939 100644
> --- a/gcc/common.opt
> +++ b/gcc/common.opt
> @@ -67,6 +67,10 @@ int *param_values
>  Variable
>  int flag_generate_lto
>
> +; Nonzero if we should write GIMPLE bytecode for offload compilation.
> +Variable
> +int flag_generate_offload = 0
> +
>  ; True to warn about any objects definitions whose size is larger
>  ; than N bytes.  Also want about function definitions whose returned
>  ; values are larger than N bytes, where N is 'larger_than_size'.
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index 25f0e7d..4ee3102 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -24420,7 +24420,8 @@ dwarf2out_finish (const char *filename)
>        /* When generating LTO bytecode we can not generate new assembler
>           names at this point and all important decls got theirs via
>          free-lang-data.  */
> -      if ((!flag_generate_lto || DECL_ASSEMBLER_NAME_SET_P (decl))
> +      if (((!flag_generate_lto && !flag_generate_offload)
> +          || DECL_ASSEMBLER_NAME_SET_P (decl))
>           && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
>         {
>           add_linkage_attr (node->die, decl);
> diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
> index 2f2993c..9d62722 100644
> --- a/gcc/ipa-inline-analysis.c
> +++ b/gcc/ipa-inline-analysis.c
> @@ -4031,7 +4031,7 @@ inline_generate_summary (void)
>
>    /* When not optimizing, do not bother to analyze.  Inlining is still done
>       because edge redirection needs to happen there.  */
> -  if (!optimize && !flag_generate_lto && !flag_wpa)
> +  if (!optimize && !flag_generate_lto && !flag_generate_offload && !flag_wpa)
>      return;
>
>    function_insertion_hook_holder =
> diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c
> index e8347dc..af20330 100644
> --- a/gcc/lto-streamer.c
> +++ b/gcc/lto-streamer.c
> @@ -328,7 +328,7 @@ lto_streamer_init (void)
>  bool
>  gate_lto_out (void)
>  {
> -  return ((flag_generate_lto || in_lto_p)
> +  return ((flag_generate_lto || flag_generate_offload || in_lto_p)
>           /* Don't bother doing anything if the program has errors.  */
>           && !seen_error ());
>  }
> diff --git a/gcc/passes.c b/gcc/passes.c
> index a3be0bb..74b40e5 100644
> --- a/gcc/passes.c
> +++ b/gcc/passes.c
> @@ -2466,7 +2466,7 @@ ipa_write_summaries (bool offload_lto_mode)
>    struct cgraph_node *node;
>    struct cgraph_node **order;
>
> -  if (!flag_generate_lto || seen_error ())
> +  if ((!flag_generate_lto && !flag_generate_offload) || seen_error ())
>      return;
>
>    select_what_to_stream (offload_lto_mode);
> diff --git a/gcc/toplev.c b/gcc/toplev.c
> index 6e6adfa..2f547bf 100644
> --- a/gcc/toplev.c
> +++ b/gcc/toplev.c
> @@ -639,7 +639,7 @@ compile_file (void)
>       We used to emit an undefined reference here, but this produces
>       link errors if an object file with IL is stored into a shared
>       library without invoking lto1.  */
> -  if (flag_generate_lto)
> +  if (flag_generate_lto || flag_generate_offload)
>      {
>  #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
>        ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
> @@ -653,23 +653,23 @@ compile_file (void)
>                          (unsigned HOST_WIDE_INT) 1,
>                          (unsigned HOST_WIDE_INT) 1);
>  #endif
> -      /* Let linker plugin know that this is a slim object and must be LTOed
> -         even when user did not ask for it.  */
> -      if (!flag_fat_lto_objects)
> -        {
> +    }
> +
> +  /* Let linker plugin know that this is a slim object and must be LTOed
> +     even when user did not ask for it.  */
> +  if (flag_generate_lto && !flag_fat_lto_objects)
> +    {
>  #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
> -         ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
> -                                         "__gnu_lto_slim",
> -                                         (unsigned HOST_WIDE_INT) 1, 8);
> +      ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE, "__gnu_lto_slim",
> +                                     (unsigned HOST_WIDE_INT) 1, 8);
>  #elif defined ASM_OUTPUT_ALIGNED_COMMON
> -         ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
> -                                    (unsigned HOST_WIDE_INT) 1, 8);
> +      ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
> +                                (unsigned HOST_WIDE_INT) 1, 8);
>  #else
> -         ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
> -                            (unsigned HOST_WIDE_INT) 1,
> -                            (unsigned HOST_WIDE_INT) 1);
> +      ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
> +                        (unsigned HOST_WIDE_INT) 1,
> +                        (unsigned HOST_WIDE_INT) 1);
>  #endif
> -        }
>      }
>
>    /* Attach a special .ident directive to the end of the file to identify
> diff --git a/gcc/tree.c b/gcc/tree.c
> index 1d5e4f6..f6a6d04 100644
> --- a/gcc/tree.c
> +++ b/gcc/tree.c
> @@ -5730,7 +5730,7 @@ free_lang_data (void)
>
>    /* If we are the LTO frontend we have freed lang-specific data already.  */
>    if (in_lto_p
> -      || !flag_generate_lto)
> +      || (!flag_generate_lto && !flag_generate_offload))
>      return 0;
>
>    /* Allocate and assign alias sets to the standard integer types
diff mbox

Patch

diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 2fd99a7..fed1a3e 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2075,7 +2075,7 @@  ipa_passes (void)
     }
 
   /* Some targets need to handle LTO assembler output specially.  */
-  if (flag_generate_lto)
+  if (flag_generate_lto || flag_generate_offload)
     targetm.asm_out.lto_start ();
 
   if (!in_lto_p)
@@ -2092,7 +2092,7 @@  ipa_passes (void)
 	}
     }
 
-  if (flag_generate_lto)
+  if (flag_generate_lto || flag_generate_offload)
     targetm.asm_out.lto_end ();
 
   if (!flag_ltrans && (in_lto_p || !flag_lto || flag_fat_lto_objects))
@@ -2176,10 +2176,10 @@  symbol_table::compile (void)
 
   /* Offloading requires LTO infrastructure.  */
   if (!in_lto_p && g->have_offload)
-    flag_generate_lto = 1;
+    flag_generate_offload = 1;
 
   /* If LTO is enabled, initialize the streamer hooks needed by GIMPLE.  */
-  if (flag_generate_lto)
+  if (flag_generate_lto || flag_generate_offload)
     lto_streamer_hooks_init ();
 
   /* Don't run the IPA passes if there was any error or sorry messages.  */
diff --git a/gcc/common.opt b/gcc/common.opt
index 41c8d4e..752d939 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -67,6 +67,10 @@  int *param_values
 Variable
 int flag_generate_lto
 
+; Nonzero if we should write GIMPLE bytecode for offload compilation.
+Variable
+int flag_generate_offload = 0
+
 ; True to warn about any objects definitions whose size is larger
 ; than N bytes.  Also want about function definitions whose returned
 ; values are larger than N bytes, where N is 'larger_than_size'.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 25f0e7d..4ee3102 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -24420,7 +24420,8 @@  dwarf2out_finish (const char *filename)
       /* When generating LTO bytecode we can not generate new assembler
          names at this point and all important decls got theirs via
 	 free-lang-data.  */
-      if ((!flag_generate_lto || DECL_ASSEMBLER_NAME_SET_P (decl))
+      if (((!flag_generate_lto && !flag_generate_offload)
+	   || DECL_ASSEMBLER_NAME_SET_P (decl))
 	  && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
 	{
 	  add_linkage_attr (node->die, decl);
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
index 2f2993c..9d62722 100644
--- a/gcc/ipa-inline-analysis.c
+++ b/gcc/ipa-inline-analysis.c
@@ -4031,7 +4031,7 @@  inline_generate_summary (void)
 
   /* When not optimizing, do not bother to analyze.  Inlining is still done
      because edge redirection needs to happen there.  */
-  if (!optimize && !flag_generate_lto && !flag_wpa)
+  if (!optimize && !flag_generate_lto && !flag_generate_offload && !flag_wpa)
     return;
 
   function_insertion_hook_holder =
diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c
index e8347dc..af20330 100644
--- a/gcc/lto-streamer.c
+++ b/gcc/lto-streamer.c
@@ -328,7 +328,7 @@  lto_streamer_init (void)
 bool
 gate_lto_out (void)
 {
-  return ((flag_generate_lto || in_lto_p)
+  return ((flag_generate_lto || flag_generate_offload || in_lto_p)
 	  /* Don't bother doing anything if the program has errors.  */
 	  && !seen_error ());
 }
diff --git a/gcc/passes.c b/gcc/passes.c
index a3be0bb..74b40e5 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -2466,7 +2466,7 @@  ipa_write_summaries (bool offload_lto_mode)
   struct cgraph_node *node;
   struct cgraph_node **order;
 
-  if (!flag_generate_lto || seen_error ())
+  if ((!flag_generate_lto && !flag_generate_offload) || seen_error ())
     return;
 
   select_what_to_stream (offload_lto_mode);
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 6e6adfa..2f547bf 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -639,7 +639,7 @@  compile_file (void)
      We used to emit an undefined reference here, but this produces
      link errors if an object file with IL is stored into a shared
      library without invoking lto1.  */
-  if (flag_generate_lto)
+  if (flag_generate_lto || flag_generate_offload)
     {
 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
       ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
@@ -653,23 +653,23 @@  compile_file (void)
 			 (unsigned HOST_WIDE_INT) 1,
 			 (unsigned HOST_WIDE_INT) 1);
 #endif
-      /* Let linker plugin know that this is a slim object and must be LTOed
-         even when user did not ask for it.  */
-      if (!flag_fat_lto_objects)
-        {
+    }
+
+  /* Let linker plugin know that this is a slim object and must be LTOed
+     even when user did not ask for it.  */
+  if (flag_generate_lto && !flag_fat_lto_objects)
+    {
 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
-	  ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
-					  "__gnu_lto_slim",
-					  (unsigned HOST_WIDE_INT) 1, 8);
+      ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE, "__gnu_lto_slim",
+				      (unsigned HOST_WIDE_INT) 1, 8);
 #elif defined ASM_OUTPUT_ALIGNED_COMMON
-	  ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
-				     (unsigned HOST_WIDE_INT) 1, 8);
+      ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim",
+				 (unsigned HOST_WIDE_INT) 1, 8);
 #else
-	  ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
-			     (unsigned HOST_WIDE_INT) 1,
-			     (unsigned HOST_WIDE_INT) 1);
+      ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim",
+			 (unsigned HOST_WIDE_INT) 1,
+			 (unsigned HOST_WIDE_INT) 1);
 #endif
-        }
     }
 
   /* Attach a special .ident directive to the end of the file to identify
diff --git a/gcc/tree.c b/gcc/tree.c
index 1d5e4f6..f6a6d04 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -5730,7 +5730,7 @@  free_lang_data (void)
 
   /* If we are the LTO frontend we have freed lang-specific data already.  */
   if (in_lto_p
-      || !flag_generate_lto)
+      || (!flag_generate_lto && !flag_generate_offload))
     return 0;
 
   /* Allocate and assign alias sets to the standard integer types