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

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