public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] gcov-tool: Allow merging of empty profile lists
@ 2022-03-23  9:34 Sebastian Huber
  2022-03-23 12:19 ` Martin Liška
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Huber @ 2022-03-23  9:34 UTC (permalink / raw)
  To: gcc-patches

The gcov_profile_merge() already had code to deal with profile information
which had no counterpart to merge with.  For profile information from files
with no associated counterpart, the profile information is simply used as is
with the weighting transformation applied.  Make sure that gcov_profile_merge()
works with an empty target profile list.  Return the merged profile list.

gcc/
	* gcov-tool.cc (gcov_profile_merge): Adjust return type.
	(profile_merge): Allow merging of directories which contain no profile
	files.

libgcc/
	* libgcov-util.c (gcov_profile_merge): Return the list of merged
	profiles.  Accept empty target and source profile lists.
---
 gcc/gcov-tool.cc      | 27 ++++++++++-----------------
 libgcc/libgcov-util.c | 15 +++++++++------
 2 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/gcc/gcov-tool.cc b/gcc/gcov-tool.cc
index f4e42ae763c..2e4083a664d 100644
--- a/gcc/gcov-tool.cc
+++ b/gcc/gcov-tool.cc
@@ -40,7 +40,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #endif
 #include <getopt.h>
 
-extern int gcov_profile_merge (struct gcov_info*, struct gcov_info*, int, int);
+extern struct gcov_info *gcov_profile_merge (struct gcov_info*,
+					     struct gcov_info*, int, int);
 extern int gcov_profile_overlap (struct gcov_info*, struct gcov_info*);
 extern int gcov_profile_normalize (struct gcov_info*, gcov_type);
 extern int gcov_profile_scale (struct gcov_info*, float, int, int);
@@ -141,26 +142,18 @@ profile_merge (const char *d1, const char *d2, const char *out, int w1, int w2)
 {
   struct gcov_info *d1_profile;
   struct gcov_info *d2_profile;
-  int ret;
+  struct gcov_info *merged_profile;
 
   d1_profile = gcov_read_profile_dir (d1, 0);
-  if (!d1_profile)
-    return 1;
-
-  if (d2)
-    {
-      d2_profile = gcov_read_profile_dir (d2, 0);
-      if (!d2_profile)
-        return 1;
+  d2_profile = gcov_read_profile_dir (d2, 0);
 
-      /* The actual merge: we overwrite to d1_profile.  */
-      ret = gcov_profile_merge (d1_profile, d2_profile, w1, w2);
+  /* The actual merge: we overwrite to d1_profile.  */
+  merged_profile = gcov_profile_merge (d1_profile, d2_profile, w1, w2);
 
-      if (ret)
-        return ret;
-    }
-
-  gcov_output_files (out, d1_profile);
+  if (merged_profile)
+    gcov_output_files (out, merged_profile);
+  else if (verbose)
+    fnotice (stdout, "no profile files were merged\n");
 
   return 0;
 }
diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c
index ba7fb924b53..e5496f4ade2 100644
--- a/libgcc/libgcov-util.c
+++ b/libgcc/libgcov-util.c
@@ -677,13 +677,13 @@ find_match_gcov_info (struct gcov_info **array, int size,
    Return 0 on success: without mismatch.
    Reutrn 1 on error.  */
 
-int
+struct gcov_info *
 gcov_profile_merge (struct gcov_info *tgt_profile, struct gcov_info *src_profile,
                     int w1, int w2)
 {
   struct gcov_info *gi_ptr;
   struct gcov_info **tgt_infos;
-  struct gcov_info *tgt_tail;
+  struct gcov_info **tgt_tail;
   struct gcov_info **in_src_not_tgt;
   unsigned tgt_cnt = 0, src_cnt = 0;
   unsigned unmatch_info_cnt = 0;
@@ -703,7 +703,10 @@ gcov_profile_merge (struct gcov_info *tgt_profile, struct gcov_info *src_profile
   for (gi_ptr = tgt_profile, i = 0; gi_ptr; gi_ptr = gi_ptr->next, i++)
     tgt_infos[i] = gi_ptr;
 
-  tgt_tail = tgt_infos[tgt_cnt - 1];
+  if (tgt_cnt)
+     tgt_tail = &tgt_infos[tgt_cnt - 1]->next;
+  else
+     tgt_tail = &tgt_profile;
 
   /* First pass on tgt_profile, we multiply w1 to all counters.  */
   if (w1 > 1)
@@ -732,14 +735,14 @@ gcov_profile_merge (struct gcov_info *tgt_profile, struct gcov_info *src_profile
       gi_ptr = in_src_not_tgt[i];
       gcov_merge (gi_ptr, gi_ptr, w2 - 1);
       gi_ptr->next = NULL;
-      tgt_tail->next = gi_ptr;
-      tgt_tail = gi_ptr;
+      *tgt_tail = gi_ptr;
+      tgt_tail = &gi_ptr->next;
     }
 
   free (in_src_not_tgt);
   free (tgt_infos);
 
-  return 0;
+  return tgt_profile;
 }
 
 typedef gcov_type (*counter_op_fn) (gcov_type, void*, void*);
-- 
2.34.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-23  9:34 [PATCH] gcov-tool: Allow merging of empty profile lists Sebastian Huber
@ 2022-03-23 12:19 ` Martin Liška
  2022-03-23 14:50   ` Sebastian Huber
  0 siblings, 1 reply; 11+ messages in thread
From: Martin Liška @ 2022-03-23 12:19 UTC (permalink / raw)
  To: Sebastian Huber, gcc-patches

On 3/23/22 10:34, Sebastian Huber wrote:

Hello.

Thanks for the patch. Note we're in stage4, so the patch can eventually go
in in the next stage1.

> The gcov_profile_merge() already had code to deal with profile information
> which had no counterpart to merge with.  For profile information from files
> with no associated counterpart, the profile information is simply used as is
> with the weighting transformation applied.  Make sure that gcov_profile_merge()
> works with an empty target profile list.  Return the merged profile list.

Can you please provide a simple demo with a pair of profiles
where I'll see what changes?

> 
> gcc/
> 	* gcov-tool.cc (gcov_profile_merge): Adjust return type.
> 	(profile_merge): Allow merging of directories which contain no profile
> 	files.
> 
> libgcc/
> 	* libgcov-util.c (gcov_profile_merge): Return the list of merged
> 	profiles.  Accept empty target and source profile lists.
> ---
>   gcc/gcov-tool.cc      | 27 ++++++++++-----------------
>   libgcc/libgcov-util.c | 15 +++++++++------
>   2 files changed, 19 insertions(+), 23 deletions(-)
> 
> diff --git a/gcc/gcov-tool.cc b/gcc/gcov-tool.cc
> index f4e42ae763c..2e4083a664d 100644
> --- a/gcc/gcov-tool.cc
> +++ b/gcc/gcov-tool.cc
> @@ -40,7 +40,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>   #endif
>   #include <getopt.h>
>   
> -extern int gcov_profile_merge (struct gcov_info*, struct gcov_info*, int, int);
> +extern struct gcov_info *gcov_profile_merge (struct gcov_info*,
> +					     struct gcov_info*, int, int);
>   extern int gcov_profile_overlap (struct gcov_info*, struct gcov_info*);
>   extern int gcov_profile_normalize (struct gcov_info*, gcov_type);
>   extern int gcov_profile_scale (struct gcov_info*, float, int, int);
> @@ -141,26 +142,18 @@ profile_merge (const char *d1, const char *d2, const char *out, int w1, int w2)
>   {
>     struct gcov_info *d1_profile;
>     struct gcov_info *d2_profile;
> -  int ret;
> +  struct gcov_info *merged_profile;
>   
>     d1_profile = gcov_read_profile_dir (d1, 0);
> -  if (!d1_profile)
> -    return 1;
> -
> -  if (d2)
> -    {
> -      d2_profile = gcov_read_profile_dir (d2, 0);
> -      if (!d2_profile)
> -        return 1;
> +  d2_profile = gcov_read_profile_dir (d2, 0);

Is it fine calling 'gcov_read_profile_dir (d2, 0)' without 'if (d2)'?

>   
> -      /* The actual merge: we overwrite to d1_profile.  */
> -      ret = gcov_profile_merge (d1_profile, d2_profile, w1, w2);
> +  /* The actual merge: we overwrite to d1_profile.  */
> +  merged_profile = gcov_profile_merge (d1_profile, d2_profile, w1, w2);
>   
> -      if (ret)
> -        return ret;
> -    }
> -
> -  gcov_output_files (out, d1_profile);
> +  if (merged_profile)
> +    gcov_output_files (out, merged_profile);
> +  else if (verbose)
> +    fnotice (stdout, "no profile files were merged\n");
>   
>     return 0;
>   }
> diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c
> index ba7fb924b53..e5496f4ade2 100644
> --- a/libgcc/libgcov-util.c
> +++ b/libgcc/libgcov-util.c
> @@ -677,13 +677,13 @@ find_match_gcov_info (struct gcov_info **array, int size,
>      Return 0 on success: without mismatch.
>      Reutrn 1 on error.  */

Please adjust the function comment.

Cheers,
Martin

>   
> -int
> +struct gcov_info *
>   gcov_profile_merge (struct gcov_info *tgt_profile, struct gcov_info *src_profile,
>                       int w1, int w2)
>   {
>     struct gcov_info *gi_ptr;
>     struct gcov_info **tgt_infos;
> -  struct gcov_info *tgt_tail;
> +  struct gcov_info **tgt_tail;
>     struct gcov_info **in_src_not_tgt;
>     unsigned tgt_cnt = 0, src_cnt = 0;
>     unsigned unmatch_info_cnt = 0;
> @@ -703,7 +703,10 @@ gcov_profile_merge (struct gcov_info *tgt_profile, struct gcov_info *src_profile
>     for (gi_ptr = tgt_profile, i = 0; gi_ptr; gi_ptr = gi_ptr->next, i++)
>       tgt_infos[i] = gi_ptr;
>   
> -  tgt_tail = tgt_infos[tgt_cnt - 1];
> +  if (tgt_cnt)
> +     tgt_tail = &tgt_infos[tgt_cnt - 1]->next;
> +  else
> +     tgt_tail = &tgt_profile;
>   
>     /* First pass on tgt_profile, we multiply w1 to all counters.  */
>     if (w1 > 1)
> @@ -732,14 +735,14 @@ gcov_profile_merge (struct gcov_info *tgt_profile, struct gcov_info *src_profile
>         gi_ptr = in_src_not_tgt[i];
>         gcov_merge (gi_ptr, gi_ptr, w2 - 1);
>         gi_ptr->next = NULL;
> -      tgt_tail->next = gi_ptr;
> -      tgt_tail = gi_ptr;
> +      *tgt_tail = gi_ptr;
> +      tgt_tail = &gi_ptr->next;
>       }
>   
>     free (in_src_not_tgt);
>     free (tgt_infos);
>   
> -  return 0;
> +  return tgt_profile;
>   }
>   
>   typedef gcov_type (*counter_op_fn) (gcov_type, void*, void*);


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-23 12:19 ` Martin Liška
@ 2022-03-23 14:50   ` Sebastian Huber
  2022-03-24 10:29     ` Martin Liška
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Huber @ 2022-03-23 14:50 UTC (permalink / raw)
  To: Martin Liška, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 5723 bytes --]

