aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--string/Versions3
-rw-r--r--string/memcmp.c3
-rw-r--r--string/string.h16
-rw-r--r--string/tester.c16
-rw-r--r--sysdeps/aarch64/memcmp.S2
-rw-r--r--sysdeps/csky/abiv2/memcmp.S1
-rw-r--r--sysdeps/i386/i686/memcmp.S2
-rw-r--r--sysdeps/i386/i686/multiarch/memcmp-ia32.S3
-rw-r--r--sysdeps/i386/i686/multiarch/memcmp.c1
-rw-r--r--sysdeps/i386/memcmp.S2
-rw-r--r--sysdeps/ia64/memcmp.S1
-rw-r--r--sysdeps/mach/hurd/i386/libc.abilist1
-rw-r--r--sysdeps/powerpc/powerpc32/405/memcmp.S1
-rw-r--r--sysdeps/powerpc/powerpc32/power4/memcmp.S1
-rw-r--r--sysdeps/powerpc/powerpc32/power4/multiarch/memcmp-power7.S3
-rw-r--r--sysdeps/powerpc/powerpc32/power4/multiarch/memcmp-ppc32.S4
-rw-r--r--sysdeps/powerpc/powerpc32/power7/memcmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/le/power10/memcmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-power10.S2
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-power4.S2
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-power7.S2
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-power8.S2
-rw-r--r--sysdeps/powerpc/powerpc64/multiarch/memcmp-ppc64.c4
-rw-r--r--sysdeps/powerpc/powerpc64/power4/memcmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power7/memcmp.S1
-rw-r--r--sysdeps/powerpc/powerpc64/power8/memcmp.S1
-rw-r--r--sysdeps/s390/memcmp-z900.S1
-rw-r--r--sysdeps/s390/memcmp.c1
-rw-r--r--sysdeps/sparc/sparc64/memcmp.S2
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/alpha/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/arc/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/arm/be/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/arm/le/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/csky/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/hppa/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/i386/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/ia64/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/be/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/microblaze/le/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/nios2/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sh/be/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sh/le/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/libc.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist1
-rw-r--r--sysdeps/x86_64/memcmp.S2
-rw-r--r--sysdeps/x86_64/multiarch/memcmp-sse2.S3
-rw-r--r--sysdeps/x86_64/multiarch/memcmp.c2
64 files changed, 120 insertions, 0 deletions
diff --git a/string/Versions b/string/Versions
index 298ecd401a..864c4cf7a4 100644
--- a/string/Versions
+++ b/string/Versions
@@ -89,4 +89,7 @@ libc {
sigdescr_np; sigabbrev_np;
strerrordesc_np; strerrorname_np;
}
+ GLIBC_2.35 {
+ __memcmpeq;
+ }
}
diff --git a/string/memcmp.c b/string/memcmp.c
index 9b46d7a905..eac4112530 100644
--- a/string/memcmp.c
+++ b/string/memcmp.c
@@ -359,3 +359,6 @@ libc_hidden_builtin_def(memcmp)
# undef bcmp
weak_alias (memcmp, bcmp)
#endif
+
+#undef __memcmpeq
+strong_alias (memcmp, __memcmpeq)
diff --git a/string/string.h b/string/string.h
index b1b083edce..e70feeaeea 100644
--- a/string/string.h
+++ b/string/string.h
@@ -64,6 +64,22 @@ extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
extern int memcmp (const void *__s1, const void *__s2, size_t __n)
__THROW __attribute_pure__ __nonnull ((1, 2));
+/* Compare N bytes of S1 and S2. Return zero if S1 and S2 are equal.
+ Return some non-zero value otherwise.
+
+ Essentially __memcmpeq has the exact same semantics as memcmp
+ except the return value is less constrained. memcmp is always a
+ correct implementation of __memcmpeq. As well !!memcmp, -memcmp,
+ or bcmp are correct implementations.
+
+ __memcmpeq is meant to be used by compilers when memcmp return is
+ only used for its bolean value.
+
+ __memcmpeq is declared only for use by compilers. Programs should
+ continue to use memcmp. */
+extern int __memcmpeq (const void *__s1, const void *__s2, size_t __n)
+ __THROW __attribute_pure__ __nonnull ((1, 2));
+
/* Search N bytes of S for C. */
#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
extern "C++"
diff --git a/string/tester.c b/string/tester.c
index 778160ae6e..605b3f00f9 100644
--- a/string/tester.c
+++ b/string/tester.c
@@ -1450,6 +1450,19 @@ test_bcmp (void)
}
static void
+test_memcmpeq (void)
+{
+ it = "__memcmpeq";
+ check (__memcmpeq ("a", "a", 1) == 0, 1); /* Identity. */
+ check (__memcmpeq ("abc", "abc", 3) == 0, 2); /* Multicharacter. */
+ check (__memcmpeq ("abcd", "abce", 4) != 0, 3); /* Honestly unequal. */
+ check (__memcmpeq ("abce", "abcd", 4) != 0, 4);
+ check (__memcmpeq ("alph", "beta", 4) != 0, 5);
+ check (__memcmpeq ("abce", "abcd", 3) == 0, 6); /* Count limited. */
+ check (__memcmpeq ("abc", "def", 0) == 0, 8); /* Zero count. */
+}
+
+static void
test_strerror (void)
{
it = "strerror";
@@ -1611,6 +1624,9 @@ main (void)
/* bcmp - somewhat like memcmp. */
test_bcmp ();
+ /* __memcmpeq - somewhat like memcmp. */
+ test_memcmpeq ();
+
/* strndup. */
test_strndup ();
diff --git a/sysdeps/aarch64/memcmp.S b/sysdeps/aarch64/memcmp.S
index c1937f6f5c..37f37b9191 100644
--- a/sysdeps/aarch64/memcmp.S
+++ b/sysdeps/aarch64/memcmp.S
@@ -177,4 +177,6 @@ L(ret_0):
END (memcmp)
#undef bcmp
weak_alias (memcmp, bcmp)
+#undef __memcmpeq
+strong_alias (memcmp, __memcmpeq)
libc_hidden_builtin_def (memcmp)
diff --git a/sysdeps/csky/abiv2/memcmp.S b/sysdeps/csky/abiv2/memcmp.S
index 1560387618..2a4ae577b0 100644
--- a/sysdeps/csky/abiv2/memcmp.S
+++ b/sysdeps/csky/abiv2/memcmp.S
@@ -138,5 +138,6 @@ ENTRY (memcmp)
br .L_s1_aligned
END (memcmp)
weak_alias (memcmp, bcmp)
+strong_alias (memcmp, __memcmpeq)
libc_hidden_def (memcmp)
.weak memcmp
diff --git a/sysdeps/i386/i686/memcmp.S b/sysdeps/i386/i686/memcmp.S
index b26b124fad..90266d904b 100644
--- a/sysdeps/i386/i686/memcmp.S
+++ b/sysdeps/i386/i686/memcmp.S
@@ -405,4 +405,6 @@ L(table_32bytes) :
#undef bcmp
weak_alias (memcmp, bcmp)
+#undef __memcmpeq
+strong_alias (memcmp, __memcmpeq)
libc_hidden_builtin_def (memcmp)
diff --git a/sysdeps/i386/i686/multiarch/memcmp-ia32.S b/sysdeps/i386/i686/multiarch/memcmp-ia32.S
index 5f6658b89a..a5b5c3d349 100644
--- a/sysdeps/i386/i686/multiarch/memcmp-ia32.S
+++ b/sysdeps/i386/i686/multiarch/memcmp-ia32.S
@@ -30,6 +30,9 @@
# undef weak_alias
# define weak_alias(original, alias)
+
+# undef strong_alias
+# define strong_alias(original, alias)
#endif
#include <sysdeps/i386/i686/memcmp.S>
diff --git a/sysdeps/i386/i686/multiarch/memcmp.c b/sysdeps/i386/i686/multiarch/memcmp.c
index 6e058a8857..3b2815edbc 100644
--- a/sysdeps/i386/i686/multiarch/memcmp.c
+++ b/sysdeps/i386/i686/multiarch/memcmp.c
@@ -29,4 +29,5 @@
libc_ifunc_redirected (__redirect_memcmp, memcmp, IFUNC_SELECTOR ());
weak_alias (memcmp, bcmp)
+strong_alias (memcmp, __memcmpeq)
#endif
diff --git a/sysdeps/i386/memcmp.S b/sysdeps/i386/memcmp.S
index 1f212b0f6d..02473c2c0c 100644
--- a/sysdeps/i386/memcmp.S
+++ b/sysdeps/i386/memcmp.S
@@ -70,4 +70,6 @@ END (memcmp)
#undef bcmp
weak_alias (memcmp, bcmp)
+#undef __memcmpeq
+strong_alias (memcmp, __memcmpeq)
libc_hidden_builtin_def (memcmp)
diff --git a/sysdeps/ia64/memcmp.S b/sysdeps/ia64/memcmp.S
index 97539c23fd..7722908751 100644
--- a/sysdeps/ia64/memcmp.S
+++ b/sysdeps/ia64/memcmp.S
@@ -160,4 +160,5 @@ ENTRY(memcmp)
END(memcmp)
weak_alias (memcmp, bcmp)
+strong_alias (memcmp, __memcmpeq)
libc_hidden_builtin_def (memcmp)
diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
index c5da10a0cd..e849d6fa35 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -2285,6 +2285,7 @@ GLIBC_2.34 res_send F
GLIBC_2.34 shm_open F
GLIBC_2.34 shm_unlink F
GLIBC_2.34 timespec_getres F
+GLIBC_2.35 __memcmpeq F
GLIBC_2.4 __confstr_chk F
GLIBC_2.4 __fgets_chk F
GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/powerpc/powerpc32/405/memcmp.S b/sysdeps/powerpc/powerpc32/405/memcmp.S
index 6a6a54d90f..c2836040a7 100644
--- a/sysdeps/powerpc/powerpc32/405/memcmp.S
+++ b/sysdeps/powerpc/powerpc32/405/memcmp.S
@@ -126,3 +126,4 @@ L(st2):
END (memcmp)
libc_hidden_builtin_def (memcmp)
weak_alias (memcmp,bcmp)
+strong_alias (memcmp, __memcmpeq)
diff --git a/sysdeps/powerpc/powerpc32/power4/memcmp.S b/sysdeps/powerpc/powerpc32/power4/memcmp.S
index 814d2f211d..f58e34aba5 100644
--- a/sysdeps/powerpc/powerpc32/power4/memcmp.S
+++ b/sysdeps/powerpc/powerpc32/power4/memcmp.S
@@ -1373,3 +1373,4 @@ END (memcmp)
libc_hidden_builtin_def (memcmp)
weak_alias (memcmp, bcmp)
+strong_alias (memcmp, __memcmpeq)
diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/memcmp-power7.S b/sysdeps/powerpc/powerpc32/power4/multiarch/memcmp-power7.S
index 8a929b2b44..b17d0e43b7 100644
--- a/sysdeps/powerpc/powerpc32/power4/multiarch/memcmp-power7.S
+++ b/