From patchwork Tue Sep 14 09:00:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Botcazou X-Patchwork-Id: 44983 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4A4FC3857412 for ; Tue, 14 Sep 2021 09:01:20 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by sourceware.org (Postfix) with ESMTPS id E9B843858402 for ; Tue, 14 Sep 2021 09:01:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E9B843858402 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: by mail-wr1-x42b.google.com with SMTP id u16so18966580wrn.5 for ; Tue, 14 Sep 2021 02:01:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=DfMbw8iub2p2L1/YpfvJj43pYzihE8GAWdaRm4tP/io=; b=atLWqrTbANZdKnuOvoNWmUUj/abtXq8rQSSNiBp3hYnrF0bPiBeE7axfssjWgXmu8j vE9pr71jVSALm1hsSllJRgxIszt1hnC+dX79NQ0CFwTM5CTggn+6OLs9Nw/vJrzhbIeO KW4dNCqdle/IFdCh/Nea1nilZ45//dKTmAvp2O77ib1wqHMU8hTRTwHfACpyTr8hIpCu vAVWYF+1pjHbnE3VwhspUAcS2Ee1yLqrVCztxZI91czHeQo40qOPNIUZtlz/BwYG/FmX DxjghDXDkUqJ7Hpnbk3xjNj2KMcpCBDTmO+KvxkqXqHSI6ogMi5kGM5ukFPx6JMSCIdq 7WRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=DfMbw8iub2p2L1/YpfvJj43pYzihE8GAWdaRm4tP/io=; b=EVeScb+WE7ks9KY8X1a3OlJUSOBHhiPS/yVtfCRyYfwI82fTc/+z2sHzLcg9yV+qH0 G7dd29MpdMuw49v+WiWiX58amEHtYkZEcyhFc9GWBJ+R9s2vJe2pmUEg75nyHhACL4lf x0SPcxXVofRBTASH0ZsAFMMD6R3QCc//Tck7vd/+gAFLfmDs1Noud5dqh3k9BLj/J11W GHJrEajrRejs/UBndHj4eDJ0X8QbADwo80ExHOKnMvF2bjACooVoy87Q8xZnSfFkYKnK /CmJerovS50fTgEU8gApKDdSPKnGUYoO/qxpPRMcCqOhFT3cUQgix9Kq5Zw0wBWGErlw sFPA== X-Gm-Message-State: AOAM532qLH7gHmKn4suLuFgqQPMSeSlFcSorZANWv3EwCeSZ+E26alzl pnxnEp6kysnWIkCFgFhe7jID3KAUzZUzgUR1 X-Google-Smtp-Source: ABdhPJwr8DPrCcXrpk3fUqvKMfuJuiioTzH7i3SbWP+NY8W5sCO9U/x+ogvPfqPwgQSSmVVzR/pQRw== X-Received: by 2002:adf:f98b:: with SMTP id f11mr15027700wrr.333.1631610061881; Tue, 14 Sep 2021 02:01:01 -0700 (PDT) Received: from fomalhaut.localnet ([2a01:e0a:41b:84f0:cf71:f5e0:b050:bede]) by smtp.gmail.com with ESMTPSA id c23sm499548wmb.37.2021.09.14.02.01.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Sep 2021 02:01:00 -0700 (PDT) From: Eric Botcazou X-Google-Original-From: Eric Botcazou To: gcc-patches@gcc.gnu.org Subject: [Ada] Strengthen compatibility warning for GCC builtins Date: Tue, 14 Sep 2021 11:00:49 +0200 Message-ID: <1870144.PYKUYFuaPT@fomalhaut> MIME-Version: 1.0 X-Spam-Status: No, score=-12.0 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 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+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" This is necessary for vector builtins, which are picky about the signedness of the element type. Tested on x86-64/Linux, applied on the mainline. 2021-09-14 Eric Botcazou * libgnat/s-atopri.ads (bool): Delete. (Atomic_Test_And_Set): Replace bool with Boolean. (Atomic_Always_Lock_Free): Likewise. * libgnat/s-aoinar.adb (Is_Lock_Free): Adjust. * libgnat/s-aomoar.adb (Is_Lock_Free): Likewise. * libgnat/s-aotase.adb (Atomic_Test_And_Set): Likewise. * libgnat/s-atopex.adb (Atomic_Compare_And_Exchange): Likewise. * gcc-interface/decl.c: Include gimple-expr.h. (intrin_types_incompatible_p): Delete. (intrin_arglists_compatible_p): Call types_compatible_p. (intrin_return_compatible_p): Likewise. diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index d37ed3d1b52..38a8bda02ce 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -28,6 +28,7 @@ #include "coretypes.h" #include "target.h" #include "tree.h" +#include "gimple-expr.h" #include "stringpool.h" #include "diagnostic-core.h" #include "alias.h" @@ -9492,46 +9493,6 @@ check_ok_for_atomic_type (tree type, Entity_Id gnat_entity, bool component_p) gnat_error_point, gnat_entity); } - -/* Helper for the intrin compatibility checks family. Evaluate whether - two types are definitely incompatible. */ - -static bool -intrin_types_incompatible_p (tree t1, tree t2) -{ - enum tree_code code; - - if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2)) - return false; - - if (TYPE_MODE (t1) != TYPE_MODE (t2)) - return true; - - if (TREE_CODE (t1) != TREE_CODE (t2)) - return true; - - code = TREE_CODE (t1); - - switch (code) - { - case INTEGER_TYPE: - case REAL_TYPE: - return TYPE_PRECISION (t1) != TYPE_PRECISION (t2); - - case POINTER_TYPE: - case REFERENCE_TYPE: - /* Assume designated types are ok. We'd need to account for char * and - void * variants to do better, which could rapidly get messy and isn't - clearly worth the effort. */ - return false; - - default: - break; - } - - return false; -} - /* Helper for intrin_profiles_compatible_p, to perform compatibility checks on the Ada/builtin argument lists for the INB binding. */ @@ -9577,8 +9538,8 @@ intrin_arglists_compatible_p (intrin_binding_t * inb) } /* Otherwise, check that types match for the current argument. */ - argpos ++; - if (intrin_types_incompatible_p (ada_type, btin_type)) + argpos++; + if (!types_compatible_p (ada_type, btin_type)) { post_error_ne_num ("??intrinsic binding type mismatch on argument ^!", inb->gnat_entity, inb->gnat_entity, argpos); @@ -9609,7 +9570,7 @@ intrin_return_compatible_p (intrin_binding_t * inb) /* Check return types compatibility otherwise. Note that this handles void/void as well. */ - if (intrin_types_incompatible_p (btin_return_type, ada_return_type)) + if (!types_compatible_p (btin_return_type, ada_return_type)) { post_error ("??intrinsic binding type mismatch on return value!", inb->gnat_entity); diff --git a/gcc/ada/libgnat/s-aoinar.adb b/gcc/ada/libgnat/s-aoinar.adb index df12b16b9e5..2f430ed4efe 100644 --- a/gcc/ada/libgnat/s-aoinar.adb +++ b/gcc/ada/libgnat/s-aoinar.adb @@ -203,7 +203,7 @@ package body System.Atomic_Operations.Integer_Arithmetic is pragma Unreferenced (Item); use type Interfaces.C.size_t; begin - return Boolean (Atomic_Always_Lock_Free (Atomic_Type'Object_Size / 8)); + return Atomic_Always_Lock_Free (Atomic_Type'Object_Size / 8); end Is_Lock_Free; end System.Atomic_Operations.Integer_Arithmetic; diff --git a/gcc/ada/libgnat/s-aomoar.adb b/gcc/ada/libgnat/s-aomoar.adb index c955623897d..a6f4b0e61e8 100644 --- a/gcc/ada/libgnat/s-aomoar.adb +++ b/gcc/ada/libgnat/s-aomoar.adb @@ -209,7 +209,7 @@ package body System.Atomic_Operations.Modular_Arithmetic is pragma Unreferenced (Item); use type Interfaces.C.size_t; begin - return Boolean (Atomic_Always_Lock_Free (Atomic_Type'Object_Size / 8)); + return Atomic_Always_Lock_Free (Atomic_Type'Object_Size / 8); end Is_Lock_Free; end System.Atomic_Operations.Modular_Arithmetic; diff --git a/gcc/ada/libgnat/s-aotase.adb b/gcc/ada/libgnat/s-aotase.adb index 53178892621..94b28dfa410 100644 --- a/gcc/ada/libgnat/s-aotase.adb +++ b/gcc/ada/libgnat/s-aotase.adb @@ -40,7 +40,7 @@ package body System.Atomic_Operations.Test_And_Set is function Atomic_Test_And_Set (Item : aliased in out Test_And_Set_Flag) return Boolean is begin - return Boolean (Atomic_Test_And_Set (Item'Address)); + return Atomic_Test_And_Set (Item'Address); end Atomic_Test_And_Set; ------------------ diff --git a/gcc/ada/libgnat/s-atopex.adb b/gcc/ada/libgnat/s-atopex.adb index 501254e4f5f..b0aa9e593d1 100644 --- a/gcc/ada/libgnat/s-atopex.adb +++ b/gcc/ada/libgnat/s-atopex.adb @@ -89,36 +89,36 @@ package body System.Atomic_Operations.Exchange is (Ptr : System.Address; Expected : System.Address; Desired : Atomic_Type; - Weak : bool := False; + Weak : Boolean := False; Success_Model : Mem_Model := Seq_Cst; - Failure_Model : Mem_Model := Seq_Cst) return bool; + Failure_Model : Mem_Model := Seq_Cst) return Boolean; pragma Import (Intrinsic, Atomic_Compare_Exchange_1, "__atomic_compare_exchange_1"); function Atomic_Compare_Exchange_2 (Ptr : System.Address; Expected : System.Address; Desired : Atomic_Type; - Weak : bool := False; + Weak : Boolean := False; Success_Model : Mem_Model := Seq_Cst; - Failure_Model : Mem_Model := Seq_Cst) return bool; + Failure_Model : Mem_Model := Seq_Cst) return Boolean; pragma Import (Intrinsic, Atomic_Compare_Exchange_2, "__atomic_compare_exchange_2"); function Atomic_Compare_Exchange_4 (Ptr : System.Address; Expected : System.Address; Desired : Atomic_Type; - Weak : bool := False; + Weak : Boolean := False; Success_Model : Mem_Model := Seq_Cst; - Failure_Model : Mem_Model := Seq_Cst) return bool; + Failure_Model : Mem_Model := Seq_Cst) return Boolean; pragma Import (Intrinsic, Atomic_Compare_Exchange_4, "__atomic_compare_exchange_4"); function Atomic_Compare_Exchange_8 (Ptr : System.Address; Expected : System.Address; Desired : Atomic_Type; - Weak : bool := False; + Weak : Boolean := False; Success_Model : Mem_Model := Seq_Cst; - Failure_Model : Mem_Model := Seq_Cst) return bool; + Failure_Model : Mem_Model := Seq_Cst) return Boolean; pragma Import (Intrinsic, Atomic_Compare_Exchange_8, "__atomic_compare_exchange_8"); pragma Warnings (On); @@ -126,21 +126,17 @@ package body System.Atomic_Operations.Exchange is begin case Atomic_Type'Object_Size is when 8 => - return Boolean - (Atomic_Compare_Exchange_1 - (Item'Address, Prior'Address, Desired)); + return + Atomic_Compare_Exchange_1 (Item'Address, Prior'Address, Desired); when 16 => - return Boolean - (Atomic_Compare_Exchange_2 - (Item'Address, Prior'Address, Desired)); + return + Atomic_Compare_Exchange_2 (Item'Address, Prior'Address, Desired); when 32 => - return Boolean - (Atomic_Compare_Exchange_4 - (Item'Address, Prior'Address, Desired)); + return + Atomic_Compare_Exchange_4 (Item'Address, Prior'Address, Desired); when 64 => - return Boolean - (Atomic_Compare_Exchange_8 - (Item'Address, Prior'Address, Desired)); + return + Atomic_Compare_Exchange_8 (Item'Address, Prior'Address, Desired); when others => raise Program_Error; end case; @@ -154,7 +150,7 @@ package body System.Atomic_Operations.Exchange is pragma Unreferenced (Item); use type Interfaces.C.size_t; begin - return Boolean (Atomic_Always_Lock_Free (Atomic_Type'Object_Size / 8)); + return Atomic_Always_Lock_Free (Atomic_Type'Object_Size / 8); end Is_Lock_Free; end System.Atomic_Operations.Exchange; diff --git a/gcc/ada/libgnat/s-atopri.ads b/gcc/ada/libgnat/s-atopri.ads index 2a5ffe59803..891b2edf061 100644 --- a/gcc/ada/libgnat/s-atopri.ads +++ b/gcc/ada/libgnat/s-atopri.ads @@ -62,9 +62,6 @@ package System.Atomic_Primitives is subtype Mem_Model is Integer range Relaxed .. Last; - type bool is new Boolean; - pragma Convention (C, bool); - ------------------------------------ -- GCC built-in atomic primitives -- ------------------------------------ @@ -137,7 +134,7 @@ package System.Atomic_Primitives is function Atomic_Test_And_Set (Ptr : System.Address; - Model : Mem_Model := Seq_Cst) return bool; + Model : Mem_Model := Seq_Cst) return Boolean; pragma Import (Intrinsic, Atomic_Test_And_Set, "__atomic_test_and_set"); procedure Atomic_Clear @@ -147,7 +144,7 @@ package System.Atomic_Primitives is function Atomic_Always_Lock_Free (Size : Interfaces.C.size_t; - Ptr : System.Address := System.Null_Address) return bool; + Ptr : System.Address := System.Null_Address) return Boolean; pragma Import (Intrinsic, Atomic_Always_Lock_Free, "__atomic_always_lock_free");