From fc4ca5bdd8c5a2b37b6efe34a9b32a1bd75c57af Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 8 Jan 2019 22:00:52 +0100 Subject: [PATCH] CMake: Feature-detect __builtin_{add,sub}_overflow --- CMakeLists.txt | 10 ++++++++++ src/nvim/assert.h | 9 +++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e73443ec2..8272a1a469 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -248,6 +248,16 @@ int main(void) } " HAVE_EXECINFO_BACKTRACE) +check_c_source_compiles(" +int main(void) +{ + int a; + __builtin_add_overflow(a, a, &a); + __builtin_sub_overflow(a, a, &a); + return 0; +} +" HAVE_BUILTIN_ADD_OVERFLOW) + if(MSVC) # XXX: /W4 gives too many warnings. #3241 add_definitions(/W3 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE) diff --git a/src/nvim/assert.h b/src/nvim/assert.h index 3f985475a7..29195a49dc 100644 --- a/src/nvim/assert.h +++ b/src/nvim/assert.h @@ -122,6 +122,7 @@ #endif /// @def STRICT_ADD +/// @brief Adds (a + b) and stores result in `c`. Aborts on overflow. /// /// Requires GCC 5+ and Clang 3.8+ /// https://clang.llvm.org/docs/LanguageExtensions.html @@ -132,8 +133,7 @@ /// /// @param MAX Maximum value of the narrowest type of operand. /// Not used if compiler supports __builtin_add_overflow. -#if (defined(__clang__) && __has_builtin(__builtin_add_overflow)) \ - || (__GNUC__ >= 5) +#if HAVE_BUILTIN_ADD_OVERFLOW # define STRICT_ADD(a, b, c, t) \ do { if (__builtin_add_overflow(a, b, c)) { abort(); } } while (0) #else @@ -141,8 +141,9 @@ do { *(c) = (t)(a + b); } while (0) #endif -#if (defined(__clang__) && __has_builtin(__builtin_sub_overflow)) \ - || (__GNUC__ >= 5) +/// @def STRICT_SUB +/// @brief Subtracts (a - b) and stores result in `c`. Aborts on overflow. +#if HAVE_BUILTIN_ADD_OVERFLOW # define STRICT_SUB(a, b, c, t) \ do { if (__builtin_sub_overflow(a, b, c)) { abort(); } } while (0) #else