public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Build x86 libitm/libgomp/libatomic with -march=i486 or better
@ 2021-01-14 21:04 H.J. Lu
  2021-01-14 21:04 ` [PATCH 1/3] Build x86 libitm " H.J. Lu
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: H.J. Lu @ 2021-01-14 21:04 UTC (permalink / raw)
  To: gcc-patches; +Cc: Uros Bizjak, Jakub Jelinek

Starting from

commit 77d372abec0fbf2cfe922e3140ee3410248f979e
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Jan 14 05:56:46 2021 -0800

    x86: Error on -fcf-protection with incompatible target

GCC issues an error on -fcf-protection with incompatible target.  CET
is enabled in run-time libraries on x86 when GCC is configured with

--with-arch=XXX

where XXX enables SSE2.  But libitm/libgomp/libatomic are hardcoded to
compile with -march=i486 which is incompatible with CET.  We should
compile libitm/libgomp/libatomic -march=i486 only if the default -march=
is lower than i486.

H.J. Lu (3):
  Build x86 libitm with -march=i486 or better
  Build x86 libgomp with -march=i486 or better
  Build x86 libatomic with -march=i486 or better

 libatomic/configure.tgt | 73 ++++++++++++++++++++++++++++-------------
 libgomp/configure.tgt   | 36 +++++++++-----------
 libitm/configure.tgt    | 39 +++++++++++-----------
 3 files changed, 85 insertions(+), 63 deletions(-)

-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/3] Build x86 libitm with -march=i486 or better
  2021-01-14 21:04 [PATCH 0/3] Build x86 libitm/libgomp/libatomic with -march=i486 or better H.J. Lu
@ 2021-01-14 21:04 ` H.J. Lu
  2021-01-14 21:04 ` [PATCH 2/3] Build x86 libgomp " H.J. Lu
  2021-01-14 21:04 ` [PATCH 3/3] Build x86 libatomic " H.J. Lu
  2 siblings, 0 replies; 10+ messages in thread
From: H.J. Lu @ 2021-01-14 21:04 UTC (permalink / raw)
  To: gcc-patches; +Cc: Uros Bizjak, Jakub Jelinek

If x86 libitm isn't compiled with -march=i486 or better, append
-march=i486 XCFLAGS for x86 libitm build.

	PR target/70454
	* configure.tgt (XCFLAGS): Append -march=i486 to compile x86
	libitm if needed.
---
 libitm/configure.tgt | 39 +++++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/libitm/configure.tgt b/libitm/configure.tgt
index 6ac206f1005..316896c1b31 100644
--- a/libitm/configure.tgt
+++ b/libitm/configure.tgt
@@ -59,16 +59,25 @@ case "${target_cpu}" in
 
   arm*)		ARCH=arm ;;
 
-  i[3456]86)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m64 "*|*" -mx32 "*)
-	    ;;
-	  *)
-	    if test -z "$with_arch"; then
-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
-	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    fi
-	esac
+  i[3456]86 | x86_64)
+	# Need i486 or better.
+	cat > conftestx.c <<EOF
+#if defined __x86_64__ || defined __i486__ || defined __pentium__ \
+      || defined __pentiumpro__ || defined __pentium4__ \
+      || defined __geode__ || defined __SSE__
+# error Need i486 or better
+#endif
+EOF
+	if ${CC} ${CFLAGS} -c -o conftestx.o conftestx.c > /dev/null 2>&1; then
+	  if test "${target_cpu}" = x86_64; then
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
+	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
+	  else
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
+	  fi
+	fi
+	rm -f conftestx.c conftestx.o
 	XCFLAGS="${XCFLAGS} -mrtm"
 	ARCH=x86
 	;;
@@ -103,16 +112,6 @@ case "${target_cpu}" in
 	ARCH=sparc
 	;;
 
-  x86_64)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m32 "*)
-	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
-	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    ;;
-	esac
-	XCFLAGS="${XCFLAGS} -mrtm"
-	ARCH=x86
-	;;
   s390|s390x)
 	XCFLAGS="${XCFLAGS} -mzarch -mhtm"
 	ARCH=s390
