blob: 5c075eeff62d2de55d40de51c0cbdc50e83e72be [file]
#######################
#
# Licensed to the Apache Software Foundation (ASF) under one or more contributor license
# agreements. See the NOTICE file distributed with this work for additional information regarding
# copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
# or implied. See the License for the specific language governing permissions and limitations under
# the License.
#
#######################
# Check128BitCas.cmake
#
# This will define the following variables
#
# TS_HAS_128BIT_CAS
# TS_NEEDS_MCX16_FOR_CAS
# TS_HAS_128BIT_CAS_LIBATOMIC
# TS_NEEDS_LIBATOMIC_FOR_CAS
#
# TS_HAS_128BIT_CAS means the 16-byte __sync builtins compile and link, which the
# compiler only allows when it can emit an inline lock-free sequence.
#
# TS_HAS_128BIT_CAS_LIBATOMIC is the fallback for targets with no inline 128-bit
# CAS (e.g. riscv64): the __atomic builtins lower to libatomic calls, which may
# be lock-based there. The __sync builtins never lower to libatomic calls, so
# the fallback has to use __atomic. The two are mutually exclusive.
#
set(CHECK_PROGRAM
"
int main(void)
{
__int128_t x = 0;
return __sync_bool_compare_and_swap(&x,0,10);
}
"
)
set(CHECK_PROGRAM_ATOMIC
"
int main(void)
{
__int128_t x = 0;
__int128_t y = 0;
__atomic_load(&x, &y, __ATOMIC_SEQ_CST);
return !__atomic_compare_exchange_n(&x, &y, 10, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
}
"
)
set(NEED_MCX16 FALSE)
set(USE_LIBATOMIC_CAS FALSE)
set(NEED_LIBATOMIC FALSE)
include(CheckCSourceCompiles)
check_c_source_compiles("${CHECK_PROGRAM}" TS_HAS_128BIT_CAS)
if(NOT TS_HAS_128BIT_CAS)
unset(TS_HAS_128BIT_CAS CACHE)
set(CMAKE_REQUIRED_FLAGS "-Werror -mcx16")
check_c_source_compiles("${CHECK_PROGRAM}" TS_HAS_128BIT_CAS)
set(NEED_MCX16 ${TS_HAS_128BIT_CAS})
unset(CMAKE_REQUIRED_FLAGS)
endif()
if(NOT TS_HAS_128BIT_CAS)
check_c_source_compiles("${CHECK_PROGRAM_ATOMIC}" TS_HAS_128BIT_CAS_BUILTIN_ATOMIC)
if(TS_HAS_128BIT_CAS_BUILTIN_ATOMIC)
set(USE_LIBATOMIC_CAS TRUE)
else()
unset(TS_HAS_128BIT_CAS_BUILTIN_ATOMIC CACHE)
set(CMAKE_REQUIRED_LIBRARIES atomic)
check_c_source_compiles("${CHECK_PROGRAM_ATOMIC}" TS_HAS_128BIT_CAS_BUILTIN_ATOMIC)
unset(CMAKE_REQUIRED_LIBRARIES)
if(TS_HAS_128BIT_CAS_BUILTIN_ATOMIC)
set(USE_LIBATOMIC_CAS TRUE)
set(NEED_LIBATOMIC TRUE)
endif()
endif()
endif()
set(TS_NEEDS_MCX16_FOR_CAS
${NEED_MCX16}
CACHE BOOL "Whether -mcx16 is needed to compile CAS"
)
set(TS_HAS_128BIT_CAS_LIBATOMIC
${USE_LIBATOMIC_CAS}
CACHE BOOL "Whether 128-bit CAS uses the __atomic builtins as a fallback"
)
set(TS_NEEDS_LIBATOMIC_FOR_CAS
${NEED_LIBATOMIC}
CACHE BOOL "Whether libatomic is needed to link CAS"
)
unset(CHECK_PROGRAM)
unset(CHECK_PROGRAM_ATOMIC)
unset(NEED_MCX16)
unset(USE_LIBATOMIC_CAS)
unset(NEED_LIBATOMIC)
mark_as_advanced(TS_HAS_128BIT_CAS TS_NEEDS_MCX16_FOR_CAS TS_HAS_128BIT_CAS_LIBATOMIC TS_NEEDS_LIBATOMIC_FOR_CAS)