diff options
Diffstat (limited to 'toolchain/glibc')
11 files changed, 4155 insertions, 661 deletions
diff --git a/toolchain/glibc/Makefile b/toolchain/glibc/Makefile index ecd6f8d2b..4d87f5789 100644 --- a/toolchain/glibc/Makefile +++ b/toolchain/glibc/Makefile @@ -19,13 +19,17 @@ TARGET_CXXFLAGS:=	$(filter-out -ffast-math,$(TARGET_CXXFLAGS))  GLIBC_CONFOPTS:=	--build=$(GNU_HOST_NAME) \  			--host=$(GNU_TARGET_NAME) \  			--with-headers=$(STAGING_TARGET_DIR)/usr/include \ -			--enable-stackguard-randomization \  			--disable-sanity-checks \ -			--disable-nls \  			--disable-werror \  			--disable-nscd \  			--enable-shared +ifeq ($(ADK_TARGET_LINUX_ARCH_SPARC64),y) +GLIBC_CONFOPTS+=	--disable-default-pie +else +GLIBC_CONFOPTS+=	--enable-default-pie +endif +  ifeq ($(ADK_TARGET_USE_STATIC_LIBS_ONLY),y)  GLIBC_CONFOPTS+=	--enable-static-nss  endif diff --git a/toolchain/glibc/Makefile.inc b/toolchain/glibc/Makefile.inc index 1078c4348..b2c16fdb1 100644 --- a/toolchain/glibc/Makefile.inc +++ b/toolchain/glibc/Makefile.inc @@ -3,16 +3,16 @@  PKG_NAME:=		glibc  ifeq ($(ADK_LIBC_VERSION),git) -PKG_VERSION:=		2.36.90 -PKG_GLIBCVER:=		2.36.9000 -PKG_SITES:=		git://sourceware.org/git/glibc.git +PKG_VERSION:=		2.42.90 +PKG_GLIBCVER:=		2.42.9000 +PKG_SITES:=		https://sourceware.org/git/glibc.git  PKG_RELEASE:=		1  endif -ifeq ($(ADK_TARGET_LIB_GLIBC_2_36),y) -PKG_VERSION:=		2.36 -PKG_GLIBCVER:=		2.36 +ifeq ($(ADK_TARGET_LIB_GLIBC_2_42),y) +PKG_VERSION:=		2.42 +PKG_GLIBCVER:=		2.42  PKG_RELEASE:=		1  PKG_SITES:=		${MASTER_SITE_GNU:=glibc/} -PKG_HASH:=		1c959fea240906226062cb4b1e7ebce71a9f0e3c0836c09e7e3423d434fcfe75 +PKG_HASH:=		d4468d3e3267068c1b0623ca6424aac9a28766df774c8d8fb4978127fca7125a  endif -DISTFILES:=		$(PKG_NAME)-$(PKG_VERSION).tar.xz +DISTFILES:=		$(PKG_NAME)-$(PKG_VERSION).tar.gz diff --git a/toolchain/glibc/patches/2.26/0001-Do-not-use-__builtin_types_compatible_p-in-C-mode-bu.patch b/toolchain/glibc/patches/2.26/0001-Do-not-use-__builtin_types_compatible_p-in-C-mode-bu.patch deleted file mode 100644 index 27a785e31..000000000 --- a/toolchain/glibc/patches/2.26/0001-Do-not-use-__builtin_types_compatible_p-in-C-mode-bu.patch +++ /dev/null @@ -1,50 +0,0 @@ -From f7439f9b1089e17b6721f28e228682831a2f0135 Mon Sep 17 00:00:00 2001 -From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com> -Date: Mon, 21 Aug 2017 14:23:27 +0200 -Subject: [PATCH] Do not use __builtin_types_compatible_p in C++ mode (bug - 21930) - -The logic to define isinf for float128 depends on the availability of -__builtin_types_compatible_p, which is only available in C mode, -however, the conditionals do not check for C or C++ mode.  This lead to -an error in libstdc++ configure, as reported by bug 21930. - -This patch adds a conditional for C mode in the definition of isinf for -float128.  No definition is provided in C++ mode, since libstdc++ -headers undefine isinf. - -Tested for powerpc64le (glibc test suite and libstdc++-v3 configure). - -	[BZ #21930] -	* math/math.h (isinf): Check if in C or C++ mode before using -	__builtin_types_compatible_p, since this is a C mode feature. - -(cherry picked from commit 47a67213a9f51c5f8816d240500b10db605d8b77) -[Romain rebase on glibc 2.26] -Signed-off-by: Romain Naour <romain.naour@gmail.com> ---- - math/math.h | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/math/math.h b/math/math.h -index e217080..dea8dbe 100644 ---- a/math/math.h -+++ b/math/math.h -@@ -442,8 +442,12 @@ enum -  - /* Return nonzero value if X is positive or negative infinity.  */ - # if __HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7,0) \ --     && !defined __SUPPORT_SNAN__ --   /* __builtin_isinf_sign is broken for float128 only before GCC 7.0.  */ -+     && !defined __SUPPORT_SNAN__ && !defined __cplusplus -+   /* Since __builtin_isinf_sign is broken for float128 before GCC 7.0, -+      use the helper function, __isinff128, with older compilers.  This is -+      only provided for C mode, because in C++ mode, GCC has no support -+      for __builtin_types_compatible_p (and when in C++ mode, this macro is -+      not used anyway, because libstdc++ headers undefine it).  */ - #  define isinf(x) \ -     (__builtin_types_compatible_p (__typeof (x), _Float128) \ -      ? __isinff128 (x) : __builtin_isinf_sign (x)) ---  -2.9.5 - diff --git a/toolchain/glibc/patches/2.26/0002-Do-not-use-generic-selection-in-C-mode.patch b/toolchain/glibc/patches/2.26/0002-Do-not-use-generic-selection-in-C-mode.patch deleted file mode 100644 index 7321eebd6..000000000 --- a/toolchain/glibc/patches/2.26/0002-Do-not-use-generic-selection-in-C-mode.patch +++ /dev/null @@ -1,56 +0,0 @@ -From bb21afc362a3ecba07ab386a0bc4385e75fbd4b5 Mon Sep 17 00:00:00 2001 -From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com> -Date: Mon, 14 Aug 2017 17:51:51 -0300 -Subject: [PATCH] Do not use generic selection in C++ mode - -The logic to protect the use of generic selection (_Generic) does not -check for C or C++ mode, however, generic selection is a C-only -feature. - -Tested for powerpc64le. - -	* misc/sys/cdefs.h (__HAVE_GENERIC_SELECTION): Define to 0, if -	in C++ mode. - -(cherry picked from commit 6913ad65e00bb32417ad39c41d292b976171e27e) -[Romain rebase on glibc 2.26] -Signed-off-by: Romain Naour <romain.naour@gmail.com> ---- - misc/sys/cdefs.h | 19 ++++++++++--------- - 1 file changed, 10 insertions(+), 9 deletions(-) - -diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h -index 06523bf..0c80821 100644 ---- a/misc/sys/cdefs.h -+++ b/misc/sys/cdefs.h -@@ -464,17 +464,18 @@ - # define __glibc_macro_warning(msg) - #endif -  --/* Support for generic selection (ISO C11) is available in GCC since --   version 4.9.  Previous versions do not provide generic selection, --   even though they might set __STDC_VERSION__ to 201112L, when in --   -std=c11 mode.  Thus, we must check for !defined __GNUC__ when --   testing __STDC_VERSION__ for generic selection support. -+/* Generic selection (ISO C11) is a C-only feature, available in GCC -+   since version 4.9.  Previous versions do not provide generic -+   selection, even though they might set __STDC_VERSION__ to 201112L, -+   when in -std=c11 mode.  Thus, we must check for !defined __GNUC__ -+   when testing __STDC_VERSION__ for generic selection support. -    On the other hand, Clang also defines __GNUC__, so a clang-specific -    check is required to enable the use of generic selection.  */ --#if __GNUC_PREREQ (4, 9) \ --    || __glibc_clang_has_extension (c_generic_selections) \ --    || (!defined __GNUC__ && defined __STDC_VERSION__ \ --	&& __STDC_VERSION__ >= 201112L) -+#if !defined __cplusplus \ -+    && (__GNUC_PREREQ (4, 9) \ -+	|| __glibc_clang_has_extension (c_generic_selections) \ -+	|| (!defined __GNUC__ && defined __STDC_VERSION__ \ -+	    && __STDC_VERSION__ >= 201112L)) - # define __HAVE_GENERIC_SELECTION 1 - #else - # define __HAVE_GENERIC_SELECTION 0 ---  -2.9.5 - diff --git a/toolchain/glibc/patches/2.26/0003-Provide-a-C-version-of-issignaling-that-does-not-use.patch b/toolchain/glibc/patches/2.26/0003-Provide-a-C-version-of-issignaling-that-does-not-use.patch deleted file mode 100644 index b9cd3df39..000000000 --- a/toolchain/glibc/patches/2.26/0003-Provide-a-C-version-of-issignaling-that-does-not-use.patch +++ /dev/null @@ -1,225 +0,0 @@ -From 9bcf391a21677c6d5fa1c2be71554ec181e24f39 Mon Sep 17 00:00:00 2001 -From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com> -Date: Mon, 14 Aug 2017 13:46:15 -0300 -Subject: [PATCH] Provide a C++ version of issignaling that does not use - __MATH_TG - -The macro __MATH_TG contains the logic to select between long double and -_Float128, when these types are ABI-distinct.  This logic relies on -__builtin_types_compatible_p, which is not available in C++ mode. - -On the other hand, C++ function overloading provides the means to -distinguish between the floating-point types.  The overloading -resolution will match the correct parameter regardless of type -qualifiers, i.e.: const and volatile. - -Tested for powerpc64le, s390x, and x86_64. - -	* math/math.h [defined __cplusplus] (issignaling): Provide a C++ -	definition for issignaling that does not rely on __MATH_TG, -	since __MATH_TG uses __builtin_types_compatible_p, which is only -	available in C mode. -	(CFLAGS-test-math-issignaling.cc): New variable. -	* math/Makefile [CXX] (tests): Add test-math-issignaling. -	* math/test-math-issignaling.cc: New test for C++ implementation -	of type-generic issignaling. -	* sysdeps/powerpc/powerpc64le/Makefile [subdir == math] -	(CXXFLAGS-test-math-issignaling.cc): Add -mfloat128 to the build -	options of test-math-issignaling on powerpc64le. - -(cherry picked from commit a16e8bc08edca84d507715c66d6cddbbc7ed3b62) -[Romain rebase on glibc 2.26] -Signed-off-by: Romain Naour <romain.naour@gmail.com> ---- - math/Makefile                        |   3 +- - math/math.h                          |  19 +++++- - math/test-math-issignaling.cc        | 113 +++++++++++++++++++++++++++++++++++ - sysdeps/powerpc/powerpc64le/Makefile |   1 + - 4 files changed, 134 insertions(+), 2 deletions(-) - create mode 100644 math/test-math-issignaling.cc - -diff --git a/math/Makefile b/math/Makefile -index e09b0c0..0130fcf 100644 ---- a/math/Makefile -+++ b/math/Makefile -@@ -203,7 +203,7 @@ tests-static = test-fpucw-static test-fpucw-ieee-static \ - 	       test-signgam-ullong-static test-signgam-ullong-init-static -  - ifneq (,$(CXX)) --tests += test-math-isinff test-math-iszero -+tests += test-math-isinff test-math-iszero test-math-issignaling - endif -  - ifneq (no,$(PERL)) -@@ -350,6 +350,7 @@ CFLAGS-test-signgam-ullong-init-static.c = -std=c99 -  - CFLAGS-test-math-isinff.cc = -std=gnu++11 - CFLAGS-test-math-iszero.cc = -std=gnu++11 -+CFLAGS-test-math-issignaling.cc = -std=gnu++11 -  - CFLAGS-test-iszero-excess-precision.c = -fexcess-precision=standard - CFLAGS-test-iseqsig-excess-precision.c = -fexcess-precision=standard -diff --git a/math/math.h b/math/math.h -index dea8dbe..add86af 100644 ---- a/math/math.h -+++ b/math/math.h -@@ -474,7 +474,24 @@ enum - # include <bits/iscanonical.h> -  - /* Return nonzero value if X is a signaling NaN.  */ --# define issignaling(x) __MATH_TG ((x), __issignaling, (x)) -+# ifndef __cplusplus -+#  define issignaling(x) __MATH_TG ((x), __issignaling, (x)) -+# else -+   /* In C++ mode, __MATH_TG cannot be used, because it relies on -+      __builtin_types_compatible_p, which is a C-only builtin.  On the -+      other hand, overloading provides the means to distinguish between -+      the floating-point types.  The overloading resolution will match -+      the correct parameter (regardless of type qualifiers (i.e.: const -+      and volatile).  */ -+extern "C++" { -+inline int issignaling (float __val) { return __issignalingf (__val); } -+inline int issignaling (double __val) { return __issignaling (__val); } -+inline int issignaling (long double __val) { return __issignalingl (__val); } -+#  if __HAVE_DISTINCT_FLOAT128 -+inline int issignaling (_Float128 __val) { return __issignalingf128 (__val); } -+#  endif -+} /* extern C++ */ -+# endif -  - /* Return nonzero value if X is subnormal.  */ - # define issubnormal(x) (fpclassify (x) == FP_SUBNORMAL) -diff --git a/math/test-math-issignaling.cc b/math/test-math-issignaling.cc -new file mode 100644 -index 0000000..22ae9e1 ---- /dev/null -+++ b/math/test-math-issignaling.cc -@@ -0,0 +1,113 @@ -+/* Test for the C++ implementation of issignaling. -+   Copyright (C) 2017 Free Software Foundation, Inc. -+   This file is part of the GNU C Library. -+ -+   The GNU C Library is free software; you can redistribute it and/or -+   modify it under the terms of the GNU Lesser General Public -+   License as published by the Free Software Foundation; either -+   version 2.1 of the License, or (at your option) any later version. -+ -+   The GNU C Library 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 -+   Lesser General Public License for more details. -+ -+   You should have received a copy of the GNU Lesser General Public -+   License along with the GNU C Library; if not, see -+   <http://www.gnu.org/licenses/>.  */ -+ -+#define _GNU_SOURCE 1 -+#include <math.h> -+#include <stdio.h> -+ -+#include <limits> -+ -+/* There is no signaling_NaN for _Float128 in std::numeric_limits. -+   Include ieee754_float128.h and use the bitfields in the union -+   ieee854_float128.ieee_nan to build a signaling NaN.  */ -+#if __HAVE_DISTINCT_FLOAT128 -+# include <ieee754_float128.h> -+#endif -+ -+static bool errors; -+ -+static void -+check (int actual, int expected, const char *actual_expr, int line) -+{ -+  if (actual != expected) -+    { -+      errors = true; -+      printf ("%s:%d: error: %s\n", __FILE__, line, actual_expr); -+      printf ("%s:%d:   expected: %d\n", __FILE__, line, expected); -+      printf ("%s:%d:   actual: %d\n", __FILE__, line, actual); -+    } -+} -+ -+#define CHECK(actual, expected) \ -+  check ((actual), (expected), #actual, __LINE__) -+ -+template <class T> -+static void -+check_type () -+{ -+  typedef std::numeric_limits<T> limits; -+  CHECK (issignaling (T{0}), 0); -+  if (limits::has_infinity) -+    { -+      CHECK (issignaling (limits::infinity ()), 0); -+      CHECK (issignaling (-limits::infinity ()), 0); -+    } -+  if (limits::has_quiet_NaN) -+    CHECK (issignaling (limits::quiet_NaN ()), 0); -+  if (limits::has_signaling_NaN) -+    CHECK (issignaling (limits::signaling_NaN ()), 1); -+} -+ -+#if __HAVE_DISTINCT_FLOAT128 -+static void -+check_float128 () -+{ -+  ieee854_float128 q; -+ -+  q.d = 0; -+  CHECK (issignaling (q.d), 0); -+ -+  /* Infinity.  */ -+  q.ieee.negative = 0; -+  q.ieee.exponent = 0x7FFF; -+  q.ieee.mantissa0 = 0x0000; -+  q.ieee.mantissa1 = 0x00000000; -+  q.ieee.mantissa2 = 0x00000000; -+  q.ieee.mantissa3 = 0x00000000; -+  CHECK (issignaling (q.d), 0); -+ -+  /* Quiet NaN.  */ -+  q.ieee_nan.quiet_nan = 1; -+  q.ieee_nan.mantissa0 = 0x0000; -+  CHECK (issignaling (q.d), 0); -+ -+  /* Still a quiet NaN.  */ -+  q.ieee_nan.quiet_nan = 1; -+  q.ieee_nan.mantissa0 = 0x4000; -+  CHECK (issignaling (q.d), 0); -+ -+  /* Signaling NaN.  */ -+  q.ieee_nan.quiet_nan = 0; -+  q.ieee_nan.mantissa0 = 0x4000; -+  CHECK (issignaling (q.d), 1); -+} -+#endif -+ -+static int -+do_test (void) -+{ -+  check_type<float> (); -+  check_type<double> (); -+  check_type<long double> (); -+#if __HAVE_DISTINCT_FLOAT128 -+  check_float128 (); -+#endif -+  return errors; -+} -+ -+#include <support/test-driver.c> -diff --git a/sysdeps/powerpc/powerpc64le/Makefile b/sysdeps/powerpc/powerpc64le/Makefile -index 77617b6..19adbfa 100644 ---- a/sysdeps/powerpc/powerpc64le/Makefile -+++ b/sysdeps/powerpc/powerpc64le/Makefile -@@ -16,6 +16,7 @@ $(foreach suf,$(all-object-suffixes),%f128_r$(suf)): CFLAGS += -mfloat128 - $(foreach suf,$(all-object-suffixes),$(objpfx)test-float128%$(suf)): CFLAGS += -mfloat128 - $(foreach suf,$(all-object-suffixes),$(objpfx)test-ifloat128%$(suf)): CFLAGS += -mfloat128 - CFLAGS-libm-test-support-float128.c += -mfloat128 -+CFLAGS-test-math-issignaling.cc += -mfloat128 - $(objpfx)test-float128% $(objpfx)test-ifloat128%: \ -   gnulib-tests += $(f128-loader-link) - endif ---  -2.9.5 - diff --git a/toolchain/glibc/patches/2.26/0004-Fix-the-C-version-of-issignaling-when-__NO_LONG_DOUB.patch b/toolchain/glibc/patches/2.26/0004-Fix-the-C-version-of-issignaling-when-__NO_LONG_DOUB.patch deleted file mode 100644 index 5e32f754d..000000000 --- a/toolchain/glibc/patches/2.26/0004-Fix-the-C-version-of-issignaling-when-__NO_LONG_DOUB.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 9dbd8386a1b706beb30291a7e76bbfe69c2620cf Mon Sep 17 00:00:00 2001 -From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com> -Date: Wed, 23 Aug 2017 10:16:54 -0300 -Subject: [PATCH] Fix the C++ version of issignaling when __NO_LONG_DOUBLE_MATH - is defined - -When __NO_LONG_DOUBLE_MATH is defined, __issignalingl is not available, -thus issignaling with long double argument should call __issignaling, -instead. - -Tested for powerpc64le. - -	* math/math.h [defined __cplusplus] (issignaling): In the long -	double case, call __issignalingl only if __NO_LONG_DOUBLE_MATH -	is not defined.  Call __issignaling, otherwise. - -(cherry picked from commit 3d7b66f66cb223e899a7ebc0f4c20f13e711c9e0) -[Romain rebase on glibc 2.26] -Signed-off-by: Romain Naour <romain.naour@gmail.com> ---- - math/math.h | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/math/math.h b/math/math.h -index add86af..60dfa31 100644 ---- a/math/math.h -+++ b/math/math.h -@@ -486,7 +486,15 @@ enum - extern "C++" { - inline int issignaling (float __val) { return __issignalingf (__val); } - inline int issignaling (double __val) { return __issignaling (__val); } --inline int issignaling (long double __val) { return __issignalingl (__val); } -+inline int -+issignaling (long double __val) -+{ -+#  ifdef __NO_LONG_DOUBLE_MATH -+  return __issignaling (__val); -+#  else -+  return __issignalingl (__val); -+#  endif -+} - #  if __HAVE_DISTINCT_FLOAT128 - inline int issignaling (_Float128 __val) { return __issignalingf128 (__val); } - #  endif ---  -2.9.5 - diff --git a/toolchain/glibc/patches/2.26/0005-Provide-a-C-version-of-iszero-that-does-not-use-__MA.patch b/toolchain/glibc/patches/2.26/0005-Provide-a-C-version-of-iszero-that-does-not-use-__MA.patch deleted file mode 100644 index e12c8438f..000000000 --- a/toolchain/glibc/patches/2.26/0005-Provide-a-C-version-of-iszero-that-does-not-use-__MA.patch +++ /dev/null @@ -1,210 +0,0 @@ -From 45970aa26d1af87b016ef95b4b35c566aeb6e841 Mon Sep 17 00:00:00 2001 -From: "Gabriel F. T. Gomes" <gftg@linux.vnet.ibm.com> -Date: Tue, 22 Aug 2017 16:34:42 -0300 -Subject: [PATCH] Provide a C++ version of iszero that does not use __MATH_TG - (bug 21930) - -When signaling nans are enabled (with -fsignaling-nans), the C++ version -of iszero uses the fpclassify macro, which is defined with __MATH_TG. -However, when support for float128 is available, __MATH_TG uses the -builtin __builtin_types_compatible_p, which is only available in C mode. - -This patch refactors the C++ version of iszero so that it uses function -overloading to select between the floating-point types, instead of -relying on fpclassify and __MATH_TG. - -Tested for powerpc64le, s390x, x86_64, and with build-many-glibcs.py. - -	[BZ #21930] -	* math/math.h [defined __cplusplus && defined __SUPPORT_SNAN__] -	(iszero): New C++ implementation that does not use -	fpclassify/__MATH_TG/__builtin_types_compatible_p, when -	signaling nans are enabled, since __builtin_types_compatible_p -	is a C-only feature. -	* math/test-math-iszero.cc: When __HAVE_DISTINCT_FLOAT128 is -	defined, include ieee754_float128.h for access to the union and -	member ieee854_float128.ieee. -	[__HAVE_DISTINCT_FLOAT128] (do_test): Call check_float128. -	[__HAVE_DISTINCT_FLOAT128] (check_float128): New function. -	* sysdeps/powerpc/powerpc64le/Makefile [subdir == math] -	(CXXFLAGS-test-math-iszero.cc): Add -mfloat128 to the build -	options of test-math-zero on powerpc64le. - -(cherry picked from commit 42496114ec0eb7d6d039d05d4262e109951c600c) -[Romain rebase on glibc 2.26] -Signed-off-by: Romain Naour <romain.naour@gmail.com> ---- - math/math.h                          | 33 +++++++++++++-- - math/test-math-iszero.cc             | 79 ++++++++++++++++++++++++++++++++++++ - sysdeps/powerpc/powerpc64le/Makefile |  3 +- - 3 files changed, 110 insertions(+), 5 deletions(-) - -diff --git a/math/math.h b/math/math.h -index 60dfa31..7c0fc6d 100644 ---- a/math/math.h -+++ b/math/math.h -@@ -513,15 +513,40 @@ inline int issignaling (_Float128 __val) { return __issignalingf128 (__val); } - #  endif - # else	/* __cplusplus */ - extern "C++" { -+#  ifdef __SUPPORT_SNAN__ -+inline int -+iszero (float __val) -+{ -+  return __fpclassifyf (__val) == FP_ZERO; -+} -+inline int -+iszero (double __val) -+{ -+  return __fpclassify (__val) == FP_ZERO; -+} -+inline int -+iszero (long double __val) -+{ -+#   ifdef __NO_LONG_DOUBLE_MATH -+  return __fpclassify (__val) == FP_ZERO; -+#   else -+  return __fpclassifyl (__val) == FP_ZERO; -+#   endif -+} -+#   if __HAVE_DISTINCT_FLOAT128 -+inline int -+iszero (_Float128 __val) -+{ -+  return __fpclassifyf128 (__val) == FP_ZERO; -+} -+#   endif -+#  else - template <class __T> inline bool - iszero (__T __val) - { --#  ifdef __SUPPORT_SNAN__ --  return fpclassify (__val) == FP_ZERO; --#  else -   return __val == 0; --#  endif - } -+#  endif - } /* extern C++ */ - # endif	/* __cplusplus */ - #endif /* Use IEC_60559_BFP_EXT.  */ -diff --git a/math/test-math-iszero.cc b/math/test-math-iszero.cc -index 027e972..5c07261 100644 ---- a/math/test-math-iszero.cc -+++ b/math/test-math-iszero.cc -@@ -22,6 +22,13 @@ -  - #include <limits> -  -+/* Support for _Float128 in std::numeric_limits is limited. -+   Include ieee754_float128.h and use the bitfields in the union -+   ieee854_float128.ieee_nan to build corner-case inputs.  */ -+#if __HAVE_DISTINCT_FLOAT128 -+# include <ieee754_float128.h> -+#endif -+ - static bool errors; -  - static void -@@ -72,12 +79,84 @@ check_type () -          std::numeric_limits<T>::has_denorm == std::denorm_absent); - } -  -+#if __HAVE_DISTINCT_FLOAT128 -+static void -+check_float128 () -+{ -+  ieee854_float128 q; -+ -+  q.d = 0.0Q; -+  CHECK (iszero (q.d), 1); -+  q.d = -0.0Q; -+  CHECK (iszero (q.d), 1); -+  q.d = 1.0Q; -+  CHECK (iszero (q.d), 0); -+  q.d = -1.0Q; -+  CHECK (iszero (q.d), 0); -+ -+  /* Normal min.  */ -+  q.ieee.negative = 0; -+  q.ieee.exponent = 0x0001; -+  q.ieee.mantissa0 = 0x0000; -+  q.ieee.mantissa1 = 0x00000000; -+  q.ieee.mantissa2 = 0x00000000; -+  q.ieee.mantissa3 = 0x00000000; -+  CHECK (iszero (q.d), 0); -+  q.ieee.negative = 1; -+  CHECK (iszero (q.d), 0); -+ -+  /* Normal max.  */ -+  q.ieee.negative = 0; -+  q.ieee.exponent = 0x7FFE; -+  q.ieee.mantissa0 = 0xFFFF; -+  q.ieee.mantissa1 = 0xFFFFFFFF; -+  q.ieee.mantissa2 = 0xFFFFFFFF; -+  q.ieee.mantissa3 = 0xFFFFFFFF; -+  CHECK (iszero (q.d), 0); -+  q.ieee.negative = 1; -+  CHECK (iszero (q.d), 0); -+ -+  /* Infinity.  */ -+  q.ieee.negative = 0; -+  q.ieee.exponent = 0x7FFF; -+  q.ieee.mantissa0 = 0x0000; -+  q.ieee.mantissa1 = 0x00000000; -+  q.ieee.mantissa2 = 0x00000000; -+  q.ieee.mantissa3 = 0x00000000; -+  CHECK (iszero (q.d), 0); -+ -+  /* Quiet NaN.  */ -+  q.ieee_nan.quiet_nan = 1; -+  q.ieee_nan.mantissa0 = 0x0000; -+  CHECK (iszero (q.d), 0); -+ -+  /* Signaling NaN.  */ -+  q.ieee_nan.quiet_nan = 0; -+  q.ieee_nan.mantissa0 = 0x4000; -+  CHECK (iszero (q.d), 0); -+ -+  /* Denormal min.  */ -+  q.ieee.negative = 0; -+  q.ieee.exponent = 0x0000; -+  q.ieee.mantissa0 = 0x0000; -+  q.ieee.mantissa1 = 0x00000000; -+  q.ieee.mantissa2 = 0x00000000; -+  q.ieee.mantissa3 = 0x00000001; -+  CHECK (iszero (q.d), 0); -+  q.ieee.negative = 1; -+  CHECK (iszero (q.d), 0); -+} -+#endif -+ - static int - do_test (void) - { -   check_type<float> (); -   check_type<double> (); -   check_type<long double> (); -+#if __HAVE_DISTINCT_FLOAT128 -+  check_float128 (); -+#endif -   return errors; - } -  -diff --git a/sysdeps/powerpc/powerpc64le/Makefile b/sysdeps/powerpc/powerpc64le/Makefile -index 19adbfa..dea2290 100644 ---- a/sysdeps/powerpc/powerpc64le/Makefile -+++ b/sysdeps/powerpc/powerpc64le/Makefile -@@ -17,7 +17,8 @@ $(foreach suf,$(all-object-suffixes),$(objpfx)test-float128%$(suf)): CFLAGS += - - $(foreach suf,$(all-object-suffixes),$(objpfx)test-ifloat128%$(suf)): CFLAGS += -mfloat128 - CFLAGS-libm-test-support-float128.c += -mfloat128 - CFLAGS-test-math-issignaling.cc += -mfloat128 --$(objpfx)test-float128% $(objpfx)test-ifloat128%: \ -+CFLAGS-test-math-iszero.cc += -mfloat128 -+$(objpfx)test-float128% $(objpfx)test-ifloat128% $(objpfx)test-math-iszero: \ -   gnulib-tests += $(f128-loader-link) - endif -  ---  -2.9.5 - diff --git a/toolchain/glibc/patches/2.26/0006-Let-fpclassify-use-the-builtin-when-optimizing-for-s.patch b/toolchain/glibc/patches/2.26/0006-Let-fpclassify-use-the-builtin-when-optimizing-for-s.patch deleted file mode 100644 index 37807c459..000000000 --- a/toolchain/glibc/patches/2.26/0006-Let-fpclassify-use-the-builtin-when-optimizing-for-s.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 33f54cf4f81a51e5c8cbfb2408edd439bdee9435 Mon Sep 17 00:00:00 2001 -From: "Gabriel F. T. Gomes" <gabriel@inconstante.eti.br> -Date: Wed, 20 Sep 2017 15:10:26 -0300 -Subject: [PATCH] Let fpclassify use the builtin when optimizing for size in - C++ mode (bug 22146) - -When optimization for size is on (-Os), fpclassify does not use the -type-generic __builtin_fpclassify builtin, instead it uses __MATH_TG. -However, when library support for float128 is available, __MATH_TG uses -__builtin_types_compatible_p, which is not available in C++ mode. - -On the other hand, libstdc++ undefines (in cmath) many macros from -math.h, including fpclassify, so that it can provide its own functions. -However, during its configure tests, libstdc++ just tests for the -availability of the macros (it does not undefine them, nor does it -provide its own functions). - -Finally, when libstdc++ is configured with optimization for size -enabled, its configure tests include math.h and get the definition of -fpclassify that uses __MATH_TG (and __builtin_types_compatible_p). -Since libstdc++ does not undefine the macros during its configure tests, -they fail. - -This patch lets fpclassify use the builtin in C++ mode, even when -optimization for size is on.  This allows the configure test in -libstdc++ to work. - -Tested for powerpc64le and x86_64. - -	[BZ #22146] -	math/math.h: Let fpclassify use the builtin in C++ mode, even -	when optimazing for size. - -(cherry picked from commit c5c4a626098ec884b8527356abdf2a4bb7b6bf27) - -[Romain rebase on glibc 2.26) -Signed-off-by: Romain Naour <romain.naour@gmail.com> ---- - math/math.h | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/math/math.h b/math/math.h -index 7c0fc6d..f9348ec 100644 ---- a/math/math.h -+++ b/math/math.h -@@ -402,7 +402,13 @@ enum -  - /* Return number of classification appropriate for X.  */ - # if __GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__			      \ --     && !defined __OPTIMIZE_SIZE__ -+     && (!defined __OPTIMIZE_SIZE__ || defined __cplusplus) -+     /* The check for __cplusplus allows the use of the builtin, even -+	when optimization for size is on.  This is provided for -+	libstdc++, only to let its configure test work when it is built -+	with -Os.  No further use of this definition of fpclassify is -+	expected in C++ mode, since libstdc++ provides its own version -+	of fpclassify in cmath (which undefines fpclassify).  */ - #  define fpclassify(x) __builtin_fpclassify (FP_NAN, FP_INFINITE,	      \ -      FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x) - # else ---  -2.9.5 - diff --git a/toolchain/glibc/patches/2.38/0001-m68k-fix-__mpn_lshift-and-__mpn_rshift-for-non-68020.patch b/toolchain/glibc/patches/2.38/0001-m68k-fix-__mpn_lshift-and-__mpn_rshift-for-non-68020.patch new file mode 100644 index 000000000..d5d8e34e9 --- /dev/null +++ b/toolchain/glibc/patches/2.38/0001-m68k-fix-__mpn_lshift-and-__mpn_rshift-for-non-68020.patch @@ -0,0 +1,46 @@ +From 464fd8249e8b791248cab7b0e0cd91757435fa9e Mon Sep 17 00:00:00 2001 +From: Andreas Schwab <schwab@linux-m68k.org> +Date: Thu, 17 Aug 2023 17:15:34 +0200 +Subject: [PATCH] m68k: fix __mpn_lshift and __mpn_rshift for non-68020 + +From revision 03f3d275d0d6 in the gmp repository. + +Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> +--- + sysdeps/m68k/m680x0/lshift.S | 4 ++-- + sysdeps/m68k/m680x0/rshift.S | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/sysdeps/m68k/m680x0/lshift.S b/sysdeps/m68k/m680x0/lshift.S +index 2aee10348e..4240738959 100644 +--- a/sysdeps/m68k/m680x0/lshift.S ++++ b/sysdeps/m68k/m680x0/lshift.S +@@ -77,8 +77,8 @@ L(Lnormal:) + #else /* not mc68000 */ + 	movel	R(s_size),R(d0) + 	asll	#2,R(d0) +-	addl	R(s_size),R(s_ptr) +-	addl	R(s_size),R(res_ptr) ++	addl	R(d0),R(s_ptr) ++	addl	R(d0),R(res_ptr) + #endif + 	movel	MEM_PREDEC(s_ptr),R(d2) + 	movel	R(d2),R(d0) +diff --git a/sysdeps/m68k/m680x0/rshift.S b/sysdeps/m68k/m680x0/rshift.S +index d16bca9307..d56a2b4a44 100644 +--- a/sysdeps/m68k/m680x0/rshift.S ++++ b/sysdeps/m68k/m680x0/rshift.S +@@ -127,8 +127,8 @@ L(Lspecial:) + #else /* not mc68000 */ + 	movel	R(s_size),R(d0) + 	asll	#2,R(d0) +-	addl	R(s_size),R(s_ptr) +-	addl	R(s_size),R(res_ptr) ++	addl	R(d0),R(s_ptr) ++	addl	R(d0),R(res_ptr) + #endif +  + 	clrl	R(d0)			/* initialize carry */ +--  +2.39.2 + diff --git a/toolchain/glibc/patches/2.38/0004-ARC-Add-support-for-ARCv3-processors.patch b/toolchain/glibc/patches/2.38/0004-ARC-Add-support-for-ARCv3-processors.patch new file mode 100644 index 000000000..cf4ca7352 --- /dev/null +++ b/toolchain/glibc/patches/2.38/0004-ARC-Add-support-for-ARCv3-processors.patch @@ -0,0 +1,4036 @@ +From ac6163148698545dd56471edabf97ffc23a519da Mon Sep 17 00:00:00 2001 +From: Alexey Brodkin <abrodkin@synopsys.com> +Date: Tue, 2 Jan 2024 03:38:32 -0800 +Subject: [PATCH] ARC: Add support for ARCv3 processors + +Signed-off-by: Vineet Gupta <vgupta@kernel.org> +Signed-off-by: Pavel Kozlov <pavel.kozlov@synopsys.com> +Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> +--- + config.h.in                                   |    6 + + elf/dl-runtime.c                              |    4 +- + elf/elf.h                                     |    5 +- + nptl/Makefile                                 |    5 +- + scripts/build-many-glibcs.py                  |    6 + + scripts/config.sub                            |    8 + + sysdeps/arc/Implies                           |    1 - + sysdeps/arc/__longjmp.S                       |   62 +- + sysdeps/arc/arc32/Implies                     |    1 + + sysdeps/arc/arc64/Implies                     |    1 + + sysdeps/arc/arc64/fpu/libm-test-ulps          | 1141 +++++++++++++++++ + sysdeps/arc/arc64/fpu/libm-test-ulps-name     |    1 + + sysdeps/arc/{ => arc64}/nofpu/libm-test-ulps  |    1 + + sysdeps/arc/arc64/nofpu/libm-test-ulps-name   |    1 + + sysdeps/arc/atomic-machine.h                  |   41 +- + sysdeps/arc/bits/setjmp.h                     |    6 +- + sysdeps/arc/configure                         |   80 +- + sysdeps/arc/configure.ac                      |   36 + + sysdeps/arc/dl-machine.h                      |   75 +- + sysdeps/arc/dl-trampoline.S                   |   89 +- + sysdeps/arc/fpu/math-use-builtins-fma.h       |   18 +- + sysdeps/arc/fpu/math-use-builtins-sqrt.h      |   18 +- + sysdeps/arc/isa-asm-macro-32.h                |   61 + + sysdeps/arc/isa-asm-macro-64.h                |   86 ++ + sysdeps/arc/isa-asm-macros.h                  |   35 + + sysdeps/arc/nofpu/libm-test-ulps              |    1 + + sysdeps/arc/nptl/pthreaddef.h                 |    2 +- + sysdeps/arc/preconfigure                      |   18 +- + sysdeps/arc/setjmp.S                          |   55 +- + sysdeps/arc/sfp-machine.h                     |   55 +- + sysdeps/arc/start.S                           |   14 +- + sysdeps/arc/sysdep.h                          |    5 +- + sysdeps/unix/sysv/linux/arc/Makefile          |    8 +- + sysdeps/unix/sysv/linux/arc/arc32/Implies     |    1 + + .../sysv/linux/arc/{ => arc32}/arch-syscall.h |    0 + .../sysv/linux/arc/{ => arc32}/c++-types.data |    0 + .../linux/arc/{ => arc32}/fixup-asm-unistd.h  |    0 + .../sysv/linux/arc/{ => arc32}/ld.abilist     |    0 + .../arc/{ => arc32}/libBrokenLocale.abilist   |    0 + .../sysv/linux/arc/{ => arc32}/libanl.abilist |    0 + .../sysv/linux/arc/{ => arc32}/libc.abilist   |    0 + .../arc/{ => arc32}/libc_malloc_debug.abilist |    0 + .../linux/arc/{ => arc32}/libcrypt.abilist    |    0 + .../sysv/linux/arc/{ => arc32}/libdl.abilist  |    0 + .../sysv/linux/arc/{ => arc32}/libm.abilist   |    0 + .../linux/arc/{ => arc32}/libpthread.abilist  |    0 + .../linux/arc/{ => arc32}/libresolv.abilist   |    0 + .../sysv/linux/arc/{ => arc32}/librt.abilist  |    0 + .../arc/{ => arc32}/libthread_db.abilist      |    0 + .../linux/arc/{ => arc32}/libutil.abilist     |    0 + sysdeps/unix/sysv/linux/arc/arc64/Implies     |    2 + + .../sysv/linux/arc/{ => arc64}/arch-syscall.h |   59 +- + .../sysv/linux/arc/{ => arc64}/c++-types.data |   48 +- + .../sysv/linux/arc/{ => arc64}/ld.abilist     |    8 +- + .../arc/{ => arc64}/libBrokenLocale.abilist   |    0 + .../sysv/linux/arc/{ => arc64}/libanl.abilist |    0 + .../sysv/linux/arc/{ => arc64}/libc.abilist   |   82 +- + .../arc/{ => arc64}/libc_malloc_debug.abilist |    8 +- + .../linux/arc/{ => arc64}/libcrypt.abilist    |    0 + .../sysv/linux/arc/{ => arc64}/libdl.abilist  |    0 + .../sysv/linux/arc/{ => arc64}/libm.abilist   |    0 + .../linux/arc/{ => arc64}/libpthread.abilist  |    0 + .../linux/arc/{ => arc64}/libresolv.abilist   |    4 +- + .../sysv/linux/arc/{ => arc64}/librt.abilist  |    0 + .../arc/{ => arc64}/libthread_db.abilist      |    0 + .../linux/arc/{ => arc64}/libutil.abilist     |    0 + sysdeps/unix/sysv/linux/arc/bits/fcntl.h      |   62 + + .../sysv/linux/arc/bits/types/__sigset_t.h    |    2 +- + sysdeps/unix/sysv/linux/arc/clone.S           |   30 +- + sysdeps/unix/sysv/linux/arc/clone3.S          |   14 +- + sysdeps/unix/sysv/linux/arc/getcontext.S      |   71 +- + sysdeps/unix/sysv/linux/arc/setcontext.S      |   88 +- + sysdeps/unix/sysv/linux/arc/shlib-versions    |    8 + + sysdeps/unix/sysv/linux/arc/swapcontext.S     |  129 +- + sysdeps/unix/sysv/linux/arc/sys/ucontext.h    |    1 + + sysdeps/unix/sysv/linux/arc/syscall.S         |   16 +- + sysdeps/unix/sysv/linux/arc/sysdep.h          |   16 +- + sysdeps/unix/sysv/linux/arc/vfork.S           |    4 +- + timezone/zic.c                                |    2 +- + 79 files changed, 2211 insertions(+), 390 deletions(-) + mode change 100755 => 100644 scripts/config.sub + create mode 100644 sysdeps/arc/arc32/Implies + create mode 100644 sysdeps/arc/arc64/Implies + create mode 100644 sysdeps/arc/arc64/fpu/libm-test-ulps + create mode 100644 sysdeps/arc/arc64/fpu/libm-test-ulps-name + copy sysdeps/arc/{ => arc64}/nofpu/libm-test-ulps (99%) + create mode 100644 sysdeps/arc/arc64/nofpu/libm-test-ulps-name + create mode 100644 sysdeps/arc/isa-asm-macro-32.h + create mode 100644 sysdeps/arc/isa-asm-macro-64.h + create mode 100644 sysdeps/arc/isa-asm-macros.h + create mode 100644 sysdeps/unix/sysv/linux/arc/arc32/Implies + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/arch-syscall.h (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/c++-types.data (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc32}/fixup-asm-unistd.h (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/ld.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libBrokenLocale.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libanl.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libc.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libc_malloc_debug.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libcrypt.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libdl.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libm.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libpthread.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libresolv.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/librt.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libthread_db.abilist (100%) + copy sysdeps/unix/sysv/linux/arc/{ => arc32}/libutil.abilist (100%) + create mode 100644 sysdeps/unix/sysv/linux/arc/arc64/Implies + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/arch-syscall.h (89%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/c++-types.data (73%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/ld.abilist (54%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libBrokenLocale.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libanl.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libc.abilist (97%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libc_malloc_debug.abilist (80%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libcrypt.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libdl.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libm.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libpthread.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libresolv.abilist (95%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/librt.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libthread_db.abilist (100%) + rename sysdeps/unix/sysv/linux/arc/{ => arc64}/libutil.abilist (100%) + create mode 100644 sysdeps/unix/sysv/linux/arc/bits/fcntl.h + +diff --git a/config.h.in b/config.h.in +index 0dedc124f7..d69b4166c0 100644 +--- a/config.h.in ++++ b/config.h.in +@@ -120,6 +120,12 @@ + /* ARC big endian ABI */ + #undef HAVE_ARC_BE +  ++/* ARC64:32 ABI */ ++#undef HAVE_ARC32 ++ ++/* ARC64:64 ABI */ ++#undef HAVE_ARC64 ++ + /* C-SKY ABI version.  */ + #undef CSKYABI +  +diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c +index 32a8bfcf74..68ffdb1c24 100644 +--- a/elf/dl-runtime.c ++++ b/elf/dl-runtime.c +@@ -42,7 +42,7 @@ _dl_fixup ( + # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + 	   ELF_MACHINE_RUNTIME_FIXUP_ARGS, + # endif +-	   struct link_map *l, ElfW(Word) reloc_arg) ++	   struct link_map *l, uintptr_t reloc_arg) + { +   const ElfW(Sym) *const symtab +     = (const void *) D_PTR (l, l_info[DT_SYMTAB]); +@@ -170,7 +170,7 @@ _dl_profile_fixup ( + #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + 		   ELF_MACHINE_RUNTIME_FIXUP_ARGS, + #endif +-		   struct link_map *l, ElfW(Word) reloc_arg, ++		   struct link_map *l, uintptr_t reloc_arg, + 		   ElfW(Addr) retaddr, void *regs, long int *framesizep) + { +   void (*mcount_fct) (ElfW(Addr), ElfW(Addr)) = _dl_mcount; +diff --git a/elf/elf.h b/elf/elf.h +index 89fc8021e9..05cc75c631 100644 +--- a/elf/elf.h ++++ b/elf/elf.h +@@ -358,6 +358,8 @@ typedef struct +  + #define EM_BPF		247	/* Linux BPF -- in-kernel virtual machine */ + #define EM_CSKY		252     /* C-SKY */ ++#define EM_ARCV3	253     /* Synopsys ARCv3 64-bit ISA */ ++#define EM_ARCV3_32	255     /* Synopsys ARCv3 32-bit ISA */ + #define EM_LOONGARCH	258	/* LoongArch */ +  + #define EM_NUM		259 +@@ -4216,12 +4218,13 @@ enum + /* Processor specific values for the Shdr sh_type field.  */ + #define SHT_ARC_ATTRIBUTES	(SHT_LOPROC + 1) /* ARC attributes section.  */ +  +-/* ARCompact/ARCv2 specific relocs.  */ ++/* ARCompact/ARCv2/ARCv3 specific relocs.  */ + #define R_ARC_NONE		0x0 + #define R_ARC_8			0x1 + #define R_ARC_16		0x2 + #define R_ARC_24		0x3 + #define R_ARC_32		0x4 ++#define R_ARC_64		0x5 +  + #define R_ARC_B22_PCREL		0x6 + #define R_ARC_H30		0x7 +diff --git a/nptl/Makefile b/nptl/Makefile +index ffa5722e48..c8b7674c27 100644 +--- a/nptl/Makefile ++++ b/nptl/Makefile +@@ -353,6 +353,7 @@ tests = \ +   tst-thread-exit-clobber \ +   tst-thread-setspecific \ +   tst-thread_local1 \ ++  tst-eintr1 \ +   tst-tsd3 \ +   tst-tsd4 \ +   # tests +@@ -397,10 +398,6 @@ tests-time64 := \ +   tst-cancel4_2-time64 +   # tests-time64 +  +-# This test can run into task limits because of a linux kernel bug +-# and then cause the make process to fail too, see bug 24537. +-xtests += tst-eintr1 +- + test-srcs = tst-oddstacklimit +  + gen-as-const-headers = unwindbuf.sym +diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py +index 73ffc57c86..6f53c195cd 100755 +--- a/scripts/build-many-glibcs.py ++++ b/scripts/build-many-glibcs.py +@@ -172,6 +172,12 @@ class Context(object): +         self.add_config(arch='arceb', +                         os_name='linux-gnu', +                         gcc_cfg=['--disable-multilib', '--with-cpu=hs38']) ++        self.add_config(arch='arc64', ++                        os_name='linux-gnu', ++                        gcc_cfg=['--disable-multilib']) ++        self.add_config(arch='arc64', ++                        os_name='linux-gnuhf', ++                        gcc_cfg=['--disable-multilib', '--with-fpu=fpud']) +         self.add_config(arch='alpha', +                         os_name='linux-gnu') +         self.add_config(arch='arm', +diff --git a/scripts/config.sub b/scripts/config.sub +old mode 100755 +new mode 100644 +index dba16e84c7..4d9a117c9c +--- a/scripts/config.sub ++++ b/scripts/config.sub +@@ -1170,6 +1170,14 @@ case $cpu-$vendor in + 		cpu=mipsallegrexel + 		vendor=sony + 		;; ++	arc32*-*) ++		cpu=arc32 ++		vendor=linux ++		;; ++	arc64*-*) ++		cpu=arc64 ++		vendor=linux ++		;; + 	tile*-*) + 		basic_os=${basic_os:-linux-gnu} + 		;; +diff --git a/sysdeps/arc/Implies b/sysdeps/arc/Implies +index 780c4e2467..12ca48b4c9 100644 +--- a/sysdeps/arc/Implies ++++ b/sysdeps/arc/Implies +@@ -1,3 +1,2 @@ +-wordsize-32 + ieee754/flt-32 + ieee754/dbl-64 +diff --git a/sysdeps/arc/__longjmp.S b/sysdeps/arc/__longjmp.S +index a57054bce0..920e535ffd 100644 +--- a/sysdeps/arc/__longjmp.S ++++ b/sysdeps/arc/__longjmp.S +@@ -24,25 +24,49 @@ +  + ENTRY (__longjmp) +  +-	LDR (blink, r0,  0) +-	LDR (sp,    r0,  1) +-	LDR (fp,    r0,  2) +-	LDR (gp,    r0,  3) +- +-	LDR (r13,   r0,  4) +-	LDR (r14,   r0,  5) +-	LDR (r15,   r0,  6) +-	LDR (r16,   r0,  7) +-	LDR (r17,   r0,  8) +-	LDR (r18,   r0,  9) +-	LDR (r19,   r0, 10) +-	LDR (r20,   r0, 11) +-	LDR (r21,   r0, 12) +-	LDR (r22,   r0, 13) +-	LDR (r23,   r0, 14) +-	LDR (r24,   r0, 15) +- +-	mov.f  r0, r1 ++	LDR.as blink, r0,  0 ++	LDR.as sp,    r0,  1 ++	LDR.as fp,    r0,  2 ++	LDR.as gp,    r0,  3 ++ ++	LDR.as r13,   r0,  4 ++	LDR.as r14,   r0,  5 ++	LDR.as r15,   r0,  6 ++	LDR.as r16,   r0,  7 ++	LDR.as r17,   r0,  8 ++	LDR.as r18,   r0,  9 ++	LDR.as r19,   r0, 10 ++	LDR.as r20,   r0, 11 ++	LDR.as r21,   r0, 12 ++	LDR.as r22,   r0, 13 ++	LDR.as r23,   r0, 14 ++	LDR.as r24,   r0, 15 ++ ++#if defined(__ARCV3__) ++	LDR.as r25,   r0, 16 ++	LDR.as r26,   r0, 17 ++#endif ++ ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	FLDR.as	f16,  r0, 18 ++	FLDR.as	f17,  r0, 19 ++	FLDR.as	f18,  r0, 20 ++	FLDR.as	f19,  r0, 21 ++	FLDR.as	f20,  r0, 22 ++	FLDR.as	f21,  r0, 23 ++	FLDR.as	f22,  r0, 24 ++	FLDR.as	f23,  r0, 25 ++	FLDR.as	f24,  r0, 26 ++	FLDR.as	f25,  r0, 27 ++	FLDR.as	f26,  r0, 28 ++	FLDR.as	f27,  r0, 29 ++	FLDR.as	f28,  r0, 30 ++	FLDR.as	f29,  r0, 31 ++	FLDR.as	f30,  r0, 32 ++	FLDR.as	f31,  r0, 33 ++#endif ++ ++	MOVR.f r0, r1 + 	j.d    [blink] + 	mov.z  r0, 1	/* don't return 0 to setjmp callsite from longjmp.  */ +  +diff --git a/sysdeps/arc/arc32/Implies b/sysdeps/arc/arc32/Implies +new file mode 100644 +index 0000000000..39a34c5f57 +--- /dev/null ++++ b/sysdeps/arc/arc32/Implies +@@ -0,0 +1 @@ ++wordsize-32 +diff --git a/sysdeps/arc/arc64/Implies b/sysdeps/arc/arc64/Implies +new file mode 100644 +index 0000000000..a8cae95f9d +--- /dev/null ++++ b/sysdeps/arc/arc64/Implies +@@ -0,0 +1 @@ ++wordsize-64 +diff --git a/sysdeps/arc/arc64/fpu/libm-test-ulps b/sysdeps/arc/arc64/fpu/libm-test-ulps +new file mode 100644 +index 0000000000..f3b8753c4d +--- /dev/null ++++ b/sysdeps/arc/arc64/fpu/libm-test-ulps +@@ -0,0 +1,1141 @@ ++# Begin of automatic generation ++ ++# Maximal error of functions: ++Function: "acos": ++double: 1 ++float: 1 ++ ++Function: "acos_downward": ++double: 1 ++float: 1 ++ ++Function: "acos_towardzero": ++double: 1 ++float: 1 ++ ++Function: "acos_upward": ++double: 1 ++float: 1 ++ ++Function: "acosh": ++double: 2 ++float: 2 ++ ++Function: "acosh_downward": ++double: 2 ++float: 2 ++ ++Function: "acosh_towardzero": ++double: 2 ++float: 2 ++ ++Function: "acosh_upward": ++double: 2 ++float: 2 ++ ++Function: "asin": ++double: 1 ++float: 1 ++ ++Function: "asin_downward": ++double: 1 ++float: 1 ++ ++Function: "asin_towardzero": ++double: 1 ++float: 1 ++ ++Function: "asin_upward": ++double: 2 ++float: 1 ++ ++Function: "asinh": ++double: 2 ++float: 2 ++ ++Function: "asinh_downward": ++double: 3 ++float: 3 ++ ++Function: "asinh_towardzero": ++double: 2 ++float: 2 ++ ++Function: "asinh_upward": ++double: 3 ++float: 3 ++ ++Function: "atan": ++double: 1 ++float: 1 ++ ++Function: "atan2": ++float: 1 ++ ++Function: "atan2_downward": ++double: 1 ++float: 2 ++ ++Function: "atan2_towardzero": ++double: 1 ++float: 2 ++ ++Function: "atan2_upward": ++double: 1 ++float: 1 ++ ++Function: "atan_downward": ++double: 1 ++float: 2 ++ ++Function: "atan_towardzero": ++double: 1 ++float: 1 ++ ++Function: "atan_upward": ++double: 1 ++float: 2 ++ ++Function: "atanh": ++double: 2 ++float: 2 ++ ++Function: "atanh_downward": ++double: 3 ++float: 3 ++ ++Function: "atanh_towardzero": ++double: 2 ++float: 2 ++ ++Function: "atanh_upward": ++double: 3 ++float: 3 ++ ++Function: "cabs": ++double: 1 ++ ++Function: "cabs_downward": ++double: 1 ++ ++Function: "cabs_towardzero": ++double: 1 ++ ++Function: "cabs_upward": ++double: 1 ++float: 1 ++ ++Function: Real part of "cacos": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "cacos": ++double: 2 ++float: 2 ++ ++Function: Real part of "cacos_downward": ++double: 3 ++float: 2 ++ ++Function: Imaginary part of "cacos_downward": ++double: 5 ++float: 3 ++ ++Function: Real part of "cacos_towardzero": ++double: 3 ++float: 2 ++ ++Function: Imaginary part of "cacos_towardzero": ++double: 4 ++float: 2 ++ ++Function: Real part of "cacos_upward": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "cacos_upward": ++double: 5 ++float: 5 ++ ++Function: Real part of "cacosh": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "cacosh": ++double: 1 ++float: 2 ++ ++Function: Real part of "cacosh_downward": ++double: 4 ++float: 2 ++ ++Function: Imaginary part of "cacosh_downward": ++double: 3 ++float: 3 ++ ++Function: Real part of "cacosh_towardzero": ++double: 4 ++float: 2 ++ ++Function: Imaginary part of "cacosh_towardzero": ++double: 3 ++float: 2 ++ ++Function: Real part of "cacosh_upward": ++double: 4 ++float: 3 ++ ++Function: Imaginary part of "cacosh_upward": ++double: 3 ++float: 2 ++ ++Function: "carg": ++float: 1 ++ ++Function: "carg_downward": ++double: 1 ++float: 2 ++ ++Function: "carg_towardzero": ++double: 1 ++float: 2 ++ ++Function: "carg_upward": ++double: 1 ++float: 1 ++ ++Function: Real part of "casin": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "casin": ++double: 2 ++float: 2 ++ ++Function: Real part of "casin_downward": ++double: 3 ++float: 2 ++ ++Function: Imaginary part of "casin_downward": ++double: 5 ++float: 3 ++ ++Function: Real part of "casin_towardzero": ++double: 3 ++float: 1 ++ ++Function: Imaginary part of "casin_towardzero": ++double: 4 ++float: 2 ++ ++Function: Real part of "casin_upward": ++double: 3 ++float: 2 ++ ++Function: Imaginary part of "casin_upward": ++double: 5 ++float: 5 ++ ++Function: Real part of "casinh": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "casinh": ++double: 1 ++float: 1 ++ ++Function: Real part of "casinh_downward": ++double: 5 ++float: 3 ++ ++Function: Imaginary part of "casinh_downward": ++double: 3 ++float: 2 ++ ++Function: Real part of "casinh_towardzero": ++double: 4 ++float: 2 ++ ++Function: Imaginary part of "casinh_towardzero": ++double: 3 ++float: 1 ++ ++Function: Real part of "casinh_upward": ++double: 5 ++float: 5 ++ ++Function: Imaginary part of "casinh_upward": ++double: 3 ++float: 2 ++ ++Function: Real part of "catan": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "catan": ++double: 1 ++float: 1 ++ ++Function: Real part of "catan_downward": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "catan_downward": ++double: 2 ++float: 2 ++ ++Function: Real part of "catan_towardzero": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "catan_towardzero": ++double: 2 ++float: 2 ++ ++Function: Real part of "catan_upward": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "catan_upward": ++double: 2 ++float: 2 ++ ++Function: Real part of "catanh": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "catanh": ++double: 1 ++float: 1 ++ ++Function: Real part of "catanh_downward": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "catanh_downward": ++double: 1 ++float: 2 ++ ++Function: Real part of "catanh_towardzero": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "catanh_towardzero": ++double: 1 ++float: 2 ++ ++Function: Real part of "catanh_upward": ++double: 4 ++float: 4 ++ ++Function: Imaginary part of "catanh_upward": ++double: 1 ++float: 1 ++ ++Function: "cbrt": ++double: 4 ++float: 1 ++ ++Function: "cbrt_downward": ++double: 4 ++float: 1 ++ ++Function: "cbrt_towardzero": ++double: 3 ++float: 1 ++ ++Function: "cbrt_upward": ++double: 5 ++float: 1 ++ ++Function: Real part of "ccos": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "ccos": ++double: 1 ++float: 1 ++ ++Function: Real part of "ccos_downward": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "ccos_downward": ++double: 3 ++float: 3 ++ ++Function: Real part of "ccos_towardzero": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "ccos_towardzero": ++double: 3 ++float: 3 ++ ++Function: Real part of "ccos_upward": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "ccos_upward": ++double: 2 ++float: 2 ++ ++Function: Real part of "ccosh": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "ccosh": ++double: 1 ++float: 1 ++ ++Function: Real part of "ccosh_downward": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "ccosh_downward": ++double: 3 ++float: 3 ++ ++Function: Real part of "ccosh_towardzero": ++double: 2 ++float: 3 ++ ++Function: Imaginary part of "ccosh_towardzero": ++double: 3 ++float: 3 ++ ++Function: Real part of "ccosh_upward": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "ccosh_upward": ++double: 2 ++float: 2 ++ ++Function: Real part of "cexp": ++double: 2 ++float: 1 ++ ++Function: Imaginary part of "cexp": ++double: 1 ++float: 2 ++ ++Function: Real part of "cexp_downward": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "cexp_downward": ++double: 3 ++float: 3 ++ ++Function: Real part of "cexp_towardzero": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "cexp_towardzero": ++double: 3 ++float: 3 ++ ++Function: Real part of "cexp_upward": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "cexp_upward": ++double: 3 ++float: 2 ++ ++Function: Real part of "clog": ++double: 3 ++float: 3 ++ ++Function: Imaginary part of "clog": ++double: 1 ++float: 1 ++ ++Function: Real part of "clog10": ++double: 3 ++float: 4 ++ ++Function: Imaginary part of "clog10": ++double: 2 ++float: 2 ++ ++Function: Real part of "clog10_downward": ++double: 5 ++float: 5 ++ ++Function: Imaginary part of "clog10_downward": ++double: 2 ++float: 4 ++ ++Function: Real part of "clog10_towardzero": ++double: 5 ++float: 6 ++ ++Function: Imaginary part of "clog10_towardzero": ++double: 2 ++float: 4 ++ ++Function: Real part of "clog10_upward": ++double: 6 ++float: 5 ++ ++Function: Imaginary part of "clog10_upward": ++double: 2 ++float: 4 ++ ++Function: Real part of "clog_downward": ++double: 4 ++float: 3 ++ ++Function: Imaginary part of "clog_downward": ++double: 1 ++float: 2 ++ ++Function: Real part of "clog_towardzero": ++double: 4 ++float: 4 ++ ++Function: Imaginary part of "clog_towardzero": ++double: 1 ++float: 3 ++ ++Function: Real part of "clog_upward": ++double: 4 ++float: 3 ++ ++Function: Imaginary part of "clog_upward": ++double: 1 ++float: 2 ++ ++Function: "cos": ++double: 1 ++float: 1 ++ ++Function: "cos_downward": ++double: 1 ++float: 1 ++ ++Function: "cos_towardzero": ++double: 1 ++float: 1 ++ ++Function: "cos_upward": ++double: 1 ++float: 1 ++ ++Function: "cosh": ++double: 2 ++float: 2 ++ ++Function: "cosh_downward": ++double: 3 ++float: 2 ++ ++Function: "cosh_towardzero": ++double: 3 ++float: 2 ++ ++Function: "cosh_upward": ++double: 2 ++float: 2 ++ ++Function: Real part of "cpow": ++double: 2 ++float: 5 ++ ++Function: Imaginary part of "cpow": ++float: 2 ++ ++Function: Real part of "cpow_downward": ++double: 5 ++float: 8 ++ ++Function: Imaginary part of "cpow_downward": ++double: 1 ++float: 2 ++ ++Function: Real part of "cpow_towardzero": ++double: 5 ++float: 8 ++ ++Function: Imaginary part of "cpow_towardzero": ++double: 1 ++float: 2 ++ ++Function: Real part of "cpow_upward": ++double: 4 ++float: 1 ++ ++Function: Imaginary part of "cpow_upward": ++double: 1 ++float: 2 ++ ++Function: Real part of "csin": ++double: 1 ++float: 1 ++ ++Function: Real part of "csin_downward": ++double: 3 ++float: 3 ++ ++Function: Imaginary part of "csin_downward": ++double: 1 ++float: 1 ++ ++Function: Real part of "csin_towardzero": ++double: 3 ++float: 3 ++ ++Function: Imaginary part of "csin_towardzero": ++double: 1 ++float: 1 ++ ++Function: Real part of "csin_upward": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "csin_upward": ++double: 1 ++float: 2 ++ ++Function: Real part of "csinh": ++float: 1 ++ ++Function: Imaginary part of "csinh": ++double: 1 ++float: 1 ++ ++Function: Real part of "csinh_downward": ++double: 2 ++float: 1 ++ ++Function: Imaginary part of "csinh_downward": ++double: 3 ++float: 3 ++ ++Function: Real part of "csinh_towardzero": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "csinh_towardzero": ++double: 3 ++float: 3 ++ ++Function: Real part of "csinh_upward": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "csinh_upward": ++double: 2 ++float: 2 ++ ++Function: Real part of "csqrt": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "csqrt": ++double: 2 ++float: 2 ++ ++Function: Real part of "csqrt_downward": ++double: 5 ++float: 4 ++ ++Function: Imaginary part of "csqrt_downward": ++double: 4 ++float: 3 ++ ++Function: Real part of "csqrt_towardzero": ++double: 4 ++float: 3 ++ ++Function: Imaginary part of "csqrt_towardzero": ++double: 4 ++float: 3 ++ ++Function: Real part of "csqrt_upward": ++double: 5 ++float: 4 ++ ++Function: Imaginary part of "csqrt_upward": ++double: 3 ++float: 3 ++ ++Function: Real part of "ctan": ++double: 1 ++float: 1 ++ ++Function: Imaginary part of "ctan": ++double: 2 ++float: 2 ++ ++Function: Real part of "ctan_downward": ++double: 6 ++float: 5 ++ ++Function: Imaginary part of "ctan_downward": ++double: 2 ++float: 2 ++ ++Function: Real part of "ctan_towardzero": ++double: 5 ++float: 2 ++ ++Function: Imaginary part of "ctan_towardzero": ++double: 2 ++float: 2 ++ ++Function: Real part of "ctan_upward": ++double: 2 ++float: 4 ++ ++Function: Imaginary part of "ctan_upward": ++double: 1 ++float: 2 ++ ++Function: Real part of "ctanh": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "ctanh": ++double: 2 ++float: 2 ++ ++Function: Real part of "ctanh_downward": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "ctanh_downward": ++double: 6 ++float: 5 ++ ++Function: Real part of "ctanh_towardzero": ++double: 2 ++float: 2 ++ ++Function: Imaginary part of "ctanh_towardzero": ++double: 5 ++float: 2 ++ ++Function: Real part of "ctanh_upward": ++double: 1 ++float: 2 ++ ++Function: Imaginary part of "ctanh_upward": ++double: 3 ++float: 3 ++ ++Function: "erf": ++double: 1 ++float: 1 ++ ++Function: "erf_downward": ++double: 1 ++float: 1 ++ ++Function: "erf_towardzero": ++double: 1 ++float: 1 ++ ++Function: "erf_upward": ++double: 1 ++float: 1 ++ ++Function: "erfc": ++double: 3 ++float: 3 ++ ++Function: "erfc_downward": ++double: 4 ++float: 4 ++ ++Function: "erfc_towardzero": ++double: 3 ++float: 3 ++ ++Function: "erfc_upward": ++double: 4 ++float: 4 ++ ++Function: "exp": ++double: 1 ++float: 1 ++ ++Function: "exp10": ++double: 2 ++float: 1 ++ ++Function: "exp10_downward": ++double: 3 ++float: 1 ++ ++Function: "exp10_towardzero": ++double: 3 ++float: 1 ++ ++Function: "exp10_upward": ++double: 2 ++float: 1 ++ ++Function: "exp2": ++double: 1 ++ ++Function: "exp2_downward": ++double: 1 ++float: 1 ++ ++Function: "exp2_towardzero": ++double: 1 ++float: 1 ++ ++Function: "exp2_upward": ++double: 1 ++float: 1 ++ ++Function: "exp_downward": ++double: 1 ++float: 1 ++ ++Function: "exp_towardzero": ++double: 1 ++float: 1 ++ ++Function: "exp_upward": ++double: 1 ++float: 1 ++ ++Function: "expm1": ++double: 1 ++float: 1 ++ ++Function: "expm1_downward": ++double: 1 ++float: 1 ++ ++Function: "expm1_towardzero": ++double: 1 ++float: 2 ++ ++Function: "expm1_upward": ++double: 1 ++float: 1 ++ ++Function: "gamma": ++double: 4 ++float: 7 ++ ++Function: "gamma_downward": ++double: 4 ++float: 4 ++ ++Function: "gamma_towardzero": ++double: 4 ++float: 3 ++ ++Function: "gamma_upward": ++double: 4 ++float: 5 ++ ++Function: "hypot": ++double: 1 ++float: 1 ++ ++Function: "hypot_downward": ++double: 1 ++float: 1 ++ ++Function: "hypot_towardzero": ++double: 1 ++float: 1 ++ ++Function: "hypot_upward": ++double: 1 ++float: 1 ++ ++Function: "j0": ++double: 4 ++float: 9 ++ ++Function: "j0_downward": ++double: 6 ++float: 8 ++ ++Function: "j0_towardzero": ++double: 4 ++float: 9 ++ ++Function: "j0_upward": ++double: 4 ++float: 9 ++ ++Function: "j1": ++double: 3 ++float: 9 ++ ++Function: "j1_downward": ++double: 9 ++float: 9 ++ ++Function: "j1_towardzero": ++double: 5 ++float: 9 ++ ++Function: "j1_upward": ++double: 5 ++float: 8 ++ ++Function: "jn": ++double: 4 ++float: 4 ++ ++Function: "jn_downward": ++double: 4 ++float: 5 ++ ++Function: "jn_towardzero": ++double: 4 ++float: 5 ++ ++Function: "jn_upward": ++double: 5 ++float: 5 ++ ++Function: "lgamma": ++double: 4 ++float: 7 ++ ++Function: "lgamma_downward": ++double: 4 ++float: 4 ++ ++Function: "lgamma_towardzero": ++double: 4 ++float: 3 ++ ++Function: "lgamma_upward": ++double: 4 ++float: 5 ++ ++Function: "log": ++double: 1 ++ ++Function: "log10": ++double: 2 ++float: 2 ++ ++Function: "log10_downward": ++double: 2 ++float: 3 ++ ++Function: "log10_towardzero": ++double: 2 ++float: 2 ++ ++Function: "log10_upward": ++double: 2 ++float: 2 ++ ++Function: "log1p": ++double: 1 ++float: 1 ++ ++Function: "log1p_downward": ++double: 1 ++float: 2 ++ ++Function: "log1p_towardzero": ++double: 2 ++float: 2 ++ ++Function: "log1p_upward": ++double: 2 ++float: 2 ++ ++Function: "log2": ++double: 2 ++float: 1 ++ ++Function: "log2_downward": ++double: 1 ++float: 1 ++ ++Function: "log2_towardzero": ++double: 1 ++float: 1 ++ ++Function: "log2_upward": ++double: 1 ++float: 1 ++ ++Function: "log_downward": ++double: 1 ++float: 1 ++ ++Function: "log_towardzero": ++double: 1 ++float: 1 ++ ++Function: "log_upward": ++double: 1 ++float: 1 ++ ++Function: "pow": ++double: 1 ++ ++Function: "pow_downward": ++double: 1 ++float: 1 ++ ++Function: "pow_towardzero": ++double: 1 ++float: 1 ++ ++Function: "pow_upward": ++double: 1 ++float: 1 ++ ++Function: "sin": ++double: 1 ++float: 1 ++ ++Function: "sin_downward": ++double: 1 ++float: 1 ++ ++Function: "sin_towardzero": ++double: 1 ++float: 1 ++ ++Function: "sin_upward": ++double: 1 ++float: 1 ++ ++Function: "sincos": ++double: 1 ++float: 1 ++ ++Function: "sincos_downward": ++double: 1 ++float: 1 ++ ++Function: "sincos_towardzero": ++double: 1 ++float: 1 ++ ++Function: "sincos_upward": ++double: 1 ++float: 1 ++ ++Function: "sinh": ++double: 2 ++float: 2 ++ ++Function: "sinh_downward": ++double: 3 ++float: 3 ++ ++Function: "sinh_towardzero": ++double: 3 ++float: 2 ++ ++Function: "sinh_upward": ++double: 3 ++float: 3 ++ ++Function: "tan": ++float: 1 ++ ++Function: "tan_downward": ++double: 1 ++float: 2 ++ ++Function: "tan_towardzero": ++double: 1 ++float: 1 ++ ++Function: "tan_upward": ++double: 1 ++float: 1 ++ ++Function: "tanh": ++double: 2 ++float: 2 ++ ++Function: "tanh_downward": ++double: 3 ++float: 3 ++ ++Function: "tanh_towardzero": ++double: 2 ++float: 2 ++ ++Function: "tanh_upward": ++double: 3 ++float: 3 ++ ++Function: "tgamma": ++double: 9 ++float: 8 ++ ++Function: "tgamma_downward": ++double: 9 ++float: 7 ++ ++Function: "tgamma_towardzero": ++double: 9 ++float: 7 ++ ++Function: "tgamma_upward": ++double: 8 ++float: 8 ++ ++Function: "y0": ++double: 3 ++float: 8 ++ ++Function: "y0_downward": ++double: 3 ++float: 8 ++ ++Function: "y0_towardzero": ++double: 3 ++float: 8 ++ ++Function: "y0_upward": ++double: 2 ++float: 8 ++ ++Function: "y1": ++double: 3 ++float: 9 ++ ++Function: "y1_downward": ++double: 6 ++float: 8 ++ ++Function: "y1_towardzero": ++double: 3 ++float: 9 ++ ++Function: "y1_upward": ++double: 6 ++float: 9 ++ ++Function: "yn": ++double: 3 ++float: 3 ++ ++Function: "yn_downward": ++double: 3 ++float: 4 ++ ++Function: "yn_towardzero": ++double: 3 ++float: 3 ++ ++Function: "yn_upward": ++double: 4 ++float: 5 ++ ++# end of automatic generation +diff --git a/sysdeps/arc/arc64/fpu/libm-test-ulps-name b/sysdeps/arc/arc64/fpu/libm-test-ulps-name +new file mode 100644 +index 0000000000..8c4fba4f9a +--- /dev/null ++++ b/sysdeps/arc/arc64/fpu/libm-test-ulps-name +@@ -0,0 +1 @@ ++ARC +diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/arc64/nofpu/libm-test-ulps +similarity index 99% +copy from sysdeps/arc/nofpu/libm-test-ulps +copy to sysdeps/arc/arc64/nofpu/libm-test-ulps +index 6ac2830b25..26632ff8f2 100644 +--- a/sysdeps/arc/nofpu/libm-test-ulps ++++ b/sysdeps/arc/arc64/nofpu/libm-test-ulps +@@ -205,6 +205,7 @@ float: 7 +  + Function: "hypot": + double: 1 ++float: 1 +  + Function: "j0": + double: 2 +diff --git a/sysdeps/arc/arc64/nofpu/libm-test-ulps-name b/sysdeps/arc/arc64/nofpu/libm-test-ulps-name +new file mode 100644 +index 0000000000..8a9879ebd6 +--- /dev/null ++++ b/sysdeps/arc/arc64/nofpu/libm-test-ulps-name +@@ -0,0 +1 @@ ++ARC soft-float +diff --git a/sysdeps/arc/atomic-machine.h b/sysdeps/arc/atomic-machine.h +index 6ac3d87dd9..f1565b317b 100644 +--- a/sysdeps/arc/atomic-machine.h ++++ b/sysdeps/arc/atomic-machine.h +@@ -19,7 +19,23 @@ + #ifndef _ARC_BITS_ATOMIC_H + #define _ARC_BITS_ATOMIC_H 1 +  +-#define __HAVE_64B_ATOMICS 0 ++#include <stdint.h> ++ ++typedef int32_t atomic32_t; ++typedef uint32_t uatomic32_t; ++typedef int64_t atomic64_t; ++typedef uint64_t uatomic64_t; ++ ++typedef intptr_t atomicptr_t; ++typedef uintptr_t uatomicptr_t; ++typedef intmax_t atomic_max_t; ++typedef uintmax_t uatomic_max_t; ++ ++# if defined(__ARC64_ARCH64__) ++#  define __HAVE_64B_ATOMICS 1 ++# else ++#  define __HAVE_64B_ATOMICS 0 ++# endif + #define USE_ATOMIC_COMPILER_BUILTINS 1 +  + /* ARC does have legacy atomic EX reg, [mem] instruction but the micro-arch +@@ -30,15 +46,16 @@ +   (abort (), 0) + #define __arch_compare_and_exchange_bool_16_acq(mem, newval, oldval)	\ +   (abort (), 0) +-#define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval)	\ +-  (abort (), 0) ++ ++# if !defined(__ARC64__) ++#  define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval)	\ ++    (abort (), 0) ++#endif +  + #define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model)	\ +   (abort (), (__typeof (*mem)) 0) + #define __arch_compare_and_exchange_val_16_int(mem, newval, oldval, model)	\ +   (abort (), (__typeof (*mem)) 0) +-#define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model)	\ +-  (abort (), (__typeof (*mem)) 0) +  + #define __arch_compare_and_exchange_val_32_int(mem, newval, oldval, model)	\ +   ({										\ +@@ -48,6 +65,20 @@ +     __oldval;                                                           	\ +   }) +  ++# if defined(__ARC64__) ++# define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model)	\ ++  ({										\ ++    typeof (*mem) __oldval = (oldval);                                  	\ ++    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0,    	\ ++                                 model, __ATOMIC_RELAXED);              	\ ++    __oldval;                                                           	\ ++  }) ++# else ++/* ARCv2 has LOCKD/SCOND but not sure if gcc atomic builtins exist.  */ ++#  define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model)	\ ++    (abort (), (__typeof (*mem)) 0) ++#endif ++ + #define atomic_compare_and_exchange_val_acq(mem, new, old)		\ +   __atomic_val_bysize (__arch_compare_and_exchange_val, int,		\ + 		       mem, new, old, __ATOMIC_ACQUIRE) +diff --git a/sysdeps/arc/bits/setjmp.h b/sysdeps/arc/bits/setjmp.h +index d1604cde1f..2ca85a679d 100644 +--- a/sysdeps/arc/bits/setjmp.h ++++ b/sysdeps/arc/bits/setjmp.h +@@ -20,7 +20,11 @@ + #define _ARC_BITS_SETJMP_H 1 +  + /* Saves r13-r25 (callee-saved), fp (frame pointer), sp (stack pointer), +-   blink (branch-n-link).  */ ++   blink (branch-n-link), FP regs.  */ ++#if defined (__ARC_FLOAT_ABI_HARD__) ++typedef long int __jmp_buf[64]; ++#else + typedef long int __jmp_buf[32]; ++#endif +  + #endif +diff --git a/sysdeps/arc/configure b/sysdeps/arc/configure +index 7b27e26490..d7b19db793 100644 +--- a/sysdeps/arc/configure ++++ b/sysdeps/arc/configure +@@ -10,7 +10,7 @@ libc_cv_asm_line_sep='`' + printf "%s\n" "#define ASM_LINE_SEP $libc_cv_asm_line_sep" >>confdefs.h +  +  +-# For big endian ABI, generate a symbol for selecting right dynamic linker ++# For arc64:64 generate a symbol for selecting right dynamic linker +  +  + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +@@ -155,6 +155,77 @@ printf "%s\n" "$ac_cv_path_EGREP" >&6; } +  EGREP="$ac_cv_path_EGREP" +  +  ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for arc64" >&5 ++printf %s "checking for arc64... " >&6; } ++if test ${libc_cv_arc64+y} ++then : ++  printf %s "(cached) " >&6 ++else $as_nop ++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h.  */ ++#ifdef __ARC64_ARCH64__ ++                      yes ++                     #endif ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++  $EGREP "yes" >/dev/null 2>&1 ++then : ++  libc_cv_arc64=yes ++else $as_nop ++  libc_cv_arc64=no ++fi ++rm -rf conftest* ++ ++fi ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_arc64" >&5 ++printf "%s\n" "$libc_cv_arc64" >&6; } ++if test $libc_cv_arc64 = yes; then ++  # For shlib-versions. ++  printf "%s\n" "#define HAVE_ARC64 1" >>confdefs.h ++ ++  config_vars="$config_vars ++default-abi = arc64le" ++ ++else ++ ++# For arc64:32 generate a symbol for selecting right dynamic linker ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for arc32" >&5 ++printf %s "checking for arc32... " >&6; } ++if test ${libc_cv_arc32+y} ++then : ++  printf %s "(cached) " >&6 ++else $as_nop ++  cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h.  */ ++#ifdef __ARC64_ARCH32__ ++                      yes ++                     #endif ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++  $EGREP "yes" >/dev/null 2>&1 ++then : ++  libc_cv_arc32=yes ++else $as_nop ++  libc_cv_arc32=no ++fi ++rm -rf conftest* ++ ++fi ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_arc32" >&5 ++printf "%s\n" "$libc_cv_arc32" >&6; } ++ ++if test $libc_cv_arc32 = yes; then ++  # For shlib-versions. ++  printf "%s\n" "#define HAVE_ARC32 1" >>confdefs.h ++ ++  config_vars="$config_vars ++default-abi = arc32le" ++ ++else ++ ++# For big endian ABI, generate a symbol for selecting right dynamic linker + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for big endian" >&5 + printf %s "checking for big endian... " >&6; } + if test ${libc_cv_arc_be+y} +@@ -189,5 +260,12 @@ default-abi = arcbe" + else +   config_vars="$config_vars + default-abi = arcle" ++# big endian ++fi ++ ++# arc64:32 ++fi ++ ++# arc64:64 + fi +  +diff --git a/sysdeps/arc/configure.ac b/sysdeps/arc/configure.ac +index 619da4e088..4e84f17105 100644 +--- a/sysdeps/arc/configure.ac ++++ b/sysdeps/arc/configure.ac +@@ -9,6 +9,35 @@ libc_cv_have_sdata_section=no + libc_cv_asm_line_sep='`' + AC_DEFINE_UNQUOTED(ASM_LINE_SEP, $libc_cv_asm_line_sep) +  ++# For arc64:64 generate a symbol for selecting right dynamic linker ++AC_CACHE_CHECK([for arc64], ++  [libc_cv_arc64], ++  [AC_EGREP_CPP(yes,[#ifdef __ARC64_ARCH64__ ++                      yes ++                     #endif ++  ], libc_cv_arc64=yes, libc_cv_arc64=no)]) ++if test $libc_cv_arc64 = yes; then ++  # For shlib-versions. ++  AC_DEFINE(HAVE_ARC64) ++  LIBC_CONFIG_VAR([default-abi], [arc64le]) ++ ++else ++ ++# For arc64:32 generate a symbol for selecting right dynamic linker ++AC_CACHE_CHECK([for arc32], ++  [libc_cv_arc32], ++  [AC_EGREP_CPP(yes,[#ifdef __ARC64_ARCH32__ ++                      yes ++                     #endif ++  ], libc_cv_arc32=yes, libc_cv_arc32=no)]) ++ ++if test $libc_cv_arc32 = yes; then ++  # For shlib-versions. ++  AC_DEFINE(HAVE_ARC32) ++  LIBC_CONFIG_VAR([default-abi], [arc32le]) ++ ++else ++ + # For big endian ABI, generate a symbol for selecting right dynamic linker + AC_CACHE_CHECK([for big endian], +   [libc_cv_arc_be], +@@ -22,4 +51,11 @@ if test $libc_cv_arc_be = yes; then +   LIBC_CONFIG_VAR([default-abi], [arcbe]) + else +   LIBC_CONFIG_VAR([default-abi], [arcle]) ++# big endian ++fi ++ ++# arc64:32 ++fi ++ ++# arc64:64 + fi +diff --git a/sysdeps/arc/dl-machine.h b/sysdeps/arc/dl-machine.h +index 4dc652a449..dbb7394c27 100644 +--- a/sysdeps/arc/dl-machine.h ++++ b/sysdeps/arc/dl-machine.h +@@ -32,18 +32,19 @@ + #include <dl-tls.h> + #include <dl-static-tls.h> + #include <dl-machine-rel.h> ++#include <sysdep.h> +  + /* Dynamic Linking ABI for ARCv2 ISA. +  +-                        PLT ++                        .plt +           --------------------------------	<---- DT_PLTGOT +           |  ld r11, [pcl, off-to-GOT[1] |  0 +           |                              |  4 +-   plt0   |  ld r10, [pcl, off-to-GOT[2] |  8 ++   PLT0   |  ld r10, [pcl, off-to-GOT[2] |  8 +           |                              | 12 +           |  j [r10]                     | 16 +           -------------------------------- +-          |    Base address of GOT       | 20 ++          |   Base address of .got.plt   | 20 +           -------------------------------- +           |  ld r12, [pcl, off-to-GOT[3] | 24 +    plt1   |                              | +@@ -69,11 +70,11 @@ +           -------------- +           |    [1]     |  Module info - setup by ld.so +           -------------- +-          |    [2]     |  resolver entry point ++          |    [2]     |  resolver entry point: _dl_runtime_resolve +           -------------- +           |    [3]     | +           |    ...     |  Runtime address for function symbols +-          |    [f]     | ++          |    [f]     |  Initially point to PLT0 +           -------------- +  +    For ARCompact, the PLT is 12 bytes due to short instructions +@@ -91,6 +92,8 @@ static inline int + elf_machine_matches_host (const ElfW(Ehdr) *ehdr) + { +   return (ehdr->e_machine == EM_ARCV2		 /* ARC HS.  */ ++	  || ehdr->e_machine == EM_ARCV3         /* ARCv3: ARC64.  */ ++	  || ehdr->e_machine == EM_ARCV3_32      /* ARCv3: ARC32.  */ + 	  || ehdr->e_machine == EM_ARC_COMPACT); /* ARC 700.  */ + } +  +@@ -114,7 +117,7 @@ elf_machine_load_address (void) +   /* For build address, below generates +      ld  r0, [pcl, _GLOBAL_OFFSET_TABLE_@pcl].  */ +   build_addr = elf_machine_dynamic (); +-  __asm__ ("add %0, pcl, _DYNAMIC@pcl	\n" : "=r" (run_addr)); ++  __asm__ ("ADDR %0, pcl, _DYNAMIC@pcl	\n" : "=r" (run_addr)); +  +   return run_addr - build_addr; + } +@@ -131,10 +134,13 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], +  +   if (l->l_info[DT_JMPREL] && lazy) +     { +-      /* On ARC DT_PLTGOT point to .plt whose 5th word (after the PLT header) +-         contains the address of .got.  */ ++      /* update .got.plt[1] and .got.plt[2]. ++         DT_PLTGOT point to base of .plt and PLT0 is 3 instructions ++         for total of 20 bytes, see illustration at top. ++         The word right after contains base address of .got.plt.  */ +       ElfW(Addr) *plt_base = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]); +-      ElfW(Addr) *got = (ElfW(Addr) *) (plt_base[5] + l->l_addr); ++      ElfW(Addr) *got_build = (ElfW(Addr) *) ((uintptr_t)plt_base + 20); ++      ElfW(Addr) *got = (ElfW(Addr) *) (*got_build + l->l_addr); +  +       got[1] = (ElfW(Addr)) l;	/* Identify this shared object.  */ +  +@@ -152,6 +158,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], +     -optionally adjusts argc for executable if exec passed as cmd +     -calls into app main with address of finaliser.  */ +  ++#ifdef __ARC64_ARCH64__ ++ + #define RTLD_START asm ("\ + .text									\n\ + .globl __start								\n\ +@@ -159,25 +167,55 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], + __start:								\n\ + 	/* (1). bootstrap ld.so.  */					\n\ + 	bl.d    _dl_start                                       	\n\ +-	mov_s   r0, sp  /* pass ptr to aux vector tbl.    */    	\n\ +-	mov r13, r0	/* safekeep app elf entry point.  */		\n\ +-	ld_s    r1, [sp]       /* orig argc.  */			\n\ ++	MOVR    r0, sp  /* pass ptr to aux vector tbl.    */    	\n\ ++	MOVR    r14, r0	/* safekeep app elf entry point.  */		\n\ ++	LDR     r1,  sp       	/* orig argc.  */			\n\ + 									\n\ + 	/* (2). call preinit stuff.  */					\n\ +-	ld	r0, [pcl, _rtld_local@pcl]				\n\ +-	add	r2, sp, 4	; argv					\n\ +-	add2	r3, r2, r1						\n\ +-	add	r3, r3, 4	; env					\n\ ++	LDR	r0, pcl, _rtld_local@pcl				\n\ ++	ADDR	r2, sp, 8	; argv					\n\ ++	ADD3R	r3, r2, r1						\n\ ++	ADDR	r3, r3, 8	; env					\n\ + 	bl	_dl_init@plt						\n\ + 									\n\ + 	/* (3) call app elf entry point.  */				\n\ +-	add     r0, pcl, _dl_fini@pcl					\n\ +-	j	[r13]							\n\ ++	ADDR    r0, pcl, _dl_fini@pcl					\n\ ++	j	[r14]							\n\ + 									\n\ + 	.size  __start,.-__start                               		\n\ + 	.previous                                               	\n\ + "); +  ++#else ++ ++#define RTLD_START asm ("\ ++.text									\n\ ++.globl __start								\n\ ++.type __start, @function						\n\ ++__start:								\n\ ++	/* (1). bootstrap ld.so.  */					\n\ ++	bl.d    _dl_start                                       	\n\ ++	MOVR    r0, sp  /* pass ptr to aux vector tbl.    */    	\n\ ++	MOVR    r14, r0	/* safekeep app elf entry point.  */		\n\ ++	LDR     r1,  sp       	/* orig argc.  */			\n\ ++									\n\ ++	/* (2). call preinit stuff.  */					\n\ ++	LDR	r0, pcl, _rtld_local@pcl				\n\ ++	ADDR	r2, sp, 4	; argv					\n\ ++	ADD2R	r3, r2, r1						\n\ ++	ADDR	r3, r3, 4	; env					\n\ ++	bl	_dl_init@plt						\n\ ++									\n\ ++	/* (3) call app elf entry point.  */				\n\ ++	ADDR    r0, pcl, _dl_fini@pcl					\n\ ++	j	[r14]							\n\ ++									\n\ ++	.size  __start,.-__start                               		\n\ ++	.previous                                               	\n\ ++"); ++ ++#endif ++ + /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so +    PLT entries should not be allowed to define the value. +    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one +@@ -289,6 +327,7 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], +           break; +  +         case R_ARC_32: ++        case R_ARC_64: +           *reloc_addr += value + reloc->r_addend; +           break; +  +diff --git a/sysdeps/arc/dl-trampoline.S b/sysdeps/arc/dl-trampoline.S +index 1b307a616f..386009d41e 100644 +--- a/sysdeps/arc/dl-trampoline.S ++++ b/sysdeps/arc/dl-trampoline.S +@@ -31,42 +31,71 @@ + ENTRY (_dl_runtime_resolve) +  + 	/* save args to func being resolved before entering resolver.  */ +-	push_s	r0 +-	push_s	r1 +-	push_s	r2 +-	push_s	r3 +-	st.a	r4, [sp, -4] +-	st.a	r5, [sp, -4] +-	st.a	r6, [sp, -4] +-	st.a	r7, [sp, -4] +-	st.a	r8, [sp, -4] +-	st.a	r9, [sp, -4] +-	cfi_adjust_cfa_offset (40) +-	push_s	blink +-	cfi_adjust_cfa_offset (4) ++	PUSHR	r0 ++	PUSHR	r1 ++	PUSHR	r2 ++	PUSHR	r3 ++	PUSHR	r4 ++	PUSHR	r5 ++	PUSHR	r6 ++	PUSHR	r7 ++	PUSHR	r8 ++	PUSHR	r9 ++ ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	FPUSHR	f0 ++	FPUSHR	f1 ++	FPUSHR	f2 ++	FPUSHR	f3 ++	FPUSHR	f4 ++	FPUSHR	f5 ++	FPUSHR	f6 ++	FPUSHR	f7 ++	cfi_adjust_cfa_offset (18*REGSZ) ++#else ++	cfi_adjust_cfa_offset (10*REGSZ) ++#endif ++ ++	PUSHR	blink ++	cfi_adjust_cfa_offset (REGSZ) + 	cfi_rel_offset (blink, 0) +  +-	mov_s 	r1, r12 ++	MOVR 	r1, r12 + 	bl.d  	_dl_fixup +-	mov   	r0, r11 ++	MOVR   	r0, r11 +  + 	/* restore regs back.  */ +-	ld.ab	blink,[sp, 4] +-	cfi_adjust_cfa_offset (-4) ++	POPR	blink ++	cfi_adjust_cfa_offset (-REGSZ) + 	cfi_restore (blink) +-	ld.ab	r9, [sp, 4] +-	ld.ab	r8, [sp, 4] +-	ld.ab	r7, [sp, 4] +-	ld.ab	r6, [sp, 4] +-	ld.ab	r5, [sp, 4] +-	ld.ab	r4, [sp, 4] +-	pop_s   r3 +-	pop_s   r2 +-	pop_s   r1 +-	cfi_adjust_cfa_offset (-36) +  +-	j_s.d   [r0]    /* r0 has resolved function addr.  */ +-	pop_s   r0      /* restore first arg to resolved call.  */ +-	cfi_adjust_cfa_offset (-4) ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	FPOPR	f7 ++	FPOPR	f6 ++	FPOPR	f5 ++	FPOPR	f4 ++	FPOPR	f3 ++	FPOPR	f2 ++	FPOPR	f1 ++	FPOPR	f0 ++#endif ++	POPR    r9 ++	POPR    r8 ++	POPR    r7 ++	POPR    r6 ++	POPR    r5 ++	POPR    r4 ++	POPR    r3 ++	POPR    r2 ++	POPR    r1 ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	cfi_adjust_cfa_offset (-17*REGSZ) ++#else ++	cfi_adjust_cfa_offset (-9*REGSZ) ++#endif ++ ++	j.d   [r0]    /* r0 has resolved function addr.  */ ++	POPR    r0      /* restore first arg to resolved call.  */ ++	cfi_adjust_cfa_offset (-REGSZ) + 	cfi_restore (r0) + END (_dl_runtime_resolve) +diff --git a/sysdeps/arc/fpu/math-use-builtins-fma.h b/sysdeps/arc/fpu/math-use-builtins-fma.h +index 2acd8113ce..59c7ed0343 100644 +--- a/sysdeps/arc/fpu/math-use-builtins-fma.h ++++ b/sysdeps/arc/fpu/math-use-builtins-fma.h +@@ -1,13 +1,17 @@ +-#if defined __ARC_FPU_DP_FMA__ ++#if defined __ARCV3__ + # define USE_FMA_BUILTIN 1 +-#else +-# define USE_FMA_BUILTIN 0 +-#endif +- +-#if defined __ARC_FPU_SP_FMA__ + # define USE_FMAF_BUILTIN 1 + #else +-# define USE_FMAF_BUILTIN 0 ++# if defined __ARC_FPU_DP_FMA__ ++#  define USE_FMA_BUILTIN 1 ++# else ++#  define USE_FMA_BUILTIN 0 ++# endif ++# if defined __ARC_FPU_SP_FMA__ ++#  define USE_FMAF_BUILTIN 1 ++# else ++#  define USE_FMAF_BUILTIN 0 ++# endif + #endif +  + #define USE_FMAL_BUILTIN 0 +diff --git a/sysdeps/arc/fpu/math-use-builtins-sqrt.h b/sysdeps/arc/fpu/math-use-builtins-sqrt.h +index a449bc6092..40a07730ea 100644 +--- a/sysdeps/arc/fpu/math-use-builtins-sqrt.h ++++ b/sysdeps/arc/fpu/math-use-builtins-sqrt.h +@@ -1,13 +1,17 @@ +-#if defined __ARC_FPU_DP_DIV__ ++#if defined __ARCV3__ + # define USE_SQRT_BUILTIN 1 +-#else +-# define USE_SQRT_BUILTIN 0 +-#endif +- +-#if defined __ARC_FPU_SP_DIV__ + # define USE_SQRTF_BUILTIN 1 + #else +-# define USE_SQRTF_BUILTIN 0 ++# if defined __ARC_FPU_DP_DIV__ ++#  define USE_SQRT_BUILTIN 1 ++# else ++#  define USE_SQRT_BUILTIN 0 ++# endif ++# if defined __ARC_FPU_SP_DIV__ ++#  define USE_SQRTF_BUILTIN 1 ++# else ++#  define USE_SQRTF_BUILTIN 0 ++# endif + #endif +  + #define USE_SQRTL_BUILTIN 0 +diff --git a/sysdeps/arc/isa-asm-macro-32.h b/sysdeps/arc/isa-asm-macro-32.h +new file mode 100644 +index 0000000000..98cd249059 +--- /dev/null ++++ b/sysdeps/arc/isa-asm-macro-32.h +@@ -0,0 +1,61 @@ ++#  define REGSZ 4 ++ ++.irp    aa,,.as ++.macro LDR\aa d, s, off=0 ++	ld\aa  \d, [\s, \off] ++.endm ++.endr ++ ++.irp    aa,,.as ++.macro STR\aa d, s, off=0 ++	st\aa \d, [\s, \off] ++.endm ++.endr ++ ++.macro PUSHR r ++	push \r ++.endm ++ ++.macro POPR r ++	pop \r ++.endm ++ ++.irp    cc,,.f ++.macro MOVR\cc d, s ++        mov\cc \d, \s ++.endm ++.endr ++ ++.irp    cc,,.nz ++.macro ADDR\cc d, s, v ++	add\cc \d, \s, \v ++.endm ++.endr ++ ++.macro ADD2R d, s, v ++	add2   \d, \s, \v ++.endm ++ ++.macro ADD3R d, s, v ++	add3   \d, \s, \v ++.endm ++ ++.macro SUBR d, s, v ++	sub    \d, \s, \v ++.endm ++ ++.macro ANDR d, s, v ++	and    \d, \s, \v ++.endm ++ ++.irp    cc,,eq,hi ++.macro BRR\cc d, s, v ++	br\cc  \d, \s, \v ++.endm ++.endr ++ ++.irp    cc,,.ne ++.macro CMPR\cc d, s ++	cmp\cc \d, \s ++.endm ++.endr +diff --git a/sysdeps/arc/isa-asm-macro-64.h b/sysdeps/arc/isa-asm-macro-64.h +new file mode 100644 +index 0000000000..02b1dc2c37 +--- /dev/null ++++ b/sysdeps/arc/isa-asm-macro-64.h +@@ -0,0 +1,86 @@ ++#  define REGSZ 8 ++ ++.irp    aa,,.as ++.macro LDR\aa d, s, off=0 ++	ldl\aa \d, [\s, \off] ++.endm ++.endr ++ ++.irp    aa,,.as ++.macro STR\aa d, s, off=0 ++	stl\aa \d, [\s, \off] ++.endm ++.endr ++ ++.macro PUSHR r ++	pushl \r ++.endm ++ ++.macro POPR r ++	popl \r ++.endm ++ ++.irp    cc,,.f ++.macro MOVR\cc d, s ++        movl\cc \d, \s ++.endm ++.endr ++ ++.irp    cc,,.nz ++.macro ADDR\cc d, s, v ++	addl\cc \d, \s, \v ++.endm ++.endr ++ ++.macro ADD2R d, s, v ++	add2l   \d, \s, \v ++.endm ++ ++.macro ADD3R d, s, v ++	add3l   \d, \s, \v ++.endm ++ ++.macro SUBR d, s, v ++	subl    \d, \s, \v ++.endm ++ ++.macro ANDR d, s, v ++	andl    \d, \s, \v ++.endm ++ ++.irp    cc,eq,hi ++.macro BRR\cc d, s, v ++; arc64 gas doesn't support BRHIL pseudo-instruction ++.ifeqs "\cc","hi" ++	brlo\()l  \s, \d, \v ++.else ++	br\cc\()l \d, \s, \v ++.endif ++.endm ++.endr ++ ++.irp    cc,,.ne ++.macro CMPR\cc d, s ++	cmpl\cc \d, \s ++.endm ++.endr ++ ++.irp    aa,,.as,.aw,.ab ++.macro FLDR\aa d, s, off=0 ++	fld64\aa \d, [\s, \off] ++.endm ++.endr ++ ++.irp    aa,,.as,.aw,.ab ++.macro FSTR\aa d, s, off=0 ++	fst64\aa \d, [\s, \off] ++.endm ++.endr ++ ++.macro FPUSHR r ++	FSTR.aw  \r, sp, -REGSZ ++.endm ++ ++.macro FPOPR r ++	FLDR.ab  \r, sp, REGSZ ++.endm +diff --git a/sysdeps/arc/isa-asm-macros.h b/sysdeps/arc/isa-asm-macros.h +new file mode 100644 +index 0000000000..f9f5e4f630 +--- /dev/null ++++ b/sysdeps/arc/isa-asm-macros.h +@@ -0,0 +1,35 @@ ++/* ISA Specific Assembler macros for ARC. ++   Copyright (C) 2020 Free Software Foundation, Inc. ++   This file is part of the GNU C Library. ++ ++   The GNU C Library is free software; you can redistribute it and/or ++   modify it under the terms of the GNU Lesser General Public License as ++   published by the Free Software Foundation; either version 2.1 of the ++   License, or (at your option) any later version. ++ ++   The GNU C Library 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 ++   Lesser General Public License for more details. ++ ++   You should have received a copy of the GNU Lesser General Public ++   License along with the GNU C Library; if not, see ++   <https://www.gnu.org/licenses/>.  */ ++ ++#ifdef	__ASSEMBLER__ ++ ++# ifdef __ARC64_ARCH64__ ++# include <sysdeps/arc/isa-asm-macro-64.h> ++# else ++# include <sysdeps/arc/isa-asm-macro-32.h> ++# endif ++ ++#else ++ ++# ifdef __ARC64_ARCH64__ ++asm(".include \"sysdeps/arc/isa-asm-macro-64.h\"\n"); ++# else ++asm(".include \"sysdeps/arc/isa-asm-macro-32.h\"\n"); ++# endif ++ ++#endif +diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps +index 6ac2830b25..26632ff8f2 100644 +--- a/sysdeps/arc/nofpu/libm-test-ulps ++++ b/sysdeps/arc/nofpu/libm-test-ulps +@@ -205,6 +205,7 @@ float: 7 +  + Function: "hypot": + double: 1 ++float: 1 +  + Function: "j0": + double: 2 +diff --git a/sysdeps/arc/nptl/pthreaddef.h b/sysdeps/arc/nptl/pthreaddef.h +index 336eded15c..3b51e59a35 100644 +--- a/sysdeps/arc/nptl/pthreaddef.h ++++ b/sysdeps/arc/nptl/pthreaddef.h +@@ -23,7 +23,7 @@ + #define ARCH_MIN_GUARD_SIZE 0 +  + /* Required stack pointer alignment at beginning.  */ +-#define STACK_ALIGN		4 ++#define STACK_ALIGN		8 +  + /* Minimal stack size after allocating thread descriptor and guard size.  */ + #define MINIMAL_REST_STACK	2048 +diff --git a/sysdeps/arc/preconfigure b/sysdeps/arc/preconfigure +index a79db0239a..eab4af0eab 100644 +--- a/sysdeps/arc/preconfigure ++++ b/sysdeps/arc/preconfigure +@@ -1,14 +1,22 @@ + case "$machine" in + arc*) +-  base_machine=arc +-  machine=arc ++  with_fp_cond=0 ++  isarc64=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | grep __LP64__| wc -l` ++ ++  case "$isarc64" in ++  0) ++    base_machine=arc ++    machine=arc/arc32 ++    ;; ++  1) ++    base_machine=arc ++    machine=arc/arc64 ++    ;; ++  esac +  +   gccfloat=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | grep __ARC_FPU_| wc -l` +   if test "$gccfloat" != "0"; then +     with_fp_cond=1 +-  else +-    with_fp_cond=0 +   fi +   ;; +- + esac +diff --git a/sysdeps/arc/setjmp.S b/sysdeps/arc/setjmp.S +index 9ecdb9daae..e39b526837 100644 +--- a/sysdeps/arc/setjmp.S ++++ b/sysdeps/arc/setjmp.S +@@ -41,24 +41,47 @@ ENTRY (__sigsetjmp) + 	   that will be right next to this setjmp call-site in BLINK + 	   since "C" caller of this routine will do a branch-n-link.  */ +  +-	STR (blink, r0,  0) +-	STR (sp,    r0,  1) +-	STR (fp,    r0,  2) +-	STR (gp,    r0,  3) ++	STR.as blink, r0,  0 ++	STR.as sp,    r0,  1 ++	STR.as fp,    r0,  2 ++	STR.as gp,    r0,  3 +  +-	STR (r13,   r0,  4) +-	STR (r14,   r0,  5) +-	STR (r15,   r0,  6) +-	STR (r16,   r0,  7) +-	STR (r17,   r0,  8) +-	STR (r18,   r0,  9) +-	STR (r19,   r0, 10) +-	STR (r20,   r0, 11) +-	STR (r21,   r0, 12) +-	STR (r22,   r0, 13) +-	STR (r23,   r0, 14) +-	STR (r24,   r0, 15) ++	STR.as r13,   r0,  4 ++	STR.as r14,   r0,  5 ++	STR.as r15,   r0,  6 ++	STR.as r16,   r0,  7 ++	STR.as r17,   r0,  8 ++	STR.as r18,   r0,  9 ++	STR.as r19,   r0, 10 ++	STR.as r20,   r0, 11 ++	STR.as r21,   r0, 12 ++	STR.as r22,   r0, 13 ++	STR.as r23,   r0, 14 ++	STR.as r24,   r0, 15 +  ++#if defined(__ARCV3__) ++	STR.as r25,   r0, 16 ++	STR.as r26,   r0, 17 ++#endif ++ ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	FSTR.as	f16,  r0, 18 ++	FSTR.as	f17,  r0, 19 ++	FSTR.as	f18,  r0, 20 ++	FSTR.as	f19,  r0, 21 ++	FSTR.as	f20,  r0, 22 ++	FSTR.as	f21,  r0, 23 ++	FSTR.as	f22,  r0, 24 ++	FSTR.as	f23,  r0, 25 ++	FSTR.as	f24,  r0, 26 ++	FSTR.as	f25,  r0, 27 ++	FSTR.as	f26,  r0, 28 ++	FSTR.as	f27,  r0, 29 ++	FSTR.as	f28,  r0, 30 ++	FSTR.as	f29,  r0, 31 ++	FSTR.as	f30,  r0, 32 ++	FSTR.as	f31,  r0, 33 ++#endif + 	b    __sigjmp_save +  + END (__sigsetjmp) +diff --git a/sysdeps/arc/sfp-machine.h b/sysdeps/arc/sfp-machine.h +index 0917a7ae17..4743b694a2 100644 +--- a/sysdeps/arc/sfp-machine.h ++++ b/sysdeps/arc/sfp-machine.h +@@ -17,10 +17,12 @@ +    <https://www.gnu.org/licenses/>.  */ +  +  +-#define _FP_W_TYPE_SIZE		32 +-#define _FP_W_TYPE		unsigned long +-#define _FP_WS_TYPE		signed long +-#define _FP_I_TYPE		long ++#ifndef __ARC64__ ++ ++# define _FP_W_TYPE_SIZE	32 ++# define _FP_W_TYPE		unsigned long ++# define _FP_WS_TYPE		signed long ++# define _FP_I_TYPE		long +  + #define _FP_MUL_MEAT_S(R,X,Y)				\ +   _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) +@@ -67,4 +69,49 @@ +     R##_c = FP_CLS_NAN;						\ +   } while (0) +  ++#else ++ ++# define _FP_W_TYPE_SIZE	64 ++# define _FP_W_TYPE		unsigned long long ++# define _FP_WS_TYPE		signed long long ++# define _FP_I_TYPE		long long ++ ++# define _FP_MUL_MEAT_S(R, X, Y)					\ ++  _FP_MUL_MEAT_1_imm (_FP_WFRACBITS_S, R, X, Y) ++# define _FP_MUL_MEAT_D(R, X, Y)					\ ++  _FP_MUL_MEAT_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm) ++# define _FP_MUL_MEAT_Q(R, X, Y)					\ ++  _FP_MUL_MEAT_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm) ++ ++# define _FP_MUL_MEAT_DW_S(R, X, Y)					\ ++  _FP_MUL_MEAT_DW_1_imm (_FP_WFRACBITS_S, R, X, Y) ++# define _FP_MUL_MEAT_DW_D(R, X, Y)					\ ++  _FP_MUL_MEAT_DW_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm) ++# define _FP_MUL_MEAT_DW_Q(R, X, Y)					\ ++  _FP_MUL_MEAT_DW_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm) ++ ++# define _FP_DIV_MEAT_S(R, X, Y)	_FP_DIV_MEAT_1_imm (S, R, X, Y, _FP_DIV_HELP_imm) ++# define _FP_DIV_MEAT_D(R, X, Y)	_FP_DIV_MEAT_1_udiv_norm (D, R, X, Y) ++# define _FP_DIV_MEAT_Q(R, X, Y)	_FP_DIV_MEAT_2_udiv (Q, R, X, Y) ++ ++# define _FP_NANFRAC_S		_FP_QNANBIT_S ++# define _FP_NANFRAC_D		_FP_QNANBIT_D ++# define _FP_NANFRAC_Q		_FP_QNANBIT_Q, 0 ++ ++#define _FP_NANSIGN_S		0 ++#define _FP_NANSIGN_D		0 ++#define _FP_NANSIGN_Q		0 ++ ++#define _FP_KEEPNANFRACP 0 ++#define _FP_QNANNEGATEDP 0 ++ ++#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)	\ ++  do {						\ ++    R##_s = _FP_NANSIGN_##fs;			\ ++    _FP_FRAC_SET_##wc (R, _FP_NANFRAC_##fs);	\ ++    R##_c = FP_CLS_NAN;				\ ++  } while (0) ++ ++#endif ++ + #define _FP_TININESS_AFTER_ROUNDING 1 +diff --git a/sysdeps/arc/start.S b/sysdeps/arc/start.S +index db3bab6395..42ead9d302 100644 +--- a/sysdeps/arc/start.S ++++ b/sysdeps/arc/start.S +@@ -57,12 +57,12 @@ ENTRY (ENTRY_POINT) + 	cfi_undefined (blink) +  + 	mov	fp, 0 +-	ld_s	r1, [sp]	/* argc.  */ ++	LDR	r1, sp		/* argc.  */ +  +-	mov_s	r5, r0		/* rltd_fini.  */ +-	add_s	r2, sp, 4	/* argv.  */ +-	and	sp, sp, -8 +-	mov	r6, sp ++	MOVR	r5, r0		/* rltd_fini.  */ ++	ADDR	r2, sp, REGSZ	/* argv.  */ ++	ANDR	sp, sp, -2*REGSZ ++	MOVR	r6, sp +  + 	/* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end).  */ +  +@@ -70,10 +70,10 @@ ENTRY (ENTRY_POINT) + 	mov	r4, 0		/* Used to be fini.  */ +  + #ifdef SHARED +-	ld	r0, [pcl, @main@gotpc] ++	LDR	r0, pcl, @main@gotpc + 	bl	__libc_start_main@plt + #else +-	mov_s	r0, main ++	MOVR	r0, main + 	bl	__libc_start_main + #endif +  +diff --git a/sysdeps/arc/sysdep.h b/sysdeps/arc/sysdep.h +index 4f024f6b73..ba6ecddbac 100644 +--- a/sysdeps/arc/sysdep.h ++++ b/sysdeps/arc/sysdep.h +@@ -47,7 +47,6 @@ +  + # define CALL_MCOUNT		/* Do nothing for now.  */ +  +-# define STR(reg, rbase, off)	st  reg, [rbase, off * 4] +-# define LDR(reg, rbase, off)	ld  reg, [rbase, off * 4] +- + #endif	/* __ASSEMBLER__ */ ++ ++#include <sysdeps/arc/isa-asm-macros.h> +diff --git a/sysdeps/unix/sysv/linux/arc/Makefile b/sysdeps/unix/sysv/linux/arc/Makefile +index eca9a9fd3a..00d655bcd3 100644 +--- a/sysdeps/unix/sysv/linux/arc/Makefile ++++ b/sysdeps/unix/sysv/linux/arc/Makefile +@@ -12,11 +12,13 @@ sysdep_headers += sys/cachectl.h + sysdep_routines += cacheflush + endif +  +-abi-variants := arcle arcbe ++abi-variants := arcle arcbe arc32le arc64le +  + ifeq (,$(filter $(default-abi),$(abi-variants))) + $(error Unknown ABI $(default-abi), must be one of $(abi-variants)) + endif +  +-abi-arcle-condition := !defined __BIG_ENDIAN__ +-abi-arcbe-condition := defined __BIG_ENDIAN__ ++abi-arcle-condition   := !defined __ARC64__        && !defined __BIG_ENDIAN__ ++abi-arcbe-condition   := !defined __ARC64__        &&  defined __BIG_ENDIAN__ ++abi-arc32le-condition :=  defined __ARC64_ARCH32__ && !defined __BIG_ENDIAN__ ++abi-arc64le-condition :=  defined __ARC64_ARCH64__ && !defined __BIG_ENDIAN__ +diff --git a/sysdeps/unix/sysv/linux/arc/arc32/Implies b/sysdeps/unix/sysv/linux/arc/arc32/Implies +new file mode 100644 +index 0000000000..9670973cfa +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/arc/arc32/Implies +@@ -0,0 +1 @@ ++unix/sysv/linux/arc +diff --git a/sysdeps/unix/sysv/linux/arc/arch-syscall.h b/sysdeps/unix/sysv/linux/arc/arc32/arch-syscall.h +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/arch-syscall.h +copy to sysdeps/unix/sysv/linux/arc/arc32/arch-syscall.h +diff --git a/sysdeps/unix/sysv/linux/arc/c++-types.data b/sysdeps/unix/sysv/linux/arc/arc32/c++-types.data +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/c++-types.data +copy to sysdeps/unix/sysv/linux/arc/arc32/c++-types.data +diff --git a/sysdeps/unix/sysv/linux/arc/fixup-asm-unistd.h b/sysdeps/unix/sysv/linux/arc/arc32/fixup-asm-unistd.h +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/fixup-asm-unistd.h +rename to sysdeps/unix/sysv/linux/arc/arc32/fixup-asm-unistd.h +diff --git a/sysdeps/unix/sysv/linux/arc/ld.abilist b/sysdeps/unix/sysv/linux/arc/arc32/ld.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/ld.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/ld.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libBrokenLocale.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libBrokenLocale.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libBrokenLocale.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libanl.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libanl.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libanl.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libanl.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libc.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libc.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libc.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libc_malloc_debug.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libc_malloc_debug.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libcrypt.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libcrypt.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libcrypt.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libcrypt.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libdl.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libdl.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libdl.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libdl.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libm.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libm.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libm.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libm.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libpthread.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libpthread.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libpthread.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libpthread.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libresolv.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libresolv.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libresolv.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libresolv.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/librt.abilist b/sysdeps/unix/sysv/linux/arc/arc32/librt.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/librt.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/librt.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libthread_db.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libthread_db.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libthread_db.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libthread_db.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libutil.abilist b/sysdeps/unix/sysv/linux/arc/arc32/libutil.abilist +similarity index 100% +copy from sysdeps/unix/sysv/linux/arc/libutil.abilist +copy to sysdeps/unix/sysv/linux/arc/arc32/libutil.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/arc64/Implies b/sysdeps/unix/sysv/linux/arc/arc64/Implies +new file mode 100644 +index 0000000000..05abf4461a +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/arc/arc64/Implies +@@ -0,0 +1,2 @@ ++unix/sysv/linux/arc ++unix/sysv/linux/wordsize-64 +diff --git a/sysdeps/unix/sysv/linux/arc/arch-syscall.h b/sysdeps/unix/sysv/linux/arc/arc64/arch-syscall.h +similarity index 89% +rename from sysdeps/unix/sysv/linux/arc/arch-syscall.h +rename to sysdeps/unix/sysv/linux/arc/arc64/arch-syscall.h +index c1207aaa12..c73f38e567 100644 +--- a/sysdeps/unix/sysv/linux/arc/arch-syscall.h ++++ b/sysdeps/unix/sysv/linux/arc/arc64/arch-syscall.h +@@ -15,11 +15,11 @@ + #define __NR_capset 91 + #define __NR_chdir 49 + #define __NR_chroot 51 +-#define __NR_clock_adjtime64 405 +-#define __NR_clock_getres_time64 406 +-#define __NR_clock_gettime64 403 +-#define __NR_clock_nanosleep_time64 407 +-#define __NR_clock_settime64 404 ++#define __NR_clock_adjtime 266 ++#define __NR_clock_getres 114 ++#define __NR_clock_gettime 113 ++#define __NR_clock_nanosleep 115 ++#define __NR_clock_settime 112 + #define __NR_clone 220 + #define __NR_clone3 435 + #define __NR_close 57 +@@ -40,7 +40,7 @@ + #define __NR_exit_group 94 + #define __NR_faccessat 48 + #define __NR_faccessat2 439 +-#define __NR_fadvise64_64 223 ++#define __NR_fadvise64 223 + #define __NR_fallocate 47 + #define __NR_fanotify_init 262 + #define __NR_fanotify_mark 263 +@@ -49,7 +49,7 @@ + #define __NR_fchmodat 53 + #define __NR_fchown 55 + #define __NR_fchownat 54 +-#define __NR_fcntl64 25 ++#define __NR_fcntl 25 + #define __NR_fdatasync 83 + #define __NR_fgetxattr 10 + #define __NR_finit_module 273 +@@ -61,10 +61,11 @@ + #define __NR_fsmount 432 + #define __NR_fsopen 430 + #define __NR_fspick 433 +-#define __NR_fstatfs64 44 ++#define __NR_fstat 80 ++#define __NR_fstatfs 44 + #define __NR_fsync 82 +-#define __NR_ftruncate64 46 +-#define __NR_futex_time64 422 ++#define __NR_ftruncate 46 ++#define __NR_futex 98 + #define __NR_futex_waitv 449 + #define __NR_get_mempolicy 236 + #define __NR_get_robust_list 100 +@@ -101,7 +102,6 @@ + #define __NR_io_destroy 1 + #define __NR_io_getevents 4 + #define __NR_io_pgetevents 292 +-#define __NR_io_pgetevents_time64 416 + #define __NR_io_setup 0 + #define __NR_io_submit 2 + #define __NR_io_uring_enter 426 +@@ -123,9 +123,9 @@ + #define __NR_listen 201 + #define __NR_listxattr 11 + #define __NR_llistxattr 12 +-#define __NR_llseek 62 + #define __NR_lookup_dcookie 18 + #define __NR_lremovexattr 15 ++#define __NR_lseek 62 + #define __NR_lsetxattr 6 + #define __NR_madvise 233 + #define __NR_mbind 235 +@@ -138,7 +138,7 @@ + #define __NR_mlock 228 + #define __NR_mlock2 284 + #define __NR_mlockall 230 +-#define __NR_mmap2 222 ++#define __NR_mmap 222 + #define __NR_mount 40 + #define __NR_mount_setattr 442 + #define __NR_move_mount 429 +@@ -147,8 +147,8 @@ + #define __NR_mq_getsetattr 185 + #define __NR_mq_notify 184 + #define __NR_mq_open 180 +-#define __NR_mq_timedreceive_time64 419 +-#define __NR_mq_timedsend_time64 418 ++#define __NR_mq_timedreceive 183 ++#define __NR_mq_timedsend 182 + #define __NR_mq_unlink 181 + #define __NR_mremap 216 + #define __NR_msgctl 187 +@@ -161,6 +161,7 @@ + #define __NR_munmap 215 + #define __NR_name_to_handle_at 264 + #define __NR_nanosleep 101 ++#define __NR_newfstatat 79 + #define __NR_nfsservctl 42 + #define __NR_open_by_handle_at 265 + #define __NR_open_tree 428 +@@ -176,7 +177,7 @@ + #define __NR_pkey_alloc 289 + #define __NR_pkey_free 290 + #define __NR_pkey_mprotect 288 +-#define __NR_ppoll_time64 414 ++#define __NR_ppoll 73 + #define __NR_prctl 167 + #define __NR_pread64 67 + #define __NR_preadv 69 +@@ -186,7 +187,7 @@ + #define __NR_process_mrelease 448 + #define __NR_process_vm_readv 270 + #define __NR_process_vm_writev 271 +-#define __NR_pselect6_time64 413 ++#define __NR_pselect6 72 + #define __NR_ptrace 117 + #define __NR_pwrite64 68 + #define __NR_pwritev 70 +@@ -199,7 +200,7 @@ + #define __NR_readv 65 + #define __NR_reboot 142 + #define __NR_recvfrom 207 +-#define __NR_recvmmsg_time64 417 ++#define __NR_recvmmsg 243 + #define __NR_recvmsg 212 + #define __NR_remap_file_pages 234 + #define __NR_removexattr 14 +@@ -214,7 +215,7 @@ + #define __NR_rt_sigqueueinfo 138 + #define __NR_rt_sigreturn 139 + #define __NR_rt_sigsuspend 133 +-#define __NR_rt_sigtimedwait_time64 421 ++#define __NR_rt_sigtimedwait 137 + #define __NR_rt_tgsigqueueinfo 240 + #define __NR_sched_get_priority_max 125 + #define __NR_sched_get_priority_min 126 +@@ -222,7 +223,7 @@ + #define __NR_sched_getattr 275 + #define __NR_sched_getparam 121 + #define __NR_sched_getscheduler 120 +-#define __NR_sched_rr_get_interval_time64 423 ++#define __NR_sched_rr_get_interval 127 + #define __NR_sched_setaffinity 122 + #define __NR_sched_setattr 274 + #define __NR_sched_setparam 118 +@@ -232,8 +233,8 @@ + #define __NR_semctl 191 + #define __NR_semget 190 + #define __NR_semop 193 +-#define __NR_semtimedop_time64 420 +-#define __NR_sendfile64 71 ++#define __NR_semtimedop 192 ++#define __NR_sendfile 71 + #define __NR_sendmmsg 269 + #define __NR_sendmsg 211 + #define __NR_sendto 206 +@@ -271,7 +272,7 @@ + #define __NR_socket 198 + #define __NR_socketpair 199 + #define __NR_splice 76 +-#define __NR_statfs64 43 ++#define __NR_statfs 43 + #define __NR_statx 291 + #define __NR_swapoff 225 + #define __NR_swapon 224 +@@ -287,21 +288,21 @@ + #define __NR_timer_create 107 + #define __NR_timer_delete 111 + #define __NR_timer_getoverrun 109 +-#define __NR_timer_gettime64 408 +-#define __NR_timer_settime64 409 ++#define __NR_timer_gettime 108 ++#define __NR_timer_settime 110 + #define __NR_timerfd_create 85 +-#define __NR_timerfd_gettime64 410 +-#define __NR_timerfd_settime64 411 ++#define __NR_timerfd_gettime 87 ++#define __NR_timerfd_settime 86 + #define __NR_times 153 + #define __NR_tkill 130 +-#define __NR_truncate64 45 ++#define __NR_truncate 45 + #define __NR_umask 166 + #define __NR_umount2 39 + #define __NR_uname 160 + #define __NR_unlinkat 35 + #define __NR_unshare 97 + #define __NR_userfaultfd 282 +-#define __NR_utimensat_time64 412 ++#define __NR_utimensat 88 + #define __NR_vhangup 58 + #define __NR_vmsplice 75 + #define __NR_wait4 260 +diff --git a/sysdeps/unix/sysv/linux/arc/c++-types.data b/sysdeps/unix/sysv/linux/arc/arc64/c++-types.data +similarity index 73% +rename from sysdeps/unix/sysv/linux/arc/c++-types.data +rename to sysdeps/unix/sysv/linux/arc/arc64/c++-types.data +index 0fb0143ae7..ac925ccb36 100644 +--- a/sysdeps/unix/sysv/linux/arc/c++-types.data ++++ b/sysdeps/unix/sysv/linux/arc/arc64/c++-types.data +@@ -1,32 +1,32 @@ +-blkcnt64_t:x +-blkcnt_t:x ++blkcnt64_t:l ++blkcnt_t:l + blksize_t:i + caddr_t:Pc + clockid_t:i + clock_t:l + daddr_t:i +-dev_t:y ++dev_t:m + fd_mask:l +-fsblkcnt64_t:y +-fsblkcnt_t:y +-fsfilcnt64_t:y +-fsfilcnt_t:y ++fsblkcnt64_t:m ++fsblkcnt_t:m ++fsfilcnt64_t:m ++fsfilcnt_t:m + fsid_t:8__fsid_t + gid_t:j + id_t:j +-ino64_t:y +-ino_t:y ++ino64_t:m ++ino_t:m + int16_t:s + int32_t:i +-int64_t:x ++int64_t:l + int8_t:a +-intptr_t:i ++intptr_t:l + key_t:i +-loff_t:x ++loff_t:l + mode_t:j + nlink_t:j +-off64_t:x +-off_t:x ++off64_t:l ++off_t:l + pid_t:i + pthread_attr_t:14pthread_attr_t + pthread_barrier_t:17pthread_barrier_t +@@ -41,27 +41,27 @@ pthread_rwlock_t:16pthread_rwlock_t + pthread_rwlockattr_t:20pthread_rwlockattr_t + pthread_spinlock_t:i + pthread_t:m +-quad_t:x +-register_t:i +-rlim64_t:y +-rlim_t:y ++quad_t:l ++register_t:l ++rlim64_t:m ++rlim_t:m + sigset_t:10__sigset_t +-size_t:j ++size_t:m + socklen_t:j +-ssize_t:i +-suseconds_t:x +-time_t:x ++ssize_t:l ++suseconds_t:l ++time_t:l + u_char:h + uid_t:j + uint:j + u_int:j + u_int16_t:t + u_int32_t:j +-u_int64_t:y ++u_int64_t:m + u_int8_t:h + ulong:m + u_long:m +-u_quad_t:y ++u_quad_t:m + useconds_t:j + ushort:t + u_short:t +diff --git a/sysdeps/unix/sysv/linux/arc/ld.abilist b/sysdeps/unix/sysv/linux/arc/arc64/ld.abilist +similarity index 54% +rename from sysdeps/unix/sysv/linux/arc/ld.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/ld.abilist +index 55f0c2ab9c..3a4bcb95f2 100644 +--- a/sysdeps/unix/sysv/linux/arc/ld.abilist ++++ b/sysdeps/unix/sysv/linux/arc/arc64/ld.abilist +@@ -1,9 +1,9 @@ +-GLIBC_2.32 __libc_stack_end D 0x4 +-GLIBC_2.32 __stack_chk_guard D 0x4 ++GLIBC_2.32 __libc_stack_end D 0x8 ++GLIBC_2.32 __stack_chk_guard D 0x8 + GLIBC_2.32 __tls_get_addr F + GLIBC_2.32 _dl_mcount F +-GLIBC_2.32 _r_debug D 0x14 ++GLIBC_2.32 _r_debug D 0x28 + GLIBC_2.34 __rtld_version_placeholder F + GLIBC_2.35 __rseq_flags D 0x4 +-GLIBC_2.35 __rseq_offset D 0x4 ++GLIBC_2.35 __rseq_offset D 0x8 + GLIBC_2.35 __rseq_size D 0x4 +diff --git a/sysdeps/unix/sysv/linux/arc/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libBrokenLocale.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libBrokenLocale.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libBrokenLocale.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libanl.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libanl.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libanl.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libanl.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libc.abilist +similarity index 97% +rename from sysdeps/unix/sysv/linux/arc/libc.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libc.abilist +index dfe0c3f7b6..d07723e742 100644 +--- a/sysdeps/unix/sysv/linux/arc/libc.abilist ++++ b/sysdeps/unix/sysv/linux/arc/arc64/libc.abilist +@@ -1,7 +1,7 @@ + GLIBC_2.32 _Exit F +-GLIBC_2.32 _IO_2_1_stderr_ D 0x9c +-GLIBC_2.32 _IO_2_1_stdin_ D 0x9c +-GLIBC_2.32 _IO_2_1_stdout_ D 0x9c ++GLIBC_2.32 _IO_2_1_stderr_ D 0xe0 ++GLIBC_2.32 _IO_2_1_stdin_ D 0xe0 ++GLIBC_2.32 _IO_2_1_stdout_ D 0xe0 + GLIBC_2.32 _IO_adjust_column F + GLIBC_2.32 _IO_adjust_wcolumn F + GLIBC_2.32 _IO_default_doallocate F +@@ -27,7 +27,7 @@ GLIBC_2.32 _IO_file_doallocate F + GLIBC_2.32 _IO_file_finish F + GLIBC_2.32 _IO_file_fopen F + GLIBC_2.32 _IO_file_init F +-GLIBC_2.32 _IO_file_jumps D 0x54 ++GLIBC_2.32 _IO_file_jumps D 0xa8 + GLIBC_2.32 _IO_file_open F + GLIBC_2.32 _IO_file_overflow F + GLIBC_2.32 _IO_file_read F +@@ -67,7 +67,7 @@ GLIBC_2.32 _IO_iter_file F + GLIBC_2.32 _IO_iter_next F + GLIBC_2.32 _IO_least_wmarker F + GLIBC_2.32 _IO_link_in F +-GLIBC_2.32 _IO_list_all D 0x4 ++GLIBC_2.32 _IO_list_all D 0x8 + GLIBC_2.32 _IO_list_lock F + GLIBC_2.32 _IO_list_resetlock F + GLIBC_2.32 _IO_list_unlock F +@@ -120,7 +120,7 @@ GLIBC_2.32 _IO_wdefault_xsgetn F + GLIBC_2.32 _IO_wdefault_xsputn F + GLIBC_2.32 _IO_wdo_write F + GLIBC_2.32 _IO_wdoallocbuf F +-GLIBC_2.32 _IO_wfile_jumps D 0x54 ++GLIBC_2.32 _IO_wfile_jumps D 0xa8 + GLIBC_2.32 _IO_wfile_overflow F + GLIBC_2.32 _IO_wfile_seekoff F + GLIBC_2.32 _IO_wfile_sync F +@@ -128,9 +128,9 @@ GLIBC_2.32 _IO_wfile_underflow F + GLIBC_2.32 _IO_wfile_xsputn F + GLIBC_2.32 _IO_wmarker_delta F + GLIBC_2.32 _IO_wsetb F +-GLIBC_2.32 ___brk_addr D 0x4 ++GLIBC_2.32 ___brk_addr D 0x8 + GLIBC_2.32 __adjtimex F +-GLIBC_2.32 __after_morecore_hook D 0x4 ++GLIBC_2.32 __after_morecore_hook D 0x8 + GLIBC_2.32 __argz_count F + GLIBC_2.32 __argz_next F + GLIBC_2.32 __argz_stringify F +@@ -155,7 +155,7 @@ GLIBC_2.32 __ctype_b_loc F + GLIBC_2.32 __ctype_get_mb_cur_max F + GLIBC_2.32 __ctype_tolower_loc F + GLIBC_2.32 __ctype_toupper_loc F +-GLIBC_2.32 __curbrk D 0x4 ++GLIBC_2.32 __curbrk D 0x8 + GLIBC_2.32 __cxa_at_quick_exit F + GLIBC_2.32 __cxa_atexit F + GLIBC_2.32 __cxa_finalize F +@@ -173,7 +173,7 @@ GLIBC_2.32 __dprintf_chk F + GLIBC_2.32 __dup2 F + GLIBC_2.32 __duplocale F + GLIBC_2.32 __endmntent F +-GLIBC_2.32 __environ D 0x4 ++GLIBC_2.32 __environ D 0x8 + GLIBC_2.32 __errno_location F + GLIBC_2.32 __explicit_bzero_chk F + GLIBC_2.32 __fbufsize F +@@ -197,7 +197,7 @@ GLIBC_2.32 __fread_chk F + GLIBC_2.32 __fread_unlocked_chk F + GLIBC_2.32 __freadable F + GLIBC_2.32 __freading F +-GLIBC_2.32 __free_hook D 0x4 ++GLIBC_2.32 __free_hook D 0x8 + GLIBC_2.32 __freelocale F + GLIBC_2.32 __fsetlocking F + GLIBC_2.32 __fwprintf_chk F +@@ -289,20 +289,20 @@ GLIBC_2.32 __longjmp_chk F + GLIBC_2.32 __lseek F + GLIBC_2.32 __lxstat F + GLIBC_2.32 __lxstat64 F +-GLIBC_2.32 __malloc_hook D 0x4 ++GLIBC_2.32 __malloc_hook D 0x8 + GLIBC_2.32 __mbrlen F + GLIBC_2.32 __mbrtowc F + GLIBC_2.32 __mbsnrtowcs_chk F + GLIBC_2.32 __mbsrtowcs_chk F + GLIBC_2.32 __mbstowcs_chk F +-GLIBC_2.32 __memalign_hook D 0x4 ++GLIBC_2.32 __memalign_hook D 0x8 + GLIBC_2.32 __memcpy_chk F + GLIBC_2.32 __memmove_chk F + GLIBC_2.32 __mempcpy F + GLIBC_2.32 __mempcpy_chk F + GLIBC_2.32 __memset_chk F + GLIBC_2.32 __monstartup F +-GLIBC_2.32 __morecore D 0x4 ++GLIBC_2.32 __morecore D 0x8 + GLIBC_2.32 __mq_open_2 F + GLIBC_2.32 __nanosleep F + GLIBC_2.32 __newlocale F +@@ -329,8 +329,8 @@ GLIBC_2.32 __pread_chk F + GLIBC_2.32 __printf_chk F + GLIBC_2.32 __printf_fp F + GLIBC_2.32 __profile_frequency F +-GLIBC_2.32 __progname D 0x4 +-GLIBC_2.32 __progname_full D 0x4 ++GLIBC_2.32 __progname D 0x8 ++GLIBC_2.32 __progname_full D 0x8 + GLIBC_2.32 __pthread_cleanup_routine F + GLIBC_2.32 __pthread_getspecific F + GLIBC_2.32 __pthread_key_create F +@@ -359,12 +359,12 @@ GLIBC_2.32 __pthread_unwind_next F + GLIBC_2.32 __ptsname_r_chk F + GLIBC_2.32 __pwrite64 F + GLIBC_2.32 __rawmemchr F +-GLIBC_2.32 __rcmd_errstr D 0x4 ++GLIBC_2.32 __rcmd_errstr D 0x8 + GLIBC_2.32 __read F + GLIBC_2.32 __read_chk F + GLIBC_2.32 __readlink_chk F + GLIBC_2.32 __readlinkat_chk F +-GLIBC_2.32 __realloc_hook D 0x4 ++GLIBC_2.32 __realloc_hook D 0x8 + GLIBC_2.32 __realpath_chk F + GLIBC_2.32 __recv_chk F + GLIBC_2.32 __recvfrom_chk F +@@ -452,7 +452,7 @@ GLIBC_2.32 __swprintf_chk F + GLIBC_2.32 __sysconf F + GLIBC_2.32 __syslog_chk F + GLIBC_2.32 __sysv_signal F +-GLIBC_2.32 __timezone D 0x4 ++GLIBC_2.32 __timezone D 0x8 + GLIBC_2.32 __toascii_l F + GLIBC_2.32 __tolower_l F + GLIBC_2.32 __toupper_l F +@@ -461,7 +461,7 @@ GLIBC_2.32 __towctrans_l F + GLIBC_2.32 __towlower_l F + GLIBC_2.32 __towupper_l F + GLIBC_2.32 __ttyname_r_chk F +-GLIBC_2.32 __tzname D 0x8 ++GLIBC_2.32 __tzname D 0x10 + GLIBC_2.32 __uflow F + GLIBC_2.32 __underflow F + GLIBC_2.32 __uselocale F +@@ -531,7 +531,7 @@ GLIBC_2.32 __xstat F + GLIBC_2.32 __xstat64 F + GLIBC_2.32 _dl_mcount_wrapper F + GLIBC_2.32 _dl_mcount_wrapper_check F +-GLIBC_2.32 _environ D 0x4 ++GLIBC_2.32 _environ D 0x8 + GLIBC_2.32 _exit F + GLIBC_2.32 _flush_cache F + GLIBC_2.32 _flushlbf F +@@ -540,7 +540,7 @@ GLIBC_2.32 _longjmp F + GLIBC_2.32 _mcleanup F + GLIBC_2.32 _mcount F + GLIBC_2.32 _nl_default_dirname D 0x12 +-GLIBC_2.32 _nl_domain_bindings D 0x4 ++GLIBC_2.32 _nl_domain_bindings D 0x8 + GLIBC_2.32 _nl_msg_cat_cntr D 0x4 + GLIBC_2.32 _obstack_allocated_p F + GLIBC_2.32 _obstack_begin F +@@ -552,8 +552,8 @@ GLIBC_2.32 _pthread_cleanup_pop F + GLIBC_2.32 _pthread_cleanup_pop_restore F + GLIBC_2.32 _pthread_cleanup_push F + GLIBC_2.32 _pthread_cleanup_push_defer F +-GLIBC_2.32 _res D 0x200 +-GLIBC_2.32 _res_hconf D 0x30 ++GLIBC_2.32 _res D 0x238 ++GLIBC_2.32 _res_hconf D 0x48 + GLIBC_2.32 _setjmp F + GLIBC_2.32 _tolower F + GLIBC_2.32 _toupper F +@@ -592,9 +592,9 @@ GLIBC_2.32 argp_error F + GLIBC_2.32 argp_failure F + GLIBC_2.32 argp_help F + GLIBC_2.32 argp_parse F +-GLIBC_2.32 argp_program_bug_address D 0x4 +-GLIBC_2.32 argp_program_version D 0x4 +-GLIBC_2.32 argp_program_version_hook D 0x4 ++GLIBC_2.32 argp_program_bug_address D 0x8 ++GLIBC_2.32 argp_program_version D 0x8 ++GLIBC_2.32 argp_program_version_hook D 0x8 + GLIBC_2.32 argp_state_help F + GLIBC_2.32 argp_usage F + GLIBC_2.32 argz_add F +@@ -734,7 +734,7 @@ GLIBC_2.32 endttyent F + GLIBC_2.32 endusershell F + GLIBC_2.32 endutent F + GLIBC_2.32 endutxent F +-GLIBC_2.32 environ D 0x4 ++GLIBC_2.32 environ D 0x8 + GLIBC_2.32 envz_add F + GLIBC_2.32 envz_entry F + GLIBC_2.32 envz_get F +@@ -753,7 +753,7 @@ GLIBC_2.32 error F + GLIBC_2.32 error_at_line F + GLIBC_2.32 error_message_count D 0x4 + GLIBC_2.32 error_one_per_line D 0x4 +-GLIBC_2.32 error_print_progname D 0x4 ++GLIBC_2.32 error_print_progname D 0x8 + GLIBC_2.32 errx F + GLIBC_2.32 ether_aton F + GLIBC_2.32 ether_aton_r F +@@ -1078,7 +1078,7 @@ GLIBC_2.32 grantpt F + GLIBC_2.32 group_member F + GLIBC_2.32 gsignal F + GLIBC_2.32 gtty F +-GLIBC_2.32 h_errlist D 0x14 ++GLIBC_2.32 h_errlist D 0x28 + GLIBC_2.32 h_nerr D 0x4 + GLIBC_2.32 hasmntopt F + GLIBC_2.32 hcreate F +@@ -1260,7 +1260,7 @@ GLIBC_2.32 malloc_stats F + GLIBC_2.32 malloc_trim F + GLIBC_2.32 malloc_usable_size F + GLIBC_2.32 mallopt F +-GLIBC_2.32 mallwatch D 0x4 ++GLIBC_2.32 mallwatch D 0x8 + GLIBC_2.32 mblen F + GLIBC_2.32 mbrlen F + GLIBC_2.32 mbrtoc16 F +@@ -1367,7 +1367,7 @@ GLIBC_2.32 ntohs F + GLIBC_2.32 ntp_adjtime F + GLIBC_2.32 ntp_gettime F + GLIBC_2.32 ntp_gettimex F +-GLIBC_2.32 obstack_alloc_failed_handler D 0x4 ++GLIBC_2.32 obstack_alloc_failed_handler D 0x8 + GLIBC_2.32 obstack_exit_failure D 0x4 + GLIBC_2.32 obstack_free F + GLIBC_2.32 obstack_printf F +@@ -1383,7 +1383,7 @@ GLIBC_2.32 openat64 F + GLIBC_2.32 opendir F + GLIBC_2.32 openlog F + GLIBC_2.32 openpty F +-GLIBC_2.32 optarg D 0x4 ++GLIBC_2.32 optarg D 0x8 + GLIBC_2.32 opterr D 0x4 + GLIBC_2.32 optind D 0x4 + GLIBC_2.32 optopt D 0x4 +@@ -1449,8 +1449,8 @@ GLIBC_2.32 prlimit64 F + GLIBC_2.32 process_vm_readv F + GLIBC_2.32 process_vm_writev F + GLIBC_2.32 profil F +-GLIBC_2.32 program_invocation_name D 0x4 +-GLIBC_2.32 program_invocation_short_name D 0x4 ++GLIBC_2.32 program_invocation_name D 0x8 ++GLIBC_2.32 program_invocation_short_name D 0x8 + GLIBC_2.32 pselect F + GLIBC_2.32 psiginfo F + GLIBC_2.32 psignal F +@@ -1637,7 +1637,7 @@ GLIBC_2.32 re_search F + GLIBC_2.32 re_search_2 F + GLIBC_2.32 re_set_registers F + GLIBC_2.32 re_set_syntax F +-GLIBC_2.32 re_syntax_options D 0x4 ++GLIBC_2.32 re_syntax_options D 0x8 + GLIBC_2.32 read F + GLIBC_2.32 readahead F + GLIBC_2.32 readdir F +@@ -1850,9 +1850,9 @@ GLIBC_2.32 statfs64 F + GLIBC_2.32 statvfs F + GLIBC_2.32 statvfs64 F + GLIBC_2.32 statx F +-GLIBC_2.32 stderr D 0x4 +-GLIBC_2.32 stdin D 0x4 +-GLIBC_2.32 stdout D 0x4 ++GLIBC_2.32 stderr D 0x8 ++GLIBC_2.32 stdin D 0x8 ++GLIBC_2.32 stdout D 0x8 + GLIBC_2.32 stpcpy F + GLIBC_2.32 stpncpy F + GLIBC_2.32 strcasecmp F +@@ -1984,7 +1984,7 @@ GLIBC_2.32 timerfd_gettime F + GLIBC_2.32 timerfd_settime F + GLIBC_2.32 times F + GLIBC_2.32 timespec_get F +-GLIBC_2.32 timezone D 0x4 ++GLIBC_2.32 timezone D 0x8 + GLIBC_2.32 tmpfile F + GLIBC_2.32 tmpfile64 F + GLIBC_2.32 tmpnam F +@@ -2013,7 +2013,7 @@ GLIBC_2.32 ttyname_r F + GLIBC_2.32 ttyslot F + GLIBC_2.32 twalk F + GLIBC_2.32 twalk_r F +-GLIBC_2.32 tzname D 0x8 ++GLIBC_2.32 tzname D 0x10 + GLIBC_2.32 tzset F + GLIBC_2.32 ualarm F + GLIBC_2.32 ulckpwdf F +diff --git a/sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libc_malloc_debug.abilist +similarity index 80% +rename from sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libc_malloc_debug.abilist +index cf9f611403..c50393d8cc 100644 +--- a/sysdeps/unix/sysv/linux/arc/libc_malloc_debug.abilist ++++ b/sysdeps/unix/sysv/linux/arc/arc64/libc_malloc_debug.abilist +@@ -1,7 +1,7 @@ +-GLIBC_2.32 __free_hook D 0x4 +-GLIBC_2.32 __malloc_hook D 0x4 +-GLIBC_2.32 __memalign_hook D 0x4 +-GLIBC_2.32 __realloc_hook D 0x4 ++GLIBC_2.32 __free_hook D 0x8 ++GLIBC_2.32 __malloc_hook D 0x8 ++GLIBC_2.32 __memalign_hook D 0x8 ++GLIBC_2.32 __realloc_hook D 0x8 + GLIBC_2.32 aligned_alloc F + GLIBC_2.32 calloc F + GLIBC_2.32 free F +diff --git a/sysdeps/unix/sysv/linux/arc/libcrypt.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libcrypt.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libcrypt.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libcrypt.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libdl.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libdl.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libdl.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libdl.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libm.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libm.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libm.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libm.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libpthread.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libpthread.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libpthread.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libpthread.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libresolv.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libresolv.abilist +similarity index 95% +rename from sysdeps/unix/sysv/linux/arc/libresolv.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libresolv.abilist +index 47c5072f61..76ab1dedfb 100644 +--- a/sysdeps/unix/sysv/linux/arc/libresolv.abilist ++++ b/sysdeps/unix/sysv/linux/arc/arc64/libresolv.abilist +@@ -10,7 +10,7 @@ GLIBC_2.32 __loc_ntoa F + GLIBC_2.32 __p_cdname F + GLIBC_2.32 __p_cdnname F + GLIBC_2.32 __p_class F +-GLIBC_2.32 __p_class_syms D 0x54 ++GLIBC_2.32 __p_class_syms D 0xa8 + GLIBC_2.32 __p_fqname F + GLIBC_2.32 __p_fqnname F + GLIBC_2.32 __p_option F +@@ -18,7 +18,7 @@ GLIBC_2.32 __p_query F + GLIBC_2.32 __p_rcode F + GLIBC_2.32 __p_time F + GLIBC_2.32 __p_type F +-GLIBC_2.32 __p_type_syms D 0x228 ++GLIBC_2.32 __p_type_syms D 0x450 + GLIBC_2.32 __putlong F + GLIBC_2.32 __putshort F + GLIBC_2.32 __res_close F +diff --git a/sysdeps/unix/sysv/linux/arc/librt.abilist b/sysdeps/unix/sysv/linux/arc/arc64/librt.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/librt.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/librt.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libthread_db.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libthread_db.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libthread_db.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libthread_db.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/libutil.abilist b/sysdeps/unix/sysv/linux/arc/arc64/libutil.abilist +similarity index 100% +rename from sysdeps/unix/sysv/linux/arc/libutil.abilist +rename to sysdeps/unix/sysv/linux/arc/arc64/libutil.abilist +diff --git a/sysdeps/unix/sysv/linux/arc/bits/fcntl.h b/sysdeps/unix/sysv/linux/arc/bits/fcntl.h +new file mode 100644 +index 0000000000..20292fd32f +--- /dev/null ++++ b/sysdeps/unix/sysv/linux/arc/bits/fcntl.h +@@ -0,0 +1,62 @@ ++/* O_*, F_*, FD_* bit values for Linux / ARC ++   Copyright (C) 2011-2021 Free Software Foundation, Inc. ++ ++   This file is part of the GNU C Library. ++ ++   The GNU C Library is free software; you can redistribute it and/or ++   modify it under the terms of the GNU Lesser General Public ++   License as published by the Free Software Foundation; either ++   version 2.1 of the License, or (at your option) any later version. ++ ++   The GNU C Library 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 ++   Lesser General Public License for more details. ++ ++   You should have received a copy of the GNU Lesser General Public ++   License along with the GNU C Library; if not, see ++   <https://www.gnu.org/licenses/>.  */ ++ ++#ifndef	_FCNTL_H ++# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead." ++#endif ++ ++#include <bits/wordsize.h> ++ ++/* In 64-bit ISA files are always with 64bit off_t and F_*LK64 are the same as ++   non-64-bit versions.  It will need to be revised for 128-bit.  */ ++#if __WORDSIZE == 64 ++# define __O_LARGEFILE	0 ++ ++# define F_GETLK64	5	/* Get record locking info.  */ ++# define F_SETLK64	6	/* Set record locking info (non-blocking).  */ ++# define F_SETLKW64	7	/* Set record locking info (blocking).	*/ ++#endif ++ ++struct flock ++  { ++    short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */ ++    short int l_whence; /* Where `l_start' is relative to (like `lseek').  */ ++#if __WORDSIZE == 64 || !defined __USE_FILE_OFFSET64 ++    __off_t l_start;    /* Offset where the lock begins.  */ ++    __off_t l_len;      /* Size of the locked area; zero means until EOF.  */ ++#else ++    __off64_t l_start;  /* Offset where the lock begins.  */ ++    __off64_t l_len;    /* Size of the locked area; zero means until EOF.  */ ++#endif ++    __pid_t l_pid;      /* Process holding the lock.  */ ++  }; ++ ++#ifdef __USE_LARGEFILE64 ++struct flock64 ++  { ++    short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */ ++    short int l_whence; /* Where `l_start' is relative to (like `lseek').  */ ++    __off64_t l_start;  /* Offset where the lock begins.  */ ++    __off64_t l_len;    /* Size of the locked area; zero means until EOF.  */ ++    __pid_t l_pid;      /* Process holding the lock.  */ ++  }; ++#endif ++ ++/* Include generic Linux declarations.  */ ++#include <bits/fcntl-linux.h> +diff --git a/sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h b/sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h +index 795638a30b..6be69437f8 100644 +--- a/sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h ++++ b/sysdeps/unix/sysv/linux/arc/bits/types/__sigset_t.h +@@ -3,7 +3,7 @@ + #define ____sigset_t_defined +  + /* Linux asm-generic syscall ABI expects sigset_t to hold 64 signals.  */ +-#define _SIGSET_NWORDS (64 / (8 * sizeof (unsigned long int))) ++#define _SIGSET_NWORDS  2 + typedef struct + { +   unsigned long int __val[_SIGSET_NWORDS]; +diff --git a/sysdeps/unix/sysv/linux/arc/clone.S b/sysdeps/unix/sysv/linux/arc/clone.S +index d8c7b93d1c..364fa1edde 100644 +--- a/sysdeps/unix/sysv/linux/arc/clone.S ++++ b/sysdeps/unix/sysv/linux/arc/clone.S +@@ -31,41 +31,41 @@ +  clone syscall in kernel (ABI: CONFIG_CLONE_BACKWARDS) +  +   int sys_clone(unsigned long int clone_flags, +-	        unsigned long int newsp, ++		unsigned long int newsp, + 		int __user *parent_tidptr, + 		void *tls, + 		int __user *child_tidptr).  */ +  + ENTRY (__clone) +-	cmp	r0, 0		/* @fn can't be NULL.  */ +-	and	r1,r1,-4	/* @child_stack be 4 bytes aligned per ABI.  */ +-	cmp.ne	r1, 0		/* @child_stack can't be NULL.  */ ++	CMPR	r0, 0		/* @fn can't be NULL.  */ ++	ANDR	r1, r1, -REGSZ	/* @child_stack 4/8 aligned per ABI.  */ ++	CMPR.ne	r1, 0		/* @child_stack can't be NULL.  */ + 	bz	L (__sys_err) +  + 	/* save some of the orig args + 	   r0 containing @fn will be clobbered AFTER syscall (with ret val) + 	   rest are clobbered BEFORE syscall due to different arg ordering.  */ +-	mov	r10, r0		/* @fn.  */ +-	mov	r11, r3		/* @args.  */ +-	mov	r12, r2		/* @clone_flags.  */ +-	mov	r9,  r5		/* @tls.  */ ++	MOVR	r10, r0		/* @fn.  */ ++	MOVR	r11, r3		/* @args.  */ ++	MOVR	r12, r2		/* @clone_flags.  */ ++	MOVR	r9,  r5		/* @tls.  */ +  + 	/* adjust libc args for syscall.  */ +  +-	mov 	r0, r2		/* libc @flags is 1st syscall arg.  */ +-	mov	r2, r4		/* libc @ptid.  */ +-	mov	r3, r5		/* libc @tls.  */ +-	mov	r4, r6		/* libc @ctid.  */ ++	MOVR	r0, r2		/* libc @flags is 1st syscall arg.  */ ++	MOVR	r2, r4		/* libc @ptid.  */ ++	MOVR	r3, r5		/* libc @tls.  */ ++	MOVR	r4, r6		/* libc @ctid.  */ + 	mov	r8, __NR_clone + 	ARC_TRAP_INSN +  +-	cmp	r0, 0		/* return code : 0 new process, !0 parent.  */ ++	CMPR	r0, 0		/* return code : 0 new process, !0 parent.  */ + 	beq	thread_start_clone + 	blt	L (__sys_err2)	/* < 0 (signed) error.  */ + 	j	[blink]		/* Parent returns.  */ +  + L (__sys_err): +-	mov	r0, -EINVAL ++	MOVR	r0, -EINVAL + L (__sys_err2): + 	/* (1) No need to make -ve kernel error code as positive errno + 	       __syscall_error expects the -ve error code returned by kernel +@@ -87,7 +87,7 @@ thread_start_clone: +  + 	/* Child jumps off to @fn with @arg as argument.  */ + 	jl.d	[r10] +-	mov	r0, r11 ++	MOVR	r0, r11 +  + 	/* exit() with result from @fn (already in r0).  */ + 	mov	r8, __NR_exit +diff --git a/sysdeps/unix/sysv/linux/arc/clone3.S b/sysdeps/unix/sysv/linux/arc/clone3.S +index 87a8272a39..7fc61524b5 100644 +--- a/sysdeps/unix/sysv/linux/arc/clone3.S ++++ b/sysdeps/unix/sysv/linux/arc/clone3.S +@@ -37,9 +37,9 @@ + ENTRY(__clone3) +  + 	/* Save args for the child.  */ +-	mov	r10, r0		/* cl_args  */ +-	mov	r11, r2		/* func	 */ +-	mov	r12, r3		/* args  */ ++	MOVR	r10, r0		/* cl_args  */ ++	MOVR	r11, r2		/* func  */ ++	MOVR	r12, r3		/* args  */ +  + 	/* Sanity check args.  */ + 	breq	r10, 0, L (__sys_err)	/* No NULL cl_args pointer.  */ +@@ -49,17 +49,17 @@ ENTRY(__clone3) + 	   r8: system call number + 	   r0: cl_args + 	   r1: size  */ +-	mov	r0, r10 ++	MOVR	r0, r10 + 	mov	r8, __NR_clone3 + 	ARC_TRAP_INSN +  +-	cmp	r0, 0 ++	CMPR	r0, 0 + 	beq	thread_start_clone3	/* Child returns.  */ + 	blt	L (__sys_err2) + 	j	[blink]			/* Parent returns.  */ +  + L (__sys_err): +-	mov	r0, -EINVAL ++	MOVR	r0, -EINVAL + L (__sys_err2): + 	b	__syscall_error + PSEUDO_END (__clone3) +@@ -74,7 +74,7 @@ thread_start_clone3: +  + 	/* Child jumps off to @fn with @arg as argument.  */ + 	jl.d	[r11] +-	mov	r0, r12 ++	MOVR	r0, r12 +  + 	/* exit() with result from @fn (already in r0).  */ + 	mov	r8, __NR_exit +diff --git a/sysdeps/unix/sysv/linux/arc/getcontext.S b/sysdeps/unix/sysv/linux/arc/getcontext.S +index eb75c8ce02..851981b64c 100644 +--- a/sysdeps/unix/sysv/linux/arc/getcontext.S ++++ b/sysdeps/unix/sysv/linux/arc/getcontext.S +@@ -26,39 +26,58 @@ + ENTRY (__getcontext) +  + 	/* Callee saved registers.  */ +-	add r2, r0, UCONTEXT_MCONTEXT +-	STR (r13,   r2, 37) +-	STR (r14,   r2, 36) +-	STR (r15,   r2, 35) +-	STR (r16,   r2, 34) +-	STR (r17,   r2, 33) +-	STR (r18,   r2, 32) +-	STR (r19,   r2, 31) +-	STR (r20,   r2, 30) +-	STR (r21,   r2, 29) +-	STR (r22,   r2, 28) +-	STR (r23,   r2, 27) +-	STR (r24,   r2, 26) ++	ADDR r2, r0, UCONTEXT_MCONTEXT ++	STR.as r13,   r2, 37 ++	STR.as r14,   r2, 36 ++	STR.as r15,   r2, 35 ++	STR.as r16,   r2, 34 ++	STR.as r17,   r2, 33 ++	STR.as r18,   r2, 32 ++	STR.as r19,   r2, 31 ++	STR.as r20,   r2, 30 ++	STR.as r21,   r2, 29 ++	STR.as r22,   r2, 28 ++	STR.as r23,   r2, 27 ++	STR.as r24,   r2, 26 +  +-	STR (blink, r2,  7) +-	STR (fp,    r2,  8) +-	STR (gp,    r2,  9) +-	STR (sp,    r2, 23) ++	STR.as blink, r2,  7 ++	STR.as fp,    r2,  8 ++	STR.as gp,    r2,  9 ++	STR.as sp,    r2, 23 ++ ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	FSTR.as	f16,  r2, 51 ++	FSTR.as	f17,  r2, 52 ++	FSTR.as	f18,  r2, 53 ++	FSTR.as	f19,  r2, 54 ++	FSTR.as	f20,  r2, 55 ++	FSTR.as	f21,  r2, 56 ++	FSTR.as	f22,  r2, 57 ++	FSTR.as	f23,  r2, 58 ++	FSTR.as	f24,  r2, 59 ++	FSTR.as	f25,  r2, 60 ++	FSTR.as	f26,  r2, 61 ++	FSTR.as	f27,  r2, 62 ++	FSTR.as	f28,  r2, 63 ++	FSTR.as	f29,  r2, 64 ++	FSTR.as	f30,  r2, 65 ++	FSTR.as	f31,  r2, 66 ++#endif +  + 	/* Save 0 in r0 placeholder to return 0 when this @ucp activated.  */ +-	mov r9, 0 +-	STR (r9,    r2, 22) ++	mov    r9, 0 ++	STR.as r9,    r2, 22 +  + 	/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8).  */ +-	mov r3, _NSIG8 +-	add r2, r0, UCONTEXT_SIGMASK +-	mov r1, 0 +-	mov r0, SIG_BLOCK +-	mov r8, __NR_rt_sigprocmask ++	mov    r3, _NSIG8 ++	ADDR   r2, r0, UCONTEXT_SIGMASK ++	mov    r1, 0 ++	mov    r0, SIG_BLOCK ++	mov    r8, __NR_rt_sigprocmask + 	ARC_TRAP_INSN +-	brhi    r0, -1024, L (call_syscall_err) ++	BRRhi   r0, -1024, L (call_syscall_err) + 	j.d	[blink] +-	mov r0, 0	/* Success, error handled in .Lcall_syscall_err.  */ ++	mov     r0, 0	/* Success, error handled in .Lcall_syscall_err.  */ +  + PSEUDO_END (__getcontext) + weak_alias (__getcontext, getcontext) +diff --git a/sysdeps/unix/sysv/linux/arc/setcontext.S b/sysdeps/unix/sysv/linux/arc/setcontext.S +index 12708379d2..e0b8b1a183 100644 +--- a/sysdeps/unix/sysv/linux/arc/setcontext.S ++++ b/sysdeps/unix/sysv/linux/arc/setcontext.S +@@ -24,46 +24,74 @@ +  + ENTRY (__setcontext) +  +-	mov  r9, r0	/* Stash @ucp across syscall.  */ ++	MOVR  r9, r0	/* Stash @ucp across syscall.  */ +  + 	/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8).  */ + 	mov  r3, _NSIG8 + 	mov  r2, 0 +-	add  r1, r0, UCONTEXT_SIGMASK ++	ADDR  r1, r0, UCONTEXT_SIGMASK + 	mov  r0, SIG_SETMASK + 	mov  r8, __NR_rt_sigprocmask + 	ARC_TRAP_INSN +-	brhi r0, -1024, L (call_syscall_err) ++	BRRhi r0, -1024, L (call_syscall_err) +  + 	/* Restore scratch/arg regs for makecontext case.  */ + 	add r9, r9, UCONTEXT_MCONTEXT +-	LDR (r0,    r9, 22) +-	LDR (r1,    r9, 21) +-	LDR (r2,    r9, 20) +-	LDR (r3,    r9, 19) +-	LDR (r4,    r9, 18) +-	LDR (r5,    r9, 17) +-	LDR (r6,    r9, 16) +-	LDR (r7,    r9, 15) ++	LDR.as r0,    r9, 22 ++	LDR.as r1,    r9, 21 ++	LDR.as r2,    r9, 20 ++	LDR.as r3,    r9, 19 ++	LDR.as r4,    r9, 18 ++	LDR.as r5,    r9, 17 ++	LDR.as r6,    r9, 16 ++	LDR.as r7,    r9, 15 +  + 	/* Restore callee saved registers.  */ +-	LDR (r13,   r9, 37) +-	LDR (r14,   r9, 36) +-	LDR (r15,   r9, 35) +-	LDR (r16,   r9, 34) +-	LDR (r17,   r9, 33) +-	LDR (r18,   r9, 32) +-	LDR (r19,   r9, 31) +-	LDR (r20,   r9, 30) +-	LDR (r21,   r9, 29) +-	LDR (r22,   r9, 28) +-	LDR (r23,   r9, 27) +-	LDR (r24,   r9, 26) +- +-	LDR (blink, r9,  7) +-	LDR (fp,    r9,  8) +-	LDR (gp,    r9,  9) +-	LDR (sp,    r9, 23) ++	LDR.as r13,   r9, 37 ++	LDR.as r14,   r9, 36 ++	LDR.as r15,   r9, 35 ++	LDR.as r16,   r9, 34 ++	LDR.as r17,   r9, 33 ++	LDR.as r18,   r9, 32 ++	LDR.as r19,   r9, 31 ++	LDR.as r20,   r9, 30 ++	LDR.as r21,   r9, 29 ++	LDR.as r22,   r9, 28 ++	LDR.as r23,   r9, 27 ++	LDR.as r24,   r9, 26 ++ ++	LDR.as blink, r9,  7 ++	LDR.as fp,    r9,  8 ++	LDR.as gp,    r9,  9 ++	LDR.as sp,    r9, 23 ++ ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	FLDR.as	f0,   r9, 43 ++	FLDR.as	f1,   r9, 44 ++	FLDR.as	f2,   r9, 45 ++	FLDR.as	f3,   r9, 46 ++	FLDR.as	f4,   r9, 47 ++	FLDR.as	f5,   r9, 48 ++	FLDR.as	f6,   r9, 49 ++	FLDR.as	f7,   r9, 50 ++ ++	FLDR.as	f16,  r9, 51 ++	FLDR.as	f17,  r9, 52 ++	FLDR.as	f18,  r9, 53 ++	FLDR.as	f19,  r9, 54 ++	FLDR.as	f20,  r9, 55 ++	FLDR.as	f21,  r9, 56 ++	FLDR.as	f22,  r9, 57 ++	FLDR.as	f23,  r9, 58 ++	FLDR.as	f24,  r9, 59 ++	FLDR.as	f25,  r9, 60 ++	FLDR.as	f26,  r9, 61 ++	FLDR.as	f27,  r9, 62 ++	FLDR.as	f28,  r9, 63 ++	FLDR.as	f29,  r9, 64 ++	FLDR.as	f30,  r9, 66 ++	FLDR.as	f31,  r9, 68 ++#endif +  + 	j    [blink] +  +@@ -83,8 +111,8 @@ ENTRY (__startcontext) + 	jl   [r14] +  + 	/* If uc_link (r15) call setcontext with that.  */ +-	mov  r0, r15 +-	breq r0, 0, 1f ++	MOVR  r0, r15 ++	BRReq r0, 0, 1f +  + 	bl   __setcontext + 1: +diff --git a/sysdeps/unix/sysv/linux/arc/shlib-versions b/sysdeps/unix/sysv/linux/arc/shlib-versions +index 343c0a0450..92a61e53fc 100644 +--- a/sysdeps/unix/sysv/linux/arc/shlib-versions ++++ b/sysdeps/unix/sysv/linux/arc/shlib-versions +@@ -1,7 +1,15 @@ + DEFAULT                 GLIBC_2.32 +  ++%ifdef HAVE_ARC32 ++ld=ld-linux-arc32.so.2 ++%else ++%ifdef HAVE_ARC64 ++ld=ld-linux-arc64.so.2 ++%else + %ifdef HAVE_ARC_BE + ld=ld-linux-arceb.so.2 + %else + ld=ld-linux-arc.so.2 + %endif ++%endif ++%endif +diff --git a/sysdeps/unix/sysv/linux/arc/swapcontext.S b/sysdeps/unix/sysv/linux/arc/swapcontext.S +index 76111af596..ff1741a08a 100644 +--- a/sysdeps/unix/sysv/linux/arc/swapcontext.S ++++ b/sysdeps/unix/sysv/linux/arc/swapcontext.S +@@ -24,69 +24,88 @@ ENTRY (__swapcontext) +  + 	/* Save context into @oucp pointed to by r0.  */ +  +-	add r2, r0, UCONTEXT_MCONTEXT +-	STR (r13,   r2, 37) +-	STR (r14,   r2, 36) +-	STR (r15,   r2, 35) +-	STR (r16,   r2, 34) +-	STR (r17,   r2, 33) +-	STR (r18,   r2, 32) +-	STR (r19,   r2, 31) +-	STR (r20,   r2, 30) +-	STR (r21,   r2, 29) +-	STR (r22,   r2, 28) +-	STR (r23,   r2, 27) +-	STR (r24,   r2, 26) +- +-	STR (blink, r2,  7) +-	STR (fp,    r2,  8) +-	STR (gp,    r2,  9) +-	STR (sp,    r2, 23) ++	ADDR   r2, r0, UCONTEXT_MCONTEXT ++	STR.as r13,   r2, 37 ++	STR.as r14,   r2, 36 ++	STR.as r15,   r2, 35 ++	STR.as r16,   r2, 34 ++	STR.as r17,   r2, 33 ++	STR.as r18,   r2, 32 ++	STR.as r19,   r2, 31 ++	STR.as r20,   r2, 30 ++	STR.as r21,   r2, 29 ++	STR.as r22,   r2, 28 ++	STR.as r23,   r2, 27 ++	STR.as r24,   r2, 26 ++ ++	STR.as blink, r2,  7 ++	STR.as fp,    r2,  8 ++	STR.as gp,    r2,  9 ++	STR.as sp,    r2, 23 ++ ++#if defined (__ARC_FLOAT_ABI_HARD__) ++	FSTR.as	f16,  r2, 51 ++	FSTR.as	f17,  r2, 52 ++	FSTR.as	f18,  r2, 53 ++	FSTR.as	f19,  r2, 54 ++	FSTR.as	f20,  r2, 55 ++	FSTR.as	f21,  r2, 56 ++	FSTR.as	f22,  r2, 57 ++	FSTR.as	f23,  r2, 58 ++	FSTR.as	f24,  r2, 59 ++	FSTR.as	f25,  r2, 60 ++	FSTR.as	f26,  r2, 61 ++	FSTR.as	f27,  r2, 62 ++	FSTR.as	f28,  r2, 63 ++	FSTR.as	f29,  r2, 64 ++	FSTR.as	f30,  r2, 65 ++	FSTR.as	f31,  r2, 66 ++#endif +  + 	/* Save 0 in r0 placeholder to return 0 when @oucp activated.  */ +-	mov r9, 0 +-	STR (r9,    r2, 22) ++	mov   r9, 0 ++	STR.as r9,    r2, 22 +  + 	/* Load context from @ucp.  */ +  +-	mov r9, r1	/* Safekeep @ucp across syscall.  */ ++	MOVR   r9, r1	/* Safekeep @ucp across syscall.  */ +  + 	/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */ +-	mov r3, _NSIG8 +-	add r2, r0, UCONTEXT_SIGMASK +-	add r1, r1, UCONTEXT_SIGMASK +-	mov r0, SIG_SETMASK +-	mov r8, __NR_rt_sigprocmask ++	mov   r3, _NSIG8 ++	ADDR   r2, r0, UCONTEXT_SIGMASK ++	ADDR   r1, r1, UCONTEXT_SIGMASK ++	mov   r0, SIG_SETMASK ++	mov   r8, __NR_rt_sigprocmask + 	ARC_TRAP_INSN +-	brhi r0, -1024, L (call_syscall_err) +- +-	add r9, r9, UCONTEXT_MCONTEXT +-	LDR (r0,    r9, 22) +-	LDR (r1,    r9, 21) +-	LDR (r2,    r9, 20) +-	LDR (r3,    r9, 19) +-	LDR (r4,    r9, 18) +-	LDR (r5,    r9, 17) +-	LDR (r6,    r9, 16) +-	LDR (r7,    r9, 15) +- +-	LDR (r13,   r9, 37) +-	LDR (r14,   r9, 36) +-	LDR (r15,   r9, 35) +-	LDR (r16,   r9, 34) +-	LDR (r17,   r9, 33) +-	LDR (r18,   r9, 32) +-	LDR (r19,   r9, 31) +-	LDR (r20,   r9, 30) +-	LDR (r21,   r9, 29) +-	LDR (r22,   r9, 28) +-	LDR (r23,   r9, 27) +-	LDR (r24,   r9, 26) +- +-	LDR (blink, r9,  7) +-	LDR (fp,    r9,  8) +-	LDR (gp,    r9,  9) +-	LDR (sp,    r9, 23) ++	BRRhi  r0, -1024, L (call_syscall_err) ++ ++	ADDR   r9, r9, UCONTEXT_MCONTEXT ++	LDR.as r0,    r9, 22 ++	LDR.as r1,    r9, 21 ++	LDR.as r2,    r9, 20 ++	LDR.as r3,    r9, 19 ++	LDR.as r4,    r9, 18 ++	LDR.as r5,    r9, 17 ++	LDR.as r6,    r9, 16 ++	LDR.as r7,    r9, 15 ++ ++	LDR.as r13,   r9, 37 ++	LDR.as r14,   r9, 36 ++	LDR.as r15,   r9, 35 ++	LDR.as r16,   r9, 34 ++	LDR.as r17,   r9, 33 ++	LDR.as r18,   r9, 32 ++	LDR.as r19,   r9, 31 ++	LDR.as r20,   r9, 30 ++	LDR.as r21,   r9, 29 ++	LDR.as r22,   r9, 28 ++	LDR.as r23,   r9, 27 ++	LDR.as r24,   r9, 26 ++ ++	LDR.as blink, r9,  7 ++	LDR.as fp,    r9,  8 ++	LDR.as gp,    r9,  9 ++	LDR.as sp,    r9, 23 +  + 	j    [blink] +  +diff --git a/sysdeps/unix/sysv/linux/arc/sys/ucontext.h b/sysdeps/unix/sysv/linux/arc/sys/ucontext.h +index 831b81a922..3a0f1d4aba 100644 +--- a/sysdeps/unix/sysv/linux/arc/sys/ucontext.h ++++ b/sysdeps/unix/sysv/linux/arc/sys/ucontext.h +@@ -42,6 +42,7 @@ typedef struct +   unsigned long int __efa; +   unsigned long int __stop_pc; +   unsigned long int __r30, __r58, __r59; ++  unsigned long int __fpr[32]; + } mcontext_t; +  + /* Userlevel context.  */ +diff --git a/sysdeps/unix/sysv/linux/arc/syscall.S b/sysdeps/unix/sysv/linux/arc/syscall.S +index c6ca329e9a..db1ffdad2a 100644 +--- a/sysdeps/unix/sysv/linux/arc/syscall.S ++++ b/sysdeps/unix/sysv/linux/arc/syscall.S +@@ -19,15 +19,15 @@ + #include <sysdep.h> +  + ENTRY (syscall) +-	mov_s	r8, r0 +-	mov_s	r0, r1 +-	mov_s	r1, r2 +-	mov_s	r2, r3 +-	mov_s	r3, r4 +-	mov_s	r4, r5 +-	mov_s	r5, r6 ++	MOVR	r8, r0 ++	MOVR	r0, r1 ++	MOVR	r1, r2 ++	MOVR	r2, r3 ++	MOVR	r3, r4 ++	MOVR	r4, r5 ++	MOVR	r5, r6 +  + 	ARC_TRAP_INSN +-	brhi	r0, -4096, L (call_syscall_err) ++	BRRhi	r0, -4096, L (call_syscall_err) + 	j	[blink] + PSEUDO_END (syscall) +diff --git a/sysdeps/unix/sysv/linux/arc/sysdep.h b/sysdeps/unix/sysv/linux/arc/sysdep.h +index 7f90d64124..14d11f038b 100644 +--- a/sysdeps/unix/sysv/linux/arc/sysdep.h ++++ b/sysdeps/unix/sysv/linux/arc/sysdep.h +@@ -26,6 +26,8 @@ +  + /* "workarounds" for generic code needing to handle 64-bit time_t.  */ +  ++#ifndef __ARC64_ARCH64__ ++ + /* Fix sysdeps/unix/sysv/linux/clock_getcpuclockid.c.  */ + #define __NR_clock_getres	__NR_clock_getres_time64 + /* Fix sysdeps/nptl/lowlevellock-futex.h.  */ +@@ -43,6 +45,8 @@ + /* Hack sysdeps/unix/sysv/linux/generic/utimes.c.  */ + #define __NR_utimensat		__NR_utimensat_time64 +  ++#endif ++ + /* For RTLD_PRIVATE_ERRNO.  */ + #include <dl-sysdep.h> +  +@@ -59,7 +63,7 @@ + # undef PSEUDO + # define PSEUDO(name, syscall_name, args)			\ +   PSEUDO_NOERRNO(name, syscall_name, args)	ASM_LINE_SEP	\ +-    brhi   r0, -4096, L (call_syscall_err)	ASM_LINE_SEP ++    BRRhi   r0, -4096, L (call_syscall_err)	ASM_LINE_SEP +  + # define ret	j_s  [blink] +  +@@ -98,7 +102,7 @@ +  + /* Don't set errno, return kernel error (in errno form) or zero.  */ + # define ret_ERRVAL						\ +-  rsub   r0, r0, 0				ASM_LINE_SEP	\ ++  SUBR   r0, 0, r0				ASM_LINE_SEP	\ +   ret_NOERRNO +  + # undef PSEUDO_END_ERRVAL +@@ -117,12 +121,12 @@ +  + # define SYSCALL_ERROR_HANDLER				\ + L (call_syscall_err):			ASM_LINE_SEP	\ +-    push_s   blink			ASM_LINE_SEP	\ +-    cfi_adjust_cfa_offset (4)		ASM_LINE_SEP	\ ++    PUSHR blink				ASM_LINE_SEP	\ ++    cfi_adjust_cfa_offset (REGSZ)	ASM_LINE_SEP	\ +     cfi_rel_offset (blink, 0)		ASM_LINE_SEP	\ +     CALL_ERRNO_SETTER_C			ASM_LINE_SEP	\ +-    pop_s  blink			ASM_LINE_SEP	\ +-    cfi_adjust_cfa_offset (-4)		ASM_LINE_SEP	\ ++    POPR  blink				ASM_LINE_SEP	\ ++    cfi_adjust_cfa_offset (-REGSZ)	ASM_LINE_SEP	\ +     cfi_restore (blink)			ASM_LINE_SEP	\ +     j_s      [blink] +  +diff --git a/sysdeps/unix/sysv/linux/arc/vfork.S b/sysdeps/unix/sysv/linux/arc/vfork.S +index 57b85988e3..57bd8d3d81 100644 +--- a/sysdeps/unix/sysv/linux/arc/vfork.S ++++ b/sysdeps/unix/sysv/linux/arc/vfork.S +@@ -28,11 +28,11 @@ +  + ENTRY (__vfork) + 	mov	r0, CLONE_FLAGS_FOR_VFORK +-	mov_s	r1, sp ++	MOVR	r1, sp + 	mov	r8, __NR_clone + 	ARC_TRAP_INSN +  +-	cmp	r0, 0 ++	CMPR	r0, 0 + 	jge	[blink]	; child continues +  + 	b   __syscall_error +diff --git a/timezone/zic.c b/timezone/zic.c +index 2875b5544c..3d606c8e6e 100644 +--- a/timezone/zic.c ++++ b/timezone/zic.c +@@ -39,7 +39,7 @@ typedef int_fast64_t	zic_t; + #include <sys/stat.h> + #endif + #ifdef S_IRUSR +-#define MKDIR_UMASK (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) ++#define MKDIR_UMASK (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH|S_IWOTH) + #else + #define MKDIR_UMASK 0755 + #endif +--  +2.31.1 + diff --git a/toolchain/glibc/patches/2.38/m68k-m68040.patch b/toolchain/glibc/patches/2.38/m68k-m68040.patch new file mode 100644 index 000000000..bfa0b3da8 --- /dev/null +++ b/toolchain/glibc/patches/2.38/m68k-m68040.patch @@ -0,0 +1,59 @@ +diff -Nur glibc-2.38.orig/sysdeps/m68k/m680x0/bits/flt-eval-method.h glibc-2.38/sysdeps/m68k/m680x0/bits/flt-eval-method.h +--- glibc-2.38.orig/sysdeps/m68k/m680x0/bits/flt-eval-method.h	2023-07-31 19:54:16.000000000 +0200 ++++ glibc-2.38/sysdeps/m68k/m680x0/bits/flt-eval-method.h	1970-01-01 01:00:00.000000000 +0100 +@@ -1,25 +0,0 @@ +-/* Define __GLIBC_FLT_EVAL_METHOD.  M68K version. +-   Copyright (C) 2016-2023 Free Software Foundation, Inc. +-   This file is part of the GNU C Library. +- +-   The GNU C Library is free software; you can redistribute it and/or +-   modify it under the terms of the GNU Lesser General Public +-   License as published by the Free Software Foundation; either +-   version 2.1 of the License, or (at your option) any later version. +- +-   The GNU C Library 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 +-   Lesser General Public License for more details. +- +-   You should have received a copy of the GNU Lesser General Public +-   License along with the GNU C Library; if not, see +-   <https://www.gnu.org/licenses/>.  */ +- +-#ifndef _MATH_H +-# error "Never use <bits/flt-eval-method.h> directly; include <math.h> instead." +-#endif +- +-/* The m68k FPUs evaluate all values in the 96-bit floating-point +-   format which is also available for the user as 'long double'.  */ +-#define __GLIBC_FLT_EVAL_METHOD	2 +diff -Nur glibc-2.38.orig/sysdeps/m68k/m680x0/m68020/wordcopy.S glibc-2.38/sysdeps/m68k/m680x0/m68020/wordcopy.S +--- glibc-2.38.orig/sysdeps/m68k/m680x0/m68020/wordcopy.S	2023-07-31 19:54:16.000000000 +0200 ++++ glibc-2.38/sysdeps/m68k/m680x0/m68020/wordcopy.S	1970-01-01 01:00:00.000000000 +0100 +@@ -1 +0,0 @@ +-/* Empty, not needed.  */ +diff -Nur glibc-2.38.orig/sysdeps/m68k/wordcopy.c glibc-2.38/sysdeps/m68k/wordcopy.c +--- glibc-2.38.orig/sysdeps/m68k/wordcopy.c	1970-01-01 01:00:00.000000000 +0100 ++++ glibc-2.38/sysdeps/m68k/wordcopy.c	2023-08-10 16:23:10.972526508 +0200 +@@ -0,0 +1,21 @@ ++/* Definitions for memory copy functions.  Motorola 68020 version.                                                                                                                                                  ++   Copyright (C) 2023 Free Software Foundation, Inc.                                                                                                                                                                ++   This file is part of the GNU C Library.                                                                                                                                                                          ++                                                                                                                                                                                                                    ++   The GNU C Library is free software; you can redistribute it and/or                                                                                                                                               ++   modify it under the terms of the GNU Lesser General Public                                                                                                                                                       ++   License as published by the Free Software Foundation; either                                                                                                                                                     ++   version 2.1 of the License, or (at your option) any later version.                                                                                                                                               ++                                                                                                                                                                                                                    ++   The GNU C Library 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                                                                                                                                                ++   Lesser General Public License for more details.                                                                                                                                                                  ++                                                                                                                                                                                                                    ++   You should have received a copy of the GNU Lesser General Public                                                                                                                                                 ++   License along with the GNU C Library.  If not, see                                                                                                                                                               ++   <https://www.gnu.org/licenses/>.  */                                                                                                                                                                             ++                                                                                                                                                                                                                    ++#if !defined(__mc68020__) && !defined(mc68020)                                                                                                                                                                      ++#include <string/wordcopy.c>                                                                                                                                                                                        ++#endif   | 
