[llvm] r239819 - Repair cmake libatomic check.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Tue Jul 7 13:53:13 PDT 2015


Thanks for investigating!

CCing the bot admin.

On 7 July 2015 at 15:20, James Y Knight <jyknight at google.com> wrote:
> I think the build configuration is probably just busted somehow.
>
> After doing the stage1 build into llvm_build0, it then tries to do an msan
> build, configured like this, which *does* find working atomics.
>
> @@@BUILD_STEP build libcxx/msan@@@
>
> + cd libcxx_build_msan
> + cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON
> -DLLVM_PARALLEL_LINK_JOBS=3
> -DCMAKE_C_COMPILER=/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build0/bin/clang
> -DCMAKE_CXX_COMPILER=/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build0/bin/clang++
> -DCMAKE_BUILD_TYPE=Release -DLLVM_USE_SANITIZER=Memory
> /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm
>
> Then it does another, configured like this, which doesn't find working
> atomics.
>
> @@@BUILD_STEP build clang/msan@@@
>
> + cd llvm_build_msan
> + cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON
> -DLLVM_PARALLEL_LINK_JOBS=3
> -DCMAKE_C_COMPILER=/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build0/bin/clang
> -DCMAKE_CXX_COMPILER=/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm_build0/bin/clang++
> -DCMAKE_BUILD_TYPE=Release -DLLVM_USE_SANITIZER=Memory
> -DLLVM_ENABLE_LIBCXX=ON
> '-DCMAKE_C_FLAGS=-I/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/include
> -I/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/include/c++/v1
> -lc++abi
> -Wl,--rpath=/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/lib
> -L/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/lib
> -fsanitize=memory -w'
> '-DCMAKE_CXX_FLAGS=-I/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/include
> -I/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/include/c++/v1
> -lc++abi
> -Wl,--rpath=/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/lib
> -L/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/lib
> -fsanitize=memory -w' '-DCMAKE_EXE_LINKER_FLAGS=-lc++abi
> -Wl,--rpath=/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/lib
> -L/mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/libcxx_build_msan/lib'
> /mnt/b/sanitizer-buildbot2/sanitizer-x86_64-linux-bootstrap/build/llvm
>
>
> However, not ONLY does it not think it has working atomics, it also says
> before that,
> -- Performing Test HAVE_INT64_T - Failed
>
> ISTM this likely indicates that the issue is that the compiler doesn't
> actually work at all when run with the flags configured by the cmake files,
> and nothing to do with atomics.
>
>
>
> On Tue, Jul 7, 2015 at 2:12 PM, Rafael EspĂ­ndola
> <rafael.espindola at gmail.com> wrote:
>>
>> Looks like this check is failing in
>>
>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/7899/steps/annotate/logs/stdio
>>
>> On 16 June 2015 at 10:00, James Y Knight <jyknight at google.com> wrote:
>> > Author: jyknight
>> > Date: Tue Jun 16 09:00:01 2015
>> > New Revision: 239819
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=239819&view=rev
>> > Log:
>> > Repair cmake libatomic check.
>> >
>> > The cmake check for whether libatomic could be used had been
>> > unconditionally setting the result to false. Which was somewhat
>> > fortunate, because the prerequisite check for whether it was *needed*
>> > was always claiming it was, even if it was not.
>> >
>> > However, this made platforms where libatomic is actually necessary
>> > fail to link.
>> >
>> > Differential Revision: http://reviews.llvm.org/D10453
>> >
>> > Modified:
>> >     llvm/trunk/cmake/modules/CheckAtomic.cmake
>> >
>> > Modified: llvm/trunk/cmake/modules/CheckAtomic.cmake
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/modules/CheckAtomic.cmake?rev=239819&r1=239818&r2=239819&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/cmake/modules/CheckAtomic.cmake (original)
>> > +++ llvm/trunk/cmake/modules/CheckAtomic.cmake Tue Jun 16 09:00:01 2015
>> > @@ -2,15 +2,45 @@
>> >
>> >  INCLUDE(CheckCXXSourceCompiles)
>> >
>> > -check_function_exists(__atomic_fetch_add_4 HAVE___ATOMIC_FETCH_ADD_4)
>> > -if( NOT HAVE___ATOMIC_FETCH_ADD_4 )
>> > -  check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
>> > -  set(HAVE_LIBATOMIC False)
>> > -  if( HAVE_LIBATOMIC )
>> > -    list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
>> > +# Sometimes linking against libatomic is required for atomic ops, if
>> > +# the platform doesn't support lock-free atomics.
>> > +
>> > +function(check_working_cxx_atomics varname)
>> > +  set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
>> > +  set(CMAKE_REQUIRED_FLAGS "-std=c++11")
>> > +  CHECK_CXX_SOURCE_COMPILES("
>> > +#include <atomic>
>> > +std::atomic<int> x;
>> > +int main() {
>> > +  return x;
>> > +}
>> > +" ${varname})
>> > +  set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
>> > +endfunction(check_working_cxx_atomics)
>> > +
>> > +# This isn't necessary on MSVC, so avoid command-line switch annoyance
>> > +# by only running on GCC-like hosts.
>> > +if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
>> > +  # First check if atomics work without the library.
>> > +  check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
>> > +  # If not, check if the library exists, and atomics work with it.
>> > +  if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
>> > +    check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
>> > +    if( HAVE_LIBATOMIC )
>> > +      list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
>> > +      check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB)
>> > +      if (NOT HAVE_CXX_ATOMICS_WITH_LIB)
>> > +       message(FATAL_ERROR "Host compiler must support std::atomic!")
>> > +      endif()
>> > +    else()
>> > +      message(FATAL_ERROR "Host compiler appears to require libatomic,
>> > but cannot find it.")
>> > +    endif()
>> >    endif()
>> >  endif()
>> >
>> > +## TODO: This define is only used for the legacy atomic operations in
>> > +## llvm's Atomic.h, which should be replaced.  Other code simply
>> > +## assumes C++11 <atomic> works.
>> >  CHECK_CXX_SOURCE_COMPILES("
>> >  #ifdef _MSC_VER
>> >  #include <Intrin.h> /* Workaround for PR19898. */
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>




More information about the llvm-commits mailing list