On 7/27/26 3:00 AM, Thomas Weißschuh wrote:
+/* abs(), labs() and llabs() over the whole range of their argument type */
+int test_abs_range(void)
+{
+ int i, ri;
+ long l, rl;
+ long long ll, rll;
Reverse xmas?
Fixed for the next revision.
+
+ /*
+ * Both the inputs and the results have to stay opaque: the compiler
+ * knows abs() and friends never return a negative value and would
+ * otherwise fold the comparisons below at build time, which would also
+ * hide the undefined behavior that is being tested for.
+ */
+ i = INT_MIN; l = LONG_MIN; ll = LLONG_MIN;
+ __asm__ ("" : "+r" (i), "+r" (l), "+r" (ll));
We have _NOLIBC_OPTIMIZER_HIDE_VAR() for this.
Oh, I missed it.
Maybe it can be made variadic.
Sounds good to me.
Does the following patch look good?
From: Ammar Faizi <[email protected]>
Date: Sun, 26 Jul 2026 13:17:14 -0700
Subject: [PATCH] tools/nolibc: make _NOLIBC_OPTIMIZER_HIDE_VAR() variadic
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The macro only takes a single variable, so code that needs to hide
several at once has to either repeat it or open-code an asm statement
with a list of operands. Accept up to four variables and build the
operand list from them.
Existing single-argument users are unaffected; the code generated for
the callers in stdio.h is unchanged on i386 and x86-64.
Suggested-by: Thomas Weißschuh <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
tools/include/nolibc/compiler.h | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/tools/include/nolibc/compiler.h b/tools/include/nolibc/compiler.h
index f2d7a81d0d7c..ed69f6d26f56 100644
--- a/tools/include/nolibc/compiler.h
+++ b/tools/include/nolibc/compiler.h
@@ -77,8 +77,19 @@
# define __nolibc_static_assert(_t)
#endif
-/* Make the optimizer believe the variable can be manipulated arbitrarily. */
-#define _NOLIBC_OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "+r" (var))
+#define __nolibc_hide1(_1) "+r" (_1)
+#define __nolibc_hide2(_1, ...) "+r" (_1),
__nolibc_hide1(__VA_ARGS__)
+#define __nolibc_hide3(_1, ...) "+r" (_1),
__nolibc_hide2(__VA_ARGS__)
+#define __nolibc_hide4(_1, ...) "+r" (_1),
__nolibc_hide3(__VA_ARGS__)
+#define ___nolibc_hide_narg(_1, _2, _3, _4, N, ...) N
+#define __nolibc_hide_narg(...)
___nolibc_hide_narg(__VA_ARGS__, 4, 3, 2, 1)
+#define __nolibc_hide(N, ...) __nolibc_hide##N(__VA_ARGS__)
+#define __nolibc_hide_n(N, ...) __nolibc_hide(N, __VA_ARGS__)
+
+/* Make the optimizer believe the variables can be manipulated arbitrarily. */
+#define _NOLIBC_OPTIMIZER_HIDE_VAR(...)
\
+ __asm__ ("" : __nolibc_hide_n(__nolibc_hide_narg(__VA_ARGS__), \
+ __VA_ARGS__))
#if __nolibc_has_feature(undefined_behavior_sanitizer)
# if defined(__clang__)
--
Ammar Faizi