svn commit: r345825 - in projects/runtime-coverage-v2: . etc etc/mtree libexec/rtld-elf share/man/man7 share/mk stand tests tests/tools tools/build/options

Enji Cooper ngie at FreeBSD.org
Wed Apr 3 03:23:51 UTC 2019


Author: ngie
Date: Wed Apr  3 03:23:45 2019
New Revision: 345825
URL: https://svnweb.freebsd.org/changeset/base/345825

Log:
  Merge all changes over from ^/projects/runtime-coverage
  
  This is being done to provide a starting point for this branch, given lessons
  learned doing the work on that branch.

Added:
  projects/runtime-coverage-v2/etc/mtree/BSD.coverage.dist   (contents, props changed)
  projects/runtime-coverage-v2/share/mk/bsd.cov.mk   (contents, props changed)
  projects/runtime-coverage-v2/tests/tools/
  projects/runtime-coverage-v2/tests/tools/Makefile   (contents, props changed)
  projects/runtime-coverage-v2/tests/tools/gather_coverage.sh   (contents, props changed)
  projects/runtime-coverage-v2/tools/build/options/WITH_COVERAGE   (contents, props changed)
Modified:
  projects/runtime-coverage-v2/Makefile
  projects/runtime-coverage-v2/Makefile.inc1
  projects/runtime-coverage-v2/Makefile.libcompat
  projects/runtime-coverage-v2/etc/Makefile
  projects/runtime-coverage-v2/etc/mtree/BSD.tests.dist
  projects/runtime-coverage-v2/etc/mtree/Makefile
  projects/runtime-coverage-v2/libexec/rtld-elf/Makefile
  projects/runtime-coverage-v2/share/man/man7/hier.7
  projects/runtime-coverage-v2/share/mk/Makefile
  projects/runtime-coverage-v2/share/mk/bsd.lib.mk
  projects/runtime-coverage-v2/share/mk/bsd.opts.mk
  projects/runtime-coverage-v2/share/mk/bsd.own.mk
  projects/runtime-coverage-v2/share/mk/bsd.prog.mk
  projects/runtime-coverage-v2/share/mk/meta.autodep.mk
  projects/runtime-coverage-v2/share/mk/src.opts.mk
  projects/runtime-coverage-v2/share/mk/suite.test.mk
  projects/runtime-coverage-v2/stand/defs.mk
  projects/runtime-coverage-v2/tests/Makefile

Modified: projects/runtime-coverage-v2/Makefile
==============================================================================
--- projects/runtime-coverage-v2/Makefile	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/Makefile	Wed Apr  3 03:23:45 2019	(r345825)
@@ -497,7 +497,7 @@ TARGET_ARCHES_riscv?=	riscv64
 TARGET_ARCHES_${target}?= ${target}
 .endfor
 
-MAKE_PARAMS_riscv?=	CROSS_TOOLCHAIN=riscv64-gcc
+MAKE_PARAMS_riscv?=	CROSS_TOOLCHAIN=riscv64-gcc MK_COVERAGE=no
 
 # XXX Remove architectures only supported by external toolchain from universe
 # if required toolchain packages are missing.

Modified: projects/runtime-coverage-v2/Makefile.inc1
==============================================================================
--- projects/runtime-coverage-v2/Makefile.inc1	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/Makefile.inc1	Wed Apr  3 03:23:45 2019	(r345825)
@@ -248,7 +248,7 @@ WANT_COMPILER_VERSION!= \
 	awk -F. '{print $$1 * 10000 + $$2 * 100 + $$3}' \
 	${SRCDIR}/${WANT_COMPILER_VERSION_FILE} || echo unknown
 .endif
-.export WANT_COMPILER_FREEBSD_VERSION WANT_COMPILER_VERSION
+.export WANT_COMPILER_FREEBSD_VERSION WANT_COMPILER_TYPE WANT_COMPILER_VERSION
 .endif	# !defined(WANT_COMPILER_FREEBSD_VERSION)
 
 # It needs to be the same revision as we would build for the bootstrap.
@@ -688,7 +688,7 @@ BSARGS= 	DESTDIR= \
 		BOOTSTRAPPING=${BOOTSTRAPPING_OSRELDATE} \
 		BWPHASE=${.TARGET:C,^_,,} \
 		SSP_CFLAGS= \
-		MK_HTML=no NO_LINT=yes MK_MAN=no \
+		MK_COVERAGE=no MK_HTML=no NO_LINT=yes MK_MAN=no \
 		-DNO_PIC MK_PROFILE=no -DNO_SHARED \
 		-DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
 		MK_CLANG_EXTRAS=no MK_CLANG_FULL=no \
