From 704c5a1c966b43f490be91aa0f19b8aa003e341f Mon Sep 17 00:00:00 2001 From: Yilou Wang Date: Fri, 31 Jul 2026 18:08:05 +0200 Subject: [PATCH] Fix gcov dump on warnings discarding later coverage counts (#8017) --- include/verilated.cpp | 2 +- include/verilatedos.h | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/verilated.cpp b/include/verilated.cpp index 540f8ee22..981ac1f57 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -3887,7 +3887,7 @@ void Verilated::runFlushCallbacks() VL_MT_SAFE { // When running internal code coverage (gcc --coverage, as opposed to // verilator --coverage), dump coverage data to properly cover failing // tests. - VL_GCOV_DUMP(); + VL_GCOV_DUMP_RESET(); } void Verilated::addExitCb(VoidPCb cb, void* datap) VL_MT_SAFE { addCbExit(cb, datap); } diff --git a/include/verilatedos.h b/include/verilatedos.h index 57add8d69..fc597a494 100644 --- a/include/verilatedos.h +++ b/include/verilatedos.h @@ -332,10 +332,19 @@ #ifdef VL_GCOV extern "C" void __gcov_dump(); +extern "C" void __gcov_reset(); // Dump internal code coverage data before e.g. std::abort() # define VL_GCOV_DUMP() __gcov_dump() +// Dump, then re-arm dumping; dumping is one-shot, so without the reset a dump +// on a nonfatal path would silently discard everything counted after it +# define VL_GCOV_DUMP_RESET() \ + do { \ + __gcov_dump(); \ + __gcov_reset(); \ + } while (false) #else # define VL_GCOV_DUMP() +# define VL_GCOV_DUMP_RESET() #endif //=========================================================================