From patchwork Tue Jan 9 13:15:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Marc_Poulhi=C3=A8s?= X-Patchwork-Id: 1884455 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=adacore.com header.i=@adacore.com header.a=rsa-sha256 header.s=google header.b=G6iq3nJo; 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 4T8WkP6JZkz1yP3 for ; Wed, 10 Jan 2024 00:19:57 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D7AA6386181F for ; Tue, 9 Jan 2024 13:19:55 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by sourceware.org (Postfix) with ESMTPS id 3489D3857BB1 for ; Tue, 9 Jan 2024 13:15:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3489D3857BB1 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3489D3857BB1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::429 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704806153; cv=none; b=r2QKR5lSLcZdNiFLT+8A/1rrnJ4owMQT6m1GtTahH4WDBqVu3q4dJ+JOScHQs0UUYpzT3P2WT9HhdzMrIAzOju0QmfuZRTCA8o7man5pu1PxOn7Vcltwlk6J/nn+KAO4GPC3QyxN0Jg2FUxX/HWYOqPcWCDZ0e9FsPLdbU+dojo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704806153; c=relaxed/simple; bh=YhsLMnY4IfHv8uvt6NJKtv+kAdSXTyqRuPwIKWLi+bo=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=nE88MV/f8YoM7MWS/bNDCBHztrUd5c+2xu1k3clUq8c2jdLFJU1Tal7FSQuHetgH92bCkZAcrSBBi+QMG4OQQ44rvMv42LhocTKGA58dVKE3cKcbc2ik+fM0C6Ic/imB5isNEsK2UoNC2P+tGxEKKcGe4C0B9MaFQZs2xg1obFg= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-3375a236525so2632951f8f.0 for ; Tue, 09 Jan 2024 05:15:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; t=1704806149; x=1705410949; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=o1FNJfF43h9Cg3wwAkHa/cQt9iUPSFVVKk/+tWMzz6c=; b=G6iq3nJoYCUrRV5/4quZPbqmFAaLSdJNfDshtGew1lv42O2wN3+sWQ4+BhzoIHiVL0 Ol0vOBhOecdUZp6R+xDqWUsmh3LzOnuGaKWgFY4E8nAzPQAvpSeoOdxmkI2XIeW2M0Bc FccEiJ2iqJNJQ2yPtQPtP0/FuiRgvpaqgzwO4UuowDB1cYmm7xgL8SLbZvDsqOPUy5lQ xDeHNUM1DV9ug6zqXbsDYldkONadPJm2JBegm5rVT9Dn3Az5RGMSTeW7UvbEJ0pvTFPa ZajvZhp5oD0La72Cs452Pj8fRAzZ5vH1nvW7f50Q2VQzZFUNqeUPnn/cVSqeUfew3ZVu X/pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704806149; x=1705410949; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=o1FNJfF43h9Cg3wwAkHa/cQt9iUPSFVVKk/+tWMzz6c=; b=WooR01KVPmcgYQ/niuVY/UwprSOCF1EzTt+dq7uOHPrFBQDO9xjs7y1G4bihkOuRsS ywAXPZrCjx1G5IqUsWUw9ouEuVQ70Yib6ON9Ch5zPC9JOfLKWDV/B2BNgbXdtcnnDZBY JX6HfUf63ZuC7bNjjzIpf/a/tFmoQD74z9vUQC/3o0AJqlcjUs66erZRfIndPNtmKAPv Q/hy4N60LNqLSvvtue/iq9h76bsyqKWgKcwU8Qr8DQyPEPV2w8KVUmHxsxlYZ1liDuOm AeLqodU6d2vAsA86yC+n3PzFr6xMvx51iV+hTgBad4N+NSnN5yJrgtVV+79TjHyL2Sem i38A== X-Gm-Message-State: AOJu0Yy3RZckMJEd+oEjbG1HMHCoRM2XKTCTNng3gwGl2f/Szfck4uFP 2wLgQ4zgpLiaY2H7v7lpPDbtERHSnbAjliC9YUXDaQzhLA== X-Google-Smtp-Source: AGHT+IF+sdPFP4ONTX8XTqKiUJXhBAn90X7xjaSeMIsAM1V/ZA6ZjJaYX1X4OlJGsO7u22V8E37kCQ== X-Received: by 2002:adf:ef8a:0:b0:336:6377:6e3d with SMTP id d10-20020adfef8a000000b0033663776e3dmr699899wro.66.1704806149049; Tue, 09 Jan 2024 05:15:49 -0800 (PST) Received: from poulhies-Precision-5550.telnowedge.local (lmontsouris-659-1-24-67.w81-250.abo.wanadoo.fr. [81.250.175.67]) by smtp.gmail.com with ESMTPSA id i1-20020a5d55c1000000b00336e43e8e57sm2412510wrw.58.2024.01.09.05.15.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jan 2024 05:15:48 -0800 (PST) From: =?utf-8?q?Marc_Poulhi=C3=A8s?= To: gcc-patches@gcc.gnu.org Cc: Eric Botcazou Subject: [COMMITTED] ada: Add __atomic_store_n binding to System.Atomic_Primitives Date: Tue, 9 Jan 2024 14:15:47 +0100 Message-ID: <20240109131547.744502-1-poulhies@adacore.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-13.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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 From: Eric Botcazou This is modeled on the existing binding for __atomic_load_n. gcc/ada/ * libgnat/s-atopri.ads (Atomic_Store): New generic procedure. (Atomic_Store_8): New instantiated procedure. (Atomic_Store_16): Likewise. (Atomic_Store_32): Likewise. (Atomic_Store_64): Likewise. * libgnat/s-atopri__32.ads (Atomic_Store): New generic procedure. (Atomic_Store_8): New instantiated procedure. (Atomic_Store_16): Likewise. (Atomic_Store_32): Likewise. * gcc-interface/decl.cc (gnat_to_gnu_subprog_type): Implement the support for __atomic_store_n and __sync_bool_compare_and_swap_n. * gcc-interface/gigi.h (list_second): New inline function. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/gcc-interface/decl.cc | 24 ++++++++++++++++++++++-- gcc/ada/gcc-interface/gigi.h | 8 ++++++++ gcc/ada/libgnat/s-atopri.ads | 13 +++++++++++++ gcc/ada/libgnat/s-atopri__32.ads | 12 ++++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc index c3d2de22b65..89a374fab1a 100644 --- a/gcc/ada/gcc-interface/decl.cc +++ b/gcc/ada/gcc-interface/decl.cc @@ -6504,6 +6504,28 @@ gnat_to_gnu_subprog_type (Entity_Id gnat_subprog, bool definition, } break; + case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N: + case BUILT_IN_ATOMIC_STORE_N: + /* This is a generic builtin overloaded on its second + parameter type, so do type resolution based on it. */ + if (list_length (gnu_param_type_list) >= 3 + && type_for_atomic_builtin_p + (list_second (gnu_param_type_list))) + gnu_builtin_decl + = resolve_atomic_builtin + (fncode, list_second (gnu_param_type_list)); + else + { + post_error + ("??cannot import type-generic 'G'C'C builtin!", + gnat_subprog); + post_error + ("\\?use a supported second parameter type", + gnat_subprog); + gnu_builtin_decl = NULL_TREE; + } + break; + case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N: /* This is a generic builtin overloaded on its third parameter type, so do type resolution based on it. */ @@ -6525,9 +6547,7 @@ gnat_to_gnu_subprog_type (Entity_Id gnat_subprog, bool definition, } break; - case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N: case BUILT_IN_SYNC_LOCK_RELEASE_N: - case BUILT_IN_ATOMIC_STORE_N: post_error ("??unsupported type-generic 'G'C'C builtin!", gnat_subprog); diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h index 63ccf311c23..2a7320f0a4b 100644 --- a/gcc/ada/gcc-interface/gigi.h +++ b/gcc/ada/gcc-interface/gigi.h @@ -1238,6 +1238,14 @@ operand_type (tree expr) return TREE_TYPE (TREE_OPERAND (expr, 0)); } +/* Return the second value of a list. */ + +static inline tree +list_second (tree list) +{ + return TREE_VALUE (TREE_CHAIN (list)); +} + /* Return the third value of a list. */ static inline tree diff --git a/gcc/ada/libgnat/s-atopri.ads b/gcc/ada/libgnat/s-atopri.ads index 8ee2e371f6f..f742812bb22 100644 --- a/gcc/ada/libgnat/s-atopri.ads +++ b/gcc/ada/libgnat/s-atopri.ads @@ -78,6 +78,19 @@ package System.Atomic_Primitives is function Atomic_Load_32 is new Atomic_Load (uint32); function Atomic_Load_64 is new Atomic_Load (uint64); + generic + type Atomic_Type is mod <>; + procedure Atomic_Store + (Ptr : Address; + Value : Atomic_Type; + Model : Mem_Model := Seq_Cst); + pragma Import (Intrinsic, Atomic_Store, "__atomic_store_n"); + + procedure Atomic_Store_8 is new Atomic_Store (uint8); + procedure Atomic_Store_16 is new Atomic_Store (uint16); + procedure Atomic_Store_32 is new Atomic_Store (uint32); + procedure Atomic_Store_64 is new Atomic_Store (uint64); + generic type Atomic_Type is mod <>; function Atomic_Compare_Exchange diff --git a/gcc/ada/libgnat/s-atopri__32.ads b/gcc/ada/libgnat/s-atopri__32.ads index 1281e9bea31..419ca179c43 100644 --- a/gcc/ada/libgnat/s-atopri__32.ads +++ b/gcc/ada/libgnat/s-atopri__32.ads @@ -76,6 +76,18 @@ package System.Atomic_Primitives is function Atomic_Load_16 is new Atomic_Load (uint16); function Atomic_Load_32 is new Atomic_Load (uint32); + generic + type Atomic_Type is mod <>; + procedure Atomic_Store + (Ptr : Address; + Value : Atomic_Type; + Model : Mem_Model := Seq_Cst); + pragma Import (Intrinsic, Atomic_Store, "__atomic_store_n"); + + procedure Atomic_Store_8 is new Atomic_Store (uint8); + procedure Atomic_Store_16 is new Atomic_Store (uint16); + procedure Atomic_Store_32 is new Atomic_Store (uint32); + generic type Atomic_Type is mod <>; function Atomic_Compare_Exchange