Skip to content

Commit

Permalink
gcov: compile specific gcov implementation based on gcc version
Browse files Browse the repository at this point in the history
Compile the correct gcov implementation file for the specific gcc version.

Signed-off-by: Frantisek Hrbata <[email protected]>
Cc: Jan Stancek <[email protected]>
Cc: Kees Cook <[email protected]>
Acked-by: Peter Oberparleiter <[email protected]>
Cc: Rusty Russell <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Andy Gospodarek <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Frantisek Hrbata authored and torvalds committed Nov 13, 2013
1 parent 5f41ea0 commit 17c568d
Showing 3 changed files with 65 additions and 1 deletion.
4 changes: 4 additions & 0 deletions Documentation/gcov.txt
Original file line number Diff line number Diff line change
@@ -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
30 changes: 30 additions & 0 deletions kernel/gcov/Kconfig
Original file line number Diff line number Diff line change
@@ -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
32 changes: 31 additions & 1 deletion kernel/gcov/Makefile
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 17c568d

Please sign in to comment.