@@ -734,7 +734,7 @@ KTMAKE=		\
 		MAKEOBJDIRPREFIX= \
 		BOOTSTRAPPING=${BOOTSTRAPPING_OSRELDATE} \
 		SSP_CFLAGS= \
-		MK_HTML=no -DNO_LINT MK_MAN=no \
+		MK_COVERAGE=no MK_HTML=no -DNO_LINT MK_MAN=no \
 		-DNO_PIC MK_PROFILE=no -DNO_SHARED \
 		-DNO_CPU_CFLAGS MK_RETPOLINE=no MK_WARNS=no MK_CTF=no
 
@@ -1361,6 +1361,10 @@ distributeworld installworld stageworld: _installcheck
 	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
 	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.include.dist \
 	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/include >/dev/null
+.if ${MK_COVERAGE} != "no"
+	mtree -deU -f ${.CURDIR}/etc/mtree/BSD.cov.dist \
+	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
+.endif
 .if ${MK_DEBUG_FILES} != "no"
 	${DESTDIR_MTREE} -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
 	    -p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
@@ -2712,6 +2716,14 @@ _prereq_libs= lib/libcompiler_rt
 _prereq_libs+= gnu/lib/libssp/libssp_nonshared
 .endif
 
+#
+# The coverage libraries must be built for the target prior to ${_startup_libs}
+# for world to have runtime coverage instrumentation.
+#
+.if ${MK_COVERAGE} != "no"
+_prereq_libs+=	lib/libclang_rt/profile
+.endif
+
 # These dependencies are not automatically generated:
 #
 # gnu/lib/csu, gnu/lib/libgcc, lib/csu and lib/libc must be built before
