diff --git a/.github/workflows/test-verific.yml b/.github/workflows/test-verific.yml
index 132aac589..bdd35428a 100644
--- a/.github/workflows/test-verific.yml
+++ b/.github/workflows/test-verific.yml
@@ -44,10 +44,18 @@ 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: |
- make config-clang
+ make config-gcov
echo "ENABLE_VERIFIC := 1" >> Makefile.conf
echo "ENABLE_VERIFIC_EDIF := 1" >> Makefile.conf
echo "ENABLE_VERIFIC_LIBERTY := 1" >> Makefile.conf
@@ -85,6 +93,31 @@ jobs:
run: |
make -C sby run_ci
+ - name: Run coverage
+ 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' }}
+ run: |
+ git clone https://x-access-token:${{ secrets.REPORTS_TOKEN }}@github.com/YosysHQ/reports.git out
+ rm -rf out/coverage/main
+ mkdir -p out/coverage/main
+ cp -r coverage_html/* out/coverage/main/
+ cd out
+ # find . -name "*.html" -type f -print0 | xargs -0 sed -i -z 's#\(
[[:space:]]*\)#\1\2#g'
+ git config user.name "yosyshq-ci"
+ git config user.email "105224853+yosyshq-ci@users.noreply.github.com"
+ git add .
+ if ! git diff --cached --quiet; then
+ git commit -m "Update coverage"
+ git push
+ else
+ echo "No changes to commit"
+ fi
+
test-pyosys:
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip != 'true' && github.repository_owner == 'YosysHQ' }}
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 afbc11005..6ee34070d 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,12 +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
- 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='(^|.*/)libs/.*|/usr/include/.*|$(subst /,\/,$(VERIFIC_DIR))/.*'
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))
@@ -1182,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