Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libs: add gcov framework support #14838

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion arch/arm/src/cmake/gcc.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ if(CONFIG_STACK_USAGE_WARNING AND NOT "${CONFIG_STACK_USAGE_WARNING}" STREQUAL
endif()

if(CONFIG_COVERAGE_ALL)
add_compile_options(-fprofile-generate -ftest-coverage)
add_compile_options(-fprofile-arcs -ftest-coverage -fno-inline)
endif()

if(CONFIG_MM_UBSAN_ALL)
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/src/cmake/ghs.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ if(CONFIG_STACK_USAGE_WARNING AND NOT "${CONFIG_STACK_USAGE_WARNING}" STREQUAL
endif()

if(CONFIG_COVERAGE_ALL)
add_compile_options(-fprofile-generate -ftest-coverage)
add_compile_options(-fprofile-arcs -ftest-coverage -fno-inline)
endif()

if(CONFIG_PROFILE_ALL)
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/src/common/Toolchain.defs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ endif

ifeq ($(CONFIG_COVERAGE_ALL),y)
ifeq ($(CONFIG_ARCH_TOOLCHAIN_GCC),y)
ARCHOPTIMIZATION += -fprofile-generate -ftest-coverage
ARCHOPTIMIZATION += -fprofile-arcs -ftest-coverage -fno-inline
else ifeq ($(CONFIG_ARCH_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += -fprofile-instr-generate -fcoverage-mapping
endif
Expand Down
2 changes: 1 addition & 1 deletion arch/arm64/src/Toolchain.defs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ endif

ifeq ($(CONFIG_COVERAGE_ALL),y)
ifeq ($(CONFIG_ARCH_TOOLCHAIN_GCC),y)
ARCHOPTIMIZATION += -fprofile-generate -ftest-coverage
ARCHOPTIMIZATION += -fprofile-arcs -ftest-coverage -fno-inline
else ifeq ($(CONFIG_ARCH_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += -fprofile-instr-generate -fcoverage-mapping
endif
Expand Down
2 changes: 1 addition & 1 deletion arch/arm64/src/cmake/Toolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ endif()

if(CONFIG_COVERAGE_ALL)
if(CONFIG_ARCH_TOOLCHAIN_GCC)
add_compile_options(-fprofile-generate -ftest-coverage)
add_compile_options(-fprofile-arcs -ftest-coverage -fno-inline)
elseif(CONFIG_ARCH_TOOLCHAIN_CLANG)
add_compile_options(-fprofile-instr-generate -fcoverage-mapping)
endif()
Expand Down
2 changes: 1 addition & 1 deletion arch/risc-v/src/cmake/Toolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ if(${CONFIG_STACK_USAGE_WARNING})
endif()

if(CONFIG_COVERAGE_ALL)
add_compile_options(-fprofile-generate -ftest-coverage)
add_compile_options(-fprofile-arcs -ftest-coverage -fno-inline)
endif()

add_compile_options(
Expand Down
2 changes: 1 addition & 1 deletion arch/sim/src/cmake/Toolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ if(CONFIG_STACK_USAGE_WARNING)
endif()

if(CONFIG_COVERAGE_ALL)
add_compile_options(-fprofile-generate -ftest-coverage)
add_compile_options(-fprofile-arcs -ftest-coverage -fno-inline)
endif()

if(CONFIG_PROFILE_ALL OR CONFIG_SIM_PROFILE)
Expand Down
2 changes: 1 addition & 1 deletion arch/tricore/src/cmake/ToolchainGnuc.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ if(CONFIG_STACK_CANARIES)
endif()

if(CONFIG_COVERAGE_ALL)
add_compile_options(-fprofile-generate -ftest-coverage)
add_compile_options(-fprofile-arcs -ftest-coverage -fno-inline)
endif()

# Optimization of unused sections
Expand Down
2 changes: 1 addition & 1 deletion arch/tricore/src/common/ToolchainGnuc.defs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ ifneq ($(CONFIG_STACK_USAGE_WARNING),0)
endif

ifeq ($(CONFIG_COVERAGE_ALL),y)
ARCHOPTIMIZATION += -fprofile-generate -ftest-coverage
ARCHOPTIMIZATION += -fprofile-arcs -ftest-coverage -fno-inline
endif

ifeq ($(CONFIG_MM_UBSAN_ALL),y)
Expand Down
2 changes: 1 addition & 1 deletion arch/x86_64/src/cmake/Toolchain.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ if(${CONFIG_STACK_USAGE_WARNING})
endif()

if(CONFIG_COVERAGE_ALL)
add_compile_options(-fprofile-generate -ftest-coverage)
add_compile_options(-fprofile-arcs -ftest-coverage -fno-inline)
endif()

if(CONFIG_DEBUG_SYMBOLS)
Expand Down
2 changes: 1 addition & 1 deletion boards/sim/sim/sim/scripts/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ endif

ifeq ($(CONFIG_COVERAGE_ALL),y)
ifeq ($(CONFIG_ARCH_TOOLCHAIN_GCC),y)
ARCHOPTIMIZATION += -fprofile-generate -ftest-coverage
ARCHOPTIMIZATION += -fprofile-arcs -ftest-coverage -fno-inline
else ifeq ($(CONFIG_ARCH_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += -fprofile-instr-generate -fcoverage-mapping
endif
Expand Down
169 changes: 169 additions & 0 deletions include/gcov.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
/****************************************************************************
* include/gcov.h
*
* SPDX-License-Identifier: Apache-2.0
*
* 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.
*
****************************************************************************/

#ifndef __INCLUDE_GCOV_H
#define __INCLUDE_GCOV_H

/****************************************************************************
* Included Files
****************************************************************************/

#include <sys/types.h>

/****************************************************************************
* Pre-processor Definitions
****************************************************************************/

/* The GCOV 12 gcno/gcda format has slight change,
* Please refer to gcov-io.h in the GCC 12 for
* more details.
*/

#if __GNUC__ >= 12
# define GCOV_12_FORMAT
#endif

#if __GNUC__ >= 14
# define GCOV_COUNTERS 9u
#elif __GNUC__ >= 10
# define GCOV_COUNTERS 8u
#elif __GNUC__ >= 8
# define GCOV_COUNTERS 9u
#else
# define GCOV_COUNTERS 10u
#endif

/****************************************************************************
* Public Types
****************************************************************************/

struct gcov_fn_info;
typedef uint64_t gcov_type;

/** Profiling data per object file
*
* This data is generated by gcc during compilation and doesn't change
* at run-time with the exception of the next pointer.
*/

struct gcov_info
{
unsigned int version; /* Gcov version (same as GCC version) */
FAR struct gcov_info *next; /* List head for a singly-linked list */
unsigned int stamp; /* Uniquifying time stamp */
#ifdef GCOV_12_FORMAT
unsigned int checksum; /* unique object checksum */
#endif
FAR const char *filename; /* Name of the associated gcda data file */
void (*merge[GCOV_COUNTERS])(FAR gcov_type *, unsigned int);
unsigned int n_functions; /* number of instrumented functions */
FAR struct gcov_fn_info **functions; /* function information */
};

/****************************************************************************
* Public Data
****************************************************************************/

extern FAR struct gcov_info *__gcov_info_start;
extern FAR struct gcov_info *__gcov_info_end;

/****************************************************************************
* Public Function Prototypes
****************************************************************************/

#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif

/****************************************************************************
* Name: __gcov_reset
*
* Description:
* Set all counters to zero.
*
****************************************************************************/

extern void __gcov_reset(void);

/****************************************************************************
* Name: __gcov_dump
*
* Description:
* Write profile information to a file.
*
****************************************************************************/

extern void __gcov_dump(void);

/****************************************************************************
* Name: __gcov_info_to_gcda
*
* Description:
* Convert the gcov information referenced by INFO to a gcda data stream.
*
* Parameters:
* info - Pointer to the gcov information.
* filename - Callback function to get the filename.
* dump - Callback function to write the gcda data.
* allocate - Callback function to allocate memory.
* arg - User-provided argument.
*
****************************************************************************/

extern void __gcov_info_to_gcda(FAR const struct gcov_info *info,
FAR void (*filename)(FAR const char *,
FAR void *),
FAR void (*dump)(FAR const void *,
unsigned int, FAR void *),
FAR void *(*allocate)(unsigned int,
FAR void *),
FAR void *arg);

/****************************************************************************
* Name: __gcov_filename_to_gcfn
*
* Description:
* Convert the filename to a gcfn data stream.
*
* Parameters:
* filename - Pointer to the filename.
* dump - Callback function to write the gcfn data.
* arg - User-provided argument.
*
****************************************************************************/

extern void __gcov_filename_to_gcfn(FAR const char *filename,
FAR void (*dump)(FAR const void *,
unsigned int,
FAR void *),
FAR void *arg);

#undef EXTERN
#ifdef __cplusplus
}
#endif

#endif /* __INCLUDE_GCOV_H */
2 changes: 1 addition & 1 deletion libs/libbuiltin/compiler-rt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ if(CONFIG_COVERAGE_COMPILER_RT)

target_sources(rt.profile PRIVATE ${RT_PROFILE_SRCS})

elseif(CONFIG_COVERAGE_MINI)
elseif(CONFIG_COVERAGE_MINI AND CONFIG_ARCH_TOOLCHAIN_CLANG)
nuttx_add_system_library(rt.miniprofile)

target_compile_options(rt.miniprofile -fno-profile-instr-generate
Expand Down
2 changes: 1 addition & 1 deletion libs/libbuiltin/compiler-rt/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ CSRCS += $(wildcard compiler-rt/compiler-rt/lib/profile/*.c)
CPPSRCS += $(wildcard compiler-rt/compiler-rt/lib/profile/*.cpp)
CSRCS += InstrProfilingPlatform.c

else ifeq ($(CONFIG_COVERAGE_MINI),y)
else ifeq ($(CONFIG_COVERAGE_MINI)$(CONFIG_ARCH_TOOLCHAIN_CLANG),yy)
xiaoxiang781216 marked this conversation as resolved.
Show resolved Hide resolved

FLAGS += -fno-profile-instr-generate -fno-coverage-mapping

Expand Down
9 changes: 7 additions & 2 deletions libs/libbuiltin/libgcc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
# ##############################################################################

if(CONFIG_PROFILE_MINI)
nuttx_add_system_library(libgprof)
target_sources(libgprof PRIVATE profile.c)
nuttx_add_system_library(libprofile)
target_sources(libprofile PRIVATE profile.c)
endif()

if(CONFIG_COVERAGE_MINI AND CONFIG_ARCH_TOOLCHAIN_GCC)
nuttx_add_system_library(libcoverage)
target_sources(libcoverage PRIVATE gcov.c)
endif()
8 changes: 5 additions & 3 deletions libs/libbuiltin/libgcc/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@
############################################################################

ifeq ($(CONFIG_PROFILE_MINI),y)

CSRCS += profile.c
endif

ifeq ($(CONFIG_COVERAGE_MINI)$(CONFIG_ARCH_TOOLCHAIN_GCC),yy)
CSRCS += gcov.c
xiaoxiang781216 marked this conversation as resolved.
Show resolved Hide resolved
endif

DEPPATH += --dep-path libgcc
VPATH += :libgcc

endif
Loading
Loading