From 65bfb4e5ff8629cdaa07bc036031671250d42006 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Mon, 14 Jun 2021 18:03:05 +0100 Subject: [PATCH] Build Verilator without -Og in the coverage build The coverage numbers decreased when adding -Og to the debug build. This patch restores them by adding --enable-coverage to configure and building without -Og if requested. --- configure.ac | 35 +++++++++++++++++++++++++++++++++++ nodist/code_coverage | 18 +----------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/configure.ac b/configure.ac index 76844f6cb..c111cecc1 100644 --- a/configure.ac +++ b/configure.ac @@ -75,6 +75,20 @@ AC_ARG_ENABLE([m32], CFG_ENABLE_M32=no) AC_MSG_RESULT($CFG_ENABLE_M32) +# Flag to enable coverage build +AC_MSG_CHECKING(whether to build for coverage collection) +AC_ARG_ENABLE([coverage], + [AS_HELP_STRING([--enable-coverage], + [Build Verilator for code coverage collection. + For developers only.])], + [case "${enableval}" in + yes) CFG_ENABLE_COVERAGE=yes ;; + no) CFG_ENABLE_COVERAGE=no ;; + *) AC_MSG_ERROR([bad value '${enableval}' for --enable-coverage]) ;; + esac], + CFG_ENABLE_COVERAGE=no) +AC_MSG_RESULT($CFG_ENABLE_COVERAGE) + # Special Substitutions - CFG_WITH_DEFENV AC_MSG_CHECKING(whether to use hardcoded paths) AC_ARG_ENABLE([defenv], @@ -302,6 +316,25 @@ if test "$CFG_ENABLE_M32" = "yes"; then [AC_MSG_ERROR([--enable-m32 was given but compiler does not support -m32])]) fi +# Similarly, add the coverage flags early as they influence later checks. +if test "$CFG_ENABLE_COVERAGE" = "yes"; then + _MY_CXX_CHECK_OPT(CXX,--coverage) + # Otherwise inline may not show as uncovered + # If we use this then e.g. verilated.h functions properly show up + # if unused. + # However, VerilatedSerialize::write then changes from covered + # to uncovered (in G++ 9.3.0) even with all inlining turned off. + # Having false negative coverage is more effort then missing negatives. + # Also this seems to explode the runtime (since a lot more data). + # _MY_CXX_CHECK_OPT(CXX,-fkeep-inline-functions) + # Otherwise static may not show as uncovered + _MY_CXX_CHECK_OPT(CXX,-fkeep-static-functions) + # Exceptions can pollute the branch coverage data + _MY_CXX_CHECK_OPT(CXX,-fno-exceptions) + # Define-out some impossible stuff + _MY_CXX_CHECK_OPT(CXX,-DVL_GCOV) +fi + # Flag to select newest language standard supported # Macros work such that first option that passes is the one we take # Currently enabled gnu++14/c++14 due to packaged SystemC dependency @@ -355,7 +388,9 @@ _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_PARSER,-Wno-unused) AC_SUBST(CFG_CXXFLAGS_PARSER) # Flags for compiling the debug version of Verilator (in addition to above CFG_CXXFLAGS_SRC) +if test "$CFG_ENABLE_COVERAGE" = "no"; then # Do not optimize for the coverage build _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DEBUG,-Og) +fi _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DEBUG,-ggdb) _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_DEBUG,-gz) AC_SUBST(CFG_CXXFLAGS_DEBUG) diff --git a/nodist/code_coverage b/nodist/code_coverage index 0a3cc0e08..ffddfa585 100755 --- a/nodist/code_coverage +++ b/nodist/code_coverage @@ -38,23 +38,7 @@ def test(): ci_fold_start("configure") print("Stage 1: configure (coverage on)") run("autoconf") - cxx_flags = ( - "--coverage" - # Otherwise inline may not show as uncovered - # If we use this then e.g. verilated.h functions properly show up - # if unused. - # However, VerilatedSerialize::write then changes from covered - # to uncovered (in G++ 9.3.0) even with all inlining turned off. - # Having false negative coverage is more effort then missing negatives. - # Also this seems to explode the runtime (since a lot more data). - # + " -fkeep-inline-functions" - # Otherwise static may not show as uncovered - + " -fkeep-static-functions" - # Exceptions can pollute the branch coverage data - + " -fno-exceptions" - # Define-out some impossible stuff - + " -DVL_GCOV") - run("./configure --enable-longtests CXX='g++ " + cxx_flags + "'") + run("./configure --enable-longtests --enable-coverage CXX=g++") ci_fold_end() if Args.stage_enabled[2]: