Patchwork [v2] tests: add gcov target

login
register
mail settings
Submitter Blue Swirl
Date Dec. 28, 2012, 8:28 p.m.
Message ID <ab39c2c8bcad4ed01ca028f480847ba619300bed.1356725896.git.blauwirbel@gmail.com>
Download mbox | patch
Permalink /patch/208567/
State New
Headers show

Comments

Blue Swirl - Dec. 28, 2012, 8:28 p.m.
Add support for compiling for GCOV test coverage, enabled
with '--enable-gcov' during configure.

After tests, test coverage can be reported with 'make gcov'.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
---
v2:
 update to HEAD: report coverage for more files
 improve gcov invocation and use foo-y Makefile magic for GCOV_FILES

---
 Makefile.objs  |    2 ++
 configure      |   19 ++++++++++++++++++-
 tests/Makefile |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 66 insertions(+), 1 deletions(-)
Anthony Liguori - Jan. 3, 2013, 12:19 a.m.
Hi,

This is an automated message generated from the QEMU Patches.
Thank you for submitting this patch.  This patch no longer applies to qemu.git.

This may have occurred due to:
 
  1) Changes in mainline requiring your patch to be rebased and re-tested.

  2) Sending the mail using a tool other than git-send-email.  Please use
     git-send-email to send patches to QEMU.

  3) Basing this patch off of a branch that isn't tracking the QEMU
     master branch.  If that was done purposefully, please include the name
     of the tree in the subject line in the future to prevent this message.

     For instance: "[PATCH block-next 1/10] qcow3: add fancy new feature"

  4) You no longer wish for this patch to be applied to QEMU.  No additional
     action is required on your part.

Nacked-by: QEMU Patches <aliguori@us.ibm.com>

Below is the output from git-am:

    Applying: tests: add gcov target
    Using index info to reconstruct a base tree...
    M	configure
    Falling back to patching base and 3-way merge...
    Auto-merging configure
    CONFLICT (content): Merge conflict in configure
    Failed to merge in the changes.
    Patch failed at 0001 tests: add gcov target
    The copy of the patch that failed is found in:
       /home/aliguori/patches/qemu.git/.git/rebase-apply/patch
    When you have resolved this problem run "git am --resolved".
    If you would prefer to skip this patch, instead run "git am --skip".
    To restore the original branch and stop patching run "git am --abort".

Patch

diff --git a/Makefile.objs b/Makefile.objs
index 3a3a402..a3eab4b 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -31,6 +31,8 @@  oslib-obj-$(CONFIG_POSIX) += oslib-posix.o qemu-thread-posix.o
 # coroutines
 coroutine-obj-y = qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o
 coroutine-obj-y += qemu-coroutine-sleep.o
+
+# If you change this logic, please also check tests/Makefile
 ifeq ($(CONFIG_UCONTEXT_COROUTINE),y)
 coroutine-obj-$(CONFIG_POSIX) += coroutine-ucontext.o
 else
diff --git a/configure b/configure
index 99c1ec3..ed801ad 100755
--- a/configure
+++ b/configure
@@ -176,6 +176,8 @@  strip_opt="yes"
 tcg_interpreter="no"
 bigendian="no"
 mingw32="no"
+gcov="no"
+gcov_tool="gcov"
 EXESUF=""
 prefix="/usr/local"
 mandir="\${prefix}/share/man"
@@ -599,6 +601,8 @@  for opt do
   ;;
   --python=*) python="$optarg"
   ;;
+  --gcov=*) gcov_tool="$optarg"
+  ;;
   --smbd=*) smbd="$optarg"
   ;;
   --extra-cflags=*)
@@ -619,6 +623,8 @@  for opt do
   ;;
   --enable-gprof) gprof="yes"
   ;;
+  --enable-gcov) gcov="yes"
+  ;;
   --static)
     static="yes"
     LDFLAGS="-static $LDFLAGS"
@@ -1130,6 +1136,8 @@  echo "  --with-coroutine=BACKEND coroutine backend. Supported options:"
 echo "                           gthread, ucontext, sigaltstack, windows"
 echo "  --enable-glusterfs       enable GlusterFS backend"
 echo "  --disable-glusterfs      disable GlusterFS backend"
+echo "  --enable-gcov            enable test coverage analysis with gcov"
+echo "  --gcov=GCOV              use specified gcov [$gcov_tool]"
 echo ""
 echo "NOTE: The object files are built at the place where configure is launched"
 exit 1
@@ -3090,10 +3098,14 @@  fi
 # End of CC checks
 # After here, no more $cc or $ld runs
 
-if test "$debug" = "no" ; then
+if test "$gcov" = "yes" ; then
+  CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
+  LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
+elif test "$debug" = "no" ; then
   CFLAGS="-O2 -D_FORTIFY_SOURCE=2 $CFLAGS"
 fi
 
+
 # Disable zero malloc errors for official releases unless explicitly told to
 # enable/disable
 if test -z "$zero_malloc" ; then
@@ -3274,6 +3286,8 @@  echo "build guest agent $guest_agent"
 echo "seccomp support   $seccomp"
 echo "coroutine backend $coroutine_backend"
 echo "GlusterFS support $glusterfs"
+echo "gcov              $gcov_tool"
+echo "gcov enabled      $gcov"
 
 if test "$sdl_too_old" = "yes"; then
 echo "-> Your SDL version is too old - please upgrade to have SDL support"
@@ -3697,6 +3711,9 @@  echo "EXESUF=$EXESUF" >> $config_host_mak
 echo "LIBS_QGA+=$libs_qga" >> $config_host_mak
 echo "POD2MAN=$POD2MAN" >> $config_host_mak
 echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak
