From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dedi548.your-server.de (dedi548.your-server.de [85.10.215.148]) by sourceware.org (Postfix) with ESMTPS id 7986A385E007 for ; Thu, 31 Mar 2022 11:35:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7986A385E007 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embedded-brains.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embedded-brains.de Received: from sslproxy01.your-server.de ([78.46.139.224]) by dedi548.your-server.de with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nZt5F-000OPo-NL; Thu, 31 Mar 2022 13:35:21 +0200 Received: from [82.100.198.138] (helo=mail.embedded-brains.de) by sslproxy01.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nZt5F-000FkA-Kf; Thu, 31 Mar 2022 13:35:21 +0200 Received: from localhost (localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id 471C3480128; Thu, 31 Mar 2022 13:35:21 +0200 (CEST) Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id xNzarIKDm0fY; Thu, 31 Mar 2022 13:35:20 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id AEB334800B1; Thu, 31 Mar 2022 13:35:20 +0200 (CEST) X-Virus-Scanned: amavisd-new at zimbra.eb.localhost Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id eaxwJGkpDQLu; Thu, 31 Mar 2022 13:35:20 +0200 (CEST) Received: from zimbra.eb.localhost (unknown [192.168.96.242]) by mail.embedded-brains.de (Postfix) with ESMTPSA id 88A634800C9; Thu, 31 Mar 2022 13:35:20 +0200 (CEST) From: Sebastian Huber To: gcc-patches@gcc.gnu.org Subject: [RFC/gcov 01/12] gcov-tool: Allow merging of empty profile lists Date: Thu, 31 Mar 2022 13:35:04 +0200 Message-Id: <20220331113515.35764-2-sebastian.huber@embedded-brains.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220331113515.35764-1-sebastian.huber@embedded-brains.de> References: <20220331113515.35764-1-sebastian.huber@embedded-brains.de> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authenticated-Sender: smtp-embedded@poldinet.de X-Virus-Scanned: Clear (ClamAV 0.103.5/26498/Thu Mar 31 10:19:05 2022) X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Mar 2022 11:35:28 -0000 The gcov_profile_merge() already had code to deal with profile informatio= n which had no counterpart to merge with. For profile information from fil= es with no associated counterpart, the profile information is simply used as= is with the weighting transformation applied. Make sure that gcov_profile_m= erge() 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 | 19 +++++++++++-------- 2 files changed, 21 insertions(+), 25 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 =20 -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, cons= t char *out, int w1, int w2) { struct gcov_info *d1_profile; struct gcov_info *d2_profile; - int ret; + struct gcov_info *merged_profile; =20 d1_profile =3D gcov_read_profile_dir (d1, 0); - if (!d1_profile) - return 1; - - if (d2) - { - d2_profile =3D gcov_read_profile_dir (d2, 0); - if (!d2_profile) - return 1; + d2_profile =3D gcov_read_profile_dir (d2, 0); =20 - /* The actual merge: we overwrite to d1_profile. */ - ret =3D gcov_profile_merge (d1_profile, d2_profile, w1, w2); + /* The actual merge: we overwrite to d1_profile. */ + merged_profile =3D gcov_profile_merge (d1_profile, d2_profile, w1, w2)= ; =20 - 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"); =20 return 0; } diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c index ba7fb924b53..100f1b19f1a 100644 --- a/libgcc/libgcov-util.c +++ b/libgcc/libgcov-util.c @@ -674,16 +674,16 @@ find_match_gcov_info (struct gcov_info **array, int= size, } =20 /* Merge the list of gcov_info objects from SRC_PROFILE to TGT_PROFILE. - Return 0 on success: without mismatch. - Reutrn 1 on error. */ + Return the list of merged gcov_info objects. Return NULL if the list= is + empty. */ =20 -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 =3D 0, src_cnt =3D 0; unsigned unmatch_info_cnt =3D 0; @@ -703,7 +703,10 @@ gcov_profile_merge (struct gcov_info *tgt_profile, s= truct gcov_info *src_profile for (gi_ptr =3D tgt_profile, i =3D 0; gi_ptr; gi_ptr =3D gi_ptr->next,= i++) tgt_infos[i] =3D gi_ptr; =20 - tgt_tail =3D tgt_infos[tgt_cnt - 1]; + if (tgt_cnt) + tgt_tail =3D &tgt_infos[tgt_cnt - 1]->next; + else + tgt_tail =3D &tgt_profile; =20 /* 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 =3D in_src_not_tgt[i]; gcov_merge (gi_ptr, gi_ptr, w2 - 1); gi_ptr->next =3D NULL; - tgt_tail->next =3D gi_ptr; - tgt_tail =3D gi_ptr; + *tgt_tail =3D gi_ptr; + tgt_tail =3D &gi_ptr->next; } =20 free (in_src_not_tgt); free (tgt_infos); =20 - return 0; + return tgt_profile; } =20 typedef gcov_type (*counter_op_fn) (gcov_type, void*, void*); --=20 2.34.1