public inbox for linux-arm-kernel@lists.infradead.org 
 help / color / mirror / Atom feed
* [PATCH v2 00/21] kconfig: move compiler capability tests to Kconfig
@ 2018-03-27  5:29 Masahiro Yamada
  2018-03-27  5:29 ` [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 " Masahiro Yamada
  2018-03-27 16:39 ` [PATCH v2 00/21] kconfig: move compiler capability tests " Masahiro Yamada
  0 siblings, 2 replies; 5+ messages in thread
From: Masahiro Yamada @ 2018-03-27  5:29 UTC (permalink / raw)
  To: linux-arm-kernel


Here is v2 to start to move compiler capability tests to Kconfig.

V1:
https://lkml.org/lkml/2018/2/16/610

I brushed up the implementation even more.

Major changes for v2:
[1] Environments and functions are expanded in the lexer (zconf.l)
    The parser (zconf.y) receives expanded tokens.  This simplifies
    the implementation.

[2] Implement only one built-in function 'shell'.  This returns
    stdout from the command.  We need something to return 'y' or 'n'.
    This is now implemented as a macro 'success'.

[3] Macros (user-defined function) are defined by 'macro' keyword
    instead of string type symbol.

    ex1) macro success $(shell ($(1) && echo y) || echo n)
    ex2) macro cc-option $(success $CC -Werror $(1) -c -x c /dev/null -o /dev/null)

My plan for v3
--------------

The MW is approaching, but I'd like to make it more lovely if
I have some time.

While I was writing these patches, I noticed a kind of similarity
between Makefile and Kconfig.

Makefile can define variables and functions to do text processing
during the parse phase.  After parsing, it builds up dependency
graph, and moves on to the execution phase.  Then, it generates
objects as needed by checking time-stamps.

[Makefile]

  OBJ := foo.o
  SRC := foo.c
  CC := gcc

  $(OBJ): $(SRC)
            $(CC) -c -o $(OBJ) $(SRC)

[Makefile after text processing]

  foo.o: foo.c
          gcc -c -o foo.o foo.c

Now, we are adding tools for text processing to Kconfig.  Functions
are statically expanded by the lexer.  After all source files are
parsed, Kconfig moves on to the evaluation phase.  Then, users can
tweak symbol values from menus.

So, we should be able to describe Kconfig like follows:

[Kconfig]

   MY_SYMBOL := CC_STACKPROTECTOR
   MY_PROMPT := "Stackprotector"
   success = $(shell ($(1) && echo y) || echo n)
   cc-option = $(success $CC -Werror $(1) -c -x c /dev/null -o /dev/null)

   config $(MY_SYMBOL)
           bool $(MY_PROMPT)
           depends on $(cc-option -fstack-protector)

[Kconfig after text processing]

   config CC_STACKPROTECTOR
           bool "Stackptector"
           depends on y

So, I think it is better to use '=' assignment for defining functions.
I will remove the 'macro' keyword.
Also, support variables.  A variable is a function with no argument.
So, it will be easy to implement it as a sub-set of function feature.
It is better to support two flavors of assignments, '=' and ':=' as well.