@@ -2960,7 +2972,7 @@ ${_lib}__PL: .PHONY .MAKE
 		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj; fi; \
 		${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
 		    DIRPRFX=${_lib}/ all; \
-		${MAKE} MK_TESTS=no MK_PROFILE=no -DNO_PIC \
+		${MAKE} MK_COVERAGE=no MK_TESTS=no MK_PROFILE=no -DNO_PIC \
 		    DIRPRFX=${_lib}/ install
 .endif
 .endfor
@@ -2972,7 +2984,7 @@ ${_lib}__L: .PHONY .MAKE
 		cd ${.CURDIR}/${_lib}; \
 		if [ -z "${NO_OBJWALK}" ]; then ${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ obj; fi; \
 		${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ all; \
-		${MAKE} MK_TESTS=no DIRPRFX=${_lib}/ install
+		${MAKE} MK_COVERAGE=no MK_TESTS=no DIRPRFX=${_lib}/ install
 .endif
 .endfor
 
@@ -3239,7 +3251,7 @@ XDEV_CPUTYPE?=${CPUTYPE}
 XDEV_CPUTYPE?=${TARGET_CPUTYPE}
 .endif
 
-NOFUN=-DNO_FSCHG MK_HTML=no -DNO_LINT \
+NOFUN=	MK_COVERAGE=no -DNO_FSCHG MK_HTML=no -DNO_LINT \
 	MK_MAN=no MK_NLS=no MK_PROFILE=no \
 	MK_KERBEROS=no MK_RESCUE=no MK_TESTS=no MK_WARNS=no \
 	TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \

Modified: projects/runtime-coverage-v2/Makefile.libcompat
==============================================================================
--- projects/runtime-coverage-v2/Makefile.libcompat	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/Makefile.libcompat	Wed Apr  3 03:23:45 2019	(r345825)
@@ -122,6 +122,7 @@ LIBCOMPATWMAKEFLAGS+= CC="${XCC} ${LIBCOMPATCFLAGS}" \
 		CPP="${XCPP} ${LIBCOMPATCFLAGS}" \
 		DESTDIR=${LIBCOMPATTMP} \
 		-DNO_CPU_CFLAGS \
+		MK_COVERAGE=no \
 		MK_CTF=no \
 		-DNO_LINT \
 		MK_TESTS=no

Modified: projects/runtime-coverage-v2/etc/Makefile
==============================================================================
--- projects/runtime-coverage-v2/etc/Makefile	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/etc/Makefile	Wed Apr  3 03:23:45 2019	(r345825)
@@ -126,18 +126,22 @@ MTREES=		mtree/BSD.root.dist		/		\
 		mtree/BSD.var.dist		/var		\
 		mtree/BSD.usr.dist		/usr		\
 		mtree/BSD.include.dist		/usr/include	\
+		mtree/BSD.coverage.dist		/usr/lib	\
 		mtree/BSD.debug.dist		/usr/lib
 .if ${MK_LIB32} != "no"
-MTREES+=	mtree/BSD.lib32.dist		/usr
-MTREES+=	mtree/BSD.lib32.dist		/usr/lib/debug/usr
+.for dir in /usr /usr/lib/cov/usr /usr/lib/debug/usr
+MTREES+=	mtree/BSD.lib32.dist		${dir}
+.endfor
 .endif
 .if ${MK_LIBSOFT} != "no"
-MTREES+=	mtree/BSD.libsoft.dist		/usr
-MTREES+=	mtree/BSD.libsoft.dist		/usr/lib/debug/usr
+.for dir in /usr /usr/lib/cov/usr /usr/lib/debug/usr
+MTREES+=	mtree/BSD.libsoft.dist		${dir}
+.endfor
 .endif
 .if ${MK_TESTS} != "no"
-MTREES+=	mtree/BSD.tests.dist		${TESTSBASE}
-MTREES+=	mtree/BSD.tests.dist		/usr/lib/debug/${TESTSBASE}
+.for dir in ${TESTSBASE} /usr/lib/cov/${TESTSBASE} /usr/lib/debug/${TESTSBASE}
+MTREES+=	mtree/BSD.tests.dist		${dir}
+.endfor
 .endif
 .if ${MK_SENDMAIL} != "no"
 MTREES+=	mtree/BSD.sendmail.dist		/

Added: projects/runtime-coverage-v2/etc/mtree/BSD.coverage.dist
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/runtime-coverage-v2/etc/mtree/BSD.coverage.dist	Wed Apr  3 03:23:45 2019	(r345825)
@@ -0,0 +1,70 @@
+# $FreeBSD$
+#
+# Please see the file src/etc/mtree/README before making changes to this file.
+#
+
+/set type=dir uname=root gname=wheel mode=0755
+.
+    cov
+        bin
+        ..
+        boot
+            kernel
+            ..
+            modules
+            ..
+        ..
+        lib
+            casper
+            ..
+            geom
+            ..
+        ..
+        libexec
+        ..
+        sbin
+        ..
+        usr
+            bin
+            ..
+            lib
+                clang
+                    8.0.0
+                        include
+                            sanitizer
+                            ..
+                        ..
+                        lib
+                            freebsd
+                            ..
+                        ..
+                    ..
+                ..
+                engines
+                ..
+                i18n
+                ..
+                libxo
+                    encoder
+                    ..
+                ..
+            ..
+            libexec
+                bsdinstall
+                ..
+                lpr
+                    ru
+                    ..
+                ..
+                sendmail
+                ..
+                sm.bin
+                ..
+            ..
+            sbin
+            ..
+            tests
+            ..
+        ..
+    ..
+..

Modified: projects/runtime-coverage-v2/etc/mtree/BSD.tests.dist
==============================================================================
--- projects/runtime-coverage-v2/etc/mtree/BSD.tests.dist	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/etc/mtree/BSD.tests.dist	Wed Apr  3 03:23:45 2019	(r345825)
@@ -825,6 +825,8 @@
         vm
         ..
     ..
+    tools
+    ..
     usr.bin
         apply
         ..

Modified: projects/runtime-coverage-v2/etc/mtree/Makefile
==============================================================================
--- projects/runtime-coverage-v2/etc/mtree/Makefile	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/etc/mtree/Makefile	Wed Apr  3 03:23:45 2019	(r345825)
@@ -5,6 +5,7 @@
 # NOTE: BSD.debug.dist is unconditionally installed for developer ease-of-use.
 FILES=	\
 	BSD.debug.dist \
+	${_BSD.coverage.dist} \
 	BSD.include.dist \
 	BSD.root.dist \
 	${_BSD.lib32.dist} \
@@ -14,6 +15,9 @@ FILES=	\
 	BSD.usr.dist \
 	BSD.var.dist
 
+.if ${MK_COVERAGE} != "no"
+_BSD.coverage.dist=	BSD.coverage.dist
+.endif
 .if ${MK_LIB32} != "no"
 _BSD.lib32.dist=	BSD.lib32.dist
 .endif

Modified: projects/runtime-coverage-v2/libexec/rtld-elf/Makefile
==============================================================================
--- projects/runtime-coverage-v2/libexec/rtld-elf/Makefile	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/libexec/rtld-elf/Makefile	Wed Apr  3 03:23:45 2019	(r345825)
@@ -6,6 +6,7 @@
 
 .include <src.opts.mk>
 PACKAGE=	clibs
+MK_COVERAGE=	no
 MK_PIE=		no # Always position independent using local rules
 MK_SSP=		no
 

Modified: projects/runtime-coverage-v2/share/man/man7/hier.7
==============================================================================
--- projects/runtime-coverage-v2/share/man/man7/hier.7	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/man/man7/hier.7	Wed Apr  3 03:23:45 2019	(r345825)
@@ -359,6 +359,8 @@ shared libraries for compatibility
 .It Pa aout/
 a.out backward compatibility libraries
 .El
+.It Pa cov/
+standalone coverage data for base system libraries and binaries
 .It Pa debug/
 standalone debug data for the kernel and base system libraries and binaries
 .It Pa dtrace/

Modified: projects/runtime-coverage-v2/share/mk/Makefile
==============================================================================
--- projects/runtime-coverage-v2/share/mk/Makefile	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/Makefile	Wed Apr  3 03:23:45 2019	(r345825)
@@ -71,6 +71,10 @@ FILES=	\
 
 FILESDIR=	${BINDIR}/mk
 
+.if ${MK_COVERAGE} != "no"
+FILES+=	bsd.cov.mk
+.endif
+
 .if ${MK_TESTS} != "no"
 FILES+=	atf.test.mk
 FILES+=	googletest.test.inc.mk

Added: projects/runtime-coverage-v2/share/mk/bsd.cov.mk
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/runtime-coverage-v2/share/mk/bsd.cov.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -0,0 +1,38 @@
+# $FreeBSD$
+#
+# Snippet for dealing with runtime coverage logic.
+#
+# .gcno files are generated from files that are compiled from source, e.g.,
+# foo.gcno is foo.c or foo.cpp's file. In order for the libraries and programs
+# to be properly instrumented, the .gcno files must be installed to a prefix
+# common to the object files.
+#
+# See gcov(1) for more details.
+
+.include <bsd.own.mk>
+
+FILESGROUPS?=	FILES
+
+.if !empty(GCNOS)
+
+GCNOSOWN?=	${BINOWN}
+GCNOSGRP?=	${BINGRP}
+GCNOSMODE?=	0644
+GCNOSDIRMODE?=	0755
+
+GCNOS:=		${GCNOS:O:u}
+FILESGROUPS+=	GCNOS
+CLEANFILES+=	${GCNOS}
+
+.for _gcno in ${GCNOS}
+_gcno_dir:=		${COVERAGEDIR}${_gcno:H:tA}
+GCNOSDIR_${_gcno:T}:=	${_gcno_dir}
+# Create _gcno_dir if it doesn't already exist.
+.if !target(${DESTDIR}${_gcno_dir})
+${DESTDIR}${_gcno_dir}:
+	${INSTALL} -d -o ${GCNOSOWN} -g ${GCNOSGRP} -m ${GCNOSDIRMODE} \
+	    ${.TARGET}/
+beforeinstall: ${DESTDIR}${_gcno_dir}
+.endif
+.endfor
+.endif

Modified: projects/runtime-coverage-v2/share/mk/bsd.lib.mk
==============================================================================
--- projects/runtime-coverage-v2/share/mk/bsd.lib.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/bsd.lib.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -3,6 +3,7 @@
 #
 
 .include <bsd.init.mk>
+.include <bsd.compiler.mk>
 
 .if defined(LIB_CXX) || defined(SHLIB_CXX)
 _LD=	${CXX}
@@ -54,6 +55,7 @@ CFLAGS+= ${DEBUG_FLAGS}
 .if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != ""
 CTFFLAGS+= -g
 .endif
+_WANTS_DEBUG=
 .else
 STRIP?=	-s
 .endif
@@ -111,6 +113,10 @@ PO_FLAG=-pg
 	${CTFCONVERT_CMD}
 
 .c.pico:
+	${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${_COV_FLAG} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
+	${CTFCONVERT_CMD}
+
+.c.ppico:
 	${CC} ${PICFLAG} -DPIC ${SHARED_CFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
 	${CTFCONVERT_CMD}
 
@@ -126,6 +132,9 @@ PO_FLAG=-pg
 	${CXX} ${PO_FLAG} ${STATIC_CXXFLAGS} ${PO_CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
 
 .cc.pico .C.pico .cpp.pico .cxx.pico:
+	${CXX} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS} ${_COV_FLAG} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
+
+.cc.ppico .C.ppico .cpp.ppico .cxx.ppico:
 	${CXX} ${PICFLAG} -DPIC ${SHARED_CXXFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}
 
 .cc.nossppico .C.nossppico .cpp.nossppico .cxx.nossppico:
@@ -196,6 +205,12 @@ _SHLIBDIR:=${SHLIBDIR}
 .if defined(SHLIB_NAME)
 .if ${MK_DEBUG_FILES} != "no"
 SHLIB_NAME_FULL=${SHLIB_NAME}.full
+.if ${MK_COVERAGE} != "no"
+COVERAGEFILEDIR=${COVERAGEDIR}${_SHLIBDIR}
+.if !exists(${DESTDIR}${COVERAGEFILEDIR})
+COVERAGEMKDIR=
+.endif
+.endif
 # Use ${DEBUGDIR} for base system debug files, else .debug subdirectory
 .if ${_SHLIBDIR} == "/boot" ||\
     ${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\
@@ -275,6 +290,9 @@ CLEANFILES+=	${SOBJS}
 .if defined(SHLIB_NAME)
 _LIBS+=		${SHLIB_NAME}
 
+.if defined(_COV_FLAG)
+SOLINKOPTS+=	${_COV_FLAG}
+.endif
 SOLINKOPTS+=	-shared -Wl,-x
 .if defined(LD_FATAL_WARNINGS) && ${LD_FATAL_WARNINGS} == "no"
 SOLINKOPTS+=	-Wl,--no-fatal-warnings
@@ -332,10 +350,18 @@ ${SHLIB_NAME}.debug: ${SHLIB_NAME_FULL}
 .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no"
 _LIBS+=		lib${LIB_PRIVATE}${LIB}_pic.a
 
-lib${LIB_PRIVATE}${LIB}_pic.a: ${SOBJS}
+.if ${MK_COVERAGE} != "no"
+PIC_OBJS:=	${SOBJS:.pico=.ppico}
+DEPENDOBJS+=	${PIC_OBJS}
+CLEANFILES+=	${PIC_OBJS}
+.else
+PIC_OBJS:=	${SOBJS}
+.endif
+
+lib${LIB_PRIVATE}${LIB}_pic.a: ${PIC_OBJS}
 	@${ECHO} building special pic ${LIB} library
 	@rm -f ${.TARGET}
-	${AR} ${ARFLAGS} ${.TARGET} ${SOBJS} ${ARADD}
+	${AR} ${ARFLAGS} ${.TARGET} ${PIC_OBJS} ${ARADD}
 	${RANLIB} ${RANLIBFLAGS} ${.TARGET}
 .endif
 
@@ -429,6 +455,14 @@ _libinstall:
 	    ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \
 	    ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR}/
 .if ${MK_DEBUG_FILES} != "no"
+.if ${MK_COVERAGE} != "no"
+.if defined(COVERAGEMKDIR)
+	${INSTALL} ${TAG_ARGS:D${TAG_ARGS},coverage} -d ${DESTDIR}${COVERAGEFILEDIR}/
+.endif
+	${INSTALL} ${TAG_ARGS:D${TAG_ARGS},coverage} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
+	    ${_INSTALLFLAGS} \
+	    ${SHLIB_NAME}.full ${DESTDIR}${COVERAGEFILEDIR}/${SHLIB_NAME}
+.endif
 .if defined(DEBUGMKDIR)
 	${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR}/
 .endif
@@ -509,6 +543,7 @@ OBJS_DEPEND_GUESS.${_S:${OBJS_SRCS_FILTER:ts:}}.po+=	$
     defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)
 .for _S in ${SRCS:N*.[hly]}
 OBJS_DEPEND_GUESS.${_S:${OBJS_SRCS_FILTER:ts:}}.pico+=	${_S}
+OBJS_DEPEND_GUESS.${_S:R}.ppico+=	${_S}
 .endfor
 .endif
 .if defined(BUILD_NOSSP_PIC_ARCHIVE) && defined(LIB) && !empty(LIB)

Modified: projects/runtime-coverage-v2/share/mk/bsd.opts.mk
==============================================================================
--- projects/runtime-coverage-v2/share/mk/bsd.opts.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/bsd.opts.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -71,10 +71,12 @@ __DEFAULT_YES_OPTIONS = \
 __DEFAULT_NO_OPTIONS = \
     BIND_NOW \
     CCACHE_BUILD \
+    COVERAGE \
     CTF \
     INSTALL_AS_USER \
     PIE \
     RETPOLINE \
+    MAKE_CHECK_TEST_WITH_COVERAGE \
     STALE_STAGED
 
 __DEFAULT_DEPENDENT_OPTIONS = \
@@ -85,6 +87,10 @@ __DEFAULT_DEPENDENT_OPTIONS = \
 
 
 .include <bsd.mkopt.mk>
+
+.if ${MK_COVERAGE} == "no" || ${MK_MAKE_CHECK_USE_SANDBOX} == "no"
+MK_MAKE_CHECK_TEST_WITH_COVERAGE:=	no
+.endif
 
 #
 # Supported NO_* options (if defined, MK_* will be forced to "no",

Modified: projects/runtime-coverage-v2/share/mk/bsd.own.mk
==============================================================================
--- projects/runtime-coverage-v2/share/mk/bsd.own.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/bsd.own.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -40,6 +40,7 @@
 #
 # LIBMODE	Library mode. [${NOBINMODE}]
 #
+# COVERAGEDIR	Base path for coverage files. [/usr/lib/cov]
 #
 # DEBUGDIR	Base path for standalone debug files. [/usr/lib/debug]
 #
@@ -184,6 +185,8 @@ SHLIBDIR?=	${LIBDIR}
 LIBOWN?=	${BINOWN}
 LIBGRP?=	${BINGRP}
 LIBMODE?=	${NOBINMODE}
+
+COVERAGEDIR?=	/usr/lib/cov
 
 DEBUGDIR?=	/usr/lib/debug
 DEBUGMODE?=	${NOBINMODE}

Modified: projects/runtime-coverage-v2/share/mk/bsd.prog.mk
==============================================================================
--- projects/runtime-coverage-v2/share/mk/bsd.prog.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/bsd.prog.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -55,12 +55,15 @@ LDFLAGS+= -Wl,-zretpolineplt
 .if defined(CRUNCH_CFLAGS)
 CFLAGS+=${CRUNCH_CFLAGS}
 .else
-.if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \
-    empty(DEBUG_FLAGS:M-gdwarf-*)
+.if ${MK_DEBUG_FILES} != "no"
+.if empty(DEBUG_FLAGS:M-g) && empty(DEBUG_FLAGS:M-gdwarf-*)
 CFLAGS+= ${DEBUG_FILES_CFLAGS}
+CXXFLAGS+= -g
 CTFFLAGS+= -g
 .endif
+_WANTS_DEBUG=
 .endif
+.endif
 
 .if !defined(DEBUG_FLAGS)
 STRIP?=	-s
@@ -75,7 +78,13 @@ TAG_ARGS=	-T ${TAGS:[*]:S/ /,/g}
 
 .if defined(NO_SHARED) && ${NO_SHARED:tl} != "no"
 LDFLAGS+= -static
+.else
+.if defined(_WANTS_DEBUG) && ${MK_COVERAGE} != "no" && ${COMPILER_FEATURES:Mc++11}
+_COV_FLAG= --coverage -fprofile-dir=${COVERAGEDIR}
+CFLAGS+= ${_COV_FLAG}
+CXXFLAGS+= ${_COV_FLAG}
 .endif
+.endif
 
 .if ${MK_DEBUG_FILES} != "no"
 PROG_FULL=${PROG}.full
@@ -91,6 +100,12 @@ DEBUGFILEDIR=	${DEBUGDIR}${BINDIR}
 .else
 DEBUGFILEDIR?=	${BINDIR}/.debug
 .endif
+.if ${MK_COVERAGE} != "no"
+_COVERAGEDIR=	${COVERAGEDIR}${BINDIR}
+.if !exists(${DESTDIR}${_COVERAGEDIR})
+COVERAGEMKDIR=
+.endif
+.endif
 .if !exists(${DESTDIR}${DEBUGFILEDIR})
 DEBUGMKDIR=
 .endif
@@ -255,6 +270,13 @@ _proginstall:
 	${INSTALL} ${TAG_ARGS} ${STRIP} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
 	    ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME}
 .if ${MK_DEBUG_FILES} != "no"
+.if ${MK_COVERAGE} != "no"
+.if defined(COVERAGEMKDIR)
+	${INSTALL} ${TAG_ARGS:D${TAG_ARGS},coverage} -d ${DESTDIR}${_COVERAGEDIR}/
+.endif
+	${INSTALL} ${TAG_ARGS:D${TAG_ARGS},coverage} -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \
+	    ${PROG_FULL} ${DESTDIR}${_COVERAGEDIR}/${PROGNAME}
+.endif
 .if defined(DEBUGMKDIR)
 	${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR}/
 .endif
@@ -301,6 +323,15 @@ NLSNAME?=	${PROG}
 .include <bsd.nls.mk>
 
 .include <bsd.confs.mk>
+.if defined(_COV_FLAG) && !empty(SRCS)
+_GCNO_SRCS=	${SRCS:M*.c} ${SRCS:M*.cc} ${SRCS:M*.cpp} ${SRCS:M*.cxx} ${SRCS:M*.C}
+GCNOS:=		${_GCNO_SRCS:R:S/$/.gcno/g}
+.undef _GCNO_SRCS
+.for _gcno in ${GCNOS}
+${_gcno}: ${_gcno:R}.o
+.endfor
+.include <bsd.cov.mk>
+.endif
 .include <bsd.files.mk>
 .include <bsd.incs.mk>
 

Modified: projects/runtime-coverage-v2/share/mk/meta.autodep.mk
==============================================================================
--- projects/runtime-coverage-v2/share/mk/meta.autodep.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/meta.autodep.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -22,11 +22,12 @@ __${_this}__: .NOTMAIN
 .-include <local.autodep.mk>
 
 PICO?= .pico
+PPICO?=	.ppico
 NOSSPPICO?= .nossppico
 
 .if defined(SRCS)
 # it would be nice to be able to query .SUFFIXES
-OBJ_EXTENSIONS+= .o .po .lo ${PICO} ${NOSSPPICO}
+OBJ_EXTENSIONS+= .o .po .lo ${PICO} ${PPICO} ${NOSSPPICO}
 
 # explicit dependencies help short-circuit .SUFFIX searches
 SRCS_DEP_FILTER+= N*.[hly]
@@ -182,7 +183,7 @@ DEPEND_SUFFIXES += .c .h .cpp .hpp .cxx .hxx .cc .hh
 	@case "${.MAKE.META.FILES:T:M*.po.*}" in \
 	*.po.*) mv $@.${.MAKE.PID} $@;; \
 	*) { cat $@.${.MAKE.PID}; \
-	sed 's,\${NOSSPPICO}:,.o:,;s,\${PICO}:,.o:,;s,\.o:,.po:,' $@.${.MAKE.PID}; } | sort -u > $@; \
+	sed 's,\${NOSSPPICO}:,.o:,;s,\${PICO}:,.o:,;s,\${PPICO}:,.o:,;s,\.o:,.po:,' $@.${.MAKE.PID}; } | sort -u > $@; \
 	rm -f $@.${.MAKE.PID};; \
 	esac
 .else

