From patchwork Mon Aug 24 15:48:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Machado X-Patchwork-Id: 8407 Received: (qmail 60309 invoked by alias); 24 Aug 2015 15:49:05 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 60260 invoked by uid 89); 24 Aug 2015 15:49:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Aug 2015 15:49:00 +0000 Received: from svr-orw-fem-04.mgc.mentorg.com ([147.34.97.41]) by relay1.mentorg.com with esmtp id 1ZTtzU-0001CM-S5 from Luis_Gustavo@mentor.com ; Mon, 24 Aug 2015 08:48:56 -0700 Received: from [172.30.14.237] (147.34.91.1) by svr-orw-fem-04.mgc.mentorg.com (147.34.97.41) with Microsoft SMTP Server id 14.3.224.2; Mon, 24 Aug 2015 08:48:56 -0700 Message-ID: <55DB3CE1.7020402@codesourcery.com> Date: Mon, 24 Aug 2015 12:48:49 -0300 From: Luis Machado Reply-To: Luis Machado User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Pedro Alves , Subject: Re: [PATCH] Prevent GCC from folding inline test functions References: <1440162341-26343-1-git-send-email-lgustavo@codesourcery.com> <55D74BCE.5020206@redhat.com> In-Reply-To: <55D74BCE.5020206@redhat.com> X-IsSubscribed: yes On 08/21/2015 01:03 PM, Pedro Alves wrote: > On 08/21/2015 02:05 PM, Luis Machado wrote: > >> The attached patch implements this by adding the new global variable z, set >> to 0, that gets added in different ways to marker and inlined_fn. Since it >> is 0, it doesn't affect any possible value checks that we may wish to do >> in the future (we currently only check for values changed by bar). >> >> Ok? >> > > OK, though you should probably make z volatile as well. > Otherwise, soon enough, gcc with LTO sees that z is always 0: > Indeed. Attached is what i pushed to trunk. Thanks, Luis commit a48847eea5f39c1f9fbe4255c9e892647f13f995 Author: Luis Machado Date: Mon Aug 24 12:33:21 2015 -0300 Prevent GCC from folding inline test functions While doing some powerpc Linux tests on a ppc 476 board using GCC 5.2, i noticed inline-bt.exp, inline-cmds.exp and inline-locals.exp failing. FAIL: gdb.opt/inline-bt.exp: continue to bar (1) FAIL: gdb.opt/inline-bt.exp: backtrace from bar (1) FAIL: gdb.opt/inline-bt.exp: continue to bar (2) FAIL: gdb.opt/inline-bt.exp: backtrace from bar (2) FAIL: gdb.opt/inline-bt.exp: continue to bar (3) FAIL: gdb.opt/inline-bt.exp: backtrace from bar (3) FAIL: gdb.opt/inline-cmds.exp: continue to bar (1) FAIL: gdb.opt/inline-cmds.exp: backtrace from bar (1) FAIL: gdb.opt/inline-cmds.exp: continue to bar (2) FAIL: gdb.opt/inline-cmds.exp: backtrace from bar (2) FAIL: gdb.opt/inline-cmds.exp: continue to marker FAIL: gdb.opt/inline-cmds.exp: backtrace from marker FAIL: gdb.opt/inline-cmds.exp: step into finish marker FAIL: gdb.opt/inline-locals.exp: continue to bar (1) FAIL: gdb.opt/inline-locals.exp: continue to bar (2) FAIL: gdb.opt/inline-locals.exp: backtrace from bar (2) FAIL: gdb.opt/inline-locals.exp: continue to bar (3) FAIL: gdb.opt/inline-locals.exp: backtrace from bar (3) They failed because the breakpoint supposedly inserted at bar was actually inserted at noinline. (gdb) break inline-markers.c:20^M Breakpoint 2 at 0x1000079c: file gdb/testsuite/gdb.opt/inline-markers.c, line 20.^M (gdb) continue^M Continuing.^M ^M Breakpoint 2, noinline () at gdb/testsuite/gdb.opt/inline-markers.c:35^M 35 inlined_fn (); /* inlined */^M As we can see, line 20 is really inside bar, not noinline: 18 void bar(void) 19 { 20 x += y; /* set breakpoint 1 here */ 21 } Further investigation shows that this is really due to GCC 5's new ICF pass (-fipa-icf), now enabled by default at -O2, which folds bar and marker into noinline, where the call to inlined_fn was inlined. This breaks the testcase since it expects to stop at specific spots. I thought about two possible fixes for this issue. - Disable the ICF pass manually when building the binary (-fno-ipa-icf). This has the advantage of not having to touch the testcase sources themselves, but the disadvantage of having to add conditional blocks to test the GCC version. If we ever change GCC's default, we will have to adjust the conditional block again to match GCC's behavior. - Modify the testcase sources to make the identical functions unique. This solution doesn't touch the testcase itself, but changes the source code slightly in order to make bar, marker and inlined_fn unique. This causes GCC's ICF pass to ignore these functions and not fold them into a common identical function. I'm good with either of them, but i'm more inclined to go with the second one. The attached patch implements this by adding the new global variable z, set to 0, that gets added in different ways to marker and inlined_fn. Since it is 0, it doesn't affect any possible value checks that we may wish to do in the future (we currently only check for values changed by bar). Ok? ps: I also noticed GDB doesn't do a great job at stating that the breakpoint was actually inserted at a different source line than previously requested, so this sounds like a bug that should be fixed, if it is not just wrong DWARF information (did not investigate it further). gdb/testsuite/ChangeLog: 2015-08-24 Luis Machado * gdb.opt/inline-bt.c: New volatile global z. * gdb.opt/inline-cmds.c: Likewise. * gdb.opt/inline-locals.c: Likewise. * gdb.opt/inline-markers.c: New extern global z. (marker): Use z. (inline_fn): Likewise. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c3d5182..b788c0f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2015-08-24 Luis Machado + + * gdb.opt/inline-bt.c: New volatile global z. + * gdb.opt/inline-cmds.c: Likewise. + * gdb.opt/inline-locals.c: Likewise. + * gdb.opt/inline-markers.c: New extern global z. + (marker): Use z. + (inline_fn): Likewise. + 2015-08-24 Pedro Alves * config/m32r-stub.exp: Remove file. diff --git a/gdb/testsuite/gdb.opt/inline-bt.c b/gdb/testsuite/gdb.opt/inline-bt.c index dc2bd45..a47d16e 100644 --- a/gdb/testsuite/gdb.opt/inline-bt.c +++ b/gdb/testsuite/gdb.opt/inline-bt.c @@ -23,6 +23,7 @@ #endif int x, y; +volatile int z = 0; volatile int result; void bar(void); diff --git a/gdb/testsuite/gdb.opt/inline-cmds.c b/gdb/testsuite/gdb.opt/inline-cmds.c index 9955720..cc43b57 100644 --- a/gdb/testsuite/gdb.opt/inline-cmds.c +++ b/gdb/testsuite/gdb.opt/inline-cmds.c @@ -23,6 +23,7 @@ #endif int x, y; +volatile int z = 0; volatile int result; void bar(void); diff --git a/gdb/testsuite/gdb.opt/inline-locals.c b/gdb/testsuite/gdb.opt/inline-locals.c index fc018bf..fa5cd13 100644 --- a/gdb/testsuite/gdb.opt/inline-locals.c +++ b/gdb/testsuite/gdb.opt/inline-locals.c @@ -23,6 +23,7 @@ #endif int x, y; +volatile int z = 0; volatile int result; volatile int *array_p; diff --git a/gdb/testsuite/gdb.opt/inline-markers.c b/gdb/testsuite/gdb.opt/inline-markers.c index 46c68ae..5d55033 100644 --- a/gdb/testsuite/gdb.opt/inline-markers.c +++ b/gdb/testsuite/gdb.opt/inline-markers.c @@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -extern int x, y; +extern int x, y, z; void bar(void) { @@ -22,12 +22,12 @@ void bar(void) void marker(void) { - x += y; /* set breakpoint 2 here */ + x += y - z; /* set breakpoint 2 here */ } inline void inlined_fn(void) { - x += y; + x += y + z; } void noinline(void)