From: Grygorii Strashko <[email protected]> Extend coverage support on .init and lib code.
To enable coverage support on .init code the gcc special section should stay in memory after Xen boot when COVERAGE=y. So, add hidden Kconfig option RELAX_INIT_CHECK "Relax strict check for .init sections only in %.init.o files", which is selected when COVERAGE=y and allows to bypass strict check for .init sections only in %.init.o files. Signed-off-by: Grygorii Strashko <[email protected]> --- changes in v3: - drop DO_NOT_FREE_INIT_MEMORY: only gcc special section should stay in memory after Xen boot - split make cmd quiet_cmd_obj_init_o on two: obj_init_check and obj_init_check - drop libfdt/libelf changes - they need additional work -- before v2 of this patch libfdt/libelf were out of code coverage scope -- v2 allowed to enable coverage for libfdt/libelf easily thanks to DO_NOT_FREE_INIT_MEMORY which kept all .init code in memory -- without DO_NOT_FREE_INIT_MEMORY it's not so easy any more, so drop libfdt/libelf changes changes in v2: - add RELAX_INIT_CHECK and DO_NOT_FREE_INIT_MEMORY, those are two different things, both potentially reusable - enable coverage for libfdt/libelf always - enable colverage for .init always v2: https://patchwork.kernel.org/project/xen-devel/patch/[email protected]/ v1: https://patchwork.kernel.org/project/xen-devel/patch/[email protected]/ xen/Kconfig.debug | 6 ++++++ xen/Rules.mk | 22 +++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/xen/Kconfig.debug b/xen/Kconfig.debug index d900d926c555..7770de87a44b 100644 --- a/xen/Kconfig.debug +++ b/xen/Kconfig.debug @@ -39,11 +39,17 @@ config COVERAGE bool "Code coverage support" depends on SYSCTL && !LIVEPATCH select SUPPRESS_DUPLICATE_SYMBOL_WARNINGS if !ENFORCE_UNIQUE_SYMBOLS + select RELAX_INIT_CHECK help Enable code coverage support. If unsure, say N here. +config RELAX_INIT_CHECK + bool + help + Relax strict check for .init sections only in %.init.o files. + config CONDITION_COVERAGE bool "Condition coverage support" depends on COVERAGE && CC_HAS_MCDC diff --git a/xen/Rules.mk b/xen/Rules.mk index 2b28d1ac3c18..25aeb08cbfef 100644 --- a/xen/Rules.mk +++ b/xen/Rules.mk @@ -33,11 +33,15 @@ cov-cflags-y := nocov-y := noubsan-y := +# when coverage is enabled the gcc special section should stay in memory +# after Xen boot +ifneq ($(CONFIG_COVERAGE),y) SPECIAL_DATA_SECTIONS := rodata $(foreach a,1 2 4 8 16, \ $(foreach w,1 2 4, \ rodata.str$(w).$(a)) \ rodata.cst$(a)) \ $(foreach r,rel rel.ro,data.$(r).local) +endif # The filename build.mk has precedence over Makefile include $(firstword $(wildcard $(srcdir)/build.mk) $(srcdir)/Makefile) @@ -146,10 +150,9 @@ endif $(call cc-option-add,cov-cflags-$(CONFIG_COVERAGE),CC,-fprofile-update=atomic) # 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-cflags-y := +$(nocov-y) $(extra-y): cov-cflags-y := -$(non-init-objects): _c_flags += $(cov-cflags-y) +$(obj-y) $(obj-bin-y) $(extra-y) $(lib-y): _c_flags += $(cov-cflags-y) ifeq ($(CONFIG_UBSAN),y) # Any -fno-sanitize= options need to come after any -fsanitize= options @@ -259,8 +262,8 @@ $(obj)/%.o: $(src)/%.S FORCE $(call if_changed_dep,cc_o_S) -quiet_cmd_obj_init_o = INIT_O $@ -define cmd_obj_init_o +quiet_cmd_obj_init_check = INIT_C $@ +define cmd_obj_init_check $(OBJDUMP) -h $< | while read idx name sz rest; do \ case "$$name" in \ .*.local) ;; \ @@ -269,12 +272,17 @@ define cmd_obj_init_o echo "Error: size of $<:$$name is 0x$$sz" >&2; \ exit $$(expr $$idx + 1);; \ esac; \ - done || exit $$?; \ + done || exit $$? +endef + +quiet_cmd_obj_init_objcopy = INIT_O $@ +define cmd_obj_init_objcopy $(OBJCOPY) $(foreach s,$(SPECIAL_DATA_SECTIONS),--rename-section .$(s)=.init.$(s)) $< $@ endef $(filter %.init.o,$(obj-y) $(obj-bin-y) $(extra-y)): $(obj)/%.init.o: $(obj)/%.o FORCE - $(call if_changed,obj_init_o) + $(if $(filter y,$(CONFIG_RELAX_INIT_CHECK)),,$(call if_changed,obj_init_check)) + $(call if_changed,obj_init_objcopy) quiet_cmd_cpp_i_c = CPP $@ cmd_cpp_i_c = $(CPP) $(call cpp_flags,$(c_flags)) -MQ $@ -o $@ $< -- 2.34.1