-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 2/3] Build x86 libgomp with -march=i486 or better
  2021-01-14 21:04 [PATCH 0/3] Build x86 libitm/libgomp/libatomic with -march=i486 or better H.J. Lu
  2021-01-14 21:04 ` [PATCH 1/3] Build x86 libitm " H.J. Lu
@ 2021-01-14 21:04 ` H.J. Lu
  2021-01-14 21:04 ` [PATCH 3/3] Build x86 libatomic " H.J. Lu
  2 siblings, 0 replies; 10+ messages in thread
From: H.J. Lu @ 2021-01-14 21:04 UTC (permalink / raw)
  To: gcc-patches; +Cc: Uros Bizjak, Jakub Jelinek

If x86 libgomp isn't compiled with -march=i486 or better, append
-march=i486 XCFLAGS for x86 libgomp build.

	PR target/70454
	* configure.tgt (XCFLAGS): Append -march=i486 to compile x86
	libgomp if needed.
---
 libgomp/configure.tgt | 36 ++++++++++++++++--------------------
 1 file changed, 16 insertions(+), 20 deletions(-)

diff --git a/libgomp/configure.tgt b/libgomp/configure.tgt
index 1863287fa0d..83b5f92727d 100644
--- a/libgomp/configure.tgt
+++ b/libgomp/configure.tgt
@@ -73,28 +73,24 @@ if test x$enable_linux_futex = xyes; then
 	;;
 
     # Note that bare i386 is not included here.  We need cmpxchg.
-    i[456]86-*-linux*)
+    i[456]86-*-linux* | x86_64-*-linux*)
 	config_path="linux/x86 linux posix"
-	case " ${CC} ${CFLAGS} " in
-	  *" -m64 "*|*" -mx32 "*)
-	    ;;
-	  *)
-	    if test -z "$with_arch"; then
-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+	# Need i486 or better.
+	cat > conftestx.c <<EOF
+#if defined __x86_64__ || defined __i486__ || defined __pentium__ \
+      || defined __pentiumpro__ || defined __pentium4__ \
+      || defined __geode__ || defined __SSE__
+# error Need i486 or better
+#endif
+EOF
+	if ${CC} ${CFLAGS} -c -o conftestx.o conftestx.c > /dev/null 2>&1; then
+	    if test "${target_cpu}" = x86_64; then
+		XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
+	    else
+		XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
 	    fi
-	esac
-	;;
-
-    # Similar jiggery-pokery for x86_64 multilibs, except here we
-    # can't rely on the --with-arch configure option, since that
-    # applies to the 64-bit side.
-    x86_64-*-linux*)
-	config_path="linux/x86 linux posix"
-	case " ${CC} ${CFLAGS} " in
-	  *" -m32 "*)
-	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
-	    ;;
-	esac
+	fi
+	rm -f conftestx.c conftestx.o
 	;;
 
     # Note that sparcv7 and sparcv8 is not included here.  We need cas.
-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 3/3] Build x86 libatomic with -march=i486 or better
  2021-01-14 21:04 [PATCH 0/3] Build x86 libitm/libgomp/libatomic with -march=i486 or better H.J. Lu
  2021-01-14 21:04 ` [PATCH 1/3] Build x86 libitm " H.J. Lu
  2021-01-14 21:04 ` [PATCH 2/3] Build x86 libgomp " H.J. Lu
@ 2021-01-14 21:04 ` H.J. Lu
  2021-01-14 23:01   ` Jakub Jelinek
  2 siblings, 1 reply; 10+ messages in thread
From: H.J. Lu @ 2021-01-14 21:04 UTC (permalink / raw)
  To: gcc-patches; +Cc: Uros Bizjak, Jakub Jelinek

If x86 libatomic isn't compiled with -march=i486 or better, append
-march=i486 XCFLAGS for x86 libatomic build.  Set try_ifunc to yes
if -mcx16 isn't used to compile x86-64 libatomic or -march=i686 or
better isn't used to compile x86 libatomic.

	PR target/70454
	* configure.tgt (XCFLAGS): Append -march=i486 to compile x86
	libatomic if needed.
	(try_ifunc): Set to yes only if needed.
---
 libatomic/configure.tgt | 73 ++++++++++++++++++++++++++++-------------
 1 file changed, 50 insertions(+), 23 deletions(-)

diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
index 2f24817b454..1f3a3ad6c7c 100644
--- a/libatomic/configure.tgt
+++ b/libatomic/configure.tgt
@@ -81,32 +81,59 @@ case "${target_cpu}" in
 	ARCH=sparc
 	;;
 
-  i[3456]86)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m64 "*|*" -mx32 "*)
-	    ;;
-	  *)
-	    if test -z "$with_arch"; then
-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
-	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    fi
-	esac
-	ARCH=x86
-	# ??? Detect when -march=i686 is already enabled.
-	try_ifunc=yes
-	;;
-  x86_64)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m32 "*)
+  i[3456]86 | x86_64)
+	# Need i486 or better.
+	cat > conftestx.c <<EOF
+#if defined __x86_64__ || defined __i486__ || defined __pentium__ \
+      || defined __pentiumpro__ || defined __pentium4__ \
+      || defined __geode__ || defined __SSE__
+# error Need i486 or better
+#endif
+EOF
+	if ${CC} ${CFLAGS} -c -o conftestx.o conftestx.c > /dev/null 2>&1; then
+	  if test "${target_cpu}" = x86_64; then
 	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
 	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    ;;
-	  *)
-	    ;;
-	esac
+	  else
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
+	  fi
+	fi
+	# Detect if -march=i686/-mcx16 is already enabled.
+	cat > conftestx.c <<EOF
+#if defined __x86_64__
+__int128_t v = 0;
+__int128_t expected = 0;
+__int128_t max = ~0;
+__int128_t desired = ~0;
+__int128_t zero = 0;
+
+int
+foo (void)
+{
+  return !__atomic_compare_exchange_n (&v, &expected, max, 0,
+                                       __ATOMIC_RELAXED,
+                                       __ATOMIC_RELAXED);
+}
+#else
+# if defined __pentiumpro__ || defined __pentium4__ || defined __SSE__
+asm ("# has i686");
+# endif
+#endif
+EOF
+	if ${CC} ${CFLAGS} -S -o conftestx.s conftestx.c > /dev/null 2>&1; then
+	  if ${GREP} cmpxchg16b conftestx.s >/dev/null; then
+	    # This is the 64-bit library.
+	    try_ifunc=no
+	  elif ${GREP} i686 conftestx.s >/dev/null; then
+	    # This is the 32-bit library.
+	    try_ifunc=no
+	  else
+	    try_ifunc=yes
+	  fi
+	fi
+	rm -f conftestx.c conftestx.o conftestx.s
 	ARCH=x86
-	# ??? Detect when -mcx16 is already enabled.
-	try_ifunc=yes
 	;;
 
   *)			ARCH="${target_cpu}" ;;
-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/3] Build x86 libatomic with -march=i486 or better
  2021-01-14 21:04 ` [PATCH 3/3] Build x86 libatomic " H.J. Lu
