From 44829b3ddb64e99e37343a0f25b2c082387d31a5 Mon Sep 17 00:00:00 2001 From: Noah Goldstein Date: Thu, 21 Oct 2021 15:54:57 -0500 Subject: String: Add support for __memcmpeq() ABI on all targets No bug. This commit adds support for __memcmpeq() as a new ABI for all targets. In this commit __memcmpeq() is implemented only as an alias to the corresponding targets memcmp() implementation. __memcmpeq() is added as a new symbol starting with GLIBC_2.35 and defined in string.h with comments explaining its behavior. Basic tests that it is callable and works where added in string/tester.c As discussed in the proposal "Add new ABI '__memcmpeq()' to libc" __memcmpeq() is essentially a reserved namespace for bcmp(). The means is shares the same specifications as memcmp() except the return value for non-equal byte sequences is any non-zero value. This is less strict than memcmp()'s return value specification and can be better optimized when a boolean return is all that is needed. __memcmpeq() is meant to only be called by compilers if they can prove that the return value of a memcmp() call is only used for its boolean value. All tests in string/tester.c passed. As well build succeeds on x86_64-linux-gnu target. --- sysdeps/x86_64/memcmp.S | 2 ++ sysdeps/x86_64/multiarch/memcmp-sse2.S | 3 +++ sysdeps/x86_64/multiarch/memcmp.c | 2 ++ 3 files changed, 7 insertions(+) (limited to 'sysdeps/x86_64') diff --git a/sysdeps/x86_64/memcmp.S b/sysdeps/x86_64/memcmp.S index 870e15c5a0..1b351ee092 100644 --- a/sysdeps/x86_64/memcmp.S +++ b/sysdeps/x86_64/memcmp.S @@ -358,4 +358,6 @@ END(memcmp) #undef bcmp weak_alias (memcmp, bcmp) +#undef __memcmpeq +strong_alias (memcmp, __memcmpeq) libc_hidden_builtin_def (memcmp) diff --git a/sysdeps/x86_64/multiarch/memcmp-sse2.S b/sysdeps/x86_64/multiarch/memcmp-sse2.S index b135fa2d40..af737c5e6c 100644 --- a/sysdeps/x86_64/multiarch/memcmp-sse2.S +++ b/sysdeps/x86_64/multiarch/memcmp-sse2.S @@ -26,6 +26,9 @@ # undef weak_alias # define weak_alias(ignored1, ignored2) + +# undef strong_alias +# define strong_alias(ignored1, ignored2) #endif #include diff --git a/sysdeps/x86_64/multiarch/memcmp.c b/sysdeps/x86_64/multiarch/memcmp.c index fe725f3563..4a3aad2c9c 100644 --- a/sysdeps/x86_64/multiarch/memcmp.c +++ b/sysdeps/x86_64/multiarch/memcmp.c @@ -29,6 +29,8 @@ libc_ifunc_redirected (__redirect_memcmp, memcmp, IFUNC_SELECTOR ()); # undef bcmp weak_alias (memcmp, bcmp) +# undef __memcmpeq +strong_alias (memcmp, __memcmpeq) # ifdef SHARED __hidden_ver1 (memcmp, __GI_memcmp, __redirect_memcmp) -- cgit 1.4.1