diff --git a/.github/workflows/test-verific.yml b/.github/workflows/test-verific.yml index 6e3284167..bdd35428a 100644 --- a/.github/workflows/test-verific.yml +++ b/.github/workflows/test-verific.yml @@ -44,6 +44,14 @@ jobs: - name: Runtime environment run: | echo "procs=$(nproc)" >> $GITHUB_ENV + mkdir -p "${GITHUB_WORKSPACE}/coverage" + echo "LLVM_PROFILE_FILE=${GITHUB_WORKSPACE}/coverage/coverage_%p.profraw" >> $GITHUB_ENV + echo "LLVM_PROFILE_FILE_BUFFER_SIZE=0" >> $GITHUB_ENV + + - name: Skip generating files + if: ${{ github.event_name != 'merge_group' && github.event_name != 'workflow_dispatch' }} + run: | + echo "LLVM_PROFILE_FILE=/dev/null" >> $GITHUB_ENV - name: Build Yosys run: | @@ -89,6 +97,7 @@ jobs: if: ${{ github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' }} run: | make coverage + make clean_coverage - name: Push coverage if: ${{ github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' }} diff --git a/.gitignore b/.gitignore index a8b04ac45..b39088088 100644 --- a/.gitignore +++ b/.gitignore @@ -65,10 +65,10 @@ /viz.js # other -/coverage.info +/yosys.profdata +/coverage /coverage_html - # these really belong in global gitignore since they're not specific to this project but rather to user tool choice # but too many people don't have a global gitignore configured: # https://docs.github.com/en/get-started/git-basics/ignoring-files#configuring-ignored-files-for-all-repositories-on-your-computer diff --git a/Makefile b/Makefile index f6ba73375..3c9911c1c 100644 --- a/Makefile +++ b/Makefile @@ -456,8 +456,11 @@ endif endif ifeq ($(ENABLE_GCOV),1) -CXXFLAGS += --coverage -LINKFLAGS += --coverage +LLVM_PROFILE_FILE ?= $(realpath $(YOSYS_SRC))/coverage/coverage_%p.profraw +export LLVM_PROFILE_FILE +export LLVM_PROFILE_FILE_BUFFER_SIZE=0 +CXXFLAGS += -fprofile-instr-generate -fcoverage-mapping +LINKFLAGS+= -fprofile-instr-generate endif ifeq ($(ENABLE_GPROF),1) @@ -1115,13 +1118,13 @@ mrproper: clean coverage: ./$(PROGRAM_PREFIX)yosys -qp 'help; help -all' - rm -rf coverage.info coverage_html - lcov --capture -d . --no-external -o coverage.info - lcov --remove coverage.info '*/tests/various/*' '*/libs/*' -o coverage.info --ignore-errors unused - genhtml coverage.info --output-directory coverage_html + rm -rf coverage_html + llvm-profdata merge -sparse coverage/coverage_*.profraw -o yosys.profdata + llvm-cov show ./$(PROGRAM_PREFIX)yosys -instr-profile=yosys.profdata -format=html -output-dir=coverage_html --compilation-dir=. -ignore-filename-regex='(^|.*/)Verific/.*|(^|.*/)libs/.*' clean_coverage: - find . -name "*.gcda" -type f -delete + rm -rf coverage + rm -f yosys.profdata FUNC_KERNEL := functional.cc functional.h sexpr.cc sexpr.h compute_graph.h FUNC_INCLUDES := $(addprefix --include *,functional/* $(FUNC_KERNEL)) @@ -1183,7 +1186,7 @@ config-msys2-64: clean echo "PREFIX := $(MINGW_PREFIX)" >> Makefile.conf config-gcov: clean - echo 'CONFIG := gcc' > Makefile.conf + echo 'CONFIG := clang' > Makefile.conf echo 'ENABLE_GCOV := 1' >> Makefile.conf echo 'ENABLE_DEBUG := 1' >> Makefile.conf