+if test "$gcov" = "yes" ; then
+  echo "GCOV=$gcov_tool" >> $config_host_mak
+fi
 
 # generate list of library paths for linker script
 
diff --git a/tests/Makefile b/tests/Makefile
index b60f0fb..d5386e0 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -1,33 +1,65 @@ 
 export SRC_PATH
 
 check-unit-y = tests/check-qdict$(EXESUF)
+GCOV_FILES-y = qdict.c
 check-unit-y += tests/check-qfloat$(EXESUF)
+GCOV_FILES-y += qfloat.c
 check-unit-y += tests/check-qint$(EXESUF)
+GCOV_FILES-y += qint.c
 check-unit-y += tests/check-qstring$(EXESUF)
+GCOV_FILES-y += qstring.c
 check-unit-y += tests/check-qlist$(EXESUF)
+GCOV_FILES-y += qlist.c
 check-unit-y += tests/check-qjson$(EXESUF)
+GCOV_FILES-y += qjson.c
 check-unit-y += tests/test-qmp-output-visitor$(EXESUF)
+GCOV_FILES-y += qapi/qmp-output-visitor.c
 check-unit-y += tests/test-qmp-input-visitor$(EXESUF)
+GCOV_FILES-y += qapi/qmp-input-visitor.c
 check-unit-y += tests/test-qmp-input-strict$(EXESUF)
 check-unit-y += tests/test-qmp-commands$(EXESUF)
+GCOV_FILES-y += qapi/qmp-dispatch.c
 check-unit-y += tests/test-string-input-visitor$(EXESUF)
+GCOV_FILES-y += qapi/string-input-visitor.c
 check-unit-y += tests/test-string-output-visitor$(EXESUF)
+GCOV_FILES-y += qapi/string-output-visitor.c
 check-unit-y += tests/test-coroutine$(EXESUF)
 check-unit-y += tests/test-visitor-serialization$(EXESUF)
+ifeq ($(CONFIG_WIN32),y)
+GCOV_FILES-y += coroutine-win32.c
+else
+ifeq ($(CONFIG_UCONTEXT_COROUTINE),y)
+GCOV_FILES-y += coroutine-ucontext.c
+else
+ifeq ($(CONFIG_SIGALTSTACK_COROUTINE),y)
+GCOV_FILES-y += coroutine-sigaltstack.c
+else
+GCOV_FILES-y += coroutine-gthread.c
+endif
+endif
+endif
 check-unit-y += tests/test-iov$(EXESUF)
+GCOV_FILES-y += iov.c
 check-unit-y += tests/test-aio$(EXESUF)
+GCOV_FILES-$(CONFIG_WIN32) += aio-win32.c
+GCOV_FILES-$(CONFIG_POSIX) += aio-posix.c
 check-unit-y += tests/test-thread-pool$(EXESUF)
+GCOV_FILES-y += thread-pool.c
 
 check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
 
 # All QTests for now are POSIX-only, but the dependencies are
 # really in libqtest, not in the testcases themselves.
 check-qtest-i386-y = tests/fdc-test$(EXESUF)
+GCOV_FILES-y += hw/fdc.c
 check-qtest-i386-y += tests/hd-geo-test$(EXESUF)
+GCOV_FILES-y += hw/hd-geometry.c
 check-qtest-i386-y += tests/rtc-test$(EXESUF)
 check-qtest-x86_64-y = $(check-qtest-i386-y)
+GCOV_FILES-y += i386-softmmu/hw/mc146818rtc.c
 check-qtest-sparc-y = tests/m48t59-test$(EXESUF)
 check-qtest-sparc64-y = tests/m48t59-test$(EXESUF)
+GCOV_FILES-y += hw/m48t59.c
 
 GENERATED_HEADERS += tests/test-qapi-types.h tests/test-qapi-visit.h tests/test-qmp-commands.h
 
@@ -98,6 +130,8 @@  check-help:
 	@echo " make check-unit           Run qobject tests"
 	@echo " make check-block          Run block tests"
 	@echo " make check-report.html    Generates an HTML test report"
+	@echo " make gcov                 Report test coverage"
+	@echo " make gcov-zerocounters    Zero test coverage counters"
 	@echo
 	@echo "Please note that HTML reports do not regenerate if the unit tests"
 	@echo "has not changed."
@@ -105,6 +139,8 @@  check-help:
 	@echo "The variable SPEED can be set to control the gtester speed setting."
 	@echo "Default options are -k and (for make V=1) --verbose; they can be"
 	@echo "changed with variable GTESTER_OPTIONS."
+	@echo
+	@echo "For test coverage, please run 'make gcov-zerocounters check gcov'."
 
 SPEED = quick
 GTESTER_OPTIONS = -k $(if $(V),--verbose,-q)
@@ -137,6 +173,16 @@  check-report.xml: $(patsubst %,check-report-qtest-%.xml, $(QTEST_TARGETS)) check
 check-report.html: check-report.xml
 	$(call quiet-command,gtester-report $< > $@, "  GEN    $@")
 
+# Gcov test coverage
+GCOV_OPTIONS = -n $(if $(V),-f,)
+.PHONY: gcov gcov-zerocounters
+gcov:
+	@for f in $(GCOV_FILES-y); do \
+	  $(GCOV) $(GCOV_OPTIONS) $$f -o `dirname $$f`; \
+	done
+
+gcov-zerocounters:
+	rm -f *.gcda */*.gcda */*/*.gcda */*/*/*.gcda
 
 # Other tests