diff --git a/meson.build b/meson.build index 69dce9c87f..458370e83d 100644 --- a/meson.build +++ b/meson.build @@ -47,9 +47,6 @@ fuzzer_build = want_ossfuzz or want_libfuzzer # More items are added later after they have been detected. summary({'build mode' : get_option('mode')}) -# GCOV doesn't define any macro when compiled with, so let's define it ourselves -conf.set10('BUILT_WITH_COVERAGE', get_option('b_coverage')) - ##################################################################### # Try to install the git pre-commit hook @@ -1823,6 +1820,12 @@ export_dbus_interfaces_py = find_program('tools/dbus_exporter.py') ############################################################ +if get_option('b_coverage') + add_project_arguments('-include', 'src/basic/coverage.h', language : 'c') +endif + +############################################################ + config_h = configure_file( output : 'config.h', configuration : conf) @@ -4230,6 +4233,7 @@ foreach tuple : [ ['link-boot-shared', get_option('link-boot-shared')], ['fexecve'], ['standalone-binaries', get_option('standalone-binaries')], + ['coverage', get_option('b_coverage')], ] if tuple.length() >= 2 diff --git a/src/basic/coverage.h b/src/basic/coverage.h new file mode 100644 index 0000000000..3ef02cf70e --- /dev/null +++ b/src/basic/coverage.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +/* When built with --coverage (gcov) we need to explicitly call __gcov_dump() + * in places where we use _exit(), since _exit() skips at-exit hooks resulting + * in lost coverage. + * + * To make sure we don't miss any _exit() calls, this header file is included + * explicitly on the compiler command line via the -include directive (only + * when built with -Db_coverage=true) + * */ +extern void _exit(int); +extern void __gcov_dump(void); + +static inline void _coverage__exit(int status) { + __gcov_dump(); + _exit(status); +} +#define _exit(x) _coverage__exit(x) diff --git a/src/basic/macro.h b/src/basic/macro.h index 685de73449..68d8b062e8 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -29,19 +29,6 @@ #define _alignptr_ __attribute__((__aligned__(sizeof(void*)))) #define _warn_unused_result_ __attribute__((__warn_unused_result__)) -#if defined(BUILT_WITH_COVERAGE) && BUILT_WITH_COVERAGE -/* We need to explicitly call __gcov_dump() in places where we use _exit(), since - * _exit() skips at-exit hooks resulting in lost coverage */ -# include -extern void __gcov_dump(void); - -_noreturn_ static inline void _coverage__exit(int status) { - __gcov_dump(); - _exit(status); -} -# define _exit(x) _coverage__exit(x) -#endif - #if !defined(HAS_FEATURE_MEMORY_SANITIZER) # if defined(__has_feature) # if __has_feature(memory_sanitizer)