gcov: Add functions to dump the gcov information

Update #4670.
This commit is contained in:
Sebastian Huber
2022-06-28 07:45:02 +02:00
parent 2bc233fe58
commit 4f87edbb75
9 changed files with 408 additions and 1 deletions

View File

@@ -0,0 +1,87 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreGcov
*
* @brief This header file provides the interfaces of the
* @ref RTEMSScoreGcov.
*/
/*
* Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _RTEMS_SCORE_GCOV_H
#define _RTEMS_SCORE_GCOV_H
#include <gcov.h>
#include <rtems/linkersets.h>
#include <rtems/score/io.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* @defgroup RTEMSScoreGcov Gcov Support
*
* @ingroup RTEMSScore
*
* @brief This group contains the gocv support.
*
* @{
*/
RTEMS_LINKER_ROSET_DECLARE( gcov_info, const struct gcov_info * );
/**
* @brief Dumps the gcov information as a binary gcfn and gcda data
* stream using the put character handler.
*
* @param put_char is the put character handler used to output the data stream.
*
* @param arg is the argument passed to the put character handler.
*/
void _Gcov_Dump_info( IO_Put_char put_char, void *arg );
/**
* @brief Dumps the gcov information as a base64 encoded gcfn and gcda data
* stream using the put character handler.
*
* @param put_char is the put character handler used to output the data stream.
*
* @param arg is the argument passed to the put character handler.
*/
void _Gcov_Dump_info_base64( IO_Put_char put_char, void *arg );
/** @} */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _RTEMS_SCORE_GCOV_H */

View File

@@ -331,6 +331,12 @@ RTEMS_NO_RETURN void rtems_test_run(
const RTEMS_TEST_STATE state
);
/**
* @brief Dumps the gcov information as a base64 encoded gcfn and gcda data
* stream using rtems_put_char().
*/
void rtems_test_gcov_dump_info( void );
/** @} */
#ifdef __cplusplus

View File

