]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
macro: implement ABS via __builtin_imaxabs()
authorMike Yuan <me@yhndnzj.com>
Tue, 6 May 2025 12:41:17 +0000 (14:41 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 6 May 2025 15:39:01 +0000 (17:39 +0200)
src/basic/errno-util.h
src/fundamental/macro-fundamental.h

index 10118c6901bd6118453b7a0f2f36a0aea992f866..e7dcad3b44832ef21813eff99633acdbc1834a8a 100644 (file)
@@ -95,6 +95,7 @@ static inline int errno_or_else(int fallback) {
         return -ABS(fallback);
 }
 
+/* abs(3) says: Trying to take the absolute value of the most negative integer is not defined. */
 #define _DEFINE_ABS_WRAPPER(name)                         \
         static inline bool ERRNO_IS_##name(intmax_t r) {  \
                 if (r == INTMAX_MIN)                      \
index 417a7853d4c079717ccaf9542529ead08431d8cb..28fef06c9933bfbfdd09d9933af406959905d6ab 100644 (file)
                 UNIQ_T(A, aq) > UNIQ_T(B, bq) ? UNIQ_T(A, aq) : UNIQ_T(B, bq); \
         })
 
-#define ABS(a) __ABS(UNIQ, (a))
-#define __ABS(aq, a)                                    \
-({                                                      \
-        const typeof(a) UNIQ_T(A, aq) = (a);            \
-        UNIQ_T(A, aq) < 0 ? -UNIQ_T(A, aq) : UNIQ_T(A, aq); \
-})
+#ifdef __clang__
+#  define ABS(a) __builtin_llabs(a)
+#else
+#  define ABS(a) __builtin_imaxabs(a)
+#endif
+assert_cc(sizeof(intmax_t) <= sizeof(long long));
 
 #define IS_UNSIGNED_INTEGER_TYPE(type) \
         (__builtin_types_compatible_p(typeof(type), unsigned char) ||   \