From nobody Sat Jun 20 00:24:59 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ghwG41K0vz6hFJm for ; Sat, 20 Jun 2026 00:25:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ghwG35Rx4z3J5K for ; Sat, 20 Jun 2026 00:24:59 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781915099; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=zD16KWpC8+esWcmEzUfkOSRYBwR41RysdEtRp6uFUdk=; b=QLShWVUegVn94/WiliHvUkBNKToOwW9+clFLI+SzcaOMpVQAnLT4jyc2tRVmUfW9XdUVFs IOsZTAPmx2Peo9jsFiqI8sL2u8mT09W1aetErvFI9bk6DU5UK0WW8+W51QbD94agiA4ICg 3gVFsnyoVZLtMH9ms45kcoIX0Zo2AKUpJAM4tuynNPhjNZLFFWUxeZIWQBz4g7JkSJiXxB O01anO+UpMStE/CT7wYwqNuYbMSaGDvPzZtoiNh+9RcL3igfDC1NDAG7X7swUnQoFMc25s G1nOHLxOxewGfExIDJmKhc05Cw3jcxRHC3o8WhrDdXB5yGsqlpsy42Dbh/jK3g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1781915099; a=rsa-sha256; cv=none; b=Sqm12s4Cco7gM/mnNOaTVSN2tXVrlBQK7POQkzp80acSmVS5QsHHM8awpPohjLh/eyhAxy Ti0fIbMgxf7+H6zItvAzzKhixL6vlRHxxLYDHUiHkZvXay5+q4OJJ05r+CQDOepbvC3p2h 4Jdu/CuuZsM+UXfYyGWKd1IRBjhaE8HHda3AkxF0UzxAcsug6zKWbdqmeyqWLXTVVKT7iU pBR20U04NvLZeVIzmvG+tcCy4jsNyBVTE+4YmtE6FyNekWS+x1NTdSmo1Jl7X5nIaQ19pR /vnlNkyNSgmteMSxk6Q5ki1A3Xnhr/7CYfkARA+W+z9pDmJm3k6qcEA5/Mx7Pw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781915099; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=zD16KWpC8+esWcmEzUfkOSRYBwR41RysdEtRp6uFUdk=; b=F3qpdfbqqqXEnPzEMh2ymhwD0f6Snujf0h7Q/KbUavciP9kJjYD+hocYrJfZPkWXYlytpH 9srrxCIh+6MiEfbQO/wikAI69UaXXyakYRMwhmCqLZA8JwYI+BYqHvnUuTwX+fPE1aPEul CcD+jjqrkqUCJOaDY5Sk6rHxBEFcLEZsgKhq01hy4nmTjzDSzux710hn6eE5MwdNw8aHvL c1vd2G9RbQaQibY3trA1OdXgKHiX+pSWpE/iGgRWbn0k5k226wq4GgvA+mt9GXGAIZvMHP tMbREkPAFvpPLkIgwv3fW9Pp94VOHrti1/saVceYstck2wqG6UZFrQBK82ptSg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4ghwG327MHz173D for ; Sat, 20 Jun 2026 00:24:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 252d9 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 20 Jun 2026 00:24:59 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Faraz Vahedi From: Warner Losh Subject: git: 0f8941fedce6 - main - tools/regression: Expand stdatomic conformance tests List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 0f8941fedce6c622f0fa71464b7790225aefa3e6 Auto-Submitted: auto-generated Date: Sat, 20 Jun 2026 00:24:59 +0000 Message-Id: <6a35dddb.252d9.3f9a03bb@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=0f8941fedce6c622f0fa71464b7790225aefa3e6 commit 0f8941fedce6c622f0fa71464b7790225aefa3e6 Author: Faraz Vahedi AuthorDate: 2026-05-08 11:40:02 +0000 Commit: Warner Losh CommitDate: 2026-06-20 00:23:29 +0000 tools/regression: Expand stdatomic conformance tests Extend the existing test utility to cover recent stdatomic changes and improve validation of interface semantics, compile-time assertions, and behavioural conformance. Signed-off-by: Faraz Vahedi Reviewed by: imp Pull Request: https://github.com/freebsd/freebsd-src/pull/2185 --- tools/regression/include/stdatomic/logic.c | 109 +++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/tools/regression/include/stdatomic/logic.c b/tools/regression/include/stdatomic/logic.c index e5534851417d..46ac85c57b0c 100644 --- a/tools/regression/include/stdatomic/logic.c +++ b/tools/regression/include/stdatomic/logic.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -42,8 +44,111 @@ * especially useful for the smaller integer types, as it may be the * case that these operations are implemented by processing entire words * (e.g. on MIPS). + * + * Before the randomised loop, a small surface check exercises lock-free + * macros, fences, atomic_flag, atomic_bool, pointer fetch_add/fetch_sub + * stride, kill_dependency, atomic_is_lock_free, and when available + * ATOMIC_VAR_INIT / ATOMIC_FLAG_INIT (pre-C23). */ +#define CHECK_LOCK_FREE(name) \ + _Static_assert((name) == 0 || (name) == 1 || (name) == 2, \ + #name " out of range") + +CHECK_LOCK_FREE(ATOMIC_BOOL_LOCK_FREE); +CHECK_LOCK_FREE(ATOMIC_CHAR_LOCK_FREE); +CHECK_LOCK_FREE(ATOMIC_SHORT_LOCK_FREE); +CHECK_LOCK_FREE(ATOMIC_INT_LOCK_FREE); +CHECK_LOCK_FREE(ATOMIC_LONG_LOCK_FREE); +CHECK_LOCK_FREE(ATOMIC_LLONG_LOCK_FREE); +CHECK_LOCK_FREE(ATOMIC_POINTER_LOCK_FREE); +#ifdef ATOMIC_CHAR8_T_LOCK_FREE +CHECK_LOCK_FREE(ATOMIC_CHAR8_T_LOCK_FREE); +#endif +#ifdef ATOMIC_CHAR16_T_LOCK_FREE +CHECK_LOCK_FREE(ATOMIC_CHAR16_T_LOCK_FREE); +#endif +#ifdef ATOMIC_CHAR32_T_LOCK_FREE +CHECK_LOCK_FREE(ATOMIC_CHAR32_T_LOCK_FREE); +#endif +#ifdef ATOMIC_WCHAR_T_LOCK_FREE +CHECK_LOCK_FREE(ATOMIC_WCHAR_T_LOCK_FREE); +#endif + +#if defined(__STDC_VERSION_STDATOMIC_H__) +_Static_assert(__STDC_VERSION_STDATOMIC_H__ == 202311L, + "__STDC_VERSION_STDATOMIC_H__"); +#endif + +static void +test_surface(void) +{ + atomic_flag f = ATOMIC_FLAG_INIT; + atomic_int probe; + atomic_bool b; + _Atomic(int *) ap; + int arr[4]; + int dep; + static const memory_order k_orders[] = { + memory_order_relaxed, + memory_order_consume, + memory_order_acquire, + memory_order_release, + memory_order_acq_rel, + memory_order_seq_cst, + }; + size_t k; + + dep = kill_dependency(123); + assert(dep == 123); + + atomic_init(&probe, 0); + assert(atomic_is_lock_free(&probe) == + atomic_is_lock_free((atomic_int *)NULL)); + + for (k = 0; k < sizeof(k_orders) / sizeof(k_orders[0]); k++) { + atomic_thread_fence(k_orders[k]); + atomic_signal_fence(k_orders[k]); + } + + assert(atomic_flag_test_and_set_explicit(&f, + memory_order_seq_cst) == 0); + assert(atomic_flag_test_and_set_explicit(&f, + memory_order_acquire) != 0); + atomic_flag_clear_explicit(&f, memory_order_relaxed); + + atomic_init(&b, false); + atomic_store_explicit(&b, true, memory_order_relaxed); + assert(atomic_load_explicit(&b, memory_order_relaxed) == true); + + memset(arr, 0, sizeof(arr)); + atomic_init(&ap, &arr[3]); + atomic_fetch_sub_explicit(&ap, 2, memory_order_relaxed); + assert(ap == &arr[1]); + atomic_fetch_add_explicit(&ap, 1, memory_order_relaxed); + assert(ap == &arr[2]); +} + +#ifdef ATOMIC_VAR_INIT +static void +test_atomic_var_init(void) +{ + atomic_int x = ATOMIC_VAR_INIT(42); + + assert(atomic_load_explicit(&x, memory_order_relaxed) == 42); + atomic_store_explicit(&x, 7, memory_order_relaxed); + assert(atomic_load_explicit(&x, memory_order_relaxed) == 7); + + { + atomic_flag f = ATOMIC_FLAG_INIT; + + assert(atomic_flag_test_and_set_explicit(&f, + memory_order_seq_cst) == 0); + atomic_flag_clear_explicit(&f, memory_order_relaxed); + } +} +#endif + static inline intmax_t rndnum(void) { @@ -111,6 +216,10 @@ main(void) { int i; + test_surface(); +#ifdef ATOMIC_VAR_INIT + test_atomic_var_init(); +#endif for (i = 0; i < 1000; i++) { TEST_TYPE(int8_t); TEST_TYPE(uint8_t);