@ 2021-01-14 23:01   ` Jakub Jelinek
  2021-01-15  0:08     ` V2 " H.J. Lu
  0 siblings, 1 reply; 10+ messages in thread
From: Jakub Jelinek @ 2021-01-14 23:01 UTC (permalink / raw)
  To: H.J. Lu; +Cc: gcc-patches, Uros Bizjak

On Thu, Jan 14, 2021 at 01:04:31PM -0800, H.J. Lu via Gcc-patches wrote:
> If x86 libatomic isn't compiled with -march=i486 or better, append
> -march=i486 XCFLAGS for x86 libatomic build.  Set try_ifunc to yes
> if -mcx16 isn't used to compile x86-64 libatomic or -march=i686 or
> better isn't used to compile x86 libatomic.
> 
> 	PR target/70454
> 	* configure.tgt (XCFLAGS): Append -march=i486 to compile x86
> 	libatomic if needed.
> 	(try_ifunc): Set to yes only if needed.
> ---
>  libatomic/configure.tgt | 73 ++++++++++++++++++++++++++++-------------
>  1 file changed, 50 insertions(+), 23 deletions(-)
> 
> diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
> index 2f24817b454..1f3a3ad6c7c 100644
> --- a/libatomic/configure.tgt
> +++ b/libatomic/configure.tgt
> @@ -81,32 +81,59 @@ case "${target_cpu}" in
>  	ARCH=sparc
>  	;;
>  
> -  i[3456]86)
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m64 "*|*" -mx32 "*)
> -	    ;;
> -	  *)
> -	    if test -z "$with_arch"; then
> -	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> -	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> -	    fi
> -	esac
> -	ARCH=x86
> -	# ??? Detect when -march=i686 is already enabled.
> -	try_ifunc=yes
> -	;;
> -  x86_64)
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m32 "*)
> +  i[3456]86 | x86_64)
> +	# Need i486 or better.
> +	cat > conftestx.c <<EOF
> +#if defined __x86_64__ || defined __i486__ || defined __pentium__ \
> +      || defined __pentiumpro__ || defined __pentium4__ \
> +      || defined __geode__ || defined __SSE__
> +# error Need i486 or better
> +#endif

Rather than hoping we got all the defines right, wouldn't it be better to
compile with -S a testcase like:
int
foo (int *p, int x, int y)
{
  return __sync_val_compare_and_swap (p, x, y);
}
and if there is __sync_val_compare_and_swap_4 in the assembly assume
-march=i486 needs to be added?
I.e. test for what exactly we need (working atomics).

	Jakub


