From patchwork Tue May 31 07:54:38 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Christian Bruel X-Patchwork-Id: 97971 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]) by ozlabs.org (Postfix) with SMTP id D01F0B6F71 for ; Tue, 31 May 2011 17:55:09 +1000 (EST) Received: (qmail 32591 invoked by alias); 31 May 2011 07:55:08 -0000 Received: (qmail 32577 invoked by uid 22791); 31 May 2011 07:55:07 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from eu1sys200aog102.obsmtp.com (HELO eu1sys200aog102.obsmtp.com) (207.126.144.113) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 31 May 2011 07:54:52 +0000 Received: from beta.dmz-eu.st.com ([164.129.1.35]) (using TLSv1) by eu1sys200aob102.postini.com ([207.126.147.11]) with SMTP ID DSNKTeSeyu+6NxYBL20FBU/yFKJTCN6Ri/g7@postini.com; Tue, 31 May 2011 07:54:51 UTC Received: from zeta.dmz-eu.st.com (ns2.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id E667F18F for ; Tue, 31 May 2011 07:54:41 +0000 (GMT) Received: from Webmail-eu.st.com (safex1hubcas2.st.com [10.75.90.16]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 872691870 for ; Tue, 31 May 2011 07:54:41 +0000 (GMT) Received: from [164.129.122.89] (164.129.122.89) by webmail-eu.st.com (10.75.90.13) with Microsoft SMTP Server (TLS) id 8.2.234.1; Tue, 31 May 2011 09:54:41 +0200 Message-ID: <4DE49EBE.30804@st.com> Date: Tue, 31 May 2011 09:54:38 +0200 From: Christian Bruel User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 ThunderBrowse/3.3.5 MIME-Version: 1.0 To: GCC Patches Subject: [PATH] PR/49139 fix always_inline failures diagnostics X-IsSubscribed: yes 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 Hello, The attached patch fixes a few diagnostic discrepancies for always_inline failures. Illustrated by the fail_always_inline[12].c attached cases, the current behavior is one of: - success (with and without -Winline), silently not honoring always_inline gcc fail_always_inline1.c -S -Winline -O0 -fpic gcc fail_always_inline1.c -S -O2 -fpic - error: with -Winline but not without gcc fail_always_inline1.c -S -Winline -O2 -fpic - error: without -Winline gcc fail_always_inline2.c -S -fno-early-inlining -O2 or the original c++ attachment in this defect note that -Winline never warns, as stated in the documentation This simple patch consistently emits a warning (changing the sorry unimplemented message) whenever the attribute is not honored. My first will was to generate and error instead of the warning, but since it is possible that inlines is only performed at LTO time, an error would be inapropriate (Note that today this is not possible with -Winline that would abort). Another alternative I considered would be to emit the warning under -Winline rather than unconditionally, but this more a user misuse of the attribute, so should always be warned anyway. Or maybe a new -Winline-always that would be activated under -Wall ? Other opinion welcomed. Tested with standard bootstrap and regression on x86. Comments, and/or OK for trunk ? Many thanks, Christian 2010-05-25 Christian Bruel PR 49139 * ipa-inline-transform.c (inline_transform):force call to optimize_inline_calls error if function is always_inline. * tree-inline.c (tree_inlinable_function_p): always warn. (expand_call_inline): Likewise. 2010-05-25 Christian Bruel * gcc.db/always_inline.c: Removed -Winline. Update checks * gcc.db/always_inline2.c: Likewise. * gcc.db/always_inline3.c: Likewise. * gcc.db/fail_always_inline1.c: New test. * gcc.db/fail_always_inline2.c: New test. /* { dg-do compile { target fpic } } */ /* { dg-options "-fpic" } */ __attribute((always_inline)) void bar() { } /* { dg-warning "can be overwriten at linktime" } */ void f() { bar(); /* { dg-warning "called from here" "" } */ } /* { dg-do compile { target fpic } } */ /* { dg-options "-fpic -fno-early-inlining" } */ inline void foo() { foo2(); } __attribute((always_inline)) void bar() { } /* { dg-warning "can be overwriten at linktime" } */ void f() { foo(); bar(); /* { dg-warning "called from here" "" } */ } Index: gcc/ipa-inline-transform.c =================================================================== --- gcc/ipa-inline-transform.c (revision 174264) +++ gcc/ipa-inline-transform.c (working copy) @@ -302,9 +302,20 @@ for (e = node->callees; e; e = e->next_callee) { - cgraph_redirect_edge_call_stmt_to_callee (e); + gimple call = cgraph_redirect_edge_call_stmt_to_callee (e); + + if (!inline_p) + { if (!e->inline_failed || warn_inline) inline_p = true; + else + { + tree fn = gimple_call_fndecl (call); + + if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn))) + inline_p = true; + } + } } if (inline_p) Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 174264) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,11 @@ +2010-05-25 Christian Bruel + + PR 49139 + * ipa-inline-transform.c (inline_transform): force optimize_inline_calls + error checking if always_inline seen. + * tree-inline.c (tree_inlinable_function_p): use error instead of sorry. + (expand_call_inline): Likewise. + 2011-05-25 Ian Lance Taylor * godump.c (go_format_type): Output the first field with a usable Index: gcc/testsuite/gcc.dg/always_inline.c =================================================================== --- gcc/testsuite/gcc.dg/always_inline.c (revision 174264) +++ gcc/testsuite/gcc.dg/always_inline.c (working copy) @@ -1,8 +1,8 @@ /* { dg-do compile } */ -/* { dg-options "-Winline -O2" } */ +/* { dg-options "-O2" } */ #include inline __attribute__ ((always_inline)) void -e(int t, ...) /* { dg-message "sorry\[^\n\]*variable argument" "" } */ +e(int t, ...) /* { dg-warning "variable argument" } */ { va_list q; va_start (q, t); Index: gcc/testsuite/gcc.dg/always_inline2.c =================================================================== --- gcc/testsuite/gcc.dg/always_inline2.c (revision 174264) +++ gcc/testsuite/gcc.dg/always_inline2.c (working copy) @@ -1,8 +1,8 @@ /* { dg-do compile } */ -/* { dg-options "-Winline -O2" } */ -inline __attribute__ ((always_inline)) void t(void); /* { dg-message "sorry\[^\n\]*body not available" "" } */ +/* { dg-options "-O2" } */ +inline __attribute__ ((always_inline)) void t(void); /* { dg-warning "body not available" } */ void q(void) { - t(); /* { dg-message "sorry\[^\n\]*called from here" "" } */ + t(); /* { dg-warning "called from here" } */ } Index: gcc/testsuite/gcc.dg/always_inline3.c =================================================================== --- gcc/testsuite/gcc.dg/always_inline3.c (revision 174264) +++ gcc/testsuite/gcc.dg/always_inline3.c (working copy) @@ -1,11 +1,11 @@ /* { dg-do compile } */ -/* { dg-options "-Winline -O2" } */ +/* { dg-options "-O2" } */ int do_something_evil (void); inline __attribute__ ((always_inline)) void -q2(void) /* { dg-message "sorry\[^\n\]*recursive" "" } */ +q2(void) /* { dg-warning "recursive inlining" } */ { if (do_something_evil ()) return; - q2(); /* { dg-message "sorry\[^\n\]*called from here" "" } */ + q2(); /* { dg-warning "called from here" } */ q2(); /* With -O2 we don't warn here, it is eliminated by tail recursion. */ } Index: gcc/testsuite/ChangeLog =================================================================== --- gcc/testsuite/ChangeLog (revision 174264) +++ gcc/testsuite/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2010-05-25 Christian Bruel + + * gcc.db/always_inline.c: Removed -Winline. Update checks + * gcc.db/always_inline2.c: Likewise. + * gcc.db/always_inline3.c: Likewise. + 2011-05-26 Fabien ChĂȘne * g++.dg/init/pr25811-3.C: New. * g++.dg/init/pr25811-4.C: New. Index: gcc/tree-inline.c =================================================================== --- gcc/tree-inline.c (revision 174264) +++ gcc/tree-inline.c (working copy) @@ -3192,7 +3192,7 @@ As a bonus we can now give more details about the reason why a function is not inlinable. */ if (always_inline) - sorry (inline_forbidden_reason, fn); + warning (0, inline_forbidden_reason, fn); else if (do_warning) warning (OPT_Winline, inline_forbidden_reason, fn); @@ -3744,9 +3744,9 @@ /* Avoid warnings during early inline pass. */ && cgraph_global_info_ready) { - sorry ("inlining failed in call to %q+F: %s", fn, - _(cgraph_inline_failed_string (reason))); - sorry ("called from here"); + warning (0, "inlining failed in call to always_inline %q+F: %s", fn, + cgraph_inline_failed_string (reason)); + warning (0, "called from here"); } else if (warn_inline && DECL_DECLARED_INLINE_P (fn)