From patchwork Tue May 7 07:22:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dimitar Dimitrov X-Patchwork-Id: 1932265 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=dinux.eu header.i=@dinux.eu header.a=rsa-sha256 header.s=default header.b=Pu+KAlM5; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VYVF13TdJz1xnS for ; Tue, 7 May 2024 17:25:57 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A877E3860766 for ; Tue, 7 May 2024 07:25:55 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from server28.superhosting.bg (server28.superhosting.bg [217.174.156.11]) by sourceware.org (Postfix) with ESMTPS id 9BE21384641E for ; Tue, 7 May 2024 07:23:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9BE21384641E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=dinux.eu Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=dinux.eu ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9BE21384641E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=217.174.156.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715066604; cv=none; b=J/uiMImJLX7DVc4E7dN03SQBXrkQp6D08PfmgsU82PhDFyhYPh1F+rgfQXi2E0J2/3+EhBcU2y0aSQjy5SsJ5oKpJPnFXzSKm9ZGwkUKvX/dAm4bUzYpH3bstoLH7rDPzO4bEPycR6XIDzwGZEWziNO5Zber/n2TjTKORw4ts90= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715066604; c=relaxed/simple; bh=ic2Lu274GULMSJ2tfMO2TIfpkFNfDEbSpyZXAOBsE7s=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=K5p11YrzEvdPM2NRVLyEMvrDMS53YhprKZjkfshYvSOwNKhLZjbKnmelU6vAX06R7aiGv7RvpvMPPLOnYSFORayVTKYOLmsM8JwaFzZm0rOqbHgHzMDUUesF02AEJCdXlhHbD+nayw8HG7uCFaIjyysGfLlqnT107KwpInSIdxI= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dinux.eu; s=default; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=2ePYtKt8wiyLXHawumkNELRP/6nZvf8NW/OKv5/fKeI=; b=Pu+KAlM5DVTOSJWVgPy1xcnSIw 6b7wkKuGAbzDoFp1cwJcbX3Oxlxnr2HbAyEyJNTGIW76204/63Udf7y0lY4Ce097X7B9Lt4Dsrm24 08aD8tRc9KRyANAdEwBYA37Jomde2yPxU2BZO1Mwt1MftgDRv0KhWUHhda3aLMcTMwotrwDEXPFow 0tFD7p56kVdMYDV68UsbqKpI/8WdpAdderOUm00ucf6Z2xIivz7tBDNZgEBPKIbuYULQAOc5bW4Ar wOwa8YZBqR511D89qPEvc1CBU1us8uvLaPLN/PlVVGcVbjAfwRgRRLNmkrkWDL/FoGM4cGg4T+CoA n7IHzPnQ==; Received: from [95.42.20.142] (port=48504 helo=kendros.lan) by server28.superhosting.bg with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96.2) (envelope-from ) id 1s4FAT-00067X-0o; Tue, 07 May 2024 10:23:20 +0300 From: Dimitar Dimitrov To: gcc-patches@gcc.gnu.org Cc: Dimitar Dimitrov Subject: [COMMITTED 9/9] pru: New validation pass for minrt Date: Tue, 7 May 2024 10:22:41 +0300 Message-ID: X-Mailer: git-send-email 2.45.0 In-Reply-To: References: MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server28.superhosting.bg X-AntiAbuse: Original Domain - gcc.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - dinux.eu X-Get-Message-Sender-Via: server28.superhosting.bg: authenticated_id: dimitar@dinux.eu X-Authenticated-Sender: server28.superhosting.bg: dimitar@dinux.eu X-Source: X-Source-Args: X-Source-Dir: X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 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 Add a new pru-specific pass to validate that the assumptions for the minimal C runtime are not violated by the user program. gcc/ChangeLog: * config/pru/pru-passes.cc (class pass_pru_minrt_check): New pass. (pass_pru_minrt_check::execute): New method. (make_pru_minrt_check): New function. * config/pru/pru-passes.def (INSERT_PASS_AFTER): Register the minrt check pass. * config/pru/pru-protos.h (make_pru_minrt_check): Add declaration. gcc/testsuite/ChangeLog: * g++.target/pru/minrt-1.cc: New test. * g++.target/pru/minrt-2.cc: New test. * g++.target/pru/minrt-3.cc: New test. * g++.target/pru/pru.exp: New test. * gcc.target/pru/minrt-1.c: New test. * gcc.target/pru/minrt-2.c: New test. * gcc.target/pru/minrt-3.c: New test. Signed-off-by: Dimitar Dimitrov --- gcc/config/pru/pru-passes.cc | 70 +++++++++++++++++++++++++ gcc/config/pru/pru-passes.def | 5 ++ gcc/config/pru/pru-protos.h | 1 + gcc/testsuite/g++.target/pru/minrt-1.cc | 10 ++++ gcc/testsuite/g++.target/pru/minrt-2.cc | 10 ++++ gcc/testsuite/g++.target/pru/minrt-3.cc | 9 ++++ gcc/testsuite/g++.target/pru/pru.exp | 34 ++++++++++++ gcc/testsuite/gcc.target/pru/minrt-1.c | 10 ++++ gcc/testsuite/gcc.target/pru/minrt-2.c | 10 ++++ gcc/testsuite/gcc.target/pru/minrt-3.c | 9 ++++ 10 files changed, 168 insertions(+) create mode 100644 gcc/testsuite/g++.target/pru/minrt-1.cc create mode 100644 gcc/testsuite/g++.target/pru/minrt-2.cc create mode 100644 gcc/testsuite/g++.target/pru/minrt-3.cc create mode 100644 gcc/testsuite/g++.target/pru/pru.exp create mode 100644 gcc/testsuite/gcc.target/pru/minrt-1.c create mode 100644 gcc/testsuite/gcc.target/pru/minrt-2.c create mode 100644 gcc/testsuite/gcc.target/pru/minrt-3.c diff --git a/gcc/config/pru/pru-passes.cc b/gcc/config/pru/pru-passes.cc index d2c6ae8737d..5e7e22df65d 100644 --- a/gcc/config/pru/pru-passes.cc +++ b/gcc/config/pru/pru-passes.cc @@ -214,3 +214,73 @@ make_pru_tiabi_check (gcc::context *ctxt) { return new pass_pru_tiabi_check (ctxt); } + +namespace { + +/* Scan the tree to ensure that the compiled code by GCC + conforms to the non-standard minimal runtime. */ +const pass_data pass_data_pru_minrt_check = +{ + GIMPLE_PASS, /* type */ + "*pru_minrt_check", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_NONE, /* tv_id */ + PROP_gimple_any, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +/* Implementation class for the minrt compliance-check pass. */ +class pass_pru_minrt_check : public gimple_opt_pass +{ +public: + pass_pru_minrt_check (gcc::context *ctxt) + : gimple_opt_pass (pass_data_pru_minrt_check, ctxt) + {} + + /* opt_pass methods: */ + virtual unsigned int execute (function *); + + virtual bool gate (function *) + { + return TARGET_MINRT; + } + +}; // class pass_pru_minrt_check + +/* Pass implementation. */ +unsigned +pass_pru_minrt_check::execute (function *fun) +{ + const_tree fntype = TREE_TYPE (fun->decl); + + if (id_equal (DECL_NAME (fun->decl), "main")) + { + /* Argument list always ends with VOID_TYPE, so subtract one + to get the number of function arguments. */ + const unsigned num_args = list_length (TYPE_ARG_TYPES (fntype)) - 1; + + if (num_args != 0) + error_at (DECL_SOURCE_LOCATION (fun->decl), "function % " + "must have no arguments when using the " + "%<-minrt%> option"); + + /* The required CFG analysis to detect when a functions would never + return is available only with -O1 and higher. */ + if (optimize >= 1 && !TREE_THIS_VOLATILE (fun->decl)) + error_at (DECL_SOURCE_LOCATION (fun->decl), "function % " + "must never return when using the " + "%<-minrt%> option"); + } + return 0; +} + +} // anon namespace + +gimple_opt_pass * +make_pru_minrt_check (gcc::context *ctxt) +{ + return new pass_pru_minrt_check (ctxt); +} diff --git a/gcc/config/pru/pru-passes.def b/gcc/config/pru/pru-passes.def index cdef089bd82..3eee313ac67 100644 --- a/gcc/config/pru/pru-passes.def +++ b/gcc/config/pru/pru-passes.def @@ -22,3 +22,8 @@ If GCC cannot output a conforming code, then an error is raised. */ INSERT_PASS_AFTER (pass_warn_unused_result, 1, pru_tiabi_check); + +/* If -minrt option is used, then this pass would validate + that the compiled code by GCC is compatible with the minimal + C runtime. */ +INSERT_PASS_AFTER (pass_warn_function_noreturn, 1, pru_minrt_check); diff --git a/gcc/config/pru/pru-protos.h b/gcc/config/pru/pru-protos.h index 74426bb86ea..3baf605d915 100644 --- a/gcc/config/pru/pru-protos.h +++ b/gcc/config/pru/pru-protos.h @@ -73,6 +73,7 @@ extern int pru_get_ctable_base_offset (unsigned HOST_WIDE_INT caddr); extern int pru_symref2ioregno (rtx op); extern rtl_opt_pass *make_pru_tiabi_check (gcc::context *); +extern rtl_opt_pass *make_pru_minrt_check (gcc::context *); #endif /* RTX_CODE */ diff --git a/gcc/testsuite/g++.target/pru/minrt-1.cc b/gcc/testsuite/g++.target/pru/minrt-1.cc new file mode 100644 index 00000000000..c30ad2cbe1e --- /dev/null +++ b/gcc/testsuite/g++.target/pru/minrt-1.cc @@ -0,0 +1,10 @@ +/* Test minrt checks */ + +/* { dg-options "-O1 -minrt" } */ + + +int main(void) +{ + for (;;) + ; +} diff --git a/gcc/testsuite/g++.target/pru/minrt-2.cc b/gcc/testsuite/g++.target/pru/minrt-2.cc new file mode 100644 index 00000000000..258385dbdba --- /dev/null +++ b/gcc/testsuite/g++.target/pru/minrt-2.cc @@ -0,0 +1,10 @@ +/* Test minrt checks */ + +/* { dg-options "-O1 -minrt" } */ + +int main(int argc, char *argv[]) +/* { dg-error "function 'main' must have no arguments when using the '-minrt' option" "" { target pru-*-* } .-1 } */ +{ + for (;;) + ; +} diff --git a/gcc/testsuite/g++.target/pru/minrt-3.cc b/gcc/testsuite/g++.target/pru/minrt-3.cc new file mode 100644 index 00000000000..07b4e5e430a --- /dev/null +++ b/gcc/testsuite/g++.target/pru/minrt-3.cc @@ -0,0 +1,9 @@ +/* Test minrt checks */ + +/* { dg-options "-O1 -minrt" } */ + +int main(void) +/* { dg-error "function 'main' must never return when using the '-minrt' option" "" { target pru-*-* } .-1 } */ +{ + return 0; +} diff --git a/gcc/testsuite/g++.target/pru/pru.exp b/gcc/testsuite/g++.target/pru/pru.exp new file mode 100644 index 00000000000..c9a3ab2b076 --- /dev/null +++ b/gcc/testsuite/g++.target/pru/pru.exp @@ -0,0 +1,34 @@ +# Copyright (C) 2024 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# . + +# GCC testsuite that uses the `dg.exp' driver. + +# Exit immediately if this isn't a pru target. +if ![istarget pru*-*-*] then { + return +} + +# Load support procs. +load_lib g++-dg.exp + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] "" "" + +# All done. +dg-finish diff --git a/gcc/testsuite/gcc.target/pru/minrt-1.c b/gcc/testsuite/gcc.target/pru/minrt-1.c new file mode 100644 index 00000000000..c30ad2cbe1e --- /dev/null +++ b/gcc/testsuite/gcc.target/pru/minrt-1.c @@ -0,0 +1,10 @@ +/* Test minrt checks */ + +/* { dg-options "-O1 -minrt" } */ + + +int main(void) +{ + for (;;) + ; +} diff --git a/gcc/testsuite/gcc.target/pru/minrt-2.c b/gcc/testsuite/gcc.target/pru/minrt-2.c new file mode 100644 index 00000000000..258385dbdba --- /dev/null +++ b/gcc/testsuite/gcc.target/pru/minrt-2.c @@ -0,0 +1,10 @@ +/* Test minrt checks */ + +/* { dg-options "-O1 -minrt" } */ + +int main(int argc, char *argv[]) +/* { dg-error "function 'main' must have no arguments when using the '-minrt' option" "" { target pru-*-* } .-1 } */ +{ + for (;;) + ; +} diff --git a/gcc/testsuite/gcc.target/pru/minrt-3.c b/gcc/testsuite/gcc.target/pru/minrt-3.c new file mode 100644 index 00000000000..07b4e5e430a --- /dev/null +++ b/gcc/testsuite/gcc.target/pru/minrt-3.c @@ -0,0 +1,9 @@ +/* Test minrt checks */ + +/* { dg-options "-O1 -minrt" } */ + +int main(void) +/* { dg-error "function 'main' must never return when using the '-minrt' option" "" { target pru-*-* } .-1 } */ +{ + return 0; +}