Modified: projects/runtime-coverage-v2/share/mk/src.opts.mk
==============================================================================
--- projects/runtime-coverage-v2/share/mk/src.opts.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/src.opts.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -295,6 +295,12 @@ __DEFAULT_NO_OPTIONS+=LLVM_TARGET_BPF
 # This means that architectures that have GCC 4.2 as default can not
 # build Clang without using an external compiler.
 
+# Note about MK_COVERAGE:
+#
+# clang and gcc 4.8+ (c++11 supporting compilers) support -fprofile-dir and
+# can compile lib/libclang_rt/profile . libgcov, etc, in base is a dead end
+# that I do not wish to support.
+
 .if ${COMPILER_FEATURES:Mc++11} && (${__T} == "aarch64" || \
     ${__T} == "amd64" || ${__TT} == "arm" || ${__T} == "i386")
 # Clang is enabled, and will be installed as the default /usr/bin/cc.
@@ -534,6 +540,7 @@ MK_LLD_BOOTSTRAP:= no
 .if ${MK_TOOLCHAIN} == "no"
 MK_BINUTILS:=	no
 MK_CLANG:=	no
+MK_COVERAGE:=	no
 MK_GCC:=	no
 MK_GDB:=	no
 MK_INCLUDES:=	no

Modified: projects/runtime-coverage-v2/share/mk/suite.test.mk
==============================================================================
--- projects/runtime-coverage-v2/share/mk/suite.test.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/share/mk/suite.test.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -79,6 +79,39 @@ Kyuafile: Makefile
 
 KYUA= ${LOCALBASE}/bin/kyua
 
