Date: Tue, 03 Sep 2019 14:06:09 -0000 From: Enji Cooper <ngie@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: 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 Message-ID: <201904030323.x333Nkcp018859@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904030323.x333Nkcp018859>