| From: Frantisek Hrbata <fhrbata@redhat.com> |
| Date: Tue, 12 Nov 2013 15:11:27 -0800 |
| Subject: gcov: compile specific gcov implementation based on gcc version |
| |
| commit 17c568d60af5a810208baf116dc174a2005c6c3e upstream. |
| |
| Compile the correct gcov implementation file for the specific gcc version. |
| |
| Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com> |
| Cc: Jan Stancek <jstancek@redhat.com> |
| Cc: Kees Cook <keescook@chromium.org> |
| Acked-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> |
| Cc: Rusty Russell <rusty@rustcorp.com.au> |
| Cc: Arnd Bergmann <arnd@arndb.de> |
| Cc: Andy Gospodarek <agospoda@redhat.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| Documentation/gcov.txt | 4 ++++ |
| kernel/gcov/Kconfig | 30 ++++++++++++++++++++++++++++++ |
| kernel/gcov/Makefile | 32 +++++++++++++++++++++++++++++++- |
| 3 files changed, 65 insertions(+), 1 deletion(-) |
| |
| --- a/Documentation/gcov.txt |
| +++ b/Documentation/gcov.txt |
| @@ -50,6 +50,10 @@ Configure the kernel with: |
| CONFIG_DEBUG_FS=y |
| CONFIG_GCOV_KERNEL=y |
| |
| +select the gcc's gcov format, default is autodetect based on gcc version: |
| + |
| + CONFIG_GCOV_FORMAT_AUTODETECT=y |
| + |
| and to get coverage data for the entire kernel: |
| |
| CONFIG_GCOV_PROFILE_ALL=y |
| --- a/kernel/gcov/Kconfig |
| +++ b/kernel/gcov/Kconfig |
| @@ -46,4 +46,34 @@ config GCOV_PROFILE_ALL |
| larger and run slower. Also be sure to exclude files from profiling |
| which are not linked to the kernel image to prevent linker errors. |
| |
| +choice |
| + prompt "Specify GCOV format" |
| + depends on GCOV_KERNEL |
| + default GCOV_FORMAT_AUTODETECT |
| + ---help--- |
| + The gcov format is usually determined by the GCC version, but there are |
| + exceptions where format changes are integrated in lower-version GCCs. |
| + In such a case use this option to adjust the format used in the kernel |
| + accordingly. |
| + |
| + If unsure, choose "Autodetect". |
| + |
| +config GCOV_FORMAT_AUTODETECT |
| + bool "Autodetect" |
| + ---help--- |
| + Select this option to use the format that corresponds to your GCC |
| + version. |
| + |
| +config GCOV_FORMAT_3_4 |
| + bool "GCC 3.4 format" |
| + ---help--- |
| + Select this option to use the format defined by GCC 3.4. |
| + |
| +config GCOV_FORMAT_4_7 |
| + bool "GCC 4.7 format" |
| + ---help--- |
| + Select this option to use the format defined by GCC 4.7. |
| + |
| +endchoice |
| + |
| endmenu |
| --- a/kernel/gcov/Makefile |
| +++ b/kernel/gcov/Makefile |
| @@ -1,3 +1,33 @@ |
| ccflags-y := -DSRCTREE='"$(srctree)"' -DOBJTREE='"$(objtree)"' |
| |
| -obj-$(CONFIG_GCOV_KERNEL) := base.o fs.o gcc_3_4.o |
| +# if-lt |
| +# Usage VAR := $(call if-lt, $(a), $(b)) |
| +# Returns 1 if (a < b) |
| +if-lt = $(shell [ $(1) -lt $(2) ] && echo 1) |
| + |
| +ifeq ($(CONFIG_GCOV_FORMAT_3_4),y) |
| + cc-ver := 0304 |
| +else ifeq ($(CONFIG_GCOV_FORMAT_4_7),y) |
| + cc-ver := 0407 |
| +else |
| +# Use cc-version if available, otherwise set 0 |
| +# |
| +# scripts/Kbuild.include, which contains cc-version function, is not included |
| +# during make clean "make -f scripts/Makefile.clean obj=kernel/gcov" |
| +# Meaning cc-ver is empty causing if-lt test to fail with |
| +# "/bin/sh: line 0: [: -lt: unary operator expected" error mesage. |
| +# This has no affect on the clean phase, but the error message could be |
| +# confusing/annoying. So this dummy workaround sets cc-ver to zero if cc-version |
| +# is not available. We can probably move if-lt to Kbuild.include, so it's also |
| +# not defined during clean or to include Kbuild.include in |
| +# scripts/Makefile.clean. But the following workaround seems least invasive. |
| + cc-ver := $(if $(call cc-version),$(call cc-version),0) |
| +endif |
| + |
| +obj-$(CONFIG_GCOV_KERNEL) := base.o fs.o |
| + |
| +ifeq ($(call if-lt, $(cc-ver), 0407),1) |
| + obj-$(CONFIG_GCOV_KERNEL) += gcc_3_4.o |
| +else |
| + obj-$(CONFIG_GCOV_KERNEL) += gcc_4_7.o |
| +endif |