From: Segher Boessenkool <segher@kernel.crashing.org>
To: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
linuxppc-dev@lists.ozlabs.org,
Chen Zhongjin <chenzhongjin@huawei.com>,
x86@kernel.org, Nick Desaulniers <ndesaulniers@google.com>,
linux-kernel@vger.kernel.org, Mark Brown <broonie@kernel.org>,
Sathvika Vasireddy <sv@linux.ibm.com>,
linux-toolchains@vger.kernel.org,
Indu Bhagat <indu.bhagat@oracle.com>,
live-patching@vger.kernel.org, Miroslav Benes <mbenes@suse.cz>,
Will Deacon <will@kernel.org>, Ard Biesheuvel <ardb@kernel.org>,
linux-arm-kernel@lists.infradead.org,
"Jose E. Marchesi" <jemarch@gnu.org>, Michael Matz <matz@suse.de>
Subject: Re: [RFC] Objtool toolchain proposal: -fannotate-{jump-table,noreturn}
Date: Wed, 14 Sep 2022 07:16:20 -0500 [thread overview]
Message-ID: <20220914121620.GY25951@gate.crashing.org> (raw)
In-Reply-To: <20220914102100.thl5ad35plvazark@treble>
On Wed, Sep 14, 2022 at 11:21:00AM +0100, Josh Poimboeuf wrote:
> On Mon, Sep 12, 2022 at 06:31:14AM -0500, Segher Boessenkool wrote:
> > On Fri, Sep 09, 2022 at 11:07:04AM -0700, Josh Poimboeuf wrote:
> > > 2) Noreturn functions:
> > >
> > > There's no reliable way to determine which functions are designated
> > > by the compiler to be noreturn (either explictly via function
> > > attribute, or implicitly via a static function which is a wrapper
> > > around a noreturn function.)
> >
> > Or just a function that does not return for any other reason.
> >
> > The compiler makes no difference between functions that have the
> > attribute and functions that do not. There are good reasons to not
> > have the attribute on functions that do in fact not return. The
> > not-returningness of the function may be just an implementation
> > accident, something you do not want part of the API, so it *should* not
> > have that attribute; or you may want the callers to a function to not be
> > optimised according to this knowledge (you cannot *prevent* that, the
> > compiler can figure it out it other ways, but still) for any other
> > reason.
>
> Yes, many static functions that are wrappers around noreturn functions
> have this "implicit noreturn" property.
I meant functions that are noreturn intrinsically. The trivial example:
void f(void)
{
for (;;)
;
}
> I agree we would need to know
> about those functions (or, as Michael suggested, their call sites) as
> well.
Many "potentially does not return" functions (there are very many such
functions!) turn into "never returns" functions, for some inputs (or
something in the environment). If the compiler specialises a code path
that does not return, you'll not see that marked up any way. Of course
such a path should not be taken in the kernel, normally :-)
> > > This information is needed because the
> > > code after the call to such a function is optimized out as
> > > unreachable and objtool has no way of knowing that.
> >
> > Since June we (GCC) have -funreachable-traps. This creates a trap insn
> > wherever control flow would otherwise go into limbo.
>
> Ah, that's interesting, though I'm not sure if we'd be able to
> distinguish between "call doesn't return" traps and other traps or
> reasons for UD2.
The trap handler can see where the trap came from. And then look up
that address in some tables or such. Just like __bug_table?
Segher
WARNING: multiple messages have this Message-ID (diff)
From: Segher Boessenkool <segher@kernel.crashing.org>
To: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>, Michael Matz <matz@suse.de>,
Will Deacon <will@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
linuxppc-dev@lists.ozlabs.org, x86@kernel.org,
Nick Desaulniers <ndesaulniers@google.com>,
linux-kernel@vger.kernel.org, Mark Brown <broonie@kernel.org>,
Sathvika Vasireddy <sv@linux.ibm.com>,
linux-toolchains@vger.kernel.org,
Indu Bhagat <indu.bhagat@oracle.com>,
live-patching@vger.kernel.org, Miroslav Benes <mbenes@suse.cz>,
Chen Zhongjin <chenzhongjin@huawei.com>,
Ard Biesheuvel <ardb@kernel.org>,
linux-arm-kernel@lists.infradead.org,
"Jose E. Marchesi" <jemarch@gnu.org>
Subject: Re: [RFC] Objtool toolchain proposal: -fannotate-{jump-table,noreturn}
Date: Wed, 14 Sep 2022 07:16:20 -0500 [thread overview]
Message-ID: <20220914121620.GY25951@gate.crashing.org> (raw)
In-Reply-To: <20220914102100.thl5ad35plvazark@treble>
On Wed, Sep 14, 2022 at 11:21:00AM +0100, Josh Poimboeuf wrote:
> On Mon, Sep 12, 2022 at 06:31:14AM -0500, Segher Boessenkool wrote:
> > On Fri, Sep 09, 2022 at 11:07:04AM -0700, Josh Poimboeuf wrote:
> > > 2) Noreturn functions:
> > >
> > > There's no reliable way to determine which functions are designated
> > > by the compiler to be noreturn (either explictly via function
> > > attribute, or implicitly via a static function which is a wrapper
> > > around a noreturn function.)
> >
> > Or just a function that does not return for any other reason.
> >
> > The compiler makes no difference between functions that have the
> > attribute and functions that do not. There are good reasons to not
> > have the attribute on functions that do in fact not return. The
> > not-returningness of the function may be just an implementation
> > accident, something you do not want part of the API, so it *should* not
> > have that attribute; or you may want the callers to a function to not be
> > optimised according to this knowledge (you cannot *prevent* that, the
> > compiler can figure it out it other ways, but still) for any other
> > reason.
>
> Yes, many static functions that are wrappers around noreturn functions
> have this "implicit noreturn" property.
I meant functions that are noreturn intrinsically. The trivial example:
void f(void)
{
for (;;)
;
}
> I agree we would need to know
> about those functions (or, as Michael suggested, their call sites) as
> well.
Many "potentially does not return" functions (there are very many such
functions!) turn into "never returns" functions, for some inputs (or
something in the environment). If the compiler specialises a code path
that does not return, you'll not see that marked up any way. Of course
such a path should not be taken in the kernel, normally :-)
> > > This information is needed because the
> > > code after the call to such a function is optimized out as
> > > unreachable and objtool has no way of knowing that.
> >
> > Since June we (GCC) have -funreachable-traps. This creates a trap insn
> > wherever control flow would otherwise go into limbo.
>
> Ah, that's interesting, though I'm not sure if we'd be able to
> distinguish between "call doesn't return" traps and other traps or
> reasons for UD2.
The trap handler can see where the trap came from. And then look up
that address in some tables or such. Just like __bug_table?
Segher
WARNING: multiple messages have this Message-ID (diff)
From: Segher Boessenkool <segher@kernel.crashing.org>
To: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
linuxppc-dev@lists.ozlabs.org,
Chen Zhongjin <chenzhongjin@huawei.com>,
x86@kernel.org, Nick Desaulniers <ndesaulniers@google.com>,
linux-kernel@vger.kernel.org, Mark Brown <broonie@kernel.org>,
Sathvika Vasireddy <sv@linux.ibm.com>,
linux-toolchains@vger.kernel.org,
Indu Bhagat <indu.bhagat@oracle.com>,
live-patching@vger.kernel.org, Miroslav Benes <mbenes@suse.cz>,
Will Deacon <will@kernel.org>, Ard Biesheuvel <ardb@kernel.org>,
linux-arm-kernel@lists.infradead.org,
"Jose E. Marchesi" <jemarch@gnu.org>, Michael Matz <matz@suse.de>
Subject: Re: [RFC] Objtool toolchain proposal: -fannotate-{jump-table,noreturn}
Date: Wed, 14 Sep 2022 07:16:20 -0500 [thread overview]
Message-ID: <20220914121620.GY25951@gate.crashing.org> (raw)
In-Reply-To: <20220914102100.thl5ad35plvazark@treble>
On Wed, Sep 14, 2022 at 11:21:00AM +0100, Josh Poimboeuf wrote:
> On Mon, Sep 12, 2022 at 06:31:14AM -0500, Segher Boessenkool wrote:
> > On Fri, Sep 09, 2022 at 11:07:04AM -0700, Josh Poimboeuf wrote:
> > > 2) Noreturn functions:
> > >
> > > There's no reliable way to determine which functions are designated
> > > by the compiler to be noreturn (either explictly via function
> > > attribute, or implicitly via a static function which is a wrapper
> > > around a noreturn function.)
> >
> > Or just a function that does not return for any other reason.
> >
> > The compiler makes no difference between functions that have the
> > attribute and functions that do not. There are good reasons to not
> > have the attribute on functions that do in fact not return. The
> > not-returningness of the function may be just an implementation
> > accident, something you do not want part of the API, so it *should* not
> > have that attribute; or you may want the callers to a function to not be
> > optimised according to this knowledge (you cannot *prevent* that, the
> > compiler can figure it out it other ways, but still) for any other
> > reason.
>
> Yes, many static functions that are wrappers around noreturn functions
> have this "implicit noreturn" property.
I meant functions that are noreturn intrinsically. The trivial example:
void f(void)
{
for (;;)
;
}
> I agree we would need to know
> about those functions (or, as Michael suggested, their call sites) as
> well.
Many "potentially does not return" functions (there are very many such
functions!) turn into "never returns" functions, for some inputs (or
something in the environment). If the compiler specialises a code path
that does not return, you'll not see that marked up any way. Of course
such a path should not be taken in the kernel, normally :-)
> > > This information is needed because the
> > > code after the call to such a function is optimized out as
> > > unreachable and objtool has no way of knowing that.
> >
> > Since June we (GCC) have -funreachable-traps. This creates a trap insn
> > wherever control flow would otherwise go into limbo.
>
> Ah, that's interesting, though I'm not sure if we'd be able to
> distinguish between "call doesn't return" traps and other traps or
> reasons for UD2.
The trap handler can see where the trap came from. And then look up
that address in some tables or such. Just like __bug_table?
Segher
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-09-14 12:28 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-09 18:07 [RFC] Objtool toolchain proposal: -fannotate-{jump-table,noreturn} Josh Poimboeuf
2022-09-09 18:07 ` Josh Poimboeuf
2022-09-09 18:07 ` Josh Poimboeuf
2022-09-11 15:26 ` Peter Zijlstra
2022-09-11 15:26 ` Peter Zijlstra
2022-09-11 15:26 ` Peter Zijlstra
2022-09-11 15:31 ` Ard Biesheuvel
2022-09-11 15:31 ` Ard Biesheuvel
2022-09-11 15:31 ` Ard Biesheuvel
2022-09-12 10:52 ` Borislav Petkov
2022-09-12 10:52 ` Borislav Petkov
2022-09-12 10:52 ` Borislav Petkov
2022-09-12 14:17 ` Michael Matz
2022-09-12 14:17 ` Michael Matz
2022-09-12 14:17 ` Michael Matz
2022-09-14 0:04 ` Josh Poimboeuf
2022-09-14 0:04 ` Josh Poimboeuf
2022-09-14 0:04 ` Josh Poimboeuf
2022-09-14 14:00 ` Peter Zijlstra
2022-09-14 14:00 ` Peter Zijlstra
2022-09-14 14:00 ` Peter Zijlstra
2022-09-14 14:28 ` Michael Matz
2022-09-14 14:28 ` Michael Matz
2022-09-14 14:28 ` Michael Matz
2022-09-14 14:55 ` Peter Zijlstra
2022-09-14 14:55 ` Peter Zijlstra
2022-09-14 14:55 ` Peter Zijlstra
2022-09-14 17:34 ` Segher Boessenkool
2022-09-14 17:34 ` Segher Boessenkool
2022-09-14 17:34 ` Segher Boessenkool
2022-09-15 2:56 ` Chen Zhongjin
2022-09-15 2:56 ` Chen Zhongjin
2022-09-15 2:56 ` Chen Zhongjin
2022-09-15 8:47 ` Peter Zijlstra
2022-09-15 8:47 ` Peter Zijlstra
2022-09-15 8:47 ` Peter Zijlstra
2022-09-20 16:49 ` Ard Biesheuvel
2022-09-20 16:49 ` Ard Biesheuvel
2022-09-20 16:49 ` Ard Biesheuvel
2022-09-21 3:16 ` Chen Zhongjin
2022-09-21 3:16 ` Chen Zhongjin
2022-09-21 3:16 ` Chen Zhongjin
2022-09-12 11:31 ` Segher Boessenkool
2022-09-12 11:31 ` Segher Boessenkool
2022-09-12 11:31 ` Segher Boessenkool
2022-09-14 10:21 ` Josh Poimboeuf
2022-09-14 10:21 ` Josh Poimboeuf
2022-09-14 10:21 ` Josh Poimboeuf
2022-09-14 12:08 ` Michael Matz
2022-09-14 12:08 ` Michael Matz
2022-09-14 12:08 ` Michael Matz
2022-09-14 12:16 ` Segher Boessenkool [this message]
2022-09-14 12:16 ` Segher Boessenkool
2022-09-14 12:16 ` Segher Boessenkool
2022-09-13 22:51 ` Indu Bhagat
2022-09-13 22:51 ` Indu Bhagat
2022-09-13 22:51 ` Indu Bhagat
2022-09-14 0:12 ` Josh Poimboeuf
2022-09-14 0:12 ` Josh Poimboeuf
2022-09-14 0:12 ` Josh Poimboeuf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220914121620.GY25951@gate.crashing.org \
--to=segher@kernel.crashing.org \
--cc=ardb@kernel.org \
--cc=broonie@kernel.org \
--cc=chenzhongjin@huawei.com \
--cc=indu.bhagat@oracle.com \
--cc=jemarch@gnu.org \
--cc=jpoimboe@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-toolchains@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=live-patching@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=matz@suse.de \
--cc=mbenes@suse.cz \
--cc=ndesaulniers@google.com \
--cc=peterz@infradead.org \
--cc=sv@linux.ibm.com \
--cc=will@kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.