Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
opendht
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Deploy
Model registry
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
savoirfairelinux
opendht
Commits
6145e545
Commit
6145e545
authored
3 years ago
by
Adrien Béraud
Browse files
Options
Downloads
Patches
Plain Diff
cmake: update CheckAtomic
parent
ac51c230
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
cmake/CheckAtomic.cmake
+75
-64
75 additions, 64 deletions
cmake/CheckAtomic.cmake
with
75 additions
and
64 deletions
cmake/CheckAtomic.cmake
+
75
−
64
View file @
6145e545
# University of Illinois/NCSA
# Open Source License
#
# Copyright (c) 2003-2017 University of Illinois at Urbana-Champaign.
# All rights reserved.
#
# Developed by:
#
# LLVM Team
#
# University of Illinois at Urbana-Champaign
#
# http://llvm.org
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal with
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is furnished to do
# so, subject to the following conditions:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimers.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimers in the
# documentation and/or other materials provided with the distribution.
#
# * Neither the names of the LLVM Team, University of Illinois at
# Urbana-Champaign, nor the names of its contributors may be used to
# endorse or promote products derived from this Software without specific
# prior written permission.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
# SOFTWARE.
# atomic builtins are required for threading support.
include
(
CheckCXXSourceCompiles
)
include
(
CheckLibraryExists
)
INCLUDE
(
CheckCXXSourceCompiles
)
INCLUDE
(
CheckLibraryExists
)
# 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
}
)
get_directory_property
(
compile_options COMPILE_OPTIONS
)
set
(
CMAKE_REQUIRED_FLAGS
${
compile_options
}
)
set
(
CMAKE_REQUIRED_FLAGS
"
${
CMAKE_REQUIRED_FLAGS
}
-std=c++11"
)
CHECK_CXX_SOURCE_COMPILES
(
"
#include <atomic>
#include <cstdint>
std::atomic<int64_t> v1;
std::atomic<int64_t> v2;
int main(int, char**) {
return v1 + v2;
}"
${
varname
}
)
std::atomic<int> x;
int main() {
return x;
}
"
${
varname
}
)
set
(
CMAKE_REQUIRED_FLAGS
${
OLD_CMAKE_REQUIRED_FLAGS
}
)
endfunction
(
check_working_cxx_atomics
)
function
(
check_working_cxx_atomics64 varname
)
set
(
OLD_CMAKE_REQUIRED_FLAGS
${
CMAKE_REQUIRED_FLAGS
}
)
set
(
CMAKE_REQUIRED_FLAGS
"-std=c++11
${
CMAKE_REQUIRED_FLAGS
}
"
)
CHECK_CXX_SOURCE_COMPILES
(
"
#include <atomic>
#include <cstdint>
std::atomic<uint64_t> x (0);
int main() {
uint64_t i = x.load(std::memory_order_relaxed);
return 0;
}
"
${
varname
}
)
set
(
CMAKE_REQUIRED_FLAGS
${
OLD_CMAKE_REQUIRED_FLAGS
}
)
endfunction
(
check_working_cxx_atomics64
)
if
(
NOT DEFINED PROXYGEN_COMPILER_IS_GCC_COMPATIBLE
)
if
(
CMAKE_COMPILER_IS_GNUCXX
)
set
(
PROXYGEN_COMPILER_IS_GCC_COMPATIBLE ON
)
elseif
(
MSVC
)
set
(
PROXYGEN_COMPILER_IS_GCC_COMPATIBLE OFF
)
elseif
(
"
${
CMAKE_CXX_COMPILER_ID
}
"
MATCHES
"Clang"
)
set
(
PROXYGEN_COMPILER_IS_GCC_COMPATIBLE ON
)
elseif
(
"
${
CMAKE_CXX_COMPILER_ID
}
"
MATCHES
"Intel"
)
set
(
PROXYGEN_COMPILER_IS_GCC_COMPATIBLE ON
)
endif
()
endif
()
# This isn't necessary on MSVC, so avoid command-line switch annoyance
# by only running on GCC-like hosts.
if
(
PROXYGEN
_COMPILER_IS_GCC_COMPATIBLE
)
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
)
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
()
list
(
APPEND CMAKE_CXX_STANDARD_LIBRARIES -latomic
)
else
()
message
(
FATAL_ERROR
"Host compiler appears to require libatomic, but cannot find it."
)
endif
()
endif
()
endif
()
# Check for 64 bit atomic operations.
if
(
MSVC
)
set
(
HAVE_CXX_ATOMICS64_WITHOUT_LIB True
)
else
()
check_working_cxx_atomics64
(
HAVE_CXX_ATOMICS64_WITHOUT_LIB
)
endif
()
# If not, check if the library exists, and atomics work with it.
if
(
NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB
)
check_library_exists
(
atomic __atomic_load_8
""
HAVE_CXX_LIBATOMICS64
)
if
(
HAVE_CXX_LIBATOMICS64
)
list
(
APPEND CMAKE_REQUIRED_LIBRARIES
"atomic"
)
check_working_cxx_atomics64
(
HAVE_CXX_ATOMICS64_WITH_LIB
)
if
(
NOT HAVE_CXX_ATOMICS64_WITH_LIB
)
message
(
FATAL_ERROR
"Host compiler must support 64-bit std::atomic!"
)
endif
()
else
()
message
(
FATAL_ERROR
"Host compiler appears to require libatomic for 64-bit operations, but cannot find it."
)
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 <windows.h>
#endif
int main() {
#ifdef _MSC_VER
volatile LONG val = 1;
MemoryBarrier();
InterlockedCompareExchange(&val, 0, 1);
InterlockedIncrement(&val);
InterlockedDecrement(&val);
#else
volatile unsigned long val = 1;
__sync_synchronize();
__sync_val_compare_and_swap(&val, 1, 0);
__sync_add_and_fetch(&val, 1);
__sync_sub_and_fetch(&val, 1);
#endif
return 0;
}
"
LLVM_HAS_ATOMICS
)
if
(
NOT LLVM_HAS_ATOMICS
)
message
(
STATUS
"Warning: LLVM will be built thread-unsafe because atomic builtins are missing"
)
endif
()
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment