* [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 YWRjZ1IzMEIDMTW3AAAAAQMAAABKDLBXeMBqnV8uxkUAAKEBCAAAAAcAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQMAAABiuTMZrrWLWUCmDfcAAKEB8v///wAAAAEDAAAAgupWGe7Z 8nAmq1QoAAChAfr///8AAAABAwAAAAqZd0kNvuDOkof/EwAAoQHu////AAAAAQMAAACW+YgsG/iT Xy0h3WQAAKEB+P///wAAAAEDAAAAVkxONsURi0rIP2+NAAChAfj///8AAAABAwAAAC4ARHS2vk3k GiGXwwAAoQH6////AAAAAQMAAACC5sw0Kg1HKejpXdsAAKEB/v///wAAAAEDAAAANjiXUWV22sBC IP9zAAChAQYAAAABAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAABAwAAAB+lXTGvyHRf9IdufAAA oQEWAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAEDAAAA1fHbf671tZk+srvA AAChAfz///8AAAABAwAAAD+6WiKdOoYaxL/sYgAAoQEcAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDAAAA38KYGIXU37H3rkoVAACh Afz///8AAAABAwAAAD0MnWGySQjRjfxgQgAAoQH0////AAAAAQMAAAC/FT4Nlyqrt2J7cqEAAKEB DgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA AAAAAAAAAQMAAAAxkC4pjX+VVfeuShUAAKEBBAAAAAEAAAAAAAAAAQAAAAAAAAAAAAABAwAAAOf8 MFRLLn96dsVjgwAAoQHw////AAAAAQMAAAC8z2tBNPcgDqHb12IAAKEBEAAAAAUAAAAAAAAAAAAA AAAAAAADAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAB AwAAALr+TCgA+jyLxPy03QAAoQEOAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAQAAAAAAAAAB AAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAABAwAAAAx6DmFkoCZ66Old2wAAoQECAAAAAQAAAAAA AAAAAAABAwAAAJEd1XQDkW3RZSGMDQAAoQHm////AAAAAQMAAACc9opkp1MtrUJ88oYAAKEBKAAA AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAC AAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAABAwAAAL4R uAFQOrtBhW1awAAAoQH0////AAAAAQMAAABu+cc8z4ClEtr1p6oAAKEBCAAAAAIAAAAAAAAAAQAA AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQMAAACkZr5TSW5BAoVtWsAAAKEB9P///wAAAAEDAAAA S+CBRWgwtHDa9aeqAAChAQgAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAED AAAA8TgbeGtBlE2FbVrAAAChAfT///8AAAABAwAAAGQaf1rFUIEbugdINAAAoQESAAAAAgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAA AAIAAAAAAAAAAAAAAQMAAACZIFkpoLlRq9qctPMAAKEBBgAAAAIAAAAAAAAAAgAAAAAAAAACAAAA AAAAAAAAAAEDAAAA5xCTD2uXofxuMOEGAAChASIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAA AQMAAAAi1G1zZA6W/D6yu8AAAKEB/P///wAAAAEDAAAAlr1+ZDb8Ughi4s4MAAChAQwAAAABAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAwAAAPWXpXqT D8g4uUPzgQAAoQEIAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAABAwAAANxR dVY7u0qRn2GI4gAAoQEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA= /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).