[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