@@ -0,0 +1,66 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSTest
*
* @brief This source file contains the implementation of
* rtems_test_gcov_dump_info().
*/
/*
* Copyright (C) 2021, 2022 embedded brains GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/test-info.h>
#include <rtems/score/gcov.h>
#include <rtems/score/isrlock.h>
#include <rtems/bspIo.h>
ISR_LOCK_DEFINE( static, gcov_dump_lock, "gcov dump" );
static bool gcov_dump_done;
void rtems_test_gcov_dump_info( void )
{
ISR_lock_Context lock_context;
_ISR_lock_ISR_disable_and_acquire( &gcov_dump_lock, &lock_context );
if ( !gcov_dump_done ) {
gcov_dump_done = true;
_IO_Printf( rtems_put_char, NULL, "\n*** BEGIN OF GCOV INFO BASE64 ***\n" );
_Gcov_Dump_info_base64( rtems_put_char, NULL );
_IO_Printf( rtems_put_char, NULL, "\n*** END OF GCOV INFO BASE64 ***\n" );
}
_ISR_lock_Release_and_ISR_enable( &gcov_dump_lock, &lock_context );
}

View File

@@ -0,0 +1,96 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreIO
*
* @brief This source file contains the implementation of _Gcov_Ddump_info().
*/
/*
* Copyright (C) 2021, 2022 embedded brains GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/gcov.h>
typedef struct {
IO_Put_char put_char;
void *arg;
} Gcov_Context;
static void _Gcov_Dump( const void *data, unsigned length, void *arg )
{
Gcov_Context *ctx;
IO_Put_char put_char;
void *ctx_arg;
const char *in;
const void *end;
ctx = arg;
in = data;
end = in + length;
put_char = ctx->put_char;
ctx_arg = ctx->arg;
while ( in != end ) {
( *put_char )( *in, ctx_arg );
++in;
}
}
static void _Gcov_Filename( const char *filename, void *arg )
{
__gcov_filename_to_gcfn( filename, _Gcov_Dump, arg );
}
static void *_Gcov_Allocate( unsigned length, void *arg )
{
(void) length;
(void) arg;
return NULL;
}
void _Gcov_Dump_info( IO_Put_char put_char, void *arg )
{
Gcov_Context ctx;
const struct gcov_info * const *item;
ctx.put_char = put_char;
ctx.arg = arg;
RTEMS_LINKER_SET_FOREACH( gcov_info, item ) {
__gcov_info_to_gcda(
*item,
_Gcov_Filename,
_Gcov_Dump,
_Gcov_Allocate,
&ctx
);
}
}

View File

@@ -0,0 +1,104 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreIO
*
* @brief This source file contains the implementation of
* _Gcov_Dump_info_base64().
*/
/*
* Copyright (C) 2021, 2022 embedded brains GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/gcov.h>
#include <limits.h>
#include <string.h>
typedef struct {
IO_Put_char put_char;
void *arg;
int out;
size_t index;
char buf[ 57 ];
} Gcov_Base64_context;
static void _Gcov_Base64_put_char( int c, void *arg )
{
Gcov_Base64_context *ctx;
ctx = arg;
( *ctx->put_char )( c, ctx->arg );
++ctx->out;
if ( ctx->out >= 76 ) {
ctx->out = 0;
( *ctx->put_char )( '\n', ctx->arg );
}
}
static void _Gcov_Base64_encode( int c, void *arg )
{
Gcov_Base64_context *ctx;
size_t index;
ctx = arg;
index = ctx->index;
ctx->buf[ index ] = (char) c;
if ( index == RTEMS_ARRAY_SIZE( ctx->buf ) - 1 ) {
index = 0;
_IO_Base64(
_Gcov_Base64_put_char,
ctx,
ctx->buf,
sizeof( ctx->buf ),
NULL,
INT_MAX
);
} else {
++index;
}
ctx->index = index;
}
void _Gcov_Dump_info_base64( IO_Put_char put_char, void *arg )
{
Gcov_Base64_context ctx;
memset( &ctx, 0, sizeof( ctx ) );
ctx.put_char = put_char;
ctx.arg = arg;
_Gcov_Dump_info( _Gcov_Base64_encode, &ctx );
_IO_Base64( _Gcov_Base64_put_char, &ctx, ctx.buf, ctx.index, NULL, INT_MAX );
}

View File

@@ -0,0 +1,43 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreIO
*
* @brief This source file contains the definition of the gcov information
* linker set.
*/
/*
* Copyright (C) 2021, 2022 embedded brains GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/gcov.h>
RTEMS_LINKER_ROSET( gcov_info, const struct gcov_info * );

View File

@@ -1403,6 +1403,9 @@ source:
- cpukit/score/src/debugisthreaddispatchingallowed.c
- cpukit/score/src/freechain.c
- cpukit/score/src/futex.c
- cpukit/score/src/gcovdumpinfobase64.c
- cpukit/score/src/gcovdumpinfo.c
- cpukit/score/src/gcovinfoset.c
- cpukit/score/src/hash.c
- cpukit/score/src/heap.c
- cpukit/score/src/heapallocate.c

View File

@@ -38,6 +38,7 @@ source:
- cpukit/libtest/testbeginend.c
- cpukit/libtest/testbusy.c
- cpukit/libtest/testextension.c
- cpukit/libtest/testgcovdumpinfo.c
- cpukit/libtest/testparallel.c
- cpukit/libtest/testrun.c
- cpukit/libtest/testwrappers.c

View File

@@ -56,6 +56,7 @@
#include <setjmp.h>
#include <string.h>
#include <rtems/bspIo.h>
#include <rtems/test-info.h>
#include <rtems/score/atomic.h>
#include <rtems/score/io.h>
#include <rtems/score/percpu.h>
@@ -150,7 +151,7 @@ void __wrap__CPU_Fatal_halt( uint32_t source, CPU_Uint32ptr code )
longjmp( before_terminate, 1 );
} else {
#if defined(RTEMS_COVERAGE)
_IO_Dump_gcov_info( rtems_put_char, NULL );
rtems_test_gcov_dump_info();
#endif
__real__CPU_Fatal_halt( source, code );
}