[PATCH] Fix regressions in libgomp testsuite: set flag_fat_lto_objects for offload
Richard Biener
richard.guenther@gmail.com
Thu Nov 27 15:32:00 GMT 2014
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.
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.
> * collect2.c (scan_prog_file): Look for the offload info marker symbol.
> * 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 offload marker if offload info has been
> previously emitted.
> * 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/collect2.c b/gcc/collect2.c
> index 9c3a1c5..2dcebcd 100644
> --- a/gcc/collect2.c
> +++ b/gcc/collect2.c
> @@ -2392,12 +2392,16 @@ scan_prog_file (const char *prog_name, scanpass which_pass,
> if (found_lto)
> continue;
>
> - /* Look for the LTO info marker symbol, and add filename to
> + /* Look for the LTO or offload info marker symbol, and add filename to
> the LTO objects list if found. */
> for (p = buf; (ch = *p) != '\0' && ch != '\n'; p++)
> if (ch == ' ' && p[1] == '_' && p[2] == '_'
> - && (strncmp (p + (p[3] == '_' ? 2 : 1), "__gnu_lto_v1", 12) == 0)
> - && ISSPACE (p[p[3] == '_' ? 14 : 13]))
> + && (((strncmp (p + (p[3] == '_' ? 2 : 1),
> + "__gnu_lto_v1", 12) == 0)
> + && ISSPACE (p[p[3] == '_' ? 14 : 13]))
> + || ((strncmp (p + (p[3] == '_' ? 2 : 1),
> + "__gnu_offload_v1", 16) == 0)
> + && ISSPACE (p[p[3] == '_' ? 18 : 17]))))
> {
> add_lto_object (<o_objects, prog_name);
>
> 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..2d84b0a 100644
> --- a/gcc/toplev.c
> +++ b/gcc/toplev.c
> @@ -672,6 +672,27 @@ compile_file (void)
> }
> }
>
> + /* Emit offload marker if offload info has been previously emitted.
> + This is used by collect2 to determine whether an object file contains IL.
> + 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_offload)
> + {
> +#if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
> + ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE,
> + "__gnu_offload_v1",
> + (unsigned HOST_WIDE_INT) 1, 8);
> +#elif defined ASM_OUTPUT_ALIGNED_COMMON
> + ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_offload_v1",
> + (unsigned HOST_WIDE_INT) 1, 8);
> +#else
> + ASM_OUTPUT_COMMON (asm_out_file, "__gnu_offload_v1",
> + (unsigned HOST_WIDE_INT) 1,
> + (unsigned HOST_WIDE_INT) 1);
> +#endif
> + }
> +
> /* Attach a special .ident directive to the end of the file to identify
> the version of GCC which compiled this code. The format of the .ident
> string is patterned after the ones produced by native SVR4 compilers. */
> 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
More information about the Gcc-patches
mailing list