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
Tue Sep 3 14:06:09 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