+MAKE_CHECK_SANDBOX_DIR=	checkdir
+CLEANDIRS+=	${MAKE_CHECK_SANDBOX_DIR}
+
+.if ${MK_MAKE_CHECK_USE_SANDBOX} != "no" && make(check)
+DESTDIR:=	${.OBJDIR}/${MAKE_CHECK_SANDBOX_DIR}
+
+.if ${MK_MAKE_CHECK_TEST_WITH_COVERAGE} != "no"
+GCOV?=		gcov
+GCOV_PREFIX?=	${DESTDIR}
+TESTS_ENV+=	GCOV=${GCOV} GCOV_PREFIX=${GCOV_PREFIX}
+.endif
+
+beforecheck:
+.for t in clean depend all
+.for dir in ${SRCTOP}/tests/tools ${.CURDIR}
+	@cd ${dir} && ${MAKE} $t
+.endfor
+.endfor
+	@cd ${SRCTOP} && ${MAKE} hierarchy DESTDIR=${DESTDIR}
+.for dir in ${SRCTOP}/tests/tools ${.CURDIR}
+	@cd ${dir} && ${MAKE} install DESTDIR=${DESTDIR}
+.endfor
+
+# NOTE: this is intentional to ensure that "make check" can be run multiple
+#       times. "aftercheck" won't be run if "make check" fails, is interrupted,
+#       etc.
+aftercheck:
+.if ${MK_MAKE_CHECK_TEST_WITH_COVERAGE} != "no"
+	@env ${TESTS_ENV:Q} ${DESTDIR}${TESTSBASE}/tools/gather_coverage
+.endif
+	@cd ${.CURDIR} && ${MAKE} clean
+.endif
+
 # Definition of the "make check" target and supporting variables.
 #
 # This target, by necessity, can only work for native builds (i.e. a FreeBSD

