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 9A5CA3858D28 for ; Mon, 25 Apr 2022 07:09:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9A5CA3858D28 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 sslproxy05.your-server.de ([78.46.172.2]) by dedi548.your-server.de with esmtpsa (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nisqj-0004mG-Ly; Mon, 25 Apr 2022 09:09:33 +0200 Received: from [82.100.198.138] (helo=mail.embedded-brains.de) by sslproxy05.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nisqj-000X16-JT; Mon, 25 Apr 2022 09:09:33 +0200 Received: from localhost (localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id 41553480147; Mon, 25 Apr 2022 09:09:33 +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 V-hGhAcb9kaI; Mon, 25 Apr 2022 09:09:32 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id BD3E74801B3; Mon, 25 Apr 2022 09:09:32 +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 QCsLpAxfMYHF; Mon, 25 Apr 2022 09:09:32 +0200 (CEST) Received: from zimbra.eb.localhost (unknown [192.168.96.242]) by mail.embedded-brains.de (Postfix) with ESMTPSA id 93B0548017F; Mon, 25 Apr 2022 09:09:32 +0200 (CEST) From: Sebastian Huber To: gcc-patches@gcc.gnu.org Subject: [gcov v2 01/14] gcov-tool: Allow merging of empty profile lists Date: Mon, 25 Apr 2022 09:09:16 +0200 Message-Id: <20220425070929.7466-2-sebastian.huber@embedded-brains.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220425070929.7466-1-sebastian.huber@embedded-brains.de> References: <20220425070929.7466-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/26522/Sun Apr 24 10:22:35 2022) X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP 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: Mon, 25 Apr 2022 07:09:38 -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