[Qemu-devel] [PATCH] tests: add gcov target

2012-05-01 Thread Blue Swirl
Add support for compiling for GCOV test coverage, enabled
with '--enable-gcov' during configure.

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

Add LDFLAGS (which may include GCOV flags) to libcacard
Makefile to avoid a build breakage.

Signed-off-by: Blue Swirl blauwir...@gmail.com
---
 configure  |   18 ++
 libcacard/Makefile |2 +-
 tests/Makefile |   33 +
 3 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/configure b/configure
index 3c72fa0..dfea46a 100755
--- a/configure
+++ b/configure
@@ -152,6 +152,8 @@ strip_opt=yes
 tcg_interpreter=no
 bigendian=no
 mingw32=no
+gcov=no
+gcov_tool=gcov
 EXESUF=
 prefix=/usr/local
 mandir=\${prefix}/share/man
@@ -556,6 +558,8 @@ for opt do
   ;;
   --python=*) python=$optarg
   ;;
+  --gcov=*) gcov_tool=$optarg
+  ;;
   --smbd=*) smbd=$optarg
   ;;
   --extra-cflags=*)
@@ -576,6 +580,8 @@ for opt do
   ;;
   --enable-gprof) gprof=yes
   ;;
+  --enable-gcov) gcov=yes
+  ;;
   --static)
 static=yes
 LDFLAGS=-static $LDFLAGS
@@ -1110,6 +1116,8 @@ echo   --disable-guest-agentdisable
building of the QEMU Guest Agent
 echo   --enable-guest-agent enable building of the QEMU Guest Agent
 echo   --with-coroutine=BACKEND coroutine backend. Supported options:
 echogthread, ucontext, sigaltstack, windows
+echo   --enable-gcovenable 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
@@ -2883,6 +2891,11 @@ if test $mingw32 = yes ; then
 done
 fi

+if test $gcov = yes ; then
+  QEMU_CFLAGS=-fprofile-arcs -ftest-coverage $QEMU_CFLAGS
+  LDFLAGS=-fprofile-arcs -ftest-coverage $LDFLAGS
+fi
+
 qemu_confdir=$sysconfdir$confsuffix
 qemu_datadir=$datadir$confsuffix

@@ -3008,6 +3021,8 @@ echo OpenGL support$opengl
 echo libiscsi support  $libiscsi
 echo build guest agent $guest_agent
 echo coroutine backend $coroutine_backend
+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
@@ -3412,6 +3427,9 @@ echo LIBS_TOOLS+=$libs_tools  $config_host_mak
 echo EXESUF=$EXESUF  $config_host_mak
 echo LIBS_QGA+=$libs_qga  $config_host_mak
 echo POD2MAN=$POD2MAN  $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/libcacard/Makefile b/libcacard/Makefile
index c6a896a..47a5eb1 100644
--- a/libcacard/Makefile
+++ b/libcacard/Makefile
@@ -18,7 +18,7 @@ QEMU_CFLAGS+=-I../
 libcacard.lib-y=$(addsuffix .lo,$(basename $(libcacard-y)))

 vscclient: $(libcacard-y) $(QEMU_OBJS) vscclient.o
-   $(call quiet-command,$(CC) -o $@ $^ $(libcacard_libs) $(LIBS),  LINK  
$@)
+   $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(libcacard_libs)
$(LIBS),  LINK  $@)

 clean:
