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

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