[PATCH 08/12] gcov: Add functions to dump the gcov information
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed Jun 29 06:30:44 UTC 2022
Update #4670.
---
cpukit/include/rtems/score/io.h | 4 +
cpukit/include/rtems/test-info.h | 6 ++
cpukit/libtest/testgcovdumpinfo.c | 66 ++++++++++++++
cpukit/score/src/iogcovdumpinfo.c | 101 +++++++++++++++++++++
cpukit/score/src/iogcovdumpinfobase64.c | 111 ++++++++++++++++++++++++
spec/build/cpukit/librtemscpu.yml | 2 +
spec/build/cpukit/librtemstest.yml | 1 +
testsuites/validation/tc-terminate.c | 3 +-
8 files changed, 293 insertions(+), 1 deletion(-)
create mode 100644 cpukit/libtest/testgcovdumpinfo.c
create mode 100644 cpukit/score/src/iogcovdumpinfo.c
create mode 100644 cpukit/score/src/iogcovdumpinfobase64.c
diff --git a/cpukit/include/rtems/score/io.h b/cpukit/include/rtems/score/io.h
index 106418f185..097cb9bdfe 100644
--- a/cpukit/include/rtems/score/io.h
+++ b/cpukit/include/rtems/score/io.h
@@ -141,6 +141,10 @@ int _IO_Base64url(
*/
void _IO_Relax( void );
+void _IO_Gcov_dump_info( IO_Put_char put_char, void *arg );
+
+void _IO_Gcov_dump_info_base64( IO_Put_char put_char, void *arg );
+
/** @} */
#ifdef __cplusplus
diff --git a/cpukit/include/rtems/test-info.h b/cpukit/include/rtems/test-info.h
index 1bc963249c..c7c6c2438d 100644
--- a/cpukit/include/rtems/test-info.h
+++ b/cpukit/include/rtems/test-info.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
diff --git a/cpukit/libtest/testgcovdumpinfo.c b/cpukit/libtest/testgcovdumpinfo.c
new file mode 100644
index 0000000000..4276d9e1c3
--- /dev/null
+++ b/cpukit/libtest/testgcovdumpinfo.c
@@ -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/io.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" );
+ _IO_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 );
+}
diff --git a/cpukit/score/src/iogcovdumpinfo.c b/cpukit/score/src/iogcovdumpinfo.c
new file mode 100644
index 0000000000..79a644106c
--- /dev/null
+++ b/cpukit/score/src/iogcovdumpinfo.c
@@ -0,0 +1,101 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSScoreIO
+ *
+ * @brief This source file contains the implementation of _IO_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/score/io.h>
+#include <rtems/linkersets.h>
+
+#include <gcov.h>
+
+RTEMS_LINKER_ROSET( gcov_info, const struct gcov_info * );
+
+typedef struct {
+ IO_Put_char put_char;
+ void *arg;
+} IO_Gcov_context;
+
+static void _IO_Gcov_dump( const void *data, unsigned length, void *arg )
+{
+ IO_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 _IO_Gcov_filename( const char *filename, void *arg )
+{
+ __gcov_filename_to_gcfn( filename, _IO_Gcov_dump, arg );
+}
+
+static void *_IO_Gcov_allocate( unsigned length, void *arg )
+{
+ (void) length;
+ (void) arg;
+ return NULL;
+}
+
+void _IO_Gcov_dump_info( IO_Put_char put_char, void *arg )
+{
+ IO_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,
+ _IO_Gcov_filename,
+ _IO_Gcov_dump,
+ _IO_Gcov_allocate,
+ &ctx
+ );
+ }
+}
diff --git a/cpukit/score/src/iogcovdumpinfobase64.c b/cpukit/score/src/iogcovdumpinfobase64.c
new file mode 100644
index 0000000000..588ba0b76c
--- /dev/null
+++ b/cpukit/score/src/iogcovdumpinfobase64.c
@@ -0,0 +1,111 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSScoreIO
+ *
+ * @brief This source file contains the implementation of
+ * _IO_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/io.h>
+
+#include <limits.h>
+#include <string.h>
+
+typedef struct {
+ IO_Put_char put_char;
+ void *arg;
+ int out;
+ size_t index;
+ char buf[ 57 ];
+} IO_Gcov_base64_context;
+
+static void _IO_Gcov_base64_put_char( int c, void *arg )
+{
+ IO_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 _IO_Gcov_base64_encode( int c, void *arg )
+{
+ IO_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(
+ _IO_Gcov_base64_put_char,
+ ctx,
+ ctx->buf,
+ sizeof( ctx->buf ),
+ NULL,
+ INT_MAX
+ );
+ } else {
+ ++index;
+ }
+
+ ctx->index = index;
+}
+
+void _IO_Gcov_dump_info_base64( IO_Put_char put_char, void *arg )
+{
+ IO_Gcov_base64_context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+ ctx.put_char = put_char;
+ ctx.arg = arg;
+ _IO_Gcov_dump_info( _IO_Gcov_base64_encode, &ctx );
+ _IO_Base64(
+ _IO_Gcov_base64_put_char,
+ &ctx,
+ ctx.buf,
+ ctx.index,
+ NULL,
+ INT_MAX
+ );
+}
diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
index 4a8a0ee1ad..143cab11ed 100644
--- a/spec/build/cpukit/librtemscpu.yml
+++ b/spec/build/cpukit/librtemscpu.yml
@@ -1418,6 +1418,8 @@ source:
- cpukit/score/src/heapwalk.c
- cpukit/score/src/interr.c
- cpukit/score/src/iobase64.c
+- cpukit/score/src/iogcovdumpinfo.c
+- cpukit/score/src/iogcovdumpinfobase64.c
- cpukit/score/src/ioprintf.c
- cpukit/score/src/iorelax.c
- cpukit/score/src/iovprintf.c
diff --git a/spec/build/cpukit/librtemstest.yml b/spec/build/cpukit/librtemstest.yml
index cba3dfcc02..cb04690066 100644
--- a/spec/build/cpukit/librtemstest.yml
+++ b/spec/build/cpukit/librtemstest.yml
@@ -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
diff --git a/testsuites/validation/tc-terminate.c b/testsuites/validation/tc-terminate.c
index a3f55fcc6c..79060930d7 100644
--- a/testsuites/validation/tc-terminate.c
+++ b/testsuites/validation/tc-terminate.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 );
}
--
2.35.3
More information about the devel
mailing list