[llvm] cef8519 - [CMake] CheckAtomic.cmake: catch false positives in RISC-V

Luís Marques via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 17 10:54:19 PST 2020


Author: Gokturk Yuksek
Date: 2020-02-17T18:53:41Z
New Revision: cef85193b2cc1817ca43199a0ae9c6f25723997d

URL: https://github.com/llvm/llvm-project/commit/cef85193b2cc1817ca43199a0ae9c6f25723997d
DIFF: https://github.com/llvm/llvm-project/commit/cef85193b2cc1817ca43199a0ae9c6f25723997d.diff

LOG: [CMake] CheckAtomic.cmake: catch false positives in RISC-V

The check for 'HAVE_CXX_ATOMICS_WITHOUT_LIB' may create false
positives in RISC-V. This is reproducible when compiling LLVM natively
using GCC on a rv64gc (rv64imafdgc) host. Due to the 'A' (atomic)
extension, g++ replaces calls to libatomic operations on the
std::atomic<int> type with the native hardware instructions. As a
result, the compilation succeeds and the build system thinks it
doesn't need to pass '-latomic'.

Improve the reliability of the 'HAVE_CXX_ATOMICS_WITHOUT_LIB' test in
two steps:

1. Force a pre-increment on x (++x), which should force a call to a
libatomic function;

2. Because step 1 would resolve the increment to 'amoadd.w.aq' under
the 'A' extension, force the same operation on sub-word types, for
which there is no hardware support.

Reviewers: jfb, hintonda, smeenai, mgorny, JDevlieghere, jyknight
Reviewed By: jfb
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D68964

Added: 
    

Modified: 
    llvm/cmake/modules/CheckAtomic.cmake

Removed: 
    


################################################################################
diff  --git a/llvm/cmake/modules/CheckAtomic.cmake b/llvm/cmake/modules/CheckAtomic.cmake
index af925f5bf9ec..5d22a131e5cb 100644
--- a/llvm/cmake/modules/CheckAtomic.cmake
+++ b/llvm/cmake/modules/CheckAtomic.cmake
@@ -12,8 +12,12 @@ function(check_working_cxx_atomics varname)
   CHECK_CXX_SOURCE_COMPILES("
 #include <atomic>
 std::atomic<int> x;
+std::atomic<short> y;
+std::atomic<char> z;
 int main() {
-  return x;
+  ++z;
+  ++y;
+  return ++x;
 }
 " ${varname})
   set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})


        


More information about the llvm-commits mailing list