Several fixes/improvements for the gcc plugin infrastructure:
- Fixes a problem with gcc plugins interfering with cc-option tests. - Aborts more gracefully when gcc plugin headers or compiler support is missing. - Improves the gcc plugin rule generation to be more dynamic, pass arguments, and build from subdirectories. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Kees Cook <kees@outflux.net> iQIbBAABCgAGBQJXqSsEAAoJEIly9N/cbcAmf+gP+LkBnio5aJrhQwsw2pJ44xC+ XTYeypDJswjA2EZsCLJXRFkRr46/SDUXF9sE428o/i47udglOPDyvRtb4/yekBTC ao9INrXqmpfkwM2QAZRQH6bTDmxoJF4/u1Z+KgF0e2CX+23ZEUjNVuQwsGcBWGJ8 ktvF3agyT/Of97scbiKmxmbyvGF4lqCdEUWr2Aq0kYd2XKRzKvDO5JvqB+Sz7uWQ ipy4GdcVgEJG6XyjirEyneqcH4Kp0XLf7pYV4V8cdBm1ORBx7igLVgm1mnPwIiAH xzlRLD/CHG8bLttvd/6iJ3RvTUYhoBFzfiijH4CTKEd/M7wWqzXhdQEGChvD1OCS DJIrZZZfWP+9IfPMdFBuq3eZ7O5wyroQf8n8jbF2Nql3qZfWy8CeNTwINxCivEHs PJnXMiug8yNuBBiXagKNlAVUb91ij/VzsQ0Zikh7wQB6odOi680p16xEUrvoNC5V H+zST1Ep+BI8O7WiYPH3YyoDZtIJcPGYLT4j0ZGY7U3UrPAgF5Wnu6pcCHDD6Azl zisde72+DWcUXTsIdFLvK1lvy4aC2lkgyqBwTvUQ8s4O0IDymywo+WacuCk1JURL 5dkGsRT8Q31XOvJjp7rf4NZvB8blwHFkwTR4yB5qjiTVCl8x2d+xfq2tDxLw60MT d/R0RGahDEBddJwmN04= =Jwmy -----END PGP SIGNATURE----- Merge tag 'gcc-plugin-infrastructure-v4.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux Pull gcc plugin improvements from Kees Cook: "Several fixes/improvements for the gcc plugin infrastructure: - fix a problem with gcc plugins interfering with cc-option tests. - abort more gracefully when gcc plugin headers or compiler support is missing. - improve the gcc plugin rule generation to be more dynamic, pass arguments, and build from subdirectories" * tag 'gcc-plugin-infrastructure-v4.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: gcc-plugins: Add support for plugin subdirectories gcc-plugins: Automate make rule generation gcc-plugins: Add support for passing plugin arguments gcc-plugins: abort builds cleanly when not supported kbuild: no gcc-plugins during cc-option tests
This commit is contained in:
Коммит
b79f34d6ae
7
Makefile
7
Makefile
|
@ -635,13 +635,6 @@ endif
|
||||||
# Tell gcc to never replace conditional load with a non-conditional one
|
# Tell gcc to never replace conditional load with a non-conditional one
|
||||||
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
|
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
|
||||||
|
|
||||||
PHONY += gcc-plugins
|
|
||||||
gcc-plugins: scripts_basic
|
|
||||||
ifdef CONFIG_GCC_PLUGINS
|
|
||||||
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
|
|
||||||
endif
|
|
||||||
@:
|
|
||||||
|
|
||||||
include scripts/Makefile.gcc-plugins
|
include scripts/Makefile.gcc-plugins
|
||||||
|
|
||||||
ifdef CONFIG_READABLE_ASM
|
ifdef CONFIG_READABLE_ASM
|
||||||
|
|
|
@ -108,16 +108,20 @@ as-option = $(call try-run,\
|
||||||
as-instr = $(call try-run,\
|
as-instr = $(call try-run,\
|
||||||
printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
|
printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
|
||||||
|
|
||||||
|
# Do not attempt to build with gcc plugins during cc-option tests.
|
||||||
|
# (And this uses delayed resolution so the flags will be up to date.)
|
||||||
|
CC_OPTION_CFLAGS = $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS))
|
||||||
|
|
||||||
# cc-option
|
# cc-option
|
||||||
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
|
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
|
||||||
|
|
||||||
cc-option = $(call try-run,\
|
cc-option = $(call try-run,\
|
||||||
$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
|
$(CC) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
|
||||||
|
|
||||||
# cc-option-yn
|
# cc-option-yn
|
||||||
# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
|
# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
|
||||||
cc-option-yn = $(call try-run,\
|
cc-option-yn = $(call try-run,\
|
||||||
$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
|
$(CC) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
|
||||||
|
|
||||||
# cc-option-align
|
# cc-option-align
|
||||||
# Prefix align with either -falign or -malign
|
# Prefix align with either -falign or -malign
|
||||||
|
@ -127,7 +131,7 @@ cc-option-align = $(subst -functions=0,,\
|
||||||
# cc-disable-warning
|
# cc-disable-warning
|
||||||
# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
|
# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
|
||||||
cc-disable-warning = $(call try-run,\
|
cc-disable-warning = $(call try-run,\
|
||||||
$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
|
$(CC) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
|
||||||
|
|
||||||
# cc-name
|
# cc-name
|
||||||
# Expands to either gcc or clang
|
# Expands to either gcc or clang
|
||||||
|
|
|
@ -19,25 +19,42 @@ ifdef CONFIG_GCC_PLUGINS
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
GCC_PLUGINS_CFLAGS := $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y))
|
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
|
||||||
|
|
||||||
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN
|
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR SANCOV_PLUGIN
|
||||||
|
|
||||||
ifeq ($(PLUGINCC),)
|
ifneq ($(PLUGINCC),)
|
||||||
ifneq ($(GCC_PLUGINS_CFLAGS),)
|
|
||||||
ifeq ($(call cc-ifversion, -ge, 0405, y), y)
|
|
||||||
PLUGINCC := $(shell $(CONFIG_SHELL) -x $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)")
|
|
||||||
$(warning warning: your gcc installation does not support plugins, perhaps the necessary headers are missing?)
|
|
||||||
else
|
|
||||||
$(warning warning: your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
|
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
|
||||||
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
|
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
|
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
|
||||||
GCC_PLUGIN := $(gcc-plugin-y)
|
GCC_PLUGIN := $(gcc-plugin-y)
|
||||||
|
GCC_PLUGIN_SUBDIR := $(gcc-plugin-subdir-y)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# If plugins aren't supported, abort the build before hard-to-read compiler
|
||||||
|
# errors start getting spewed by the main build.
|
||||||
|
PHONY += gcc-plugins-check
|
||||||
|
gcc-plugins-check: FORCE
|
||||||
|
ifdef CONFIG_GCC_PLUGINS
|
||||||
|
ifeq ($(PLUGINCC),)
|
||||||
|
ifneq ($(GCC_PLUGINS_CFLAGS),)
|
||||||
|
ifeq ($(call cc-ifversion, -ge, 0405, y), y)
|
||||||
|
$(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
|
||||||
|
@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
|
||||||
|
else
|
||||||
|
@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc version does not support plugins, you should upgrade it to at least gcc 4.5" >&2 && exit 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
@:
|
||||||
|
|
||||||
|
# Actually do the build, if requested.
|
||||||
|
PHONY += gcc-plugins
|
||||||
|
gcc-plugins: scripts_basic gcc-plugins-check
|
||||||
|
ifdef CONFIG_GCC_PLUGINS
|
||||||
|
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
|
||||||
|
endif
|
||||||
|
@:
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
srctree=$(dirname "$0")
|
srctree=$(dirname "$0")
|
||||||
|
|
||||||
|
SHOW_ERROR=
|
||||||
|
if [ "$1" = "--show-error" ] ; then
|
||||||
|
SHOW_ERROR=1
|
||||||
|
shift || true
|
||||||
|
fi
|
||||||
|
|
||||||
gccplugins_dir=$($3 -print-file-name=plugin)
|
gccplugins_dir=$($3 -print-file-name=plugin)
|
||||||
plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF
|
plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF
|
||||||
#include "gcc-common.h"
|
#include "gcc-common.h"
|
||||||
|
@ -13,6 +20,9 @@ EOF
|
||||||
|
|
||||||
if [ $? -ne 0 ]
|
if [ $? -ne 0 ]
|
||||||
then
|
then
|
||||||
|
if [ -n "$SHOW_ERROR" ] ; then
|
||||||
|
echo "${plugincc}" >&2
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -48,4 +58,8 @@ then
|
||||||
echo "$2"
|
echo "$2"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -n "$SHOW_ERROR" ] ; then
|
||||||
|
echo "${plugincc}" >&2
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
@ -12,16 +12,18 @@ else
|
||||||
export HOST_EXTRACXXFLAGS
|
export HOST_EXTRACXXFLAGS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
export GCCPLUGINS_DIR HOSTLIBS
|
|
||||||
|
|
||||||
ifneq ($(CFLAGS_KCOV), $(SANCOV_PLUGIN))
|
ifneq ($(CFLAGS_KCOV), $(SANCOV_PLUGIN))
|
||||||
GCC_PLUGIN := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGIN))
|
GCC_PLUGIN := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGIN))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(HOSTLIBS)-y := $(GCC_PLUGIN)
|
export HOSTLIBS
|
||||||
|
|
||||||
|
$(HOSTLIBS)-y := $(foreach p,$(GCC_PLUGIN),$(if $(findstring /,$(p)),,$(p)))
|
||||||
always := $($(HOSTLIBS)-y)
|
always := $($(HOSTLIBS)-y)
|
||||||
|
|
||||||
cyc_complexity_plugin-objs := cyc_complexity_plugin.o
|
$(foreach p,$($(HOSTLIBS)-y:%.so=%),$(eval $(p)-objs := $(p).o))
|
||||||
sancov_plugin-objs := sancov_plugin.o
|
|
||||||
|
subdir-y := $(GCC_PLUGIN_SUBDIR)
|
||||||
|
subdir- += $(GCC_PLUGIN_SUBDIR)
|
||||||
|
|
||||||
clean-files += *.so
|
clean-files += *.so
|
||||||
|
|
Загрузка…
Ссылка в новой задаче