Hello Martin,

On 23/03/2022 13:19, Martin Liška wrote:
> On 3/23/22 10:34, Sebastian Huber wrote:
> 
> Hello.
> 
> Thanks for the patch. Note we're in stage4, so the patch can eventually go
> in in the next stage1.

ok, good.

> 
>> The gcov_profile_merge() already had code to deal with profile 
>> information
>> which had no counterpart to merge with.  For profile information from 
>> files
>> with no associated counterpart, the profile information is simply used 
>> as is
>> with the weighting transformation applied.  Make sure that 
>> gcov_profile_merge()
>> works with an empty target profile list.  Return the merged profile list.
> 
> Can you please provide a simple demo with a pair of profiles
> where I'll see what changes?

The background for this feature is that I would like to combine the gcov 
information obtained from several test executables. Each test executable 
will print something like this (log.txt):

*** BEGIN OF GCOV INFO ***

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda
YWRjZ1IzMEKtLjW3AAAAAQMAAADcaps855EX05p4KUUAAKEBOgAAAAEAAAAAAAAAAQAAAAAAAAAB
AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA
AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAA
AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAACXn3k16
TDqmuIMwpAAAoQECAAAAAgAAAAAAAAAAAAABAwAAADzkvDcfSnvcuIMwpAAAoQH+////AAAAAQMA
AACnWNZaIM7GWZ9hiOIAAKEBBAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAAPkGW3YHFUOO6Old
2wAAoQECAAAAAQAAAAAAAAAAAAABAwAAAIvy4CE9FxuM6Old2wAAoQECAAAAAQAAAAAAAAAAAAAB
AwAAANyvBDZiERlQ6Old2wAAoQECAAAAAQAAAAAAAAAAAAABAwAAACKQjCp2pYlIuIMwpAAAoQEC
AAAAAQAAAAAAAAAAAAABAwAAAKSSXEjQFDluuIMwpAAAoQH+////AAAAAA==