Masahiro Yamada (21):
  kbuild: remove kbuild cache
  kbuild: remove CONFIG_CROSS_COMPILE support
  kconfig: move and rename sym_expand_string_value()
  kconfig: reference environments directly and remove 'option env='
    syntax
  kconfig: remove string expansion in file_lookup()
  kconfig: remove string expansion for mainmenu after yyparse()
  kconfig: add function support and implement 'shell' function
  kconfig: replace $UNAME_RELEASE with function call
  kconfig: add 'macro' keyword to support user-defined function
  kconfig: add 'success' and 'cc-option' macros
  stack-protector: test compiler capability in Kconfig and drop AUTO
    mode
  kconfig: show compiler version text in the top comment
  kconfig: add CC_IS_GCC and GCC_VERSION
  kconfig: add CC_IS_CLANG and CLANG_VERSION
  gcov: remove CONFIG_GCOV_FORMAT_AUTODETECT
  kcov: imply GCC_PLUGINS and GCC_PLUGIN_SANCOV instead of select'ing
    them
  gcc-plugins: always build plugins with C++
  gcc-plugins: move GCC version check for PowerPC to Kconfig
  gcc-plugins: test GCC plugin support in Kconfig
  gcc-plugins: enable GCC_PLUGINS for COMPILE_TEST
  arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig

 Documentation/kbuild/kconfig-language.txt |   8 --
 Kconfig                                   |   4 +-
 Makefile                                  | 103 ++------------
 arch/Kconfig                              |  37 ++---
 arch/arm64/Kconfig                        |   1 +
 arch/arm64/Makefile                       |   2 -
 arch/powerpc/Kconfig                      |   2 +-
 arch/sh/Kconfig                           |   4 +-
 arch/sparc/Kconfig                        |   4 +-
 arch/tile/Kconfig                         |   2 +-
 arch/um/Kconfig.common                    |   4 -
 arch/x86/Kconfig                          |  12 +-
 arch/x86/um/Kconfig                       |   4 +-
 init/Kconfig                              |  44 +++---
 kernel/gcov/Kconfig                       |  17 +--
 kernel/gcov/Makefile                      |   2 -
 lib/Kconfig.debug                         |   7 +-
 scripts/Kbuild.include                    | 101 ++------------
 scripts/Makefile.gcc-plugins              |  95 ++++---------
 scripts/clang-version.sh                  |  24 ++--
 scripts/gcc-plugin.sh                     |  37 +----
 scripts/gcc-plugins/Makefile              |  15 +-
 scripts/gcc-x86_32-has-stack-protector.sh |   7 +-
 scripts/gcc-x86_64-has-stack-protector.sh |   5 -
 scripts/kconfig/confdata.c                |  31 +---
 scripts/kconfig/env.c                     |  95 +++++++++++++
 scripts/kconfig/function.c                | 225 ++++++++++++++++++++++++++++++
 scripts/kconfig/kconf_id.c                |   1 -
 scripts/kconfig/lkc.h                     |   9 +-
 scripts/kconfig/lkc_proto.h               |   7 +-
 scripts/kconfig/menu.c                    |   3 -
 scripts/kconfig/symbol.c                  | 109 ---------------
 scripts/kconfig/util.c                    |  96 ++++++++++---
 scripts/kconfig/zconf.l                   |  51 ++++++-
 scripts/kconfig/zconf.y                   |  35 ++---
 35 files changed, 608 insertions(+), 595 deletions(-)
 create mode 100644 scripts/kconfig/env.c
 create mode 100644 scripts/kconfig/function.c

-- 
2.7.4

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig
  2018-03-27  5:29 [PATCH v2 00/21] kconfig: move compiler capability tests to Kconfig Masahiro Yamada
@ 2018-03-27  5:29 ` Masahiro Yamada
  2018-03-27 17:28   ` Will Deacon
  2018-03-28 11:55   ` Kees Cook
  2018-03-27 16:39 ` [PATCH v2 00/21] kconfig: move compiler capability tests " Masahiro Yamada
  1 sibling, 2 replies; 5+ messages in thread
From: Masahiro Yamada @ 2018-03-27  5:29 UTC (permalink / raw)
  To: linux-arm-kernel

This becomes much neater in Kconfig.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext•com>
---

Changes in v2:
  - Newly added

 arch/arm64/Kconfig  | 1 +
 arch/arm64/Makefile | 2 --
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 7381eeb..0c97f40 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -43,6 +43,7 @@ config ARM64
 	select ARCH_USE_QUEUED_RWLOCKS
 	select ARCH_SUPPORTS_MEMORY_FAILURE
 	select ARCH_SUPPORTS_ATOMIC_RMW
+	select ARCH_SUPPORTS_INT128 if GCC_VERSION >= 50000
 	select ARCH_SUPPORTS_NUMA_BALANCING
 	select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
 	select ARCH_WANT_FRAME_POINTERS
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index b481b4a..7318165 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -57,8 +57,6 @@ KBUILD_AFLAGS	+= $(lseinstr) $(brokengasinst)
 KBUILD_CFLAGS	+= $(call cc-option,-mabi=lp64)
 KBUILD_AFLAGS	+= $(call cc-option,-mabi=lp64)
 
-KBUILD_CFLAGS	+= $(call cc-ifversion, -ge, 0500, -DCONFIG_ARCH_SUPPORTS_INT128)
-
 ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
 KBUILD_CPPFLAGS	+= -mbig-endian
 CHECKFLAGS	+= -D__AARCH64EB__
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 00/21] kconfig: move compiler capability tests to Kconfig
  2018-03-27  5:29 [PATCH v2 00/21] kconfig: move compiler capability tests to Kconfig Masahiro Yamada
  2018-03-27  5:29 ` [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 " Masahiro Yamada
@ 2018-03-27 16:39 ` Masahiro Yamada
  1 sibling, 0 replies; 5+ messages in thread
From: Masahiro Yamada @ 2018-03-27 16:39 UTC (permalink / raw)
  To: linux-arm-kernel