^ permalink raw reply	[flat|nested] 10+ messages in thread

* V2 [PATCH 3/3] Build x86 libatomic with -march=i486 or better
  2021-01-14 23:01   ` Jakub Jelinek
@ 2021-01-15  0:08     ` H.J. Lu
  2021-01-15  7:59       ` Jakub Jelinek
  2021-01-15 11:54       ` [PATCH] libatomic, libgomp, libitc: Fix bootstrap [PR70454] Jakub Jelinek
  0 siblings, 2 replies; 10+ messages in thread
From: H.J. Lu @ 2021-01-15  0:08 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: GCC Patches, Uros Bizjak

[-- Attachment #1: Type: text/plain, Size: 2294 bytes --]

On Thu, Jan 14, 2021 at 3:01 PM Jakub Jelinek <jakub@redhat.com> wrote:
>
> On Thu, Jan 14, 2021 at 01:04:31PM -0800, H.J. Lu via Gcc-patches wrote:
> > If x86 libatomic isn't compiled with -march=i486 or better, append
> > -march=i486 XCFLAGS for x86 libatomic build.  Set try_ifunc to yes
> > if -mcx16 isn't used to compile x86-64 libatomic or -march=i686 or
> > better isn't used to compile x86 libatomic.
> >
> >       PR target/70454
> >       * configure.tgt (XCFLAGS): Append -march=i486 to compile x86
> >       libatomic if needed.
> >       (try_ifunc): Set to yes only if needed.
> > ---
> >  libatomic/configure.tgt | 73 ++++++++++++++++++++++++++++-------------
> >  1 file changed, 50 insertions(+), 23 deletions(-)
> >
> > diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
> > index 2f24817b454..1f3a3ad6c7c 100644
> > --- a/libatomic/configure.tgt
> > +++ b/libatomic/configure.tgt
> > @@ -81,32 +81,59 @@ case "${target_cpu}" in
> >       ARCH=sparc
> >       ;;
> >
> > -  i[3456]86)
> > -     case " ${CC} ${CFLAGS} " in
> > -       *" -m64 "*|*" -mx32 "*)
> > -         ;;
> > -       *)
> > -         if test -z "$with_arch"; then
> > -           XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> > -           XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> > -         fi
> > -     esac
> > -     ARCH=x86
> > -     # ??? Detect when -march=i686 is already enabled.
> > -     try_ifunc=yes
> > -     ;;
> > -  x86_64)
> > -     case " ${CC} ${CFLAGS} " in
> > -       *" -m32 "*)
> > +  i[3456]86 | x86_64)
> > +     # Need i486 or better.
> > +     cat > conftestx.c <<EOF
> > +#if defined __x86_64__ || defined __i486__ || defined __pentium__ \
> > +      || defined __pentiumpro__ || defined __pentium4__ \
> > +      || defined __geode__ || defined __SSE__
> > +# error Need i486 or better
> > +#endif
>
> Rather than hoping we got all the defines right, wouldn't it be better to
> compile with -S a testcase like:
> int
> foo (int *p, int x, int y)
> {
>   return __sync_val_compare_and_swap (p, x, y);
> }
> and if there is __sync_val_compare_and_swap_4 in the assembly assume
> -march=i486 needs to be added?
> I.e. test for what exactly we need (working atomics).
>
>         Jakub
>

Here is the updated patch.  OK for master?

Thanks.

-- 
H.J.

[-- Attachment #2: 0001-Build-x86-libatomic-with-march-i486-or-better.patch --]
[-- Type: text/x-patch, Size: 2972 bytes --]

From f847185c4faa94b6dbb52327c13d5d5bfec9b259 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Mon, 2 May 2016 09:44:07 -0700
Subject: [PATCH] Build x86 libatomic with -march=i486 or better

If x86 libatomic isn't compiled with -march=i486 or better, append
-march=i486 XCFLAGS for x86 libatomic build.  Set try_ifunc to yes
if -mcx16 isn't used to compile x86-64 libatomic or -march=i686 or
better isn't used to compile x86 libatomic.

	PR target/70454
	* configure.tgt (XCFLAGS): Append -march=i486 to compile x86
	libatomic if needed.
	(try_ifunc): Set to yes only if needed.
---
 libatomic/configure.tgt | 74 ++++++++++++++++++++++++++++-------------
 1 file changed, 51 insertions(+), 23 deletions(-)

diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
index 2f24817b454..3530c992264 100644
--- a/libatomic/configure.tgt
+++ b/libatomic/configure.tgt
@@ -81,32 +81,60 @@ case "${target_cpu}" in
 	ARCH=sparc
 	;;
 
-  i[3456]86)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m64 "*|*" -mx32 "*)
-	    ;;
-	  *)
-	    if test -z "$with_arch"; then
-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
-	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    fi
-	esac
-	ARCH=x86
-	# ??? Detect when -march=i686 is already enabled.
-	try_ifunc=yes
-	;;
-  x86_64)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m32 "*)
+  i[3456]86 | x86_64)
+	# Need i486 or better.
+	cat > conftestx.c <<EOF
+int
+foo (int *p, int x, int y)
+{
+  return __sync_val_compare_and_swap (p, x, y);
+}
+EOF
+	if ${CC} ${CFLAGS} -S conftestx.c > /dev/null 2>&1 \
+	   && grep -q __sync_val_compare_and_swap conftestx.s /dev/null; then
+	  if test "${target_cpu}" = x86_64; then
 	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
 	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    ;;
