[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v5] xen: debug: gcov: add condition coverage support



On Wed, 9 Apr 2025, Volodymyr Babchuk wrote:
> Condition coverage, also known as MC/DC (modified condition/decision
> coverage) is a coverage metric that tracks separate outcomes in
> boolean expressions.
> 
> This patch adds CONFIG_CONDITION_COVERAGE option to enable MC/DC for
> GCC. Clang is not supported right now because Xen can't emit version
> 10 of LLVM profile data, where MC/DC support was added.
> 
> Also, use the opportunity to convert COV_FLAGS to cov-cflags-y, which
> reduces amount of ifeqs in Rules.mk. Otherwise this patch had to add
> another nesting level with "ifeq ($(CONFIG_CONDITION_COVERAGE),y)".
> 
> Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


> ---
> Changes in v5:
>  - cov-flags-y -> cov-cflags-y
>  - Clarified why Clang is not supported right now
> 
> Changes in v4:
>  - Slight formatting fixes
>  - COV_FLAGS  -> cov-flags-y
> 
> Changes in v3:
>  - Introduced CC_HAS_MCDC that checks if compiler supports
>    required feature
> 
> Changes in v2:
>  - Move gcc version check from .c file to Rules.mk (I can't find
>    an easy way to check GCC version at Kconfig level)
>  - Check for gcc 14, not gcc 14.1
> ---
>  xen/Kconfig       |  4 ++++
>  xen/Kconfig.debug |  9 +++++++++
>  xen/Rules.mk      | 14 +++++++-------
>  3 files changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/xen/Kconfig b/xen/Kconfig
> index 2128f0ccfc..3a723db8ea 100644
> --- a/xen/Kconfig
> +++ b/xen/Kconfig
> @@ -41,6 +41,10 @@ config CC_SPLIT_SECTIONS
>  config CC_HAS_UBSAN
>       def_bool $(cc-option,-fsanitize=undefined)
>  
> +# Compiler supports -fcondition-coverage aka MC/DC
> +config CC_HAS_MCDC
> +     def_bool $(cc-option,-fcondition-coverage)
> +
>  # Set code alignment.
>  #
>  # Allow setting on a boolean basis, and then convert such selection to an
> diff --git a/xen/Kconfig.debug b/xen/Kconfig.debug
> index f7cc5ffaab..f89cbd823b 100644
> --- a/xen/Kconfig.debug
> +++ b/xen/Kconfig.debug
> @@ -44,6 +44,15 @@ config COVERAGE
>  
>         If unsure, say N here.
>  
> +config CONDITION_COVERAGE
> +     bool "Condition coverage support"
> +     depends on COVERAGE && CC_HAS_MCDC
> +     help
> +       Enable condition coverage support. Used for collecting MC/DC
> +       (Modified Condition/Decision Coverage) metrics.
> +
> +       If unsure, say N here.
> +
>  config DEBUG_LOCK_PROFILE
>       bool "Lock Profiling"
>       select DEBUG_LOCKS
> diff --git a/xen/Rules.mk b/xen/Rules.mk
> index d759cccee3..da21850926 100644
> --- a/xen/Rules.mk
> +++ b/xen/Rules.mk
> @@ -29,6 +29,7 @@ targets :=
>  subdir-y :=
>  CFLAGS-y :=
>  AFLAGS-y :=
> +cov-cflags-y :=
>  nocov-y :=
>  noubsan-y :=
>  
> @@ -133,19 +134,18 @@ $(filter %.init.o,$(obj-y) $(obj-bin-y) $(extra-y)): 
> CFLAGS-y += -DINIT_SECTIONS
>  
>  non-init-objects = $(filter-out %.init.o, $(obj-y) $(obj-bin-y) $(extra-y))
>  
> -ifeq ($(CONFIG_COVERAGE),y)
>  ifeq ($(CONFIG_CC_IS_CLANG),y)
> -    COV_FLAGS := -fprofile-instr-generate -fcoverage-mapping
> +    cov-cflags-$(CONFIG_COVERAGE) := -fprofile-instr-generate 
> -fcoverage-mapping
>  else
> -    COV_FLAGS := -fprofile-arcs -ftest-coverage
> +    cov-cflags-$(CONFIG_COVERAGE) := -fprofile-arcs -ftest-coverage
> +    cov-cflags-$(CONFIG_CONDITION_COVERAGE) += -fcondition-coverage
>  endif
>  
> -# Reset COV_FLAGS in cases where an objects has another one as prerequisite
> +# Reset cov-cflags-y in cases where an objects has another one as 
> prerequisite
>  $(nocov-y) $(filter %.init.o, $(obj-y) $(obj-bin-y) $(extra-y)): \
> -    COV_FLAGS :=
> +    cov-cflags-y :=
>  
> -$(non-init-objects): _c_flags += $(COV_FLAGS)
> -endif
> +$(non-init-objects): _c_flags += $(cov-cflags-y)
>  
>  ifeq ($(CONFIG_UBSAN),y)
>  # Any -fno-sanitize= options need to come after any -fsanitize= options
> -- 
> 2.48.1
> 



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.