Page MenuHomeFreeBSD

D53660.id.diff
No OneTemporary

D53660.id.diff

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

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)

Event Timeline