-	  *)
-	    ;;
-	esac
+	  else
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
+	  fi
+	fi
+	# Detect if -march=i686/-mcx16 is already enabled.
+	cat > conftestx.c <<EOF
+#if defined __x86_64__
+__int128_t v = 0;
+__int128_t expected = 0;
+__int128_t max = ~0;
+__int128_t desired = ~0;
+__int128_t zero = 0;
+
+int
+foo (void)
+{
+  return !__atomic_compare_exchange_n (&v, &expected, max, 0,
+                                       __ATOMIC_RELAXED,
+                                       __ATOMIC_RELAXED);
+}
+#else
+# if defined __pentiumpro__ || defined __pentium4__ || defined __SSE__
+asm ("# has i686");
+# endif
+#endif
+EOF
+	if ${CC} ${CFLAGS} -S -o conftestx.s conftestx.c > /dev/null 2>&1; then
+	  if grep cmpxchg16b conftestx.s >/dev/null; then
+	    # This is the 64-bit library.
+	    try_ifunc=no
+	  elif grep i686 conftestx.s >/dev/null; then
+	    # This is the 32-bit library.
+	    try_ifunc=no
+	  else
+	    try_ifunc=yes
+	  fi
+	fi
+	rm -f conftestx.c conftestx.s
 	ARCH=x86
-	# ??? Detect when -mcx16 is already enabled.
-	try_ifunc=yes
 	;;
 
   *)			ARCH="${target_cpu}" ;;
