mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
87
cpukit/include/rtems/score/gcov.h
Normal file
87
cpukit/include/rtems/score/gcov.h
Normal 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 */
|
||||
@@ -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
|
||||
|
||||
66
cpukit/libtest/testgcovdumpinfo.c
Normal file
66
cpukit/libtest/testgcovdumpinfo.c
Normal 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 );
|
||||
}
|
||||
96
cpukit/score/src/gcovdumpinfo.c
Normal file
96
cpukit/score/src/gcovdumpinfo.c
Normal 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
|
||||
);
|
||||
}
|
||||
}
|
||||
104
cpukit/score/src/gcovdumpinfobase64.c
Normal file
104
cpukit/score/src/gcovdumpinfobase64.c
Normal 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 );
|
||||
}
|
||||
43
cpukit/score/src/gcovinfoset.c
Normal file
43
cpukit/score/src/gcovinfoset.c
Normal 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 * );
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user