Modified: projects/runtime-coverage-v2/stand/defs.mk
==============================================================================
--- projects/runtime-coverage-v2/stand/defs.mk	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/stand/defs.mk	Wed Apr  3 03:23:45 2019	(r345825)
@@ -7,6 +7,7 @@ __BOOT_DEFS_MK__=${MFILE}
 # because it includes bsd.own.mk which needs the right MK_ values,
 # espeically MK_CTF.
 
+MK_COVERAGE=	no
 MK_CTF=		no
 MK_SSP=		no
 MK_PROFILE=	no

Modified: projects/runtime-coverage-v2/tests/Makefile
==============================================================================
--- projects/runtime-coverage-v2/tests/Makefile	Wed Apr  3 02:46:57 2019	(r345824)
+++ projects/runtime-coverage-v2/tests/Makefile	Wed Apr  3 03:23:45 2019	(r345825)
@@ -10,6 +10,7 @@ KYUAFILE= yes
 
 SUBDIR+= etc
 SUBDIR+= sys
+SUBDIR+= tools
 
 SUBDIR_PARALLEL=
 

Added: projects/runtime-coverage-v2/tests/tools/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/runtime-coverage-v2/tests/tools/Makefile	Wed Apr  3 03:23:45 2019	(r345825)
@@ -0,0 +1,11 @@
+# $FreeBSD$
+
+.include <src.opts.mk>
+
+BINDIR=		${TESTSBASE}/tools
+
+.if ${MK_COVERAGE} != "no"
+SCRIPTS+=	gather_coverage
+.endif
+
+.include <bsd.prog.mk>