-- 
2.29.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: V2 [PATCH 3/3] Build x86 libatomic with -march=i486 or better
  2021-01-15  0:08     ` V2 " H.J. Lu
@ 2021-01-15  7:59       ` Jakub Jelinek
  2021-01-15 11:54       ` [PATCH] libatomic, libgomp, libitc: Fix bootstrap [PR70454] Jakub Jelinek
  1 sibling, 0 replies; 10+ messages in thread
From: Jakub Jelinek @ 2021-01-15  7:59 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GCC Patches, Uros Bizjak

On Thu, Jan 14, 2021 at 04:08:20PM -0800, H.J. Lu wrote:

I think best would be to revert the i386-options.c change
until this is all fixed, keeping the trunk broken too long is undesirable.

Second, I didn't mean to talk specifically about libatomic, but about all
the 3 configure.tgt changes.
And while for the i486 and cmpxchg16b cases you now use a functional test,
for the i686 test you still use macros, and I don't e.g. see how __SSE__ is
relevant, one could have in CFLAGS -march=skylake-avx512 -mno-sse and it
wouldn't be considered an i686.
Now that I look at it, I think what you should be looking at is whether
the compiler with the ${CC} ${CFLAGS} predefines:
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 - if not, then -march=i486 needs to be
added,
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 for 32-bit code resp.
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 for 64-bit code, then
maybe try_ifunc=no (but it needs verification that the code will in the end
always use cmpxchg8b or cmpxchg16b rather than never).

	Jakub


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH] libatomic, libgomp, libitc: Fix bootstrap [PR70454]
  2021-01-15  0:08     ` V2 " H.J. Lu
  2021-01-15  7:59       ` Jakub Jelinek
@ 2021-01-15 11:54       ` Jakub Jelinek
  2021-01-15 12:07         ` Richard Biener
  1 sibling, 1 reply; 10+ messages in thread
From: Jakub Jelinek @ 2021-01-15 11:54 UTC (permalink / raw)
  To: Richard Biener, Uros Bizjak, H.J. Lu; +Cc: GCC Patches

On Thu, Jan 14, 2021 at 04:08:20PM -0800, H.J. Lu wrote:
> Here is the updated patch.  OK for master?

Here is my version of the entire patch.

Bootstrapped/regtested on x86_64-linux and i686-linux and additionally
tested with i686-linux --with-arch=i386 and x86_64-linux --with-arch_32=i386
(non-bootstrap) builds to verify -march=i486 additions in that case.

Ok for trunk?

2021-01-15  Jakub Jelinek  <jakub@redhat.com>

	PR target/70454
	* configure.tgt: For i?86 and x86_64 determine if -march=i486 needs to
	be added through preprocessor check on
	__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4.  Determine if try_ifunc is needed
	based on preprocessor check on __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
	or __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8.

	* configure.tgt: For i?86 and x86_64 determine if -march=i486 needs to
	be added through preprocessor check on
	__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4.

	* configure.tgt: For i?86 and x86_64 determine if -march=i486 needs to
	be added through preprocessor check on
	__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4.

--- libatomic/configure.tgt.jj	2021-01-15 11:08:13.659545929 +0100
+++ libatomic/configure.tgt	2021-01-15 11:21:09.071740967 +0100
@@ -81,32 +81,40 @@ case "${target_cpu}" in
 	ARCH=sparc
 	;;
 
-  i[3456]86)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m64 "*|*" -mx32 "*)
-	    ;;
-	  *)
-	    if test -z "$with_arch"; then
-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
-	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    fi
-	esac
-	ARCH=x86
-	# ??? Detect when -march=i686 is already enabled.
-	try_ifunc=yes
-	;;
-  x86_64)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m32 "*)
+  i[3456]86 | x86_64)
+	cat > conftestx.c <<EOF
+#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
+#error need -march=i486
+#endif
+EOF
+	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
+	  :
+	else
+	  if test "${target_cpu}" = x86_64; then
 	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
-	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    ;;
-	  *)
-	    ;;
-	esac
+	  else
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+	  fi
+	  XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
+	fi
+	cat > conftestx.c <<EOF
+#ifdef __x86_64__
+#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+#error need -mcx16
+#endif
+#else
+#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
+#error need -march=i686
+#endif
+#endif
+EOF
+	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
+	  try_ifunc=no
+	else
+	  try_ifunc=yes
+	fi
+	rm -f conftestx.c
 	ARCH=x86
-	# ??? Detect when -mcx16 is already enabled.
-	try_ifunc=yes
 	;;
 
   *)			ARCH="${target_cpu}" ;;
--- libgomp/configure.tgt.jj	2021-01-15 11:08:13.659545929 +0100
+++ libgomp/configure.tgt	2021-01-15 11:20:54.809902917 +0100
@@ -73,28 +73,23 @@ if test x$enable_linux_futex = xyes; the
 	;;
 
     # Note that bare i386 is not included here.  We need cmpxchg.
-    i[456]86-*-linux*)
+    i[456]86-*-linux* | x86_64-*-linux*)
 	config_path="linux/x86 linux posix"
-	case " ${CC} ${CFLAGS} " in
-	  *" -m64 "*|*" -mx32 "*)
-	    ;;
-	  *)
-	    if test -z "$with_arch"; then
-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
-	    fi
-	esac
-	;;
-
-    # Similar jiggery-pokery for x86_64 multilibs, except here we
-    # can't rely on the --with-arch configure option, since that
-    # applies to the 64-bit side.
-    x86_64-*-linux*)
-	config_path="linux/x86 linux posix"
-	case " ${CC} ${CFLAGS} " in
-	  *" -m32 "*)
+	cat > conftestx.c <<EOF
+#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
+#error need -march=i486
+#endif
+EOF
+	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
+	  :
+	else
+	  if test "${target_cpu}" = x86_64; then
 	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
-	    ;;
-	esac
+	  else
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+	  fi
+	fi
+	rm -f conftestx.c
 	;;
 
     # Note that sparcv7 and sparcv8 is not included here.  We need cas.
--- libitm/configure.tgt.jj	2021-01-15 11:08:13.659545929 +0100
+++ libitm/configure.tgt	2021-01-15 11:21:28.611519095 +0100
@@ -59,16 +59,23 @@ case "${target_cpu}" in
 
   arm*)		ARCH=arm ;;
 
-  i[3456]86)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m64 "*|*" -mx32 "*)
-	    ;;
-	  *)
-	    if test -z "$with_arch"; then
-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
-	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    fi
-	esac
+  i[3456]86 | x86_64)
+	cat > conftestx.c <<EOF
+#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
+#error need -march=i486
+#endif
+EOF
+	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
+	  :
+	else
+	  if test "${target_cpu}" = x86_64; then
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
+	  else
+	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
+	  fi
+	  XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
+	fi
+	rm -f conftestx.c
 	XCFLAGS="${XCFLAGS} -mrtm"
 	ARCH=x86
 	;;
@@ -103,16 +110,6 @@ case "${target_cpu}" in
 	ARCH=sparc
 	;;
 
-  x86_64)
-	case " ${CC} ${CFLAGS} " in
-	  *" -m32 "*)
-	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
-	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
-	    ;;
-	esac
-	XCFLAGS="${XCFLAGS} -mrtm"
-	ARCH=x86
-	;;
   s390|s390x)
 	XCFLAGS="${XCFLAGS} -mzarch -mhtm"
 	ARCH=s390


	Jakub


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] libatomic, libgomp, libitc: Fix bootstrap [PR70454]
  2021-01-15 11:54       ` [PATCH] libatomic, libgomp, libitc: Fix bootstrap [PR70454] Jakub Jelinek
