From c40a7eb930c4851c20338589ae41252aba550456 Mon Sep 17 00:00:00 2001 From: yinshengkai Date: Wed, 8 Sep 2021 17:37:25 +0800 Subject: [PATCH] tool: add code coverage tool N/A Signed-off-by: yinshengkai Change-Id: I9388a08565508383e53b418696c14ae286b172ce --- .gitignore | 2 ++ arch/Kconfig | 8 ++++++ arch/sim/src/Makefile | 4 +++ arch/sim/src/nuttx-names.in | 19 +++++++++++++ boards/sim/sim/sim/scripts/Make.defs | 4 +++ tools/Config.mk | 4 +++ tools/gcov.sh | 42 ++++++++++++++++++++++++++++ 7 files changed, 83 insertions(+) create mode 100755 tools/gcov.sh diff --git a/.gitignore b/.gitignore index 47c8be281ab..3470bd14db6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ *.dSYM *.elf *.exe +*.gcno +*.gcda *.hex *.i *.ihx diff --git a/arch/Kconfig b/arch/Kconfig index f242466e4df..cec48197768 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -217,6 +217,14 @@ config ARCH_SIZET_LONG C++ library routines because the NuttX size_t might not have the same underlying type as your toolchain's size_t. +config ARCH_COVERAGE + bool "arch coverage" + select HAVE_CXX + select HAVE_CXXINITIALIZE + default n + ---help--- + Generate code coverage + comment "Architecture Options" config ARCH_NOINTC diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile index 2bc9bcb3e2e..7f2eeb63228 100644 --- a/arch/sim/src/Makefile +++ b/arch/sim/src/Makefile @@ -88,6 +88,10 @@ ifeq ($(CONFIG_STACK_COLORATION),y) CSRCS += up_checkstack.c endif +ifeq ($(CONFIG_ARCH_COVERAGE),y) + STDLIBS += -lgcov +endif + ifeq ($(CONFIG_SPINLOCK),y) HOSTSRCS += up_testset.c endif diff --git a/arch/sim/src/nuttx-names.in b/arch/sim/src/nuttx-names.in index 2e3899336f3..5b051b0df13 100644 --- a/arch/sim/src/nuttx-names.in +++ b/arch/sim/src/nuttx-names.in @@ -31,7 +31,9 @@ #endif NXSYMBOLS(__cxa_atexit) +NXSYMBOLS(abort) NXSYMBOLS(accept) +NXSYMBOLS(access) NXSYMBOLS(atexit) NXSYMBOLS(bind) NXSYMBOLS(calloc) @@ -46,14 +48,24 @@ NXSYMBOLS(dup) NXSYMBOLS(exit) NXSYMBOLS(fchmod) NXSYMBOLS(fchown) +NXSYMBOLS(fclose) NXSYMBOLS(fcntl) +NXSYMBOLS(fdopen) +NXSYMBOLS(fopen) +NXSYMBOLS(fprintf) +NXSYMBOLS(fread) NXSYMBOLS(free) +NXSYMBOLS(fseek) NXSYMBOLS(fstat) NXSYMBOLS(fsync) +NXSYMBOLS(ftell) NXSYMBOLS(ftruncate) NXSYMBOLS(futimens) +NXSYMBOLS(fwrite) NXSYMBOLS(getpeername) NXSYMBOLS(getsockname) +NXSYMBOLS(getenv) +NXSYMBOLS(getpid) NXSYMBOLS(getsockopt) NXSYMBOLS(if_nametoindex) NXSYMBOLS(ioctl) @@ -86,6 +98,7 @@ NXSYMBOLS(pthread_mutex_lock) NXSYMBOLS(pthread_mutex_unlock) NXSYMBOLS(pthread_setspecific) NXSYMBOLS(pthread_sigmask) +NXSYMBOLS(puts) NXSYMBOLS(read) NXSYMBOLS(readdir) NXSYMBOLS(readv) @@ -99,6 +112,7 @@ NXSYMBOLS(select) NXSYMBOLS(sendmsg) NXSYMBOLS(sendto) NXSYMBOLS(setitimer) +NXSYMBOLS(setbuf) NXSYMBOLS(setjmp) NXSYMBOLS(setsockopt) NXSYMBOLS(shutdown) @@ -110,7 +124,12 @@ NXSYMBOLS(sleep) NXSYMBOLS(socket) NXSYMBOLS(stat) NXSYMBOLS(statvfs) +NXSYMBOLS(stderr) +NXSYMBOLS(strcat) +NXSYMBOLS(strchr) NXSYMBOLS(strerror) +NXSYMBOLS(strlen) +NXSYMBOLS(strtol) NXSYMBOLS(syslog) NXSYMBOLS(tcgetattr) NXSYMBOLS(tcsetattr) diff --git a/boards/sim/sim/sim/scripts/Make.defs b/boards/sim/sim/sim/scripts/Make.defs index 6c8e180f8a8..eba8f128bf8 100644 --- a/boards/sim/sim/sim/scripts/Make.defs +++ b/boards/sim/sim/sim/scripts/Make.defs @@ -55,6 +55,10 @@ ifeq ($(CONFIG_SIM_SANITIZE),y) ARCHOPTIMIZATION += -fsanitize=address -fno-omit-frame-pointer endif +ifeq ($(CONFIG_ARCH_COVERAGE),y) + ARCHOPTIMIZATION += -fprofile-arcs -ftest-coverage +endif + ARCHCPUFLAGS = -fno-builtin ARCHCPUFLAGSXX = -fno-builtin -nostdinc++ ifeq ($(CONFIG_CXX_EXCEPTION),) diff --git a/tools/Config.mk b/tools/Config.mk index ec27354f657..dddc3478fdb 100644 --- a/tools/Config.mk +++ b/tools/Config.mk @@ -459,6 +459,10 @@ endef # CLEAN - Default clean target +ifeq ($(CONFIG_ARCH_COVERAGE),y) + OBJS += *.gcno *.gcda +endif + ifeq ($(CONFIG_WINDOWS_NATIVE),y) define CLEAN $(Q) if exist *$(OBJEXT) (del /f /q *$(OBJEXT)) diff --git a/tools/gcov.sh b/tools/gcov.sh new file mode 100755 index 00000000000..839f32baf5f --- /dev/null +++ b/tools/gcov.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# tools/gcov.sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to you under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +ROOT_DIR=$(cd $(dirname $0)/../../; pwd) + +if [ $# == 1 ]; then + GCOV_DIR=$1 +else + GCOV_DIR=${ROOT_DIR}/gcov +fi + +mkdir -p ${GCOV_DIR} +cd ${GCOV_DIR} + +# Generate coverage text report +lcov -c -d ${ROOT_DIR} -o coverage.info --rc lcov_branch_coverage=1 +# Generate coverage page report +genhtml --branch-coverage -o result coverage.info + +if [ $? -ne 0 ]; then + echo "Failed to generate coverage file" + exit 1 +fi + +echo -e "Copy the following link and open it in the browser to view the coverage report" +echo "file://${GCOV_DIR}/result/index.html"