On Fri, Nov 28, 2014 at 12:45 AM, Ilya Verbin <iver...@gmail.com> wrote: > On 27 Nov 16:00, Richard Biener wrote: >> On Thu, Nov 27, 2014 at 2:31 PM, Ilya Verbin <iver...@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