Skip to content

Commit b79f34d

Browse files
committed
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
2 parents e1d009e + caefd8c commit b79f34d

File tree

5 files changed

+56
-26
lines changed

5 files changed

+56
-26
lines changed

Makefile

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -635,13 +635,6 @@ endif
635635
# Tell gcc to never replace conditional load with a non-conditional one
636636
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
637637

638-
PHONY += gcc-plugins
639-
gcc-plugins: scripts_basic
640-
ifdef CONFIG_GCC_PLUGINS
641-
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
642-
endif
643-
@:
644-
645638
include scripts/Makefile.gcc-plugins
646639

647640
ifdef CONFIG_READABLE_ASM

scripts/Kbuild.include

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,20 @@ as-option = $(call try-run,\
108108
as-instr = $(call try-run,\
109109
printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
110110

111+
# Do not attempt to build with gcc plugins during cc-option tests.
112+
# (And this uses delayed resolution so the flags will be up to date.)
113+
CC_OPTION_CFLAGS = $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS))
114+
111115
# cc-option
112116
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
113117

114118
cc-option = $(call try-run,\
115-
$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
119+
$(CC) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
116120

117121
# cc-option-yn
118122
# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
119123
cc-option-yn = $(call try-run,\
120-
$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
124+
$(CC) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
121125

122126
# cc-option-align
123127
# Prefix align with either -falign or -malign
@@ -127,7 +131,7 @@ cc-option-align = $(subst -functions=0,,\
127131
# cc-disable-warning
128132
# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
129133
cc-disable-warning = $(call try-run,\
130-
$(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
134+
$(CC) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
131135

132136
# cc-name
133137
# Expands to either gcc or clang

scripts/Makefile.gcc-plugins

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,42 @@ ifdef CONFIG_GCC_PLUGINS
1919
endif
2020
endif
2121

22-
GCC_PLUGINS_CFLAGS := $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y))
22+
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
2323

24-
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN SANCOV_PLUGIN
24+
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN GCC_PLUGIN_SUBDIR SANCOV_PLUGIN
2525

26+
ifneq ($(PLUGINCC),)
27+
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
28+
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
29+
endif
30+
31+
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
32+
GCC_PLUGIN := $(gcc-plugin-y)
33+
GCC_PLUGIN_SUBDIR := $(gcc-plugin-subdir-y)
34+
endif
35+
36+
# If plugins aren't supported, abort the build before hard-to-read compiler
37+
# errors start getting spewed by the main build.
38+
PHONY += gcc-plugins-check
39+
gcc-plugins-check: FORCE
40+
ifdef CONFIG_GCC_PLUGINS
2641
ifeq ($(PLUGINCC),)
2742
ifneq ($(GCC_PLUGINS_CFLAGS),)
2843
ifeq ($(call cc-ifversion, -ge, 0405, y), y)
29-
PLUGINCC := $(shell $(CONFIG_SHELL) -x $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)")
30-
$(warning warning: your gcc installation does not support plugins, perhaps the necessary headers are missing?)
44+
$(Q)$(srctree)/scripts/gcc-plugin.sh --show-error "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)" || true
45+
@echo "Cannot use CONFIG_GCC_PLUGINS: your gcc installation does not support plugins, perhaps the necessary headers are missing?" >&2 && exit 1
3146
else
32-
$(warning warning: your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least)
47+
@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
3348
endif
3449
endif
35-
else
36-
# SANCOV_PLUGIN can be only in CFLAGS_KCOV because avoid duplication.
37-
GCC_PLUGINS_CFLAGS := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGINS_CFLAGS))
3850
endif
51+
endif
52+
@:
3953

40-
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
41-
GCC_PLUGIN := $(gcc-plugin-y)
42-
54+
# Actually do the build, if requested.
55+
PHONY += gcc-plugins
56+
gcc-plugins: scripts_basic gcc-plugins-check
57+
ifdef CONFIG_GCC_PLUGINS
58+
$(Q)$(MAKE) $(build)=scripts/gcc-plugins
4359
endif
60+
@:

scripts/gcc-plugin.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
#!/bin/sh
22
srctree=$(dirname "$0")
3+
4+
SHOW_ERROR=
5+
if [ "$1" = "--show-error" ] ; then
6+
SHOW_ERROR=1
7+
shift || true
8+
fi
9+
310
gccplugins_dir=$($3 -print-file-name=plugin)
411
plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF
512
#include "gcc-common.h"
@@ -13,6 +20,9 @@ EOF
1320

1421
if [ $? -ne 0 ]
1522
then
23+
if [ -n "$SHOW_ERROR" ] ; then
24+
echo "${plugincc}" >&2
25+
fi
1626
exit 1
1727
fi
1828

@@ -48,4 +58,8 @@ then
4858
echo "$2"
4959
exit 0
5060
fi
61+
62+
if [ -n "$SHOW_ERROR" ] ; then
63+
echo "${plugincc}" >&2
64+
fi
5165
exit 1

scripts/gcc-plugins/Makefile

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,18 @@ else
1212
export HOST_EXTRACXXFLAGS
1313
endif
1414

15-
export GCCPLUGINS_DIR HOSTLIBS
16-
1715
ifneq ($(CFLAGS_KCOV), $(SANCOV_PLUGIN))
1816
GCC_PLUGIN := $(filter-out $(SANCOV_PLUGIN), $(GCC_PLUGIN))
1917
endif
2018

21-
$(HOSTLIBS)-y := $(GCC_PLUGIN)
19+
export HOSTLIBS
20+
21+
$(HOSTLIBS)-y := $(foreach p,$(GCC_PLUGIN),$(if $(findstring /,$(p)),,$(p)))
2222
always := $($(HOSTLIBS)-y)
2323

24-
cyc_complexity_plugin-objs := cyc_complexity_plugin.o
25-
sancov_plugin-objs := sancov_plugin.o
24+
$(foreach p,$($(HOSTLIBS)-y:%.so=%),$(eval $(p)-objs := $(p).o))
25+
26+
subdir-y := $(GCC_PLUGIN_SUBDIR)
27+
subdir- += $(GCC_PLUGIN_SUBDIR)
2628

2729
clean-files += *.so

0 commit comments

Comments
 (0)