2018-03-27 14:29 GMT+09:00 Masahiro Yamada <yamada.masahiro@socionext•com>:
>
> Here is v2 to start to move compiler capability tests to Kconfig.
>
> V1:
> https://lkml.org/lkml/2018/2/16/610
>
> I brushed up the implementation even more.
>
> Major changes for v2:
> [1] Environments and functions are expanded in the lexer (zconf.l)
>     The parser (zconf.y) receives expanded tokens.  This simplifies
>     the implementation.
>
> [2] Implement only one built-in function 'shell'.  This returns
>     stdout from the command.  We need something to return 'y' or 'n'.
>     This is now implemented as a macro 'success'.
>
> [3] Macros (user-defined function) are defined by 'macro' keyword
>     instead of string type symbol.
>
>     ex1) macro success $(shell ($(1) && echo y) || echo n)
>     ex2) macro cc-option $(success $CC -Werror $(1) -c -x c /dev/null -o /dev/null)
>
> My plan for v3
> --------------
>
> The MW is approaching, but I'd like to make it more lovely if
> I have some time.
>
> While I was writing these patches, I noticed a kind of similarity
> between Makefile and Kconfig.
>
> Makefile can define variables and functions to do text processing
> during the parse phase.  After parsing, it builds up dependency
> graph, and moves on to the execution phase.  Then, it generates
> objects as needed by checking time-stamps.
>
> [Makefile]
>
>   OBJ := foo.o
>   SRC := foo.c
>   CC := gcc
>
>   $(OBJ): $(SRC)
>             $(CC) -c -o $(OBJ) $(SRC)
>
> [Makefile after text processing]
>
>   foo.o: foo.c
>           gcc -c -o foo.o foo.c
>
> Now, we are adding tools for text processing to Kconfig.  Functions
> are statically expanded by the lexer.  After all source files are
> parsed, Kconfig moves on to the evaluation phase.  Then, users can
> tweak symbol values from menus.
>
> So, we should be able to describe Kconfig like follows:
>
> [Kconfig]
>
>    MY_SYMBOL := CC_STACKPROTECTOR
>    MY_PROMPT := "Stackprotector"
>    success = $(shell ($(1) && echo y) || echo n)
>    cc-option = $(success $CC -Werror $(1) -c -x c /dev/null -o /dev/null)
>
>    config $(MY_SYMBOL)
>            bool $(MY_PROMPT)
>            depends on $(cc-option -fstack-protector)
>
> [Kconfig after text processing]
>
>    config CC_STACKPROTECTOR
>            bool "Stackptector"
>            depends on y
>
> So, I think it is better to use '=' assignment for defining functions.
> I will remove the 'macro' keyword.
> Also, support variables.  A variable is a function with no argument.
> So, it will be easy to implement it as a sub-set of function feature.
> It is better to support two flavors of assignments, '=' and ':=' as well.
>
> Masahiro Yamada (21):
>   kbuild: remove kbuild cache
>   kbuild: remove CONFIG_CROSS_COMPILE support
>   kconfig: move and rename sym_expand_string_value()
>   kconfig: reference environments directly and remove 'option env='
>     syntax
>   kconfig: remove string expansion in file_lookup()
>   kconfig: remove string expansion for mainmenu after yyparse()
>   kconfig: add function support and implement 'shell' function
>   kconfig: replace $UNAME_RELEASE with function call
>   kconfig: add 'macro' keyword to support user-defined function
>   kconfig: add 'success' and 'cc-option' macros
>   stack-protector: test compiler capability in Kconfig and drop AUTO
>     mode
>   kconfig: show compiler version text in the top comment
>   kconfig: add CC_IS_GCC and GCC_VERSION
>   kconfig: add CC_IS_CLANG and CLANG_VERSION
>   gcov: remove CONFIG_GCOV_FORMAT_AUTODETECT
>   kcov: imply GCC_PLUGINS and GCC_PLUGIN_SANCOV instead of select'ing
>     them
>   gcc-plugins: always build plugins with C++
>   gcc-plugins: move GCC version check for PowerPC to Kconfig
>   gcc-plugins: test GCC plugin support in Kconfig
>   gcc-plugins: enable GCC_PLUGINS for COMPILE_TEST
>   arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig
>
>  Documentation/kbuild/kconfig-language.txt |   8 --
>  Kconfig                                   |   4 +-
>  Makefile                                  | 103 ++------------
>  arch/Kconfig                              |  37 ++---
>  arch/arm64/Kconfig                        |   1 +
>  arch/arm64/Makefile                       |   2 -
>  arch/powerpc/Kconfig                      |   2 +-
>  arch/sh/Kconfig                           |   4 +-
>  arch/sparc/Kconfig                        |   4 +-
>  arch/tile/Kconfig                         |   2 +-
>  arch/um/Kconfig.common                    |   4 -
>  arch/x86/Kconfig                          |  12 +-
>  arch/x86/um/Kconfig                       |   4 +-
>  init/Kconfig                              |  44 +++---
>  kernel/gcov/Kconfig                       |  17 +--
>  kernel/gcov/Makefile                      |   2 -
>  lib/Kconfig.debug                         |   7 +-
>  scripts/Kbuild.include                    | 101 ++------------
>  scripts/Makefile.gcc-plugins              |  95 ++++---------
>  scripts/clang-version.sh                  |  24 ++--
>  scripts/gcc-plugin.sh                     |  37 +----
>  scripts/gcc-plugins/Makefile              |  15 +-
>  scripts/gcc-x86_32-has-stack-protector.sh |   7 +-
>  scripts/gcc-x86_64-has-stack-protector.sh |   5 -
>  scripts/kconfig/confdata.c                |  31 +---
>  scripts/kconfig/env.c                     |  95 +++++++++++++
>  scripts/kconfig/function.c                | 225 ++++++++++++++++++++++++++++++
>  scripts/kconfig/kconf_id.c                |   1 -
>  scripts/kconfig/lkc.h                     |   9 +-
>  scripts/kconfig/lkc_proto.h               |   7 +-
>  scripts/kconfig/menu.c                    |   3 -
>  scripts/kconfig/symbol.c                  | 109 ---------------
>  scripts/kconfig/util.c                    |  96 ++++++++++---
>  scripts/kconfig/zconf.l                   |  51 ++++++-
>  scripts/kconfig/zconf.y                   |  35 ++---
>  35 files changed, 608 insertions(+), 595 deletions(-)
>  create mode 100644 scripts/kconfig/env.c
>  create mode 100644 scripts/kconfig/function.c
>
> --
> 2.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



