diff options
author | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-05-28 05:22:04 -0400 |
---|---|---|
committer | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-06-10 20:14:08 -0400 |
commit | 5aadfdeb8de001ca04d500586e3b033404c28617 (patch) | |
tree | a430e73a414b972a4a4cb71ba98fad5af960254d /scripts/Makefile.gcc-plugins | |
parent | 6a61b70b43c9c4cbc7314bf6c8b5ba8b0d6e1e7b (diff) |
kcov: test compiler capability in Kconfig and correct dependency
As Documentation/kbuild/kconfig-language.txt notes, 'select' should be
be used with care - it forces a lower limit of another symbol, ignoring
the dependency. Currently, KCOV can select GCC_PLUGINS even if arch
does not select HAVE_GCC_PLUGINS. This could cause the unmet direct
dependency.
Now that Kconfig can test compiler capability, let's handle this in a
more sophisticated way.
There are two ways to enable KCOV; use the compiler that natively
supports -fsanitize-coverage=trace-pc, or build the SANCOV plugin if
the compiler has ability to build GCC plugins. Hence, the correct
dependency for KCOV is:
depends on CC_HAS_SANCOV_TRACE_PC || GCC_PLUGINS
You do not need to build the SANCOV plugin if the compiler already
supports -fsanitize-coverage=trace-pc. Hence, the select should be:
select GCC_PLUGIN_SANCOV if !CC_HAS_SANCOV_TRACE_PC
With this, GCC_PLUGIN_SANCOV is selected only when necessary, so
scripts/Makefile.gcc-plugins can be cleaner.
I also cleaned up Kconfig and scripts/Makefile.kcov as well.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'scripts/Makefile.gcc-plugins')
-rw-r--r-- | scripts/Makefile.gcc-plugins | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/scripts/Makefile.gcc-plugins b/scripts/Makefile.gcc-plugins index 7f5c86246138..708c8f6a5717 100644 --- a/scripts/Makefile.gcc-plugins +++ b/scripts/Makefile.gcc-plugins | |||
@@ -14,16 +14,12 @@ ifdef CONFIG_GCC_PLUGINS | |||
14 | endif | 14 | endif |
15 | 15 | ||
16 | ifdef CONFIG_GCC_PLUGIN_SANCOV | 16 | ifdef CONFIG_GCC_PLUGIN_SANCOV |
17 | ifeq ($(strip $(CFLAGS_KCOV)),) | ||
18 | # It is needed because of the gcc-plugin.sh and gcc version checks. | 17 | # It is needed because of the gcc-plugin.sh and gcc version checks. |
19 | gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV) += sancov_plugin.so | 18 | gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV) += sancov_plugin.so |
20 | 19 | ||
21 | ifneq ($(PLUGINCC),) | 20 | ifeq ($(PLUGINCC),) |
22 | CFLAGS_KCOV := $(SANCOV_PLUGIN) | ||
23 | else | ||
24 | $(warning warning: cannot use CONFIG_KCOV: -fsanitize-coverage=trace-pc is not supported by compiler) | 21 | $(warning warning: cannot use CONFIG_KCOV: -fsanitize-coverage=trace-pc is not supported by compiler) |
25 | endif | 22 | endif |
26 | endif | ||
27 | endif | 23 | endif |
28 | 24 | ||
29 | gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so | 25 | gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so |
@@ -38,7 +34,7 @@ ifdef CONFIG_GCC_PLUGINS | |||
38 | GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y)) | 34 | GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y)) |
39 | 35 | ||
40 | export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR | 36 | export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR |
41 | export SANCOV_PLUGIN DISABLE_LATENT_ENTROPY_PLUGIN | 37 | export DISABLE_LATENT_ENTROPY_PLUGIN |
42 | 38 | ||
43 | ifneq ($(PLUGINCC),) | 39 | ifneq ($(PLUGINCC),) |
44 | # SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication. | 40 | # SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication. |