Added: projects/runtime-coverage-v2/tests/tools/gather_coverage.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/runtime-coverage-v2/tests/tools/gather_coverage.sh	Wed Apr  3 03:23:45 2019	(r345825)
@@ -0,0 +1,75 @@
+#!/bin/sh
+#
+# Copyright (c) 2017 Ngie Cooper
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+
+# usage: gather_coverage
+
+SCRIPT=${0##*/}
+
+: ${COVERAGE_OUTPUT=coverage-output}
+: ${GCOV=gcov}
+: ${GCOV_PREFIX=$(pwd)}
+
+error()
+{
+	printf >&2 "${SCRIPT}: ERROR: %s\n" "$@"
+}
+
+require_command()
+{
+	local cmd=$1; shift
+
+	if ! command -v $cmd >/dev/null; then
+		error "required command not found: $cmd"
+		if [ $# -gt 0 ]; then
+			printf >&2 "%s\n" "$@"
+		fi
+		exit 1
+	fi
+}
+
+
+
+require_command ${GCOV} \
+    'Install gcov from base, or specify alternate version, e.g., from ports, using $GCOV.'
+for cmd in lcov genhtml; do
+	require_command ${cmd} "Install devel/lcov from ports."
+done
+
+if ! COVERAGE_TMP=$(mktemp -d tmp.XXXXXX); then
+	error "failed to create COVERAGE_TMP."
+	exit 1
+fi
+trap "rm -Rf '$COVERAGE_TMP'" EXIT INT TERM
+
+set -e
+
+lcov --gcov-tool ${GCOV} --capture --directory ${GCOV_PREFIX} --output-file \
+    ${COVERAGE_TMP}/coverage.info
+genhtml ${COVERAGE_TMP}/coverage.info --output-directory ${COVERAGE_OUTPUT}
+
+printf "${SCRIPT}: INFO: coverage output successfully placed in ${COVERAGE_OUTPUT}\n"

Added: projects/runtime-coverage-v2/tools/build/options/WITH_COVERAGE
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/runtime-coverage-v2/tools/build/options/WITH_COVERAGE	Wed Apr  3 03:23:45 2019	(r345825)
@@ -0,0 +1,17 @@
+.\" $FreeBSD$
+Set to build profiled libraries for use with
+.Xr gcov 1 ,
+.Xr lcov 1 ,
+etc.
+.Em Warning:
+this option is experimental.
+Profiled libraries and binaries with runtime instrumentation built in will
+consume large amounts of disk space (somewhere on the order of several
+gigabytes).
+.\" TODO: put this in build(7)?
+GCDA files are installed to the
+.Pa /usr/lib/cov
+prefix.
+.\" TODO: verify this claim in an e2e test.
+The install directory mirrors the install path for the object directory, e.g.,
+.Pa /usr/lib/cov/usr/obj/lib/libc/stdio/vfprintf.gcda


More information about the svn-src-projects mailing list