@ 2021-01-15 12:07         ` Richard Biener
  2021-01-15 12:35           ` H.J. Lu
  0 siblings, 1 reply; 10+ messages in thread
From: Richard Biener @ 2021-01-15 12:07 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Uros Bizjak, H.J. Lu, GCC Patches

On Fri, 15 Jan 2021, Jakub Jelinek wrote:

> On Thu, Jan 14, 2021 at 04:08:20PM -0800, H.J. Lu wrote:
> > Here is the updated patch.  OK for master?
> 
> Here is my version of the entire patch.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux and additionally
> tested with i686-linux --with-arch=i386 and x86_64-linux --with-arch_32=i386
> (non-bootstrap) builds to verify -march=i486 additions in that case.
> 
> Ok for trunk?

OK.

Thanks,
Richard.

> 2021-01-15  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR target/70454
> 	* configure.tgt: For i?86 and x86_64 determine if -march=i486 needs to
> 	be added through preprocessor check on
> 	__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4.  Determine if try_ifunc is needed
> 	based on preprocessor check on __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
> 	or __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8.
> 
> 	* configure.tgt: For i?86 and x86_64 determine if -march=i486 needs to
> 	be added through preprocessor check on
> 	__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4.
> 
> 	* configure.tgt: For i?86 and x86_64 determine if -march=i486 needs to
> 	be added through preprocessor check on
> 	__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4.
> 
> --- libatomic/configure.tgt.jj	2021-01-15 11:08:13.659545929 +0100
> +++ libatomic/configure.tgt	2021-01-15 11:21:09.071740967 +0100
> @@ -81,32 +81,40 @@ case "${target_cpu}" in
>  	ARCH=sparc
>  	;;
>  
> -  i[3456]86)
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m64 "*|*" -mx32 "*)
> -	    ;;
> -	  *)
> -	    if test -z "$with_arch"; then
> -	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> -	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> -	    fi
> -	esac
> -	ARCH=x86
> -	# ??? Detect when -march=i686 is already enabled.
> -	try_ifunc=yes
> -	;;
> -  x86_64)
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m32 "*)
> +  i[3456]86 | x86_64)
> +	cat > conftestx.c <<EOF
> +#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
> +#error need -march=i486
> +#endif
> +EOF
> +	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
> +	  :
> +	else
> +	  if test "${target_cpu}" = x86_64; then
>  	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
> -	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> -	    ;;
> -	  *)
> -	    ;;
> -	esac
> +	  else
> +	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> +	  fi
> +	  XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> +	fi
> +	cat > conftestx.c <<EOF
> +#ifdef __x86_64__
> +#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
> +#error need -mcx16
> +#endif
> +#else
> +#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
> +#error need -march=i686
> +#endif
> +#endif
> +EOF
> +	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
> +	  try_ifunc=no
> +	else
> +	  try_ifunc=yes
> +	fi
> +	rm -f conftestx.c
>  	ARCH=x86
> -	# ??? Detect when -mcx16 is already enabled.
> -	try_ifunc=yes
>  	;;
>  
>    *)			ARCH="${target_cpu}" ;;
> --- libgomp/configure.tgt.jj	2021-01-15 11:08:13.659545929 +0100
> +++ libgomp/configure.tgt	2021-01-15 11:20:54.809902917 +0100
> @@ -73,28 +73,23 @@ if test x$enable_linux_futex = xyes; the
>  	;;
>  
>      # Note that bare i386 is not included here.  We need cmpxchg.
> -    i[456]86-*-linux*)
> +    i[456]86-*-linux* | x86_64-*-linux*)
>  	config_path="linux/x86 linux posix"
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m64 "*|*" -mx32 "*)
> -	    ;;
> -	  *)
> -	    if test -z "$with_arch"; then
> -	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> -	    fi
> -	esac
> -	;;
> -
> -    # Similar jiggery-pokery for x86_64 multilibs, except here we
> -    # can't rely on the --with-arch configure option, since that
> -    # applies to the 64-bit side.
> -    x86_64-*-linux*)
> -	config_path="linux/x86 linux posix"
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m32 "*)
> +	cat > conftestx.c <<EOF
> +#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
> +#error need -march=i486
> +#endif
> +EOF
> +	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
> +	  :
> +	else
> +	  if test "${target_cpu}" = x86_64; then
>  	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
> -	    ;;
> -	esac
> +	  else
> +	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> +	  fi
> +	fi
> +	rm -f conftestx.c
>  	;;
>  
>      # Note that sparcv7 and sparcv8 is not included here.  We need cas.
> --- libitm/configure.tgt.jj	2021-01-15 11:08:13.659545929 +0100
> +++ libitm/configure.tgt	2021-01-15 11:21:28.611519095 +0100
> @@ -59,16 +59,23 @@ case "${target_cpu}" in
>  
>    arm*)		ARCH=arm ;;
>  
> -  i[3456]86)
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m64 "*|*" -mx32 "*)
> -	    ;;
> -	  *)
> -	    if test -z "$with_arch"; then
> -	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> -	      XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> -	    fi
> -	esac
> +  i[3456]86 | x86_64)
> +	cat > conftestx.c <<EOF
> +#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
> +#error need -march=i486
> +#endif
> +EOF
> +	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
> +	  :
> +	else
> +	  if test "${target_cpu}" = x86_64; then
> +	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
> +	  else
> +	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
> +	  fi
> +	  XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> +	fi
> +	rm -f conftestx.c
>  	XCFLAGS="${XCFLAGS} -mrtm"
>  	ARCH=x86
>  	;;
> @@ -103,16 +110,6 @@ case "${target_cpu}" in
>  	ARCH=sparc
>  	;;
>  
> -  x86_64)
> -	case " ${CC} ${CFLAGS} " in
> -	  *" -m32 "*)
> -	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
> -	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
> -	    ;;
> -	esac
> -	XCFLAGS="${XCFLAGS} -mrtm"
> -	ARCH=x86
> -	;;
>    s390|s390x)
>  	XCFLAGS="${XCFLAGS} -mzarch -mhtm"
>  	ARCH=s390
> 
> 
> 	Jakub
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] libatomic, libgomp, libitc: Fix bootstrap [PR70454]
  2021-01-15 12:07         ` Richard Biener
@ 2021-01-15 12:35           ` H.J. Lu
  0 siblings, 0 replies; 10+ messages in thread
