From patchwork Thu Nov 27 13:31:15 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Verbin X-Patchwork-Id: 415518 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id AC953140142 for ; Fri, 28 Nov 2014 00:31:40 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; q=dns; s=default; b=nNSWEXzHVZgCi7zUW /xkZ4oIFa/Yg/efSF/ZbQ4/kZmgzMb6bKaSxlEa5SCv86frwNkrnOtY+8zHUCzzY MbL4wkdV0RmfY89R6SPVOYl9844ZVIaDST7pG9kDx0q4nL2XeCQasuCUG8wKHGwl YeCYgnvXh5Z8Eg9jJG8hReqjIk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=default; bh=Si6EesWXHRC3VPX1kZTMr00 Apv0=; b=WNs8E3Az6Ddh32njG9IF1ue+zBRsWhpG02T9y2+Vz5dEbAEzDbMUn1o 9XUwN9R1dhREZBY8j32upSs7Bfg7Kk6VXisjzASCMtuXr3ZY4Serztorbc4irm/g ZyrjBOJ9PJqvuvE9k5WaL+3TOkOPKx/6Brl+NAauNN1hsH2U+Qhw= Received: (qmail 16548 invoked by alias); 27 Nov 2014 13:31:33 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 16537 invoked by uid 89); 27 Nov 2014 13:31:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wi0-f178.google.com Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com) (209.85.212.178) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 27 Nov 2014 13:31:31 +0000 Received: by mail-wi0-f178.google.com with SMTP id hi2so8340661wib.5 for ; Thu, 27 Nov 2014 05:31:28 -0800 (PST) X-Received: by 10.194.57.43 with SMTP id f11mr48779788wjq.6.1417095088296; Thu, 27 Nov 2014 05:31:28 -0800 (PST) Received: from msticlxl57.ims.intel.com ([192.55.55.41]) by mx.google.com with ESMTPSA id iz19sm25302611wic.8.2014.11.27.05.31.24 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 27 Nov 2014 05:31:27 -0800 (PST) Date: Thu, 27 Nov 2014 16:31:15 +0300 From: Ilya Verbin To: Richard Biener Cc: "H.J. Lu" , Jakub Jelinek , GCC Patches , Kirill Yukhin Subject: Re: [PATCH] Fix regressions in libgomp testsuite: set flag_fat_lto_objects for offload Message-ID: <20141127133115.GA30075@msticlxl57.ims.intel.com> References: <20141114160441.GA40445@msticlxl57.ims.intel.com> <20141114160709.GB40445@msticlxl57.ims.intel.com> <20141114165113.GC40445@msticlxl57.ims.intel.com> <20141114170849.GD40445@msticlxl57.ims.intel.com> <20141124164443.GA35345@msticlxl57.ims.intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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? -- 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