All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ardb@kernel.org>
To: Rikard Falkeborn <rikard.falkeborn@gmail.com>,
	Arnd Bergmann <arnd@arndb.de>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>,
	Yury Norov <yury.norov@gmail.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH] linux/bits.h: Fix compilation error with GENMASK
Date: Wed, 12 May 2021 14:53:27 +0200	[thread overview]
Message-ID: <CAMj1kXF0rMwjgm27=i3XkrXJ=21C_x4he5Ls+7FSKUhsva970Q@mail.gmail.com> (raw)
In-Reply-To: <20210511203716.117010-1-rikard.falkeborn@gmail.com>

(+ Arnd)

On Tue, 11 May 2021 at 22:37, Rikard Falkeborn
<rikard.falkeborn@gmail.com> wrote:
>
> GENMASK() has an input check which uses __builtin_choose_expr() to enable
> a compile time sanity check of its inputs if they are known at compile
> time. However, it turns out that __builtin_constant_p() does not always
> return a compile time constant [0]. It was thought this problem was fixed
> with gcc 4.9 [1], but apparently this is not the case [2].
>
> Switch to use __is_constexpr() instead which always returns a compile
> time constant, regardless of its inputs.
>
> [0]: https://lore.kernel.org/lkml/42b4342b-aefc-a16a-0d43-9f9c0d63ba7a@rasmusvillemoes.dk
> [1]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=19449
> [2]: https://lore.kernel.org/lkml/1ac7bbc2-45d9-26ed-0b33-bf382b8d858b@I-love.SAKURA.ne.jp
>
> Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
> Signed-off-by: Rikard Falkeborn <rikard.falkeborn@gmail.com>
> ---
> Feedback on placing __is_constexpr() in const.h is welcome, at least the
> name is appropriate...
>
>  include/linux/bits.h        |  2 +-
>  include/linux/const.h       |  8 ++++++++
>  include/linux/minmax.h      | 10 ++--------
>  tools/include/linux/bits.h  |  2 +-
>  tools/include/linux/const.h |  8 ++++++++
>  5 files changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/include/linux/bits.h b/include/linux/bits.h
> index 7f475d59a097..87d112650dfb 100644
> --- a/include/linux/bits.h
> +++ b/include/linux/bits.h
> @@ -22,7 +22,7 @@
>  #include <linux/build_bug.h>
>  #define GENMASK_INPUT_CHECK(h, l) \
>         (BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
> -               __builtin_constant_p((l) > (h)), (l) > (h), 0)))
> +               __is_constexpr((l) > (h)), (l) > (h), 0)))
>  #else
>  /*
>   * BUILD_BUG_ON_ZERO is not available in h files included from asm files,
> diff --git a/include/linux/const.h b/include/linux/const.h
> index 81b8aae5a855..435ddd72d2c4 100644
> --- a/include/linux/const.h
> +++ b/include/linux/const.h
> @@ -3,4 +3,12 @@
>
>  #include <vdso/const.h>
>
> +/*
> + * This returns a constant expression while determining if an argument is
> + * a constant expression, most importantly without evaluating the argument.
> + * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
> + */
> +#define __is_constexpr(x) \
> +       (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
> +
>  #endif /* _LINUX_CONST_H */
> diff --git a/include/linux/minmax.h b/include/linux/minmax.h
> index c0f57b0c64d9..5433c08fcc68 100644
> --- a/include/linux/minmax.h
> +++ b/include/linux/minmax.h
> @@ -2,6 +2,8 @@
>  #ifndef _LINUX_MINMAX_H
>  #define _LINUX_MINMAX_H
>
> +#include <linux/const.h>
> +
>  /*
>   * min()/max()/clamp() macros must accomplish three things:
>   *
> @@ -17,14 +19,6 @@
>  #define __typecheck(x, y) \
>         (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
>
> -/*
> - * This returns a constant expression while determining if an argument is
> - * a constant expression, most importantly without evaluating the argument.
> - * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
> - */
> -#define __is_constexpr(x) \
> -       (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
> -
>  #define __no_side_effects(x, y) \
>                 (__is_constexpr(x) && __is_constexpr(y))
>
> diff --git a/tools/include/linux/bits.h b/tools/include/linux/bits.h
> index 7f475d59a097..87d112650dfb 100644
> --- a/tools/include/linux/bits.h
> +++ b/tools/include/linux/bits.h
> @@ -22,7 +22,7 @@
>  #include <linux/build_bug.h>
>  #define GENMASK_INPUT_CHECK(h, l) \
>         (BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
> -               __builtin_constant_p((l) > (h)), (l) > (h), 0)))
> +               __is_constexpr((l) > (h)), (l) > (h), 0)))
>  #else
>  /*
>   * BUILD_BUG_ON_ZERO is not available in h files included from asm files,
> diff --git a/tools/include/linux/const.h b/tools/include/linux/const.h
> index 81b8aae5a855..435ddd72d2c4 100644
> --- a/tools/include/linux/const.h
> +++ b/tools/include/linux/const.h
> @@ -3,4 +3,12 @@
>
>  #include <vdso/const.h>
>
> +/*
> + * This returns a constant expression while determining if an argument is
> + * a constant expression, most importantly without evaluating the argument.
> + * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
> + */
> +#define __is_constexpr(x) \
> +       (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
> +
>  #endif /* _LINUX_CONST_H */
> --
> 2.31.1
>

  reply	other threads:[~2021-05-12 12:55 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-11 20:37 [PATCH] linux/bits.h: Fix compilation error with GENMASK Rikard Falkeborn
2021-05-12 12:53 ` Ard Biesheuvel [this message]
2021-05-20 18:46   ` Rikard Falkeborn
2021-05-20 19:44     ` Yury Norov
2021-05-20 20:15       ` Arnd Bergmann
2021-05-20 20:41 ` Andrew Morton
2021-05-21 11:59   ` Andy Shevchenko
2021-05-21 10:15 ` Andy Shevchenko

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='CAMj1kXF0rMwjgm27=i3XkrXJ=21C_x4he5Ls+7FSKUhsva970Q@mail.gmail.com' \
    --to=ardb@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=arnd@arndb.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=peterz@infradead.org \
    --cc=rikard.falkeborn@gmail.com \
    --cc=yury.norov@gmail.com \
    /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.