From: Frantisek Sumsal Date: Wed, 6 Apr 2022 17:41:01 +0000 (+0200) Subject: macro: call __gcov_dump() before _exit() w/ coverage enabled X-Git-Tag: v251-rc2~169^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c6552ad381003a23cde7c3228e7071f30465df35;p=thirdparty%2Fsystemd.git macro: call __gcov_dump() before _exit() w/ coverage enabled _exit() skips at-exit hooks, causing lost coverage from processes utilizing it. Hopefully resolves systemd/systemd-centos-ci#482 --- diff --git a/meson.build b/meson.build index 0455d89b78c..26f98b856c6 100644 --- a/meson.build +++ b/meson.build @@ -47,6 +47,9 @@ 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 diff --git a/src/basic/macro.h b/src/basic/macro.h index 68d8b062e87..685de734493 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -29,6 +29,19 @@ #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)