rm -f *.o */*.o *.d */*.d *.a */*.a *~ */*~ vscclient *.lo .libs/* *.la 
*.pc
diff --git a/tests/Makefile b/tests/Makefile
index 9988681..a316180 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -1,18 +1,42 @@
 export SRC_PATH

 check-unit-y = tests/check-qdict$(EXESUF)
+GCOV_FILES = qdict.c
 check-unit-y += tests/check-qfloat$(EXESUF)
+GCOV_FILES += qfloat.c
 check-unit-y += tests/check-qint$(EXESUF)
+GCOV_FILES += qint.c
 check-unit-y += tests/check-qstring$(EXESUF)
+GCOV_FILES += qstring.c
 check-unit-y += tests/check-qlist$(EXESUF)
+GCOV_FILES += qlist.c
 check-unit-y += tests/check-qjson$(EXESUF)
+GCOV_FILES += qjson.c
 check-unit-y += tests/test-qmp-output-visitor$(EXESUF)
+GCOV_QAPI_FILES += qapi/qmp-output-visitor.c
 check-unit-y += tests/test-qmp-input-visitor$(EXESUF)
+GCOV_QAPI_FILES += qapi/qmp-input-visitor.c
 check-unit-y += tests/test-qmp-input-strict$(EXESUF)
 check-unit-y += tests/test-qmp-commands$(EXESUF)
+GCOV_QAPI_FILES += qapi/qmp-dispatch.c
 check-unit-y += tests/test-string-input-visitor$(EXESUF)
+GCOV_QAPI_FILES += qapi/string-input-visitor.c
 check-unit-y += tests/test-string-output-visitor$(EXESUF)
+GCOV_QAPI_FILES += qapi/string-output-visitor.c
 check-unit-y += tests/test-coroutine$(EXESUF)
+ifeq ($(CONFIG_WIN32),y)
+GCOV_FILES += coroutine-win32.c
+else
+ifeq ($(CONFIG_UCONTEXT_COROUTINE),y)
+GCOV_FILES += coroutine-ucontext.c
+else
+ifeq ($(CONFIG_SIGALTSTACK_COROUTINE),y)
+GCOV_FILES += coroutine-sigaltstack.c
+else
+GCOV_FILES += coroutine-gthread.c
+endif
+endif
+endif

 check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh

@@ -20,8 +44,10 @@ check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
 # really in libqtest, not in the testcases themselves.
 check-qtest-i386-y = tests/rtc-test
 check-qtest-x86_64-y = $(check-qtest-i386-y)
+GCOV_I386_SOFTMMU_FILES += hw/mc146818rtc.c
 check-qtest-sparc-y = tests/m48t59-test$(EXESUF)
 check-qtest-sparc64-y = 

Re: [Qemu-devel] [PATCH] tests: add gcov target

2012-05-01 Thread Blue Swirl
On Tue, May 1, 2012 at 18:49, Blue Swirl blauwir...@gmail.com wrote:
 Add support for compiling for GCOV test coverage, enabled
 with '--enable-gcov' during configure.

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

This is how it looks like:
File '/src/qemu/qjson.c'
Lines executed:86.52% of 141

File '/usr/include/bits/stdio2.h'
Lines executed:100.00% of 1

File '/usr/include/bits/string3.h'
Lines executed:100.00% of 1

File '/src/qemu/qstring.c'
Lines executed:90.48% of 42

File '/src/qemu/qfloat.c'
Lines executed:93.33% of 15

File '/src/qemu/qdict.c'
Lines executed:86.51% of 126

File '/src/qemu/qobject.h'
Lines executed:100.00% of 11

File '/src/qemu/qint.c'
Lines executed:93.33% of 15

File '/src/qemu/qlist.c'
Lines executed:94.12% of 51

File '/src/qemu/coroutine-ucontext.c'
Lines executed:85.00% of 80

(cd i386-softmmu; gcov -n hw/mc146818rtc.c)
File '/src/qemu/hw/mc146818rtc.c'
Lines executed:62.58% of 318

File '/src/qemu/qemu-timer.h'
Lines executed:100.00% of 2

File '/src/qemu/qemu-common.h'
Lines executed:100.00% of 7

File '/src/qemu/hw/irq.h'
Lines executed:100.00% of 2

(cd libhw64; gcov -n hw/m48t59.c)
File '/src/qemu/hw/m48t59.c'
Lines executed:87.19% of 320

File '/src/qemu/qemu-timer.h'
Lines executed:100.00% of 1

File '/src/qemu/qemu-common.h'
Lines executed:100.00% of 2

(cd qapi; gcov -n qapi/qmp-output-visitor.c qapi/qmp-input-visitor.c
qapi/qmp-dispatch.c qapi/string-input-visitor.c
qapi/string-output-visitor.c)
File '/src/qemu/qapi/string-input-visitor.c'
Lines executed:80.33% of 61

File '/src/qemu/qlist.h'
Lines executed:100.00% of 3

File '/src/qemu/qapi/qmp-input-visitor.c'
Lines executed:92.36% of 144

File '/src/qemu/qapi/qmp-output-visitor.c'
Lines executed:100.00% of 100

File '/src/qemu/qobject.h'
Lines executed:100.00% of 10

File '/src/qemu/qapi/qmp-dispatch.c'
Lines executed:74.14% of 58

File '/src/qemu/qapi/string-output-visitor.c'
Lines executed:100.00% of 36

With lcov it's possible to get HTML output, however generating it
takes ages for some reason.


 Add LDFLAGS (which may include GCOV flags) to libcacard
 Makefile to avoid a build breakage.

 Signed-off-by: Blue Swirl blauwir...@gmail.com
 ---
  configure          |   18 ++
  libcacard/Makefile |    2 +-
  tests/Makefile     |   33 +
  3 files changed, 52 insertions(+), 1 deletion(-)

 diff --git a/configure b/configure
 index 3c72fa0..dfea46a 100755
 --- a/configure
 +++ b/configure
 @@ -152,6 +152,8 @@ strip_opt=yes
  tcg_interpreter=no
  bigendian=no
  mingw32=no
 +gcov=no
 +gcov_tool=gcov
  EXESUF=
  prefix=/usr/local
  mandir=\${prefix}/share/man
 @@ -556,6 +558,8 @@ for opt do
   ;;
   --python=*) python=$optarg
   ;;
 +  --gcov=*) gcov_tool=$optarg
 +  ;;
   --smbd=*) smbd=$optarg
   ;;
   --extra-cflags=*)
 @@ -576,6 +580,8 @@ for opt do
   ;;
   --enable-gprof) gprof=yes
   ;;
 +  --enable-gcov) gcov=yes
 +  ;;
   --static)
     static=yes
     LDFLAGS=-static $LDFLAGS
 @@ -1110,6 +1116,8 @@ echo   --disable-guest-agent    disable
 building of the QEMU Guest Agent
  echo   --enable-guest-agent     enable building of the QEMU Guest Agent
  echo   --with-coroutine=BACKEND coroutine backend. Supported options:
  echo                            gthread, ucontext, sigaltstack, windows
 +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
 @@ -2883,6 +2891,11 @@ if test $mingw32 = yes ; then
     done
  fi

 +if test $gcov = yes ; then
 +  QEMU_CFLAGS=-fprofile-arcs -ftest-coverage $QEMU_CFLAGS
 +  LDFLAGS=-fprofile-arcs -ftest-coverage $LDFLAGS
 +fi
 +
  qemu_confdir=$sysconfdir$confsuffix
  qemu_datadir=$datadir$confsuffix

 @@ -3008,6 +3021,8 @@ echo OpenGL support    $opengl
  echo libiscsi support  $libiscsi
  echo build guest agent $guest_agent
  echo coroutine backend $coroutine_backend
 +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
 @@ -3412,6 +3427,9 @@ echo LIBS_TOOLS+=$libs_tools  $config_host_mak
  echo EXESUF=$EXESUF  $config_host_mak
  echo LIBS_QGA+=$libs_qga  $config_host_mak
  echo POD2MAN=$POD2MAN  $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/libcacard/Makefile b/libcacard/Makefile
 index c6a896a..47a5eb1 100644
 --- a/libcacard/Makefile
 +++ b/libcacard/Makefile
 @@ -18,7 +18,7 @@ QEMU_CFLAGS+=-I../
  libcacard.lib-y=$(addsuffix .lo,$(basename $(libcacard-y)))

  vscclient: $(libcacard-y) $(QEMU_OBJS) vscclient.o
 -       $(call quiet-command,$(CC) -o $@ $^ $(libcacard_libs) $(LIBS),  LINK 
  $@)
 +       $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(libcacard_libs)
 $(LIBS),  LINK  $@)