For convenience, the whole of this series is available at
the following branch.

git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git
 kconfig-shell-v2


-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig
  2018-03-27  5:29 ` [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 " Masahiro Yamada
@ 2018-03-27 17:28   ` Will Deacon
  2018-03-28 11:55   ` Kees Cook
  1 sibling, 0 replies; 5+ messages in thread
From: Will Deacon @ 2018-03-27 17:28 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Mar 27, 2018 at 02:29:35PM +0900, Masahiro Yamada wrote:
> This becomes much neater in Kconfig.
> 
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext•com>
> ---
> 
> Changes in v2:
>   - Newly added
> 
>  arch/arm64/Kconfig  | 1 +
>  arch/arm64/Makefile | 2 --
>  2 files changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 7381eeb..0c97f40 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -43,6 +43,7 @@ config ARM64
>  	select ARCH_USE_QUEUED_RWLOCKS
>  	select ARCH_SUPPORTS_MEMORY_FAILURE
>  	select ARCH_SUPPORTS_ATOMIC_RMW
> +	select ARCH_SUPPORTS_INT128 if GCC_VERSION >= 50000
>  	select ARCH_SUPPORTS_NUMA_BALANCING
>  	select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
>  	select ARCH_WANT_FRAME_POINTERS
> diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> index b481b4a..7318165 100644
> --- a/arch/arm64/Makefile
> +++ b/arch/arm64/Makefile
> @@ -57,8 +57,6 @@ KBUILD_AFLAGS	+= $(lseinstr) $(brokengasinst)
>  KBUILD_CFLAGS	+= $(call cc-option,-mabi=lp64)
>  KBUILD_AFLAGS	+= $(call cc-option,-mabi=lp64)
>  
> -KBUILD_CFLAGS	+= $(call cc-ifversion, -ge, 0500, -DCONFIG_ARCH_SUPPORTS_INT128)
> -

If this does what it claims to do, then I agree that it's much cleaner!

Acked-by: Will Deacon <will.deacon@arm•com>

Will

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig
  2018-03-27  5:29 ` [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 " Masahiro Yamada
  2018-03-27 17:28   ` Will Deacon
@ 2018-03-28 11:55   ` Kees Cook
  1 sibling, 0 replies; 5+ messages in thread
From: Kees Cook @ 2018-03-28 11:55 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Mar 26, 2018 at 10:29 PM, Masahiro Yamada
<yamada.masahiro@socionext•com> wrote:
> This becomes much neater in Kconfig.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext•com>

Is there a reason this doesn't have a cc-option test, or was this a
silent addition to the compiler? (And as such, should there be a
comment for this in the Kconfig?)

Regardless:

Reviewed-by: Kees Cook <keescook@chromium•org>

-Kees

-- 
Kees Cook
Pixel Security

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-03-28 11:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-03-27  5:29 [PATCH v2 00/21] kconfig: move compiler capability tests to Kconfig Masahiro Yamada
2018-03-27  5:29 ` [PATCH v2 21/21] arm64: move GCC version check for ARCH_SUPPORTS_INT128 " Masahiro Yamada
2018-03-27 17:28   ` Will Deacon
2018-03-28 11:55   ` Kees Cook
2018-03-27 16:39 ` [PATCH v2 00/21] kconfig: move compiler capability tests " Masahiro Yamada

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox