[rtems commit] gcov: Add functions to dump the gcov information

Sebastian Huber sebh at rtems.org
Mon Jul 4 06:24:57 UTC 2022


Module:    rtems
Branch:    master
Commit:    4f87edbb75865cb92efd3166d1faeb5fd720a47f
Changeset: http://git.rtems.org/rtems/commit/?id=4f87edbb75865cb92efd3166d1faeb5fd720a47f

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jun 28 07:45:02 2022 +0200

gcov: Add functions to dump the gcov information

Update #4670.

---

 cpukit/include/rtems/score/gcov.h     |  87 ++++++++++++++++++++++++++++
 cpukit/include/rtems/test-info.h      |   6 ++
 cpukit/libtest/testgcovdumpinfo.c     |  66 +++++++++++++++++++++
 cpukit/score/src/gcovdumpinfo.c       |  96 +++++++++++++++++++++++++++++++
 cpukit/score/src/gcovdumpinfobase64.c | 104 ++++++++++++++++++++++++++++++++++
 cpukit/score/src/gcovinfoset.c        |  43 ++++++++++++++
 spec/build/cpukit/librtemscpu.yml     |   3 +
 spec/build/cpukit/librtemstest.yml    |   1 +
 testsuites/validation/tc-terminate.c  |   3 +-
 9 files changed, 408 insertions(+), 1 deletion(-)

diff --git a/cpukit/include/rtems/score/gcov.h b/cpukit/include/rtems/score/gcov.h
new file mode 100644
index 0000000000..b150c9f763
--- /dev/null
+++ b/cpukit/include/rtems/score/gcov.h
@@ -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 */
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..7139d7d623
--- /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/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 );
+}
diff --git a/cpukit/score/src/gcovdumpinfo.c b/cpukit/score/src/gcovdumpinfo.c
new file mode 100644
index 0000000000..8598fce578
--- /dev/null
+++ b/cpukit/score/src/gcovdumpinfo.c
@@ -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
+    );
+  }
+}
diff --git a/cpukit/score/src/gcovdumpinfobase64.c b/cpukit/score/src/gcovdumpinfobase64.c
new file mode 100644
index 0000000000..be07f03291
--- /dev/null
+++ b/cpukit/score/src/gcovdumpinfobase64.c
@@ -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 );
+}
diff --git a/cpukit/score/src/gcovinfoset.c b/cpukit/score/src/gcovinfoset.c
new file mode 100644
index 0000000000..6fd695043b
--- /dev/null
+++ b/cpukit/score/src/gcovinfoset.c
@@ -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 * );
diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
index 4a8a0ee1ad..31a68cf85a 100644
--- a/spec/build/cpukit/librtemscpu.yml
+++ b/spec/build/cpukit/librtemscpu.yml
@@ -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
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 );
   }



More information about the vc mailing list