Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F135519931
D53660.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
15 KB
Referenced Files
None
Subscribers
None
D53660.id.diff
View Options
diff --git a/lib/libc/tests/Makefile b/lib/libc/tests/Makefile
--- a/lib/libc/tests/Makefile
+++ b/lib/libc/tests/Makefile
@@ -14,6 +14,7 @@
TESTS_SUBDIRS+= rpc
TESTS_SUBDIRS+= secure
TESTS_SUBDIRS+= setjmp
+TESTS_SUBDIRS+= stdbit
TESTS_SUBDIRS+= stdio
TESTS_SUBDIRS+= stdlib
TESTS_SUBDIRS+= stdtime
diff --git a/lib/libc/tests/stdbit/Makefile b/lib/libc/tests/stdbit/Makefile
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/Makefile
@@ -0,0 +1,19 @@
+# ensure libc functions are tested, not clang's builtins
+CFLAGS+= -fno-builtin
+
+ATF_TESTS_C+= stdc_bit_ceil_test \
+ stdc_bit_floor_test \
+ stdc_bit_width_test \
+ stdc_count_ones_test \
+ stdc_count_zeros_test \
+ stdc_first_leading_one_test \
+ stdc_first_leading_zero_test \
+ stdc_first_trailing_one_test \
+ stdc_first_trailing_zero_test \
+ stdc_has_single_bit_test \
+ stdc_leading_ones_test \
+ stdc_leading_zeros_test \
+ stdc_trailing_ones_test \
+ stdc_trailing_zeros_test
+
+.include <bsd.test.mk>
diff --git a/lib/libc/tests/stdbit/stdbit-test-framework.c b/lib/libc/tests/stdbit/stdbit-test-framework.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdbit-test-framework.c
@@ -0,0 +1,71 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+/*
+ * Test framework for stdbit functions.
+ * Requires the following macros to be defined:
+ *
+ * FUNCSTEM -- name of the function without type suffix
+ * MKREFFUNC(name, type) -- macro to generate a reference
+ * implementation of the function as a static function
+ * named name with give argument type.
+ */
+
+#include <sys/cdefs.h>
+#include <atf-c.h>
+#include <limits.h>
+#include <stdbit.h>
+#include <stdint.h>
+
+#define ATF_TC_WITHOUT_HEAD1(stem, suffix) ATF_TC_WITHOUT_HEAD2(__CONCAT(stem, suffix))
+#define ATF_TC_WITHOUT_HEAD2(case) ATF_TC_WITHOUT_HEAD(case)
+#define ATF_TC_BODY1(stem, suffix, tc) ATF_TC_BODY2(__CONCAT(stem, suffix), tc)
+#define ATF_TC_BODY2(case, tc) ATF_TC_BODY(case, tc)
+
+#define SUFFIX _uc
+#define TYPE unsigned char
+#include "stdbit-test-kernel.c"
+#undef TYPE
+#undef SUFFIX
+
+#define SUFFIX _us
+#define TYPE unsigned short
+#include "stdbit-test-kernel.c"
+#undef TYPE
+#undef SUFFIX
+
+#define SUFFIX _ui
+#define TYPE unsigned int
+#include "stdbit-test-kernel.c"
+#undef TYPE
+#undef SUFFIX
+
+#define SUFFIX _ul
+#define TYPE unsigned long
+#include "stdbit-test-kernel.c"
+#undef TYPE
+#undef SUFFIX
+
+#define SUFFIX _ull
+#define TYPE unsigned long long
+#include "stdbit-test-kernel.c"
+#undef TYPE
+#undef SUFFIX
+
+#define ADD_CASE(stem, suffix) ADD_CASE1(__CONCAT(stem, suffix))
+#define ADD_CASE1(case) ATF_TP_ADD_TC(tp, case)
+
+ATF_TP_ADD_TCS(tp)
+{
+
+ ADD_CASE(FUNCSTEM, _uc);
+ ADD_CASE(FUNCSTEM, _us);
+ ADD_CASE(FUNCSTEM, _ui);
+ ADD_CASE(FUNCSTEM, _ul);
+ ADD_CASE(FUNCSTEM, _ull);
+
+ return (atf_no_error());
+}
diff --git a/lib/libc/tests/stdbit/stdbit-test-kernel.c b/lib/libc/tests/stdbit/stdbit-test-kernel.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdbit-test-kernel.c
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+/*
+ * test kernel for stdbit functions.
+ * Requires the following macros to be defined:
+ *
+ * FUNCSTEM -- stem of the function name
+ * SUFFIX -- type suffic
+ * TYPE -- argument type
+ * MKREFFUNC(ref, type) -- reference function builder
+ */
+
+#define FUNC __CONCAT(FUNCSTEM, SUFFIX)
+#define REF __CONCAT(FUNCSTEM, __CONCAT(SUFFIX, _ref))
+#define TYPE_BITS (CHAR_BIT * sizeof(TYPE))
+
+MKREFFUNC(REF, TYPE)
+
+ATF_TC_WITHOUT_HEAD1(FUNCSTEM, SUFFIX);
+ATF_TC_BODY1(FUNCSTEM, SUFFIX, tc)
+{
+ uintmax_t has, want;
+ size_t i, j;
+ TYPE value;
+
+ /* test all single-bit patterns */
+ for (i = 0; i < TYPE_BITS; i++) {
+ value = (TYPE)1 << i;
+ has = FUNC(value);
+ want = REF(value);
+ ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
+ __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
+ }
+
+ /* test all double-bit patterns */
+ for (i = 0; i < TYPE_BITS; i++)
+ for (j = 0; j < i; j++) {
+ value = (TYPE)1 << i | (TYPE)1 << j;
+ has = FUNC(value);
+ want = REF(value);
+ ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
+ __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
+ }
+
+ /* test all barber-pole patterns */
+ value = ~(TYPE)0;
+ for (i = 0; i < TYPE_BITS; i++) {
+ has = FUNC(value);
+ want = REF(value);
+ ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
+ __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
+
+ value = ~value;
+ has = FUNC(value);
+ want = REF(value);
+ ATF_CHECK_EQ_MSG(has, want, "%s(%#jx) == %#jx != %#jx == %s(%#jx)",
+ __XSTRING(FUNC), (uintmax_t)value, has, want, __XSTRING(REF), (uintmax_t)value);
+
+ value = ~value << 1;
+ }
+}
+
+#undef TYPE_BITS
+#undef REF
+#undef FUNC
diff --git a/lib/libc/tests/stdbit/stdc_bit_ceil_test.c b/lib/libc/tests/stdbit/stdc_bit_ceil_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_bit_ceil_test.c
@@ -0,0 +1,20 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_bit_ceil
+#define MKREFFUNC(name, type) \
+ static type \
+ name(type value) \
+ { \
+ type ceil = 1; \
+ \
+ while (ceil < value && ceil != 0) \
+ ceil <<= 1; \
+ \
+ return (ceil); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_bit_floor_test.c b/lib/libc/tests/stdbit/stdc_bit_floor_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_bit_floor_test.c
@@ -0,0 +1,25 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_bit_floor
+#define MKREFFUNC(name, type) \
+ static type \
+ name(type value) \
+ { \
+ type floor = 1; \
+ \
+ if (value == 0) \
+ return (0); \
+ \
+ while (value != 1) { \
+ floor <<= 1; \
+ value >>= 1; \
+ } \
+ \
+ return (floor); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_bit_width_test.c b/lib/libc/tests/stdbit/stdc_bit_width_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_bit_width_test.c
@@ -0,0 +1,22 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_bit_width
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ unsigned width = 0; \
+ \
+ while (value != 0) { \
+ value >>= 1; \
+ width++; \
+ } \
+ \
+ return (width); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_count_ones_test.c b/lib/libc/tests/stdbit/stdc_count_ones_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_count_ones_test.c
@@ -0,0 +1,22 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_count_ones
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ unsigned count = 0; \
+ \
+ while (value != 0) { \
+ count += value & 1; \
+ value >>= 1; \
+ } \
+ \
+ return (count); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_count_zeros_test.c b/lib/libc/tests/stdbit/stdc_count_zeros_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_count_zeros_test.c
@@ -0,0 +1,23 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_count_zeros
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ unsigned count = 0; \
+ \
+ value = ~value; \
+ while (value != 0) { \
+ count += value & 1; \
+ value >>= 1; \
+ } \
+ \
+ return (count); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_first_leading_one_test.c b/lib/libc/tests/stdbit/stdc_first_leading_one_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_first_leading_one_test.c
@@ -0,0 +1,29 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_first_leading_one
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned pos = 1; \
+ \
+ if (value == 0) \
+ return (0); \
+ \
+ while ((type)(bit << 1) != 0) \
+ bit <<= 1; \
+ \
+ while ((bit & value) == 0) { \
+ bit >>= 1; \
+ pos++; \
+ } \
+ \
+ return (pos); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_first_leading_zero_test.c b/lib/libc/tests/stdbit/stdc_first_leading_zero_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_first_leading_zero_test.c
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_first_leading_zero
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned pos = 1; \
+ \
+ value = ~value; \
+ if (value == 0) \
+ return (0); \
+ \
+ while ((type)(bit << 1) != 0) \
+ bit <<= 1; \
+ \
+ while ((bit & value) == 0) { \
+ bit >>= 1; \
+ pos++; \
+ } \
+ \
+ return (pos); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_first_trailing_one_test.c b/lib/libc/tests/stdbit/stdc_first_trailing_one_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_first_trailing_one_test.c
@@ -0,0 +1,26 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_first_trailing_one
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned pos = 1; \
+ \
+ if (value == 0) \
+ return (0); \
+ \
+ while ((bit & value) == 0) { \
+ bit <<= 1; \
+ pos++; \
+ } \
+ \
+ return (pos); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_first_trailing_zero_test.c b/lib/libc/tests/stdbit/stdc_first_trailing_zero_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_first_trailing_zero_test.c
@@ -0,0 +1,27 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_first_trailing_zero
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned pos = 1; \
+ \
+ value = ~value; \
+ if (value == 0) \
+ return (0); \
+ \
+ while ((bit & value) == 0) { \
+ bit <<= 1; \
+ pos++; \
+ } \
+ \
+ return (pos); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_has_single_bit_test.c b/lib/libc/tests/stdbit/stdc_has_single_bit_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_has_single_bit_test.c
@@ -0,0 +1,21 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_has_single_bit
+#define MKREFFUNC(name, type) \
+ static bool \
+ name(type value) \
+ { \
+ type bit; \
+ \
+ for (bit = 1; bit != 0; bit <<= 1) \
+ if (value == bit) \
+ return (true); \
+ \
+ return (false); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_leading_ones_test.c b/lib/libc/tests/stdbit/stdc_leading_ones_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_leading_ones_test.c
@@ -0,0 +1,26 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_leading_ones
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned count = 0; \
+ \
+ while ((type)(bit << 1) != 0) \
+ bit <<= 1; \
+ \
+ while (bit != 0 && (bit & value) != 0) { \
+ bit >>= 1; \
+ count++; \
+ } \
+ \
+ return (count); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_leading_zeros_test.c b/lib/libc/tests/stdbit/stdc_leading_zeros_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_leading_zeros_test.c
@@ -0,0 +1,26 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_leading_zeros
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned count = 0; \
+ \
+ while ((type)(bit << 1) != 0) \
+ bit <<= 1; \
+ \
+ while (bit != 0 && (bit & value) == 0) { \
+ bit >>= 1; \
+ count++; \
+ } \
+ \
+ return (count); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_trailing_ones_test.c b/lib/libc/tests/stdbit/stdc_trailing_ones_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_trailing_ones_test.c
@@ -0,0 +1,23 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_trailing_ones
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned count = 0; \
+ \
+ while (bit != 0 && (bit & value) != 0) { \
+ bit <<= 1; \
+ count++; \
+ } \
+ \
+ return (count); \
+ }
+
+#include "stdbit-test-framework.c"
diff --git a/lib/libc/tests/stdbit/stdc_trailing_zeros_test.c b/lib/libc/tests/stdbit/stdc_trailing_zeros_test.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/tests/stdbit/stdc_trailing_zeros_test.c
@@ -0,0 +1,23 @@
+/*-
+ * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#define FUNCSTEM stdc_trailing_zeros
+#define MKREFFUNC(name, type) \
+ static unsigned \
+ name(type value) \
+ { \
+ type bit = 1; \
+ unsigned count = 0; \
+ \
+ while (bit != 0 && (bit & value) == 0) { \
+ bit <<= 1; \
+ count++; \
+ } \
+ \
+ return (count); \
+ }
+
+#include "stdbit-test-framework.c"
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Nov 11, 12:22 PM (4 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25157090
Default Alt Text
D53660.id.diff (15 KB)
Attached To
Mode
D53660: libc/tests: add stdbit test framework and unit tests
Attached
Detach File
Event Timeline
Log In to Comment