From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753245AbeAQONV (ORCPT + 1 other); Wed, 17 Jan 2018 09:13:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53270 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752574AbeAQONU (ORCPT ); Wed, 17 Jan 2018 09:13:20 -0500 Date: Wed, 17 Jan 2018 08:13:15 -0600 From: Josh Poimboeuf To: Peter Zijlstra Cc: David Woodhouse , linux-kernel@vger.kernel.org, Dave Hansen , Ashok Raj , Thomas Gleixner , Tim Chen , Andy Lutomirski , Linus Torvalds , Greg KH , Andrea Arcangeli , Andi Kleen , Arjan Van De Ven , Dan Williams , Paolo Bonzini , Jun Nakajima , Asit Mallick Subject: Re: [PATCH v2 11/10] objtool: Even more complex static block checks Message-ID: <20180117141315.nk4cszdo4tw7zaxk@treble> References: <20180116142825.376986833@infradead.org> <20180116194917.GH2228@hirez.programming.kicks-ass.net> <20180117031232.y7t25srlfsym5len@treble> <20180117081309.GJ2228@hirez.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20180117081309.GJ2228@hirez.programming.kicks-ass.net> User-Agent: Mutt/1.6.0.1 (2016-04-01) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 17 Jan 2018 14:13:19 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On Wed, Jan 17, 2018 at 09:13:09AM +0100, Peter Zijlstra wrote: > On Tue, Jan 16, 2018 at 09:12:32PM -0600, Josh Poimboeuf wrote: > > On Tue, Jan 16, 2018 at 08:49:17PM +0100, Peter Zijlstra wrote: > > > Subject: objtool: Even more complex static block checks > > > From: Peter Zijlstra > > > Date: Tue Jan 16 20:17:01 CET 2018 > > > > > > I've observed GCC transform: > > > > > > f() > > > { > > > if (!static_branch_unlikely()) > > > return; > > > > > > static_assert(); > > > A; > > > } > > > > > > g() > > > { > > > f(); > > > } > > > > > > Into: > > > > > > f() > > > { > > > static_assert(); > > > A; > > > } > > > > > > g() > > > { > > > if (static_branch_unlikely()) > > > f(); > > > } > > > > > > Which results in the assertion landing at f+0. The transformation is > > > valid and useful; it avoids a pointless CALL+RET sequence, so we'll > > > have to teach objtool how to deal with this. > > > > > > Do this by marking all CALL destinations with static_call when called > > > from a static_block and non_static_call when called outside a > > > static_block. This allows us to identify functions called exclusively > > > from a static_block and start them with a static_block. > > > > Ew... where'd you place the assertion to trigger this? > > Its the patch I pastebin'ed you earlier, also see below. Ah, I remembered you mentioning the problem, just forgot you showed me the patch. > > It's late and my brain has already clocked out, so I'll need to revisit > > this tomorrow. But now I'm wondering if my basic block idea would be a > > better way to solve this. > > I would think basic-blocks are inside functions, and this patch goes > across functions, something you'd still need even if you had basic > blocks. Right, but I was thinking the patch would be a lot simpler with basic blocks. > Also, basic blocks are non-trivial because they can overlap. Hm, I thought a basic block only has one entry point and one exit point. How could they overlap? -- Josh