about summary refs log tree commit diff
path: root/string/tester.c
diff options
context:
space:
mode:
authorNoah Goldstein <goldstein.w.n@gmail.com>2021-10-21 15:54:57 -0500
committerNoah Goldstein <goldstein.w.n@gmail.com>2021-10-26 16:51:29 -0500
commit44829b3ddb64e99e37343a0f25b2c082387d31a5 (patch)
treeba9565215210f530296dd4456816fc69f593e542 /string/tester.c
parent8438135d3481853e300e1043cfee3946dadb28b3 (diff)
downloadglibc-44829b3ddb64e99e37343a0f25b2c082387d31a5.tar.gz
glibc-44829b3ddb64e99e37343a0f25b2c082387d31a5.tar.xz
glibc-44829b3ddb64e99e37343a0f25b2c082387d31a5.zip
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.
Diffstat (limited to 'string/tester.c')
-rw-r--r--string/tester.c16
1 files changed, 16 insertions, 0 deletions
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 ();