From patchwork Tue Jul 13 03:09:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Oliva X-Patchwork-Id: 1504326 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4GP5Gz2g1Kz9sWd for ; Tue, 13 Jul 2021 13:10:18 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8F834393D039 for ; Tue, 13 Jul 2021 03:10:15 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from rock.gnat.com (rock.gnat.com [205.232.38.15]) by sourceware.org (Postfix) with ESMTPS id 79E043877035 for ; Tue, 13 Jul 2021 03:10:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 79E043877035 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 514F0116335; Mon, 12 Jul 2021 23:10:04 -0400 (EDT) X-Virus-Scanned: Debian amavisd-new at gnat.com Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id NS5aqBuHE7eE; Mon, 12 Jul 2021 23:10:04 -0400 (EDT) Received: from free.home (tron.gnat.com [IPv6:2620:20:4000:0:46a8:42ff:fe0e:e294]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by rock.gnat.com (Postfix) with ESMTPS id 11DE3116327; Mon, 12 Jul 2021 23:10:03 -0400 (EDT) Received: from livre (livre.home [172.31.160.2]) by free.home (8.15.2/8.15.2) with ESMTPS id 16D39vpq104106 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 13 Jul 2021 00:09:57 -0300 From: Alexandre Oliva To: gcc-patches@gcc.gnu.org Subject: adjust landing pads when changing main label Organization: Free thinker, does not speak for AdaCore Date: Tue, 13 Jul 2021 00:09:57 -0300 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 X-Spam-Status: No, score=-12.3 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: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" If an artificial label created for a landing pad ends up being dropped in favor of a user-supplied label, the user-supplied label inherits the landing pad index, but the post_landing_pad field is not adjusted to point to the new label. This patch fixes the problem, and adds verification that we don't remove a label that's still used as a landing pad. The circumstance in which this problem can be hit was unusual: removal of a block with an unreachable label moves the label to some other unrelated block, in case its address is taken. In the case at hand (pr42739.C, complicated by wrappers and cleanups), the chosen block happened to be an EH landing pad. (A followup patch will change that.) Regstrapped on x86_64-linux-gnu. Ok to install? for gcc/ChangeLog * tree-cfg.c (cleanup_dead_labels_eh): Update post_landing_pad label upon change of landing pad block's primary label. (cleanup_dead_labels): Check that a removed label is not that of a landing pad. --- gcc/tree-cfg.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index c73e1cbdda6b9..1f0f4a2c6eb2c 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1481,6 +1481,7 @@ cleanup_dead_labels_eh (label_record *label_for_bb) if (lab != lp->post_landing_pad) { EH_LANDING_PAD_NR (lp->post_landing_pad) = 0; + lp->post_landing_pad = lab; EH_LANDING_PAD_NR (lab) = lp->index; } } @@ -1707,7 +1708,10 @@ cleanup_dead_labels (void) || FORCED_LABEL (label)) gsi_next (&i); else - gsi_remove (&i, true); + { + gcc_checking_assert (EH_LANDING_PAD_NR (label) == 0); + gsi_remove (&i, true); + } } }