]> git.ozlabs.org Git - ccan/blobdiff - ccan/ilog/ilog.h
base64: fix for unsigned chars (e.g. ARM).
[ccan] / ccan / ilog / ilog.h
index 55dd009885a73c488cb41280f64a319e84ed6233..32702b178567e503c11d606d655738fe9dbfc3aa 100644 (file)
@@ -1,3 +1,4 @@
+/* CC0 (Public domain) - see LICENSE file for details */
 #if !defined(_ilog_H)
 # define _ilog_H (1)
 # include "config.h"
@@ -24,7 +25,7 @@
  *             return 1U << ilog32(i-1);
  *     }
  */
-int ilog32(uint32_t _v) IDEMPOTENT;
+int ilog32(uint32_t _v) CONST_FUNCTION;
 
 /**
  * ilog32_nz - Integer binary logarithm of a non-zero 32-bit value.
@@ -43,7 +44,7 @@ int ilog32(uint32_t _v) IDEMPOTENT;
  *             return ilog32_nz(i) - 1;
  *     }
  */
-int ilog32_nz(uint32_t _v) IDEMPOTENT;
+int ilog32_nz(uint32_t _v) CONST_FUNCTION;
 
 /**
  * ilog64 - Integer binary logarithm of a 64-bit value.
@@ -55,7 +56,7 @@ int ilog32_nz(uint32_t _v) IDEMPOTENT;
  * See Also:
  *     ilog64_nz(), ilog32()
  */
-int ilog64(uint64_t _v) IDEMPOTENT;
+int ilog64(uint64_t _v) CONST_FUNCTION;
 
 /**
  * ilog64_nz - Integer binary logarithm of a non-zero 64-bit value.
@@ -67,7 +68,7 @@ int ilog64(uint64_t _v) IDEMPOTENT;
  * See Also:
  *     ilog64(), ilog32_nz()
  */
-int ilog64_nz(uint64_t _v) IDEMPOTENT;
+int ilog64_nz(uint64_t _v) CONST_FUNCTION;
 
 /**
  * STATIC_ILOG_32 - The integer logarithm of an (unsigned, 32-bit) constant.
@@ -119,7 +120,10 @@ int ilog64_nz(uint64_t _v) IDEMPOTENT;
 #endif
 
 #ifdef builtin_ilog32_nz
-#define ilog32(_v) (builtin_ilog32_nz(_v)&-!!(_v))
+/* This used to be builtin_ilog32_nz(_v)&-!!(_v), which means it zeroes out
+ * the undefined builtin_ilog32_nz(0) return.  But clang UndefinedBehaviorSantizer
+ * complains, so do the branch: */
+#define ilog32(_v) ((_v) ? builtin_ilog32_nz(_v) : 0)
 #define ilog32_nz(_v) builtin_ilog32_nz(_v)
 #else
 #define ilog32_nz(_v) ilog32(_v)
@@ -127,7 +131,7 @@ int ilog64_nz(uint64_t _v) IDEMPOTENT;
 #endif /* builtin_ilog32_nz */
 
 #ifdef builtin_ilog64_nz
-#define ilog64(_v) (builtin_ilog64_nz(_v)&-!!(_v))
+#define ilog32(_v) ((_v) ? builtin_ilog32_nz(_v) : 0)
 #define ilog64_nz(_v) builtin_ilog64_nz(_v)
 #else
 #define ilog64_nz(_v) ilog64(_v)