...

*** END OF GCOV INFO ***

The attached script reads the log file and creates the *.gcda files 
using gcov-tool. Initially, the target files do not exist.

> 
>>
>> gcc/
>>     * gcov-tool.cc (gcov_profile_merge): Adjust return type.
>>     (profile_merge): Allow merging of directories which contain no 
>> profile
>>     files.
>>
>> libgcc/
>>     * libgcov-util.c (gcov_profile_merge): Return the list of merged
>>     profiles.  Accept empty target and source profile lists.
>> ---
>>   gcc/gcov-tool.cc      | 27 ++++++++++-----------------
>>   libgcc/libgcov-util.c | 15 +++++++++------
>>   2 files changed, 19 insertions(+), 23 deletions(-)
>>
>> diff --git a/gcc/gcov-tool.cc b/gcc/gcov-tool.cc
>> index f4e42ae763c..2e4083a664d 100644
>> --- a/gcc/gcov-tool.cc
>> +++ b/gcc/gcov-tool.cc
>> @@ -40,7 +40,8 @@ see the files COPYING3 and COPYING.RUNTIME 
>> respectively.  If not, see
>>   #endif
>>   #include <getopt.h>
>> -extern int gcov_profile_merge (struct gcov_info*, struct gcov_info*, 
>> int, int);
>> +extern struct gcov_info *gcov_profile_merge (struct gcov_info*,
>> +                         struct gcov_info*, int, int);
>>   extern int gcov_profile_overlap (struct gcov_info*, struct gcov_info*);
>>   extern int gcov_profile_normalize (struct gcov_info*, gcov_type);
>>   extern int gcov_profile_scale (struct gcov_info*, float, int, int);
>> @@ -141,26 +142,18 @@ profile_merge (const char *d1, const char *d2, 
>> const char *out, int w1, int w2)
>>   {
>>     struct gcov_info *d1_profile;
>>     struct gcov_info *d2_profile;
>> -  int ret;
>> +  struct gcov_info *merged_profile;
>>     d1_profile = gcov_read_profile_dir (d1, 0);
>> -  if (!d1_profile)
>> -    return 1;
>> -
>> -  if (d2)
>> -    {
>> -      d2_profile = gcov_read_profile_dir (d2, 0);
>> -      if (!d2_profile)
>> -        return 1;
>> +  d2_profile = gcov_read_profile_dir (d2, 0);
> 
> Is it fine calling 'gcov_read_profile_dir (d2, 0)' without 'if (d2)'?

Yes, the caller ensures that d1 and d2 are both provided:

   if (argc - optind != 2)
     merge_usage ();

   return profile_merge (argv[optind], argv[optind+1], output_dir, w1, w2);

Maybe we should provide a better error message, if the user doesn't 
provide two directories instead of the general usage message.

> 
>> -      /* The actual merge: we overwrite to d1_profile.  */
>> -      ret = gcov_profile_merge (d1_profile, d2_profile, w1, w2);
>> +  /* The actual merge: we overwrite to d1_profile.  */
>> +  merged_profile = gcov_profile_merge (d1_profile, d2_profile, w1, w2);
>> -      if (ret)
>> -        return ret;
>> -    }
>> -
>> -  gcov_output_files (out, d1_profile);
>> +  if (merged_profile)
>> +    gcov_output_files (out, merged_profile);
>> +  else if (verbose)
>> +    fnotice (stdout, "no profile files were merged\n");
>>     return 0;
>>   }
>> diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c
>> index ba7fb924b53..e5496f4ade2 100644
>> --- a/libgcc/libgcov-util.c
>> +++ b/libgcc/libgcov-util.c
>> @@ -677,13 +677,13 @@ find_match_gcov_info (struct gcov_info **array, 
>> int size,
>>      Return 0 on success: without mismatch.
>>      Reutrn 1 on error.  */
> 
> Please adjust the function comment.

Oh, yes.

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

[-- Attachment #2: gcov.py --]
[-- Type: text/x-python, Size: 2703 bytes --]

#!/usr/bin/env python
# SPDX-License-Identifier: BSD-2-Clause
""" Read log file and create *.gcda files. """

# Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
#
# 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.

import base64
import os 
import subprocess
import sys 
import tempfile


def _longest_common_prefix(names):
    names = sorted(names)
    try:
        shortest = names[0]
    except KeyError:
        return ""
    prefix = ""
    longest = names[-1]
    for idx, char in enumerate(shortest):
        if longest[idx] == char:
            prefix += char
        else:
            break
    return prefix


gcov_info = {}
for name in sys.argv[1:]:
    with open(name, "r") as log:
        after = log.read().split("*** BEGIN OF GCOV INFO ***")[1]
        before = after.split("*** END OF GCOV INFO ***")[0]
        for block in before.split("\n\n"):
            if block:
                gcov_file, gcov_data = block.split("\n", 1)
                gcov_info[gcov_file] = base64.b64decode(gcov_data)
prefix = _longest_common_prefix(gcov_info.keys())
with tempfile.TemporaryDirectory() as tmp_dir:
    for gcov_file, gcov_data in gcov_info.items():
        name = os.path.join(tmp_dir, gcov_file[len(prefix):])
        print(name)
        os.makedirs(os.path.dirname(name), exist_ok=True)
        with open(name, "wb") as out:
            out.write(gcov_data)
    subprocess.run(["gcov-tool", "merge", "-v", "-o", prefix, prefix, tmp_dir])

[-- Attachment #3: log.txt --]
[-- Type: text/plain, Size: 16732 bytes --]

*** BEGIN OF GCOV INFO ***

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda
YWRjZ1IzMEKtLjW3AAAAAQMAAADcaps855EX05p4KUUAAKEBOgAAAAEAAAAAAAAAAQAAAAAAAAAB
AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA
AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAA
AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAACXn3k16
TDqmuIMwpAAAoQECAAAAAgAAAAAAAAAAAAABAwAAADzkvDcfSnvcuIMwpAAAoQH+////AAAAAQMA
AACnWNZaIM7GWZ9hiOIAAKEBBAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAAPkGW3YHFUOO6Old
2wAAoQECAAAAAQAAAAAAAAAAAAABAwAAAIvy4CE9FxuM6Old2wAAoQECAAAAAQAAAAAAAAAAAAAB
AwAAANyvBDZiERlQ6Old2wAAoQECAAAAAQAAAAAAAAAAAAABAwAAACKQjCp2pYlIuIMwpAAAoQEC
AAAAAQAAAAAAAAAAAAABAwAAAKSSXEjQFDluuIMwpAAAoQH+////AAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/iodumpgcovinfo.gcda
YWRjZ1IzMEL5LjW3AAAAAQMAAAB/qf0pVHSQp+GsNm4AAKEBFAAAAAEAAAAAAAAAAQAAAAAAAAAC
AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAQMAAABY4NpH6HrccejpXdsAAKEB/v///wAAAAEDAAAA76aYWABKTQgiKXSYAACh
AQgAAAC3AAAAAAAAAAwAAAAAAAAA4AIAAAAAAAC9AAAAAAAAAAAAAAEDAAAA3gCsEklz8o4+srvA
AAChAQQAAAACAAAAAAAAAAIAAAAAAAAAAAAAAQMAAACYmBQ1FTcE2j6yu8AAAKEBBAAAAAEAAAAA
AAAAAQAAAAAAAAAAAAABAwAAAEpH8UWiRiLQWXZT7QAAoQEIAAAAZAQAAAAAAABkBAAAAAAAAA4A
AAAAAAAADwAAAAAAAAAAAAABAwAAAAFn/1Ij+Pw56Old2wAAoQECAAAAAQAAAAAAAAAAAAAA

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/rtems/sys_arch.gcda
YWRjZ1IzMEIPLzW3AAAAAQMAAABjuoI41n6mx+jpXdsAAKEBAgAAAAMAAAAAAAAAAAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/inet_chksum.gcda
YWRjZ1IzMEI1LzW3AAAAAQMAAABstMtmN29P8sbKpG4AAKEB9v///wAAAAEDAAAAee2tYzGj4C75
SrN8AAChAQQAAAACAAAAAAAAAAIAAAAAAAAAAAAAAQMAAACGYbFXfPI+Wj6yu8AAAKEB/P///wAA
AAEDAAAAq4+3AVSigIw+srvAAAChAfz///8AAAABAwAAAPPRfieDH0YBqtAvWAAAoQHw////AAAA
AQMAAAB75nAXPKyrnT6yu8AAAKEBBAAAAAMAAAAAAAAAAwAAAAAAAAAAAAABAwAAAMSMeGl4ucAo
PrK7wAAAoQEEAAAAAwAAAAAAAAADAAAAAAAAAAAAAAEDAAAAZypNPJK/y4vGyqRuAAChAQoAAAAD
AAAAAAAAAAMAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAEAAAAAAAAAAAAAAQMAAAA8U4JsaG3zzhrw
rwMAAKEBDAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAA=

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/init.gcda
YWRjZ1IzMEJhLzW3AAAAAQMAAAAe0i0z6EH2vmriwogAAKEBDAAAAAEAAAAAAAAAAQAAAAAAAAAB
AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAA=

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/ipv4/etharp.gcda
YWRjZ1IzMEKZLzW3AAAAAQMAAADX4Zo9bHOgXz6yu8AAAKEBBAAAAAEAAAAAAAAAAQAAAAAAAAAA
AAABAwAAANqRGya85B7OPrK7wAAAoQEEAAAAAQAAAAAAAAABAAAAAAAAAAAAAAEDAAAAPBAzSHKo
eKiUhbn/AAChARAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAQMAAABcaC5/hBOuMEi7M8AAAKEBsv///wAAAAEDAAAA
44oUZkoowW25UUR1AAChAdb///8AAAABAwAAAE8TzhiXZbqh/FjAVAAAoQHs////AAAAAQMAAACV
d/FG7zvgBMx1fVIAAKEB4P///wAAAAEDAAAAjK9vJUzYdO1nYSBgAAChAfT///8AAAABAwAAAESK
ijFyFcuxPA58fQAAoQH0////AAAAAQMAAABKkQ9vx6lHV1KPQHAAAKEB9v///wAAAAEDAAAAlZ3U
dwMSDVl8bpjiAAChAeb///8AAAABAwAAAF2e3x1rQWpk+XPLZQAAoQHE////AAAAAQMAAACDNddC
PazDJ+88eV8AAKEB6v///wAAAAEDAAAA1m79Rh9sC7LiJBKcAAChAfr///8AAAABAwAAAAlfswh8
7DMcnSp+jAAAoQH0////AAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/ipv4/icmp.gcda
YWRjZ1IzMELiLzW3AAAAAQMAAACoJxFIQVt+c6iGsqcAAKEB6v///wAAAAEDAAAAF5i3F7FIZoM+
srvAAAChAfz///8AAAABAwAAAB/m+CztcV+KPrK7wAAAoQH8////AAAAAQMAAAD0VqZgaubyndH9
T6UAAKEBuv///wAAAAA=

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/ipv4/ip4_addr.gcda
YWRjZ1IzMEIGMDW3AAAAAQMAAABeW5Y6P1N6DYiNJeQAAKEB9P///wAAAAEDAAAAfSBNbLnvRnM+
srvAAAChAfz///8AAAABAwAAAEcxwGvOpkVb7lRjLwAAoQE8AAAAAgAAAAAAAAAAAAAAAAAAAAgA
AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAFAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAQMA
AAC9oTxoPpX2r9LLWqoAAKEBBgAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAEDAAAAONaV
I6ps4AbechPOAAChAfb///8AAAABAwAAAP8g80g95y8jA06riQAAoQEOAAAABgAAAAAAAAAGAAAA
AAAAAAYAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/ipv4/ip4.gcda
YWRjZ1IzMEIxMDW3AAAAAQMAAADiTkk//OSWYNxPeR4AAKEB9v///wAAAAEDAAAAnLBJY1QiXObS
+lD5AAChARwAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAAAAAAAAAAAAQMAAABGAjFbr4qfGhpl3mwAAKEB9v///wAAAAEDAAAA98z7b/5CNxpZ0HKo
AAChAWAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAC
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAA
AAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAABAwAA
AHdq/TYLEzFup0abZgAAoQEMAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAIAAAAAAAAAAAAAAQMAAABR9yJ2X9ru/9PaqHsAAKEB2v///wAAAAEDAAAAsZZOKBhA1q6N
1eAwAAChAfD///8AAAABAwAAAP89hwdoAlc2WRGhBQAAoQHm////AAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/ipv4/ip4_frag.gcda
YWRjZ1IzMEJqMDW3AAAAAQMAAAAJLHtV2G0zmeXhLUYAAKEBzv///wAAAAEDAAAA3iBYXgTjmYWQ
/oFwAAChAfT///8AAAABAwAAAKMzBTFYmi66FQzNAgAAoQH6////AAAAAQMAAABkV2wf3QCaej6y
u8AAAKEB/P///wAAAAEDAAAAZfcZLzO0wWu+sX/0AAChAbL///8AAAABAwAAANuuXGtIrkB1yEuF
oQAAoQHE////AAAAAQMAAADV8EpccqlPqUBr2gkAAKEB+P///wAAAAEDAAAAUiitFDeEM7/M1f9m
AAChAfL///8AAAABAwAAAKuI0h3kYrTMu7CRoAAAoQHo////AAAAAQMAAABzIB5P+kICf1mJzgIA
AKEB4v///wAAAAEDAAAAdzPYIADXN8Tm3RNiAAChAfj///8AAAAA

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/mem.gcda
YWRjZ1IzMEKpMDW3AAAAAQMAAABvgu1imfBVU4KVXnYAAKEB+P///wAAAAEDAAAAWJTmNkCSYW2B
0dbTAAChATIAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAA
AAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAMAAAAAAAAAAwAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAEDAAAAd9Mmd0BSXWEb
CwhhAAChAcz///8AAAABAwAAABeHAWV1thnVG3j3oQAAoQEUAAAAAgAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAA
AAAAAAAAAAABAwAAAPccN31dGnshNgsDiQAAoQEUAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAA
AgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAA
AAABAwAAAELe72Y4qgJcN0Y1SwAAoQEEAAAAAQAAAAAAAAABAAAAAAAAAAAAAAEDAAAAeSG5Hwnw
MlrvtQoLAAChASgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
AAAAAAACAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAQMAAAAuSXYZ16AkZ+jpXdsAAKEBAgAAAAUAAAAAAAAAAAAAAQMAAADrLvZqnDHSy+jp
XdsAAKEBAgAAABIAAAAAAAAAAAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/memp.gcda
YWRjZ1IzMELaMDW3AAAAAQMAAAAVF5AiQjz+me+hUEEAAKEB+P///wAAAAEDAAAAgayqEVjKh2q3
U5P9AAChAfb///8AAAABAwAAAI/gwW7kAg6DbLDwEwAAoQH8////AAAAAQMAAADfeD1zkY2UDGbM
GFAAAKEBBgAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAEDAAAAsg7Wak0/HhjlijldAACh
Afj///8AAAABAwAAADAmXEha66yIjQDyHAAAoQEGAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAA
AAAAAQMAAABATn4hUjZEQkIg/3MAAKEBBgAAAAEAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAED
AAAAXCUyTFYc1/WTV+q4AAChAQQAAAAIAAAAAAAAAA0BAAAAAAAAAAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/netif.gcda
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

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/pbuf.gcda
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
AAAAAAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/raw.gcda
YWRjZ1IzMEKcMTW3AAAAAQMAAACXieBYUmRO10/JWb8AAKEBDgAAAAIAAAAAAAAAAgAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQMAAABFssM/HFFs7/lK
s3wAAKEB/P///wAAAAEDAAAAVeK8F1ml2hCNiYAYAAChAfr///8AAAABAwAAAHWpNRDJaEyJ98/E
LAAAoQH0////AAAAAQMAAACTqCwa/yqpwz6yu8AAAKEB/P///wAAAAEDAAAADBu2YV+PFxA4JSv9
AAChAdj///8AAAABAwAAAMTH4zRpLrevL44scwAAoQHo////AAAAAQMAAAChsP1rOH9ybbiDMKQA
AKEB/v///wAAAAEDAAAASXMSaz5jUCq4gzCkAAChAf7///8AAAABAwAAAFF6D0h5oLXSfccECwAA
oQH4////AAAAAQMAAAABS59y3tit2BzifMIAAKEB/P///wAAAAEDAAAAHRXsVUgzu319xwQLAACh
Afj///8AAAABAwAAAGLfT2oVhCPjfdXtKwAAoQEaAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwAAAPhO80jKTh3H6zHeDwAAoQHu////AAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/timeouts.gcda
YWRjZ1IzMELJMTW3AAAAAQMAAABTP8podw7hXWOK27IAAKEB9v///wAAAAEDAAAAT36kVfAZgyqW
tu2lAAChAfj///8AAAABAwAAAL/QK0/WtAJ61sRHFQAAoQEOAAAAAQAAAAAAAAAAAAAAAAAAAAEA
AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAwAAAJTv9yxJIXFxEEUV
tAAAoQHy////AAAAAQMAAAD+ZfxS3I/8aQOF34EAAKEBCAAAAAIAAAAAAAAAAAAAAAAAAAACAAAA
AAAAAAIAAAAAAAAAAAAAAQMAAADdx0Fe6E/5kEIg/3MAAKEBBgAAAAEAAAAAAAAAAgAAAAAAAAAC
AAAAAAAAAAAAAAEDAAAADATzVN3PnUbz40HPAAChAfT///8AAAABAwAAAMt2kzM6LWrkX/2/RQAA
oQESAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/core/udp.gcda
YWRjZ1IzMEL1MTW3AAAAAQMAAAAeN2kidg0ERk/JWb8AAKEBDgAAAAIAAAAAAAAAAgAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQMAAABwuLAGqri6R/lK
s3wAAKEB/P///wAAAAEDAAAAHh4LJrk7dkmNiYAYAAChAQYAAAABAAAAAAAAAAEAAAAAAAAAAQAA
AAAAAAAAAAABAwAAAFhzISk35J7qEwtzSgAAoQHy////AAAAAQMAAABoa/5lEm3kWxzifMIAAKEB
BAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAAH6fqT9y771rHOJ8wgAAoQH8////AAAAAQMAAAAg
KiJD9ooiUGxA6bkAAKEB7v///wAAAAEDAAAANqckJgO1Xj8c4nzCAAChAQQAAAABAAAAAAAAAAEA
AAAAAAAAAAAAAQMAAADUzu9bQtiESBcepG4AAKEBJAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAB
AAAAAAAAAAAAAAEDAAAAEddbbEIoli20CpFLAAChATgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAA
AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAEDAAAAXwcrXSY737B+kQWAAAChARQA
AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEDAAAA6R33DXRUGWFO+cBSAAChAe7///8AAAAB
AwAAAFpzLxTevR+476FQQQAAoQH4////AAAAAQMAAABothpVvaNdVFGNsq8AAKEBWAAAAAIAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAA
AAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAA
AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAC
AAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAA
AAAAAAAAAAABAwAAAK5kp2LCGHr5O1Na2wAAoQEaAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC
AAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAABAwAAABqa7Sl0CRZzc+0iVQAAoQH2////AAAAAQMA
AACoQ8lIznIe9biDMKQAAKEBAgAAAAEAAAAAAAAAAAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/netif/ethernet.gcda
YWRjZ1IzMEIwMjW3AAAAAQMAAAC+EBQuXa7stuNAYTkAAKEBCgAAAAEAAAAAAAAAAQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAwAAAAQbGWmmhbpBJ5lR8AAAoQEmAAAAAQAAAAAA
AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

*** END OF GCOV INFO ***

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-23 14:50   ` Sebastian Huber
@ 2022-03-24 10:29     ` Martin Liška
  2022-03-24 10:51       ` Sebastian Huber
  0 siblings, 1 reply; 11+ messages in thread
From: Martin Liška @ 2022-03-24 10:29 UTC (permalink / raw)
  To: Sebastian Huber, gcc-patches

On 3/23/22 15:50, Sebastian Huber wrote:
> The attached script reads the log file and creates the *.gcda files using gcov-tool. Initially, the target files do not exist.

Now I've got your use-case and I like it. It's cool one can utilize GCOV even without a filesystem.

Please update the patch. I basically don't see any issues with it.

Cheers,
Martin

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-24 10:29     ` Martin Liška
@ 2022-03-24 10:51       ` Sebastian Huber
  2022-03-24 12:03         ` Martin Liška
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Huber @ 2022-03-24 10:51 UTC (permalink / raw)
  To: Martin Liška, gcc-patches

On 24/03/2022 11:29, Martin Liška wrote:
> On 3/23/22 15:50, Sebastian Huber wrote:
>> The attached script reads the log file and creates the *.gcda files 
>> using gcov-tool. Initially, the target files do not exist.
> 
> Now I've got your use-case and I like it. It's cool one can utilize GCOV 
> even without a filesystem.

Yes, it basically works quite well. I try to make it a bit easier to 
use. What seems to be quite common is that tests for embedded systems 
report their test data through an in order character stream, for example 
through an UART device. I used this primitive encoding of the gcov 
information:

*** BEGIN OF GCOV INFO ***

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda
YWRjZ1IzMEKtLjW3AAAAAQMAAADcaps855EX05p4KUUAAKEBOgAAAAEAAAAAAAAAAQAAAAAAAAAB
AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEA
AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAA
AAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAACXn3k16
TDqmuIMwpAAAoQECAAAAAgAAAAAAAAAAAAABAwAAADzkvDcfSnvcuIMwpAAAoQH+////AAAAAQMA
AACnWNZaIM7GWZ9hiOIAAKEBBAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAAPkGW3YHFUOO6Old
2wAAoQECAAAAAQAAAAAAAAAAAAABAwAAAIvy4CE9FxuM6Old2wAAoQECAAAAAQAAAAAAAAAAAAAB
AwAAANyvBDZiERlQ6Old2wAAoQECAAAAAQAAAAAAAAAAAAABAwAAACKQjCp2pYlIuIMwpAAAoQEC
AAAAAQAAAAAAAAAAAAABAwAAAKSSXEjQFDluuIMwpAAAoQH+////AAAAAA==

/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/src/netif/ethernet.gcda
YWRjZ1IzMEIwMjW3AAAAAQMAAAC+EBQuXa7stuNAYTkAAKEBCgAAAAEAAAAAAAAAAQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAwAAAAQbGWmmhbpBJ5lR8AAAoQEmAAAAAQAAAAAA
AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

...

*** END OF GCOV INFO ***

Maybe we could add the file path into the gcov information stream using 
a new tag:

#define GCOV_TAG_GCDA_FILE_NAME  ((gcov_unsigned_t)0xa5000000)

Then the complete gcov information can be dumped using a single base64 
encoded stream. We could add some support to the gcov-tool to read this 
stream and merge it into gcda files.

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-24 10:51       ` Sebastian Huber
@ 2022-03-24 12:03         ` Martin Liška
  2022-03-28 16:23           ` Sebastian Huber
  0 siblings, 1 reply; 11+ messages in thread
From: Martin Liška @ 2022-03-24 12:03 UTC (permalink / raw)
  To: Sebastian Huber, gcc-patches

On 3/24/22 11:51, Sebastian Huber wrote:
> Maybe we could add the file path into the gcov information stream using a new tag:
> 
> #define GCOV_TAG_GCDA_FILE_NAME  ((gcov_unsigned_t)0xa5000000)
> 
> Then the complete gcov information can be dumped using a single base64 encoded stream. We could add some support to the gcov-tool to read this stream and merge it into gcda files.

I would support such patch!

Thanks,
Martin

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-24 12:03         ` Martin Liška
@ 2022-03-28 16:23           ` Sebastian Huber
  2022-03-30 11:56             ` Martin Liška
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Huber @ 2022-03-28 16:23 UTC (permalink / raw)
  To: Martin Liška, gcc-patches

On 24/03/2022 13:03, Martin Liška wrote:
> On 3/24/22 11:51, Sebastian Huber wrote:
>> Maybe we could add the file path into the gcov information stream 
>> using a new tag:
>>
>> #define GCOV_TAG_GCDA_FILE_NAME  ((gcov_unsigned_t)0xa5000000)
>>
>> Then the complete gcov information can be dumped using a single base64 
>> encoded stream. We could add some support to the gcov-tool to read 
>> this stream and merge it into gcda files.
> 
> I would support such patch!

Ok, good. I work currently on a prototype implementation. My use case 
would be like this.

Run a test executable which dumps all gcov info objects in a serial data 
stream. It could be encoded as base64. It could be also compressed. On 
the host you unpack the encoded data stream and feed it into gcov-tool 
using the new "merge-stream" subcommand:

gcov-tool --help
Usage: gcov-tool [OPTION]... SUB_COMMAND [OPTION]...

Offline tool to handle gcda counts

   -h, --help                            Print this help, then exit
   -v, --version                         Print version number, then exit
   merge-stream [options] [stream-file]  Merge coverage stream file (or 
stdin)
                                         and coverage file contents
     -v, --verbose                       Verbose mode
     -w, --weight <w1,w2>                Set weights (float point values)

Example:

base64 -d log.txt | gcov-tool merge-stream

The gcov-tool uses a new tag which contains the filename of the 
associated gcov info file:

gcov-dump b-xilinx_zynq_a9_qemu/init.gcda
b-xilinx_zynq_a9_qemu/init.gcda:data:magic `gcda':version `B20 '
b-xilinx_zynq_a9_qemu/init.gcda:stamp 3496756572
b-xilinx_zynq_a9_qemu/init.gcda:checksum 137326246
b-xilinx_zynq_a9_qemu/init.gcda:  a5000000:  62:FILENAME 
`/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda'
b-xilinx_zynq_a9_qemu/init.gcda:  a1000000:   8:OBJECT_SUMMARY runs=0, 
sum_max=0
b-xilinx_zynq_a9_qemu/init.gcda:  01000000:  12:FUNCTION 
ident=1016818396, lineno_checksum=0xd31791e7, cfg_checksum=0x4529789a
b-xilinx_zynq_a9_qemu/init.gcda:    01a10000: 232:COUNTERS arcs 29 counts

Should I generate this filename tag to all configurations or just in 
case inhibit_libc is defined?

Advantage:

* No dependency on the GCC configuration

Disadvantages:

* Bigger files
* Actual filename and the filename of the tag differ if file is moved
* Potential information leak

In any case, I would add the support for the (optional) filename tag to 
all readers.

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-28 16:23           ` Sebastian Huber
@ 2022-03-30 11:56             ` Martin Liška
  2022-03-30 13:30               ` Sebastian Huber
  0 siblings, 1 reply; 11+ messages in thread
From: Martin Liška @ 2022-03-30 11:56 UTC (permalink / raw)
  To: Sebastian Huber, gcc-patches

On 3/28/22 18:23, Sebastian Huber wrote:
> On 24/03/2022 13:03, Martin Liška wrote:
>> On 3/24/22 11:51, Sebastian Huber wrote:
>>> Maybe we could add the file path into the gcov information stream using a new tag:
>>>
>>> #define GCOV_TAG_GCDA_FILE_NAME  ((gcov_unsigned_t)0xa5000000)
>>>
>>> Then the complete gcov information can be dumped using a single base64 encoded stream. We could add some support to the gcov-tool to read this stream and merge it into gcda files.
>>
>> I would support such patch!
> 
> Ok, good. I work currently on a prototype implementation. My use case would be like this.
> 

Great, the suggested scheme works for me.

> Run a test executable which dumps all gcov info objects in a serial data stream. It could be encoded as base64. It could be also compressed. On the host you unpack the encoded data stream and feed it into gcov-tool using the new "merge-stream" subcommand:
> 
> gcov-tool --help
> Usage: gcov-tool [OPTION]... SUB_COMMAND [OPTION]...
> 
> Offline tool to handle gcda counts
> 
>    -h, --help                            Print this help, then exit
>    -v, --version                         Print version number, then exit
>    merge-stream [options] [stream-file]  Merge coverage stream file (or stdin)
>                                          and coverage file contents
>      -v, --verbose                       Verbose mode
>      -w, --weight <w1,w2>                Set weights (float point values)
> 
> Example:
> 
> base64 -d log.txt | gcov-tool merge-stream
> 
> The gcov-tool uses a new tag which contains the filename of the associated gcov info file:
> 
> gcov-dump b-xilinx_zynq_a9_qemu/init.gcda
> b-xilinx_zynq_a9_qemu/init.gcda:data:magic `gcda':version `B20 '
> b-xilinx_zynq_a9_qemu/init.gcda:stamp 3496756572
> b-xilinx_zynq_a9_qemu/init.gcda:checksum 137326246
> b-xilinx_zynq_a9_qemu/init.gcda:  a5000000:  62:FILENAME `/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda'
> b-xilinx_zynq_a9_qemu/init.gcda:  a1000000:   8:OBJECT_SUMMARY runs=0, sum_max=0
> b-xilinx_zynq_a9_qemu/init.gcda:  01000000:  12:FUNCTION ident=1016818396, lineno_checksum=0xd31791e7, cfg_checksum=0x4529789a
> b-xilinx_zynq_a9_qemu/init.gcda:    01a10000: 232:COUNTERS arcs 29 counts
> 
> Should I generate this filename tag to all configurations or just in case inhibit_libc is defined?

I would emit it unconditionally. Btw. why do you need the tag?

Cheers,
Martin

> 
> Advantage:
> 
> * No dependency on the GCC configuration
> 
> Disadvantages:
> 
> * Bigger files
> * Actual filename and the filename of the tag differ if file is moved
> * Potential information leak
> 
> In any case, I would add the support for the (optional) filename tag to all readers.
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-30 11:56             ` Martin Liška
@ 2022-03-30 13:30               ` Sebastian Huber
  2022-03-30 14:48                 ` Sebastian Huber
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Huber @ 2022-03-30 13:30 UTC (permalink / raw)
  To: Martin Liška, gcc-patches

On 30/03/2022 13:56, Martin Liška wrote:
>> Example:
>>
>> base64 -d log.txt | gcov-tool merge-stream
>>
>> The gcov-tool uses a new tag which contains the filename of the 
>> associated gcov info file:
>>
>> gcov-dump b-xilinx_zynq_a9_qemu/init.gcda
>> b-xilinx_zynq_a9_qemu/init.gcda:data:magic `gcda':version `B20 '
>> b-xilinx_zynq_a9_qemu/init.gcda:stamp 3496756572
>> b-xilinx_zynq_a9_qemu/init.gcda:checksum 137326246
>> b-xilinx_zynq_a9_qemu/init.gcda:  a5000000:  62:FILENAME 
>> `/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda'
>> b-xilinx_zynq_a9_qemu/init.gcda:  a1000000:   8:OBJECT_SUMMARY runs=0, 
>> sum_max=0
>> b-xilinx_zynq_a9_qemu/init.gcda:  01000000:  12:FUNCTION 
>> ident=1016818396, lineno_checksum=0xd31791e7, cfg_checksum=0x4529789a
>> b-xilinx_zynq_a9_qemu/init.gcda:    01a10000: 232:COUNTERS arcs 29 counts
>>
>> Should I generate this filename tag to all configurations or just in 
>> case inhibit_libc is defined?
> 
> I would emit it unconditionally. Btw. why do you need the tag?

The tag was the easiest way to add the filename to the gcov information.

We need some gcov defined way to get the filename associated with a gcov 
information, so that the gcov-tool can generate the gcov files from the 
gcov information itself. In a hosted environment, it is not necessary to 
include the filename in the gcov information, since the instrumented 
executable already creates the gcov files. In a freestanding 
environment, the gcov information is not automatically stored to files 
since no file system may be available. Here, we can dump the gcov 
information through __gcov_info_to_gcda(). This dump is basically a 
concatenation of several gcov files.

An alternative to a tag inside the gcov data would be a header which is 
dumped before the gcov data and understood by the gcov-tool:

header : int32:filename-magic int32:version string

#define GCOV_FILENAME_MAGIC ((gcov_unsigned_t)0x6763666e) /* "gcfn" */

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-30 13:30               ` Sebastian Huber
@ 2022-03-30 14:48                 ` Sebastian Huber
  2022-03-31  6:58                   ` Martin Liška
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Huber @ 2022-03-30 14:48 UTC (permalink / raw)
  To: Martin Liška, gcc-patches



On 30/03/2022 15:30, Sebastian Huber wrote:
> On 30/03/2022 13:56, Martin Liška wrote:
>>> Example:
>>>
>>> base64 -d log.txt | gcov-tool merge-stream
>>>
>>> The gcov-tool uses a new tag which contains the filename of the 
>>> associated gcov info file:
>>>
>>> gcov-dump b-xilinx_zynq_a9_qemu/init.gcda
>>> b-xilinx_zynq_a9_qemu/init.gcda:data:magic `gcda':version `B20 '
>>> b-xilinx_zynq_a9_qemu/init.gcda:stamp 3496756572
>>> b-xilinx_zynq_a9_qemu/init.gcda:checksum 137326246
>>> b-xilinx_zynq_a9_qemu/init.gcda:  a5000000:  62:FILENAME 
>>> `/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda'
>>> b-xilinx_zynq_a9_qemu/init.gcda:  a1000000:   8:OBJECT_SUMMARY 
>>> runs=0, sum_max=0
>>> b-xilinx_zynq_a9_qemu/init.gcda:  01000000:  12:FUNCTION 
>>> ident=1016818396, lineno_checksum=0xd31791e7, cfg_checksum=0x4529789a
>>> b-xilinx_zynq_a9_qemu/init.gcda:    01a10000: 232:COUNTERS arcs 29 
>>> counts
>>>
>>> Should I generate this filename tag to all configurations or just in 
>>> case inhibit_libc is defined?
>>
>> I would emit it unconditionally. Btw. why do you need the tag?
> 
> The tag was the easiest way to add the filename to the gcov information.
> 
> We need some gcov defined way to get the filename associated with a gcov 
> information, so that the gcov-tool can generate the gcov files from the 
> gcov information itself. In a hosted environment, it is not necessary to 
> include the filename in the gcov information, since the instrumented 
> executable already creates the gcov files. In a freestanding 
> environment, the gcov information is not automatically stored to files 
> since no file system may be available. Here, we can dump the gcov 
> information through __gcov_info_to_gcda(). This dump is basically a 
> concatenation of several gcov files.
> 
> An alternative to a tag inside the gcov data would be a header which is 
> dumped before the gcov data and understood by the gcov-tool:
> 
> header : int32:filename-magic int32:version string
> 
> #define GCOV_FILENAME_MAGIC ((gcov_unsigned_t)0x6763666e) /* "gcfn" */

Thanks for asking the question. The alternative with the header is much 
less intrusive. I will work on this approach now.

Another question, I would like to add an option to gcov-tool to 
transform the filenames using regular expressions (for example, remove 
or add a prefix). Can I use the C++ <regex> for this?

-- 
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax:   +49-89-18 94 741 - 08

Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] gcov-tool: Allow merging of empty profile lists
  2022-03-30 14:48                 ` Sebastian Huber
@ 2022-03-31  6:58                   ` Martin Liška
  0 siblings, 0 replies; 11+ messages in thread
From: Martin Liška @ 2022-03-31  6:58 UTC (permalink / raw)
  To: Sebastian Huber, gcc-patches

On 3/30/22 16:48, Sebastian Huber wrote:
> 
> 
> On 30/03/2022 15:30, Sebastian Huber wrote:
>> On 30/03/2022 13:56, Martin Liška wrote:
>>>> Example:
>>>>
>>>> base64 -d log.txt | gcov-tool merge-stream
>>>>
>>>> The gcov-tool uses a new tag which contains the filename of the associated gcov info file:
>>>>
>>>> gcov-dump b-xilinx_zynq_a9_qemu/init.gcda
>>>> b-xilinx_zynq_a9_qemu/init.gcda:data:magic `gcda':version `B20 '
>>>> b-xilinx_zynq_a9_qemu/init.gcda:stamp 3496756572
>>>> b-xilinx_zynq_a9_qemu/init.gcda:checksum 137326246
>>>> b-xilinx_zynq_a9_qemu/init.gcda:  a5000000:  62:FILENAME `/home/EB/sebastian_h/src/lwip/b-xilinx_zynq_a9_qemu/init.gcda'
>>>> b-xilinx_zynq_a9_qemu/init.gcda:  a1000000:   8:OBJECT_SUMMARY runs=0, sum_max=0
>>>> b-xilinx_zynq_a9_qemu/init.gcda:  01000000:  12:FUNCTION ident=1016818396, lineno_checksum=0xd31791e7, cfg_checksum=0x4529789a
>>>> b-xilinx_zynq_a9_qemu/init.gcda:    01a10000: 232:COUNTERS arcs 29 counts
>>>>
>>>> Should I generate this filename tag to all configurations or just in case inhibit_libc is defined?
>>>
>>> I would emit it unconditionally. Btw. why do you need the tag?
>>
>> The tag was the easiest way to add the filename to the gcov information.
>>
>> We need some gcov defined way to get the filename associated with a gcov information, so that the gcov-tool can generate the gcov files from the gcov information itself. In a hosted environment, it is not necessary to include the filename in the gcov information, since the instrumented executable already creates the gcov files. In a freestanding environment, the gcov information is not automatically stored to files since no file system may be available. Here, we can dump the gcov information through __gcov_info_to_gcda(). This dump is basically a concatenation of several gcov files.
>>
>> An alternative to a tag inside the gcov data would be a header which is dumped before the gcov data and understood by the gcov-tool:
>>
>> header : int32:filename-magic int32:version string
>>
>> #define GCOV_FILENAME_MAGIC ((gcov_unsigned_t)0x6763666e) /* "gcfn" */
> 
> Thanks for asking the question. The alternative with the header is much less intrusive. I will work on this approach now.

Agreed.

> 
> Another question, I would like to add an option to gcov-tool to transform the filenames using regular expressions (for example, remove or add a prefix). Can I use the C++ <regex> for this?

Sure, use it!

Thanks,
Martin

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-03-31  6:58 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-23  9:34 [PATCH] gcov-tool: Allow merging of empty profile lists Sebastian Huber
2022-03-23 12:19 ` Martin Liška
2022-03-23 14:50   ` Sebastian Huber
2022-03-24 10:29     ` Martin Liška
2022-03-24 10:51       ` Sebastian Huber
2022-03-24 12:03         ` Martin Liška
2022-03-28 16:23           ` Sebastian Huber
2022-03-30 11:56             ` Martin Liška
2022-03-30 13:30               ` Sebastian Huber
2022-03-30 14:48                 ` Sebastian Huber
2022-03-31  6:58                   ` Martin Liška

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).