commit b6b8969657ce950c7f5c81ebd6d3fa6b13b1ec1c from: Sergey Bronnikov date: Mon Dec 04 16:04:52 2017 UTC Update patch with code coverage support in kernel commit - 45e3bd443f77e786990239ffcc74ddf62652cf33 commit + b6b8969657ce950c7f5c81ebd6d3fa6b13b1ec1c blob - 26ef46ffc43660c026ae709769f0a8b7c1a8e6b8 blob + 1252120c9009a7e5f4baeb3d4009d826238c007a --- tools/coverage.patch +++ tools/coverage.patch @@ -1,73 +1,35 @@ +diff --git a/share/man/man9/malloc.9 b/share/man/man9/malloc.9 +index 6c0e71959dd..cb6177dfa00 100644 +--- a/share/man/man9/malloc.9 ++++ b/share/man/man9/malloc.9 +@@ -312,6 +312,8 @@ UDF file ID. + AGP memory. + .It Dv M_DRM + Direct Rendering Manager. ++.It Dv M_GCOV ++Code coverage. + .El + .Sh CONTEXT + .Fn malloc diff --git a/sys/arch/amd64/conf/Makefile.amd64 b/sys/arch/amd64/conf/Makefile.amd64 -index 6d99b22..8e902cd 100644 +index d709d434b1f..065625ae1f1 100644 --- a/sys/arch/amd64/conf/Makefile.amd64 +++ b/sys/arch/amd64/conf/Makefile.amd64 -@@ -41,6 +41,9 @@ CMACHFLAGS+= -Wa,-n +@@ -47,6 +47,9 @@ NO_INTEGR_AS= -no-integrated-as DEBUG?= -g COPTS?= -O2 +.if ${COVERAGE} +COPTS+= -fprofile-arcs -ftest-coverage -O0 -+.end ++.endif CFLAGS= ${DEBUG} ${CWARNFLAGS} ${CMACHFLAGS} ${COPTS} ${PIPE} AFLAGS= -D_LOCORE -x assembler-with-cpp ${CWARNFLAGS} ${CMACHFLAGS} - LDSCRIPT= ${_machdir}/conf/ld.script -diff --git a/sys/arch/amd64/conf/ld.script b/sys/arch/amd64/conf/ld.script -index b184a75..2a7bf68 100644 ---- a/sys/arch/amd64/conf/ld.script -+++ b/sys/arch/amd64/conf/ld.script -@@ -92,6 +92,7 @@ SECTIONS - __data_size = SIZEOF(.data); - __data_load = LOADADDR(.data); - *(.data .data.*) -+ SORT(CONSTRUCTORS) - } :data - . = ALIGN(0x1000); - PROVIDE (edata = .); -@@ -124,4 +125,38 @@ SECTIONS - *(.note.GNU-stack) - *(.eh_frame) - } -+ -+ _start_ctors = .; -+ PROVIDE (start_ctors = .); -+ .ctors : -+ { -+ /* gcc uses crtbegin.o to find the start of -+ the constructors, so we make sure it is -+ first. Because this is a wildcard, it -+ doesn't matter if the user does not -+ actually link against crtbegin.o; the -+ linker won't look for a file to match a -+ wildcard. The wildcard also means that it -+ doesn't matter which directory crtbegin.o -+ is in. */ -+ KEEP (*crtbegin.o(.ctors)) -+ KEEP (*crtbegin?.o(.ctors)) -+ /* We don't want to include the .ctor section from -+ the crtend.o file until after the sorted ctors. -+ The .ctor section from the crtend file contains the -+ end of ctors marker and it must be last */ -+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) -+ KEEP (*(SORT(.ctors.*))) -+ KEEP (*(.ctors)) -+ } -+ _stop_ctors = .; -+ PROVIDE (stop_ctors = .); -+ .dtors : -+ { -+ KEEP (*crtbegin.o(.dtors)) -+ KEEP (*crtbegin?.o(.dtors)) -+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) -+ KEEP (*(SORT(.dtors.*))) -+ KEEP (*(.dtors)) -+ } - } + LINKFLAGS= -T ld.script -X --warn-common -nopie diff --git a/sys/conf/files b/sys/conf/files -index 400bdbb..f36919c 100644 +index e948086e270..2ad000124e0 100644 --- a/sys/conf/files +++ b/sys/conf/files -@@ -689,6 +689,7 @@ file kern/subr_autoconf.c +@@ -695,6 +695,7 @@ file kern/subr_autoconf.c file kern/subr_disk.c file kern/subr_evcount.c file kern/subr_extent.c @@ -77,10 +39,10 @@ index 400bdbb..f36919c 100644 file kern/subr_percpu.c diff --git a/sys/kern/subr_gcov.c b/sys/kern/subr_gcov.c new file mode 100644 -index 0000000..475fe83 +index 00000000000..40963c65839 --- /dev/null +++ b/sys/kern/subr_gcov.c -@@ -0,0 +1,208 @@ +@@ -0,0 +1,210 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. @@ -135,7 +97,6 @@ index 0000000..475fe83 +#include +#include + -+/* +static void +linker_file_register_profile(linker_file_t lf) +{ @@ -152,16 +113,15 @@ index 0000000..475fe83 +{ + gcov_unregister_ctors(lf); +} -+*/ + +//static MALLOC_DEFINE(M_GCOV, "gcov", "GCC profile-arcs and code-coverage"); ++// FreeBSD: static struct mutex gcov_mutex; ++// FreeBSD: MTX_SYSINIT(gcov_lock, &gcov_mutex, "gcov data lock", MTX_DEF); ++struct mutex gcov_mutex = MUTEX_INITIALIZER(IPL_NONE); ++mtx_init(&gcov_mutex, MTX_DEF); + -+static struct mutex gcov_mutex; -+//MTX_SYSINIT(gcov_lock, &gcov_mutex, "gcov data lock", MTX_DEF); -+//mtx_init(&gcov_mutex, MTX_DEF); -+ -+/* This structure is used to keep track of all struct bbs associated with a -+ * module. */ ++/* This structure is used to keep track ++ * of all struct bbs associated with a module. */ +struct gcov_context +{ + LIST_ENTRY(gcov_context) gcov_link; @@ -177,6 +137,7 @@ index 0000000..475fe83 + * change gcov_type *counts to void * + */ +/* Structure emitted by --profile-arcs */ ++ +struct bb +{ + long zero_word; @@ -226,17 +187,20 @@ index 0000000..475fe83 + int bbcount; + struct gcov_context *context; + ctor_t* ctor; -+ ++ + bbcount = stop - start; -+ ++ +/* ++ FreeBSD: + MALLOC(context, struct gcov_context *, + sizeof(struct gcov_context) + bbcount * sizeof(struct bb *), + M_GCOV, M_WAITOK); +*/ -+ //mtx_lock(&gcov_mutex); ++ // FreeBSD: mtx_lock(&gcov_mutex); ++ // FreeBSD: KASSERT(current_context == NULL, ("current gcov context is not NULL")); ++ malloc(sizeof(struct gcov_context) + bbcount * sizeof(struct bb *), M_GCOV | M_WAITOK) + mtx_enter(&gcov_mutex); -+ //KASSERT(current_context == NULL, ("current gcov context is not NULL")); ++ KASSERT(current_context == NULL); + current_context = context; + current_context->lf = lf; + current_context->count = 0; @@ -247,7 +211,7 @@ index 0000000..475fe83 + for (ctor = start; ctor < stop; ctor++) + if (*ctor != NULL) + (*ctor)(); -+ ++ + current_context = NULL; + mtx_leave(&gcov_mutex); +} @@ -265,7 +229,7 @@ index 0000000..475fe83 + /* remove the each bb from the bb_head list */ + struct bb *prev = NULL, *bb; + int i; -+ ++ + for (bb = bb_head; bb ; bb = bb->next) { + for (i = 0; i < context->count; i++) { + if (context->bb[i] == bb) { @@ -286,17 +250,17 @@ index 0000000..475fe83 + return; + } + } -+ ++ + mtx_leave(&gcov_mutex); +} diff --git a/sys/sys/gcov.h b/sys/sys/gcov.h new file mode 100644 -index 0000000..854be47 +index 00000000000..a5fc28dc987 --- /dev/null +++ b/sys/sys/gcov.h @@ -0,0 +1,57 @@ +/*- -+ * Copyright (c) 1995 ++ * Copyright (c) 1995 + * All rights reserved. + * + * Copyright (c) 1990, 1993 @@ -352,3 +316,26 @@ index 0000000..854be47 +extern void gcov_register_ctors(struct linker_file *, ctor_t *, ctor_t *); +extern void gcov_unregister_ctors(struct linker_file *); +#endif +diff --git a/sys/sys/malloc.h b/sys/sys/malloc.h +index e5fb2caa906..be1f7573c5b 100644 +--- a/sys/sys/malloc.h ++++ b/sys/sys/malloc.h +@@ -181,7 +181,9 @@ + + #define M_DRM 145 /* Direct Rendering Manager */ + +-#define M_LAST 146 /* Must be last type + 1 */ ++#define M_GCOV 146 /* Code coverage */ ++ ++#define M_LAST 147 /* Must be last type + 1 */ + + #define INITKMEMNAMES { \ + "free", /* 0 M_FREE */ \ +@@ -314,6 +316,7 @@ + NULL, /* 143 free */ \ + "AGP Memory", /* 144 M_AGP */ \ + "DRM", /* 145 M_DRM */ \ ++ "GCOV", /* 146 M_GCOV */ \ + } + + struct kmemstats {