configure: check for C11 atomics support
authorSitsofe Wheeler <sitsofe@yahoo.com>
Sat, 25 Jul 2020 07:46:15 +0000 (08:46 +0100)
committerSitsofe Wheeler <sitsofe@yahoo.com>
Sat, 25 Jul 2020 16:20:43 +0000 (17:20 +0100)
Since 3932f8be718fc4ca3b863c51c0d567821d75c003 ("arch/arch.h: Introduce
atomic_{load_acquire,store_release}()") fio has needed C11 atomic
support and this is only provided from gcc 4.9 / clang 3.6 onwards
(http://stdatomic.gforge.inria.fr/#sec-2 ). Make this clearer by
doing the following:

- Add configure check for C11 atomics support and bail out with a
  (friendly) message pointing at compiler version if it's not there
- Remove the minimum compiler version check from compiler.h as it is now
  redundant

I've avoided doing an explicit compiler version check because Apple's
clang can have a wildly different version to upstream
(https://stackoverflow.com/a/33614612 ).

Tested on:
- CentOS 7 with default gcc 4.8.5 (correctly errors with message)
- CentOS 7 docker container using llvm-toolset-7 to provide clang 5.0.1
  (works)
- CentOS 7 docker container using devtool-toolset-7 to provide gcc 7.3.1
  (works)
- Ubuntu 16.04 with clang-3.5 (correctly errors with message)
- Ubuntu 16.04 with clang-3.6 installed (works)
- macOS 10.14.6 with clang-1001.0.46.4 (works)

v2:
- Rebase
- Reword failure message and stop mentioning fio version number

Fixes: https://github.com/axboe/fio/issues/1047
Signed-off-by: Sitsofe Wheeler <sitsofe@yahoo.com>
compiler/compiler.h
configure

index 8c0eb9d10d210c5f6e92be3e062ca9ddf8076558..8a784b9269b6a66419fc7f51cb453f047309653f 100644 (file)
@@ -1,13 +1,6 @@
 #ifndef FIO_COMPILER_H
 #define FIO_COMPILER_H
 
-/* IWYU pragma: begin_exports */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) || __clang_major__ >= 6
-#else
-#error Compiler too old, need at least gcc 4.9
-#endif
-/* IWYU pragma: end_exports */
-
 #define __must_check           __attribute__((warn_unused_result))
 
 #define __compiletime_warning(message) __attribute__((warning(message)))
index 6a7bdeef31982eb2180bc9afb974c4cee3c68fec..25216c631171d044f51f7a0ecf52798e13fd4a51 100755 (executable)
--- a/configure
+++ b/configure
@@ -495,20 +495,6 @@ else
   fatal "compile test failed"
 fi
 
-##########################################
-# check compiler version
-
-cat > $TMPC <<EOF
-#include "$(pwd)/compiler/compiler.h"
-int main(void)
-{
-  return 0;
-}
-EOF
-if ! compile_prog "" "" "compiler check"; then
-  fatal "Your compiler is too old, needs GCC 4.9 or higher"
-fi
-
 ##########################################
 # check endianness
 if test "$bigendian" != "yes" ; then
@@ -564,6 +550,25 @@ else
 fi
 print_config "Static build" "$build_static"
 
+##########################################
+# check for C11 atomics support
+cat > $TMPC <<EOF
+#include <stdatomic.h>
+int main(void)
+{
+  _Atomic unsigned v;
+  atomic_load(&v);
+  return 0;
+}
+EOF
+if ! compile_prog "" "" "C11 atomics"; then
+  echo
+  echo "Your compiler doesn't support C11 atomics. gcc 4.9/clang 3.6 are the"
+  echo "minimum versions with it - perhaps your compiler is too old?"
+  fatal "C11 atomics support not found"
+fi
+
+
 ##########################################
 # check for wordsize
 wordsize="0"