Blame SOURCES/0151-macros-expand-BIT-macros-add-MASK-macros-add-_SAFE-m.patch

0e3ee4
From 3f3dd44f1964c54b55e8c84343579bd7c1924df5 Mon Sep 17 00:00:00 2001
0e3ee4
From: Eugene Syromyatnikov <evgsyr@gmail.com>
0e3ee4
Date: Wed, 18 Aug 2021 21:49:12 +0200
0e3ee4
Subject: [PATCH 148/150] macros: expand BIT macros, add MASK macros; add
0e3ee4
 *_SAFE macros
0e3ee4
0e3ee4
These macros might make reading a code that often converts between powers
0e3ee4
of 2 and values/masks a bit easier;  moreover, the *_SAFE versions should
0e3ee4
help in cases where the shift values are expected to be equal to the type
0e3ee4
bit width (which lead to UB otherwise).
0e3ee4
0e3ee4
Switching from BIT to BIT32 should also clarify bitness, which may be somewhat
0e3ee4
murky at times (cf. printxval, printflags, and printxvals).
0e3ee4
0e3ee4
* src/macros.h [!BIT] (BIT): Rename to...
0e3ee4
[!BIT32] (BIT32): ...this.
0e3ee4
[!BIT64] (BIT64): New macro.
0e3ee4
[!MASK32] (MASK32): Likewise.
0e3ee4
[!MASK64] (MASK64): Likewise.
0e3ee4
(BIT32_SAFE, BIT64_SAFE, MASK32_SAFE, MASK64_SAFE): New macros.
0e3ee4
(FLAG): Use BIT32.
0e3ee4
---
0e3ee4
 src/macros.h | 30 +++++++++++++++++++++++++++---
0e3ee4
 1 file changed, 27 insertions(+), 3 deletions(-)
0e3ee4
0e3ee4
diff --git a/src/macros.h b/src/macros.h
0e3ee4
index 467f5d0..2d7a83d 100644
0e3ee4
--- a/src/macros.h
0e3ee4
+++ b/src/macros.h
0e3ee4
@@ -78,10 +78,34 @@ is_filled(const char *ptr, char fill, size_t size)
0e3ee4
 # define IS_ARRAY_ZERO(arr_)	\
0e3ee4
 	is_filled((const char *) (arr_), 0, sizeof(arr_) + MUST_BE_ARRAY(arr_))
0e3ee4
 
0e3ee4
-# ifndef BIT
0e3ee4
-#  define BIT(x_) (1U << (x_))
0e3ee4
+# ifndef BIT32
0e3ee4
+#  define BIT32(x_) (1U << (x_))
0e3ee4
 # endif
0e3ee4
 
0e3ee4
-# define FLAG(name_) name_ = BIT(name_##_BIT)
0e3ee4
+# ifndef BIT64
0e3ee4
+#  define BIT64(x_) (1ULL << (x_))
0e3ee4
+# endif
0e3ee4
+
0e3ee4
+# ifndef MASK32
0e3ee4
+#  define MASK32(x_) (BIT32(x_) - 1U)
0e3ee4
+# endif
0e3ee4
+
0e3ee4
+# ifndef MASK64
0e3ee4
+#  define MASK64(x_) (BIT64(x_) - 1ULL)
0e3ee4
+# endif
0e3ee4
+
0e3ee4
+/*
0e3ee4
+ * "Safe" versions that avoid UB for values that are >= type bit size
0e3ee4
+ * (the usually expected behaviour of the bit shift in that case is zero,
0e3ee4
+ * but at least powerpc is notorious for returning the input value when shift
0e3ee4
+ * by 64 bits is performed).
0e3ee4
+ */
0e3ee4
+
0e3ee4
+# define BIT32_SAFE(x_) ((x_) < 32 ? BIT32(x_) : 0)
0e3ee4
+# define BIT64_SAFE(x_) ((x_) < 64 ? BIT64(x_) : 0)
0e3ee4
+# define MASK32_SAFE(x_) (BIT32_SAFE(x_) - 1U)
0e3ee4
+# define MASK64_SAFE(x_) (BIT64_SAFE(x_) - 1ULL)
0e3ee4
+
0e3ee4
+# define FLAG(name_) name_ = BIT32(name_##_BIT)
0e3ee4
 
0e3ee4
 #endif /* !STRACE_MACROS_H */
0e3ee4
-- 
0e3ee4
2.1.4
0e3ee4