From: H.J. Lu @ 2021-01-15 12:35 UTC (permalink / raw)
  To: Richard Biener; +Cc: Jakub Jelinek, Uros Bizjak, GCC Patches

On Fri, Jan 15, 2021 at 4:07 AM Richard Biener <rguenther@suse.de> wrote:
>
> On Fri, 15 Jan 2021, Jakub Jelinek wrote:
>
> > On Thu, Jan 14, 2021 at 04:08:20PM -0800, H.J. Lu wrote:
> > > Here is the updated patch.  OK for master?
> >
> > Here is my version of the entire patch.
> >
> > Bootstrapped/regtested on x86_64-linux and i686-linux and additionally
> > tested with i686-linux --with-arch=i386 and x86_64-linux --with-arch_32=i386
> > (non-bootstrap) builds to verify -march=i486 additions in that case.
> >
> > Ok for trunk?
>
> OK.
>

Thanks.

-- 
H.J.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2021-01-15 12:35 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-14 21:04 [PATCH 0/3] Build x86 libitm/libgomp/libatomic with -march=i486 or better H.J. Lu
2021-01-14 21:04 ` [PATCH 1/3] Build x86 libitm " H.J. Lu
2021-01-14 21:04 ` [PATCH 2/3] Build x86 libgomp " H.J. Lu
2021-01-14 21:04 ` [PATCH 3/3] Build x86 libatomic " H.J. Lu
2021-01-14 23:01   ` Jakub Jelinek
2021-01-15  0:08     ` V2 " H.J. Lu
2021-01-15  7:59       ` Jakub Jelinek
2021-01-15 11:54       ` [PATCH] libatomic, libgomp, libitc: Fix bootstrap [PR70454] Jakub Jelinek
2021-01-15 12:07         ` Richard Biener
2021-01-15 12:35           ` H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).