From nobody Wed May 8 20:11:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 153802875764443.96922408658577; Wed, 26 Sep 2018 23:12:37 -0700 (PDT) Received: from localhost ([::1]:33908 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g5PXC-0001w2-H2 for importer@patchew.org; Thu, 27 Sep 2018 02:12:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40108) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g5PWG-0001dN-TA for qemu-devel@nongnu.org; Thu, 27 Sep 2018 02:11:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g5PW4-0004ma-8l for qemu-devel@nongnu.org; Thu, 27 Sep 2018 02:11:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42386) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1g5PW3-0004lF-5R for qemu-devel@nongnu.org; Thu, 27 Sep 2018 02:11:12 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E6EFD5F73A; Thu, 27 Sep 2018 06:11:08 +0000 (UTC) Received: from thuth.com (ovpn-116-44.ams2.redhat.com [10.36.116.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id DFA354DA88; Thu, 27 Sep 2018 06:11:06 +0000 (UTC) From: Thomas Huth To: qemu-devel@nongnu.org, Peter Maydell Date: Thu, 27 Sep 2018 08:11:02 +0200 Message-Id: <1538028662-3810-1-git-send-email-thuth@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 27 Sep 2018 06:11:09 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2] qemu/compiler: Wrap __attribute__((flatten)) in a macro X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Richard Henderson , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Aurelien Jarno Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RDMRC_1 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Older versions of Clang (before 3.5) and GCC (before 4.1) do not support the "__attribute__((flatten))" yet. We don't care about such old versions of GCC anymore, but since Clang 3.4 is still used in EPEL for RHEL7 / CentOS 7, we should not use this attribute directly but with a wrapper macro instead. Signed-off-by: Thomas Huth Reviewed-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- v2: Ignore older versions of GCC since we do not support them anymore fpu/softfloat.c | 39 +++++++++++++++------------------------ include/qemu/compiler.h | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 59ca356..8b91cd6 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -726,8 +726,7 @@ static FloatParts addsub_floats(FloatParts a, FloatPart= s b, bool subtract, * IEC/IEEE Standard for Binary Floating-Point Arithmetic. */ =20 -float16 __attribute__((flatten)) float16_add(float16 a, float16 b, - float_status *status) +float16 QEMU_FLATTEN float16_add(float16 a, float16 b, float_status *statu= s) { FloatParts pa =3D float16_unpack_canonical(a, status); FloatParts pb =3D float16_unpack_canonical(b, status); @@ -736,8 +735,7 @@ float16 __attribute__((flatten)) float16_add(float16 a= , float16 b, return float16_round_pack_canonical(pr, status); } =20 -float32 __attribute__((flatten)) float32_add(float32 a, float32 b, - float_status *status) +float32 QEMU_FLATTEN float32_add(float32 a, float32 b, float_status *statu= s) { FloatParts pa =3D float32_unpack_canonical(a, status); FloatParts pb =3D float32_unpack_canonical(b, status); @@ -746,8 +744,7 @@ float32 __attribute__((flatten)) float32_add(float32 a,= float32 b, return float32_round_pack_canonical(pr, status); } =20 -float64 __attribute__((flatten)) float64_add(float64 a, float64 b, - float_status *status) +float64 QEMU_FLATTEN float64_add(float64 a, float64 b, float_status *statu= s) { FloatParts pa =3D float64_unpack_canonical(a, status); FloatParts pb =3D float64_unpack_canonical(b, status); @@ -756,8 +753,7 @@ float64 __attribute__((flatten)) float64_add(float64 a,= float64 b, return float64_round_pack_canonical(pr, status); } =20 -float16 __attribute__((flatten)) float16_sub(float16 a, float16 b, - float_status *status) +float16 QEMU_FLATTEN float16_sub(float16 a, float16 b, float_status *statu= s) { FloatParts pa =3D float16_unpack_canonical(a, status); FloatParts pb =3D float16_unpack_canonical(b, status); @@ -766,8 +762,7 @@ float16 __attribute__((flatten)) float16_sub(float16 a,= float16 b, return float16_round_pack_canonical(pr, status); } =20 -float32 __attribute__((flatten)) float32_sub(float32 a, float32 b, - float_status *status) +float32 QEMU_FLATTEN float32_sub(float32 a, float32 b, float_status *statu= s) { FloatParts pa =3D float32_unpack_canonical(a, status); FloatParts pb =3D float32_unpack_canonical(b, status); @@ -776,8 +771,7 @@ float32 __attribute__((flatten)) float32_sub(float32 a,= float32 b, return float32_round_pack_canonical(pr, status); } =20 -float64 __attribute__((flatten)) float64_sub(float64 a, float64 b, - float_status *status) +float64 QEMU_FLATTEN float64_sub(float64 a, float64 b, float_status *statu= s) { FloatParts pa =3D float64_unpack_canonical(a, status); FloatParts pb =3D float64_unpack_canonical(b, status); @@ -835,8 +829,7 @@ static FloatParts mul_floats(FloatParts a, FloatParts b= , float_status *s) g_assert_not_reached(); } =20 -float16 __attribute__((flatten)) float16_mul(float16 a, float16 b, - float_status *status) +float16 QEMU_FLATTEN float16_mul(float16 a, float16 b, float_status *statu= s) { FloatParts pa =3D float16_unpack_canonical(a, status); FloatParts pb =3D float16_unpack_canonical(b, status); @@ -845,8 +838,7 @@ float16 __attribute__((flatten)) float16_mul(float16 a,= float16 b, return float16_round_pack_canonical(pr, status); } =20 -float32 __attribute__((flatten)) float32_mul(float32 a, float32 b, - float_status *status) +float32 QEMU_FLATTEN float32_mul(float32 a, float32 b, float_status *statu= s) { FloatParts pa =3D float32_unpack_canonical(a, status); FloatParts pb =3D float32_unpack_canonical(b, status); @@ -855,8 +847,7 @@ float32 __attribute__((flatten)) float32_mul(float32 a,= float32 b, return float32_round_pack_canonical(pr, status); } =20 -float64 __attribute__((flatten)) float64_mul(float64 a, float64 b, - float_status *status) +float64 QEMU_FLATTEN float64_mul(float64 a, float64 b, float_status *statu= s) { FloatParts pa =3D float64_unpack_canonical(a, status); FloatParts pb =3D float64_unpack_canonical(b, status); @@ -1068,7 +1059,7 @@ static FloatParts muladd_floats(FloatParts a, FloatPa= rts b, FloatParts c, return a; } =20 -float16 __attribute__((flatten)) float16_muladd(float16 a, float16 b, floa= t16 c, +float16 QEMU_FLATTEN float16_muladd(float16 a, float16 b, float16 c, int flags, float_status *s= tatus) { FloatParts pa =3D float16_unpack_canonical(a, status); @@ -1079,7 +1070,7 @@ float16 __attribute__((flatten)) float16_muladd(float= 16 a, float16 b, float16 c, return float16_round_pack_canonical(pr, status); } =20 -float32 __attribute__((flatten)) float32_muladd(float32 a, float32 b, floa= t32 c, +float32 QEMU_FLATTEN float32_muladd(float32 a, float32 b, float32 c, int flags, float_status *s= tatus) { FloatParts pa =3D float32_unpack_canonical(a, status); @@ -1090,7 +1081,7 @@ float32 __attribute__((flatten)) float32_muladd(float= 32 a, float32 b, float32 c, return float32_round_pack_canonical(pr, status); } =20 -float64 __attribute__((flatten)) float64_muladd(float64 a, float64 b, floa= t64 c, +float64 QEMU_FLATTEN float64_muladd(float64 a, float64 b, float64 c, int flags, float_status *s= tatus) { FloatParts pa =3D float64_unpack_canonical(a, status); @@ -2402,21 +2393,21 @@ static FloatParts sqrt_float(FloatParts a, float_st= atus *s, const FloatFmt *p) return a; } =20 -float16 __attribute__((flatten)) float16_sqrt(float16 a, float_status *sta= tus) +float16 QEMU_FLATTEN float16_sqrt(float16 a, float_status *status) { FloatParts pa =3D float16_unpack_canonical(a, status); FloatParts pr =3D sqrt_float(pa, status, &float16_params); return float16_round_pack_canonical(pr, status); } =20 -float32 __attribute__((flatten)) float32_sqrt(float32 a, float_status *sta= tus) +float32 QEMU_FLATTEN float32_sqrt(float32 a, float_status *status) { FloatParts pa =3D float32_unpack_canonical(a, status); FloatParts pr =3D sqrt_float(pa, status, &float32_params); return float32_round_pack_canonical(pr, status); } =20 -float64 __attribute__((flatten)) float64_sqrt(float64 a, float_status *sta= tus) +float64 QEMU_FLATTEN float64_sqrt(float64 a, float_status *status) { FloatParts pa =3D float64_unpack_canonical(a, status); FloatParts pr =3D sqrt_float(pa, status, &float64_params); diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h index 5843812..a4aafa1 100644 --- a/include/qemu/compiler.h +++ b/include/qemu/compiler.h @@ -122,6 +122,22 @@ #ifndef __has_feature #define __has_feature(x) 0 /* compatibility with non-clang compilers */ #endif + +#ifndef __has_attribute +#define __has_attribute(x) 0 /* compatibility with older GCC */ +#endif + +/* + * GCC doesn't provide __has_attribute() until GCC 5, but we know all the = GCC + * versions we support have the "flatten" attribute. Clang may not have the + * "flatten" attribute but always has __has_attribute() to check for it. + */ +#if __has_attribute(flatten) || !defined(__clang__) +# define QEMU_FLATTEN __attribute__((flatten)) +#else +# define QEMU_FLATTEN +#endif + /* Implement C11 _Generic via GCC builtins. Example: * * QEMU_GENERIC(x, (float, sinf), (long double, sinl), sin) (x) --=20 1.8.3.1