|
|
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 |
|