1. enable CONFIG_BUILTIN_COMPILER_RT to built libclang_rt.builtins-xxx.a and no longer use the compiler's built-in 2. Modify clang version acquisition to get two decimal points 3. It has been ported to support four architectures: ARM, ARM64, RISCV, and x86_64, among which ARM has been validated Signed-off-by: wangmingrong1 <wangmingrong1@xiaomi.com>
438 lines
9.1 KiB
CMake
438 lines
9.1 KiB
CMake
# ##############################################################################
|
|
# libs/libbuiltin/compiler-rt/CMakeLists.txt
|
|
#
|
|
# 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.
|
|
#
|
|
# ##############################################################################
|
|
|
|
if(CONFIG_BUILTIN_COMPILER_RT)
|
|
|
|
if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/compiler-rt)
|
|
|
|
set(COMPILER_RT_VERSION ${CONFIG_COMPILER_RT_VERSION})
|
|
|
|
FetchContent_Declare(
|
|
compiler-rt
|
|
DOWNLOAD_NAME "compiler-rt-${COMPILER_RT_VERSION}.src.tar.xz"
|
|
DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}
|
|
URL "https://github.com/llvm/llvm-project/releases/download/llvmorg-${COMPILER_RT_VERSION}/compiler-rt-${COMPILER_RT_VERSION}.src.tar.xz"
|
|
SOURCE_DIR
|
|
${CMAKE_CURRENT_LIST_DIR}/compiler-rt
|
|
BINARY_DIR
|
|
${CMAKE_BINARY_DIR}/libs/libbuiltin/compiler-rt
|
|
CONFIGURE_COMMAND
|
|
""
|
|
BUILD_COMMAND
|
|
""
|
|
INSTALL_COMMAND
|
|
""
|
|
TEST_COMMAND
|
|
""
|
|
DOWNLOAD_NO_PROGRESS true
|
|
TIMEOUT 100)
|
|
|
|
FetchContent_GetProperties(compiler-rt)
|
|
|
|
if(NOT compiler-rt_POPULATED)
|
|
FetchContent_Populate(compiler-rt)
|
|
endif()
|
|
|
|
endif()
|
|
|
|
nuttx_add_system_library(compiler-rt)
|
|
|
|
list(APPEND INCDIR ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/include)
|
|
list(APPEND INCDIR ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins)
|
|
|
|
# Arithmetic operations
|
|
set(RT_BUILTIN_SRCS
|
|
absvdi2.c
|
|
absvsi2.c
|
|
absvti2.c
|
|
adddf3.c
|
|
addtf3.c
|
|
addvdi3.c
|
|
addvsi3.c
|
|
addvti3.c
|
|
muldc3.c
|
|
muldf3.c
|
|
muldi3.c
|
|
mulodi4.c
|
|
mulosi4.c
|
|
muloti4.c
|
|
mulsc3.c
|
|
mulsf3.c
|
|
multc3.c
|
|
multf3.c
|
|
multi3.c
|
|
mulvdi3.c
|
|
mulvsi3.c
|
|
mulvti3.c
|
|
mulxc3.c
|
|
negdf2.c
|
|
negdi2.c
|
|
negsf2.c
|
|
negti2.c
|
|
negvdi2.c
|
|
negvsi2.c
|
|
negvti2.c
|
|
subdf3.c
|
|
subsf3.c
|
|
subtf3.c
|
|
subvdi3.c
|
|
subvsi3.c
|
|
subvti3.c)
|
|
|
|
# Floating point operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_SRCS
|
|
floatdidf.c
|
|
floatdisf.c
|
|
floatditf.c
|
|
floatdixf.c
|
|
floatsidf.c
|
|
floatsisf.c
|
|
floatsitf.c
|
|
floattidf.c
|
|
floattisf.c
|
|
floattitf.c
|
|
floattixf.c
|
|
floatundidf.c
|
|
floatundisf.c
|
|
floatunditf.c
|
|
floatundixf.c
|
|
floatunsidf.c
|
|
floatunsisf.c
|
|
floatunsitf.c
|
|
floatuntidf.c
|
|
floatuntisf.c
|
|
floatuntitf.c
|
|
floatuntixf.c)
|
|
|
|
# Conversion and expansion operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_SRCS
|
|
fixtfdi.c
|
|
fixtfsi.c
|
|
fixtfti.c
|
|
fixunsdfdi.c
|
|
fixunsdfsi.c
|
|
fixunsdfti.c
|
|
fixunssfdi.c
|
|
fixunssfsi.c
|
|
fixunssfti.c
|
|
fixunstfdi.c
|
|
fixunstfsi.c
|
|
fixunstfti.c
|
|
fixunsxfdi.c
|
|
fixunsxfsi.c
|
|
fixunsxfti.c
|
|
fixxfdi.c
|
|
fixxfti.c
|
|
extenddftf2.c
|
|
extendhfsf2.c
|
|
extendhftf2.c
|
|
extendsfdf2.c
|
|
extendsftf2.c
|
|
truncdfhf2.c
|
|
truncdfsf2.c
|
|
truncsfhf2.c
|
|
trunctfdf2.c
|
|
trunctfhf2.c
|
|
trunctfsf2.c)
|
|
|
|
# Bit manipulation operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_SRCS
|
|
ashldi3.c
|
|
ashlti3.c
|
|
ashrdi3.c
|
|
ashrti3.c
|
|
clzti2.c
|
|
ctzdi2.c
|
|
ctzsi2.c
|
|
ctzti2.c
|
|
lshrdi3.c
|
|
lshrti3.c
|
|
popcountdi2.c
|
|
popcountsi2.c
|
|
popcountti2.c
|
|
paritydi2.c
|
|
paritysi2.c
|
|
parityti2.c)
|
|
|
|
# Division and modulo operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_SRCS
|
|
divdc3.c
|
|
divdf3.c
|
|
divdi3.c
|
|
divmoddi4.c
|
|
divmodti4.c
|
|
divsc3.c
|
|
divsf3.c
|
|
divtc3.c
|
|
divtf3.c
|
|
divti3.c
|
|
divxc3.c
|
|
moddi3.c
|
|
modti3.c
|
|
udivdi3.c
|
|
udivmoddi4.c
|
|
udivmodti4.c
|
|
udivti3.c
|
|
umoddi3.c
|
|
umodti3.c)
|
|
|
|
# Atomic operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_SRCS
|
|
atomic.c
|
|
atomic_flag_clear.c
|
|
atomic_flag_clear_explicit.c
|
|
atomic_flag_test_and_set.c
|
|
atomic_flag_test_and_set_explicit.c
|
|
atomic_signal_fence.c
|
|
atomic_thread_fence.c)
|
|
|
|
# Other function related files
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_SRCS
|
|
apple_versioning.c
|
|
clear_cache.c
|
|
cmpdi2.c
|
|
cmpti2.c
|
|
comparedf2.c
|
|
comparetf2.c
|
|
cpu_model.c
|
|
emutls.c
|
|
enable_execute_stack.c
|
|
eprintf.c
|
|
fp_mode.c
|
|
gcc_personality_v0.c
|
|
int_util.c
|
|
os_version_check.c
|
|
trampoline_setup.c
|
|
ucmpdi2.c
|
|
ucmpti2.c
|
|
powidf2.c
|
|
powisf2.c
|
|
powitf2.c
|
|
powixf2.c)
|
|
|
|
set(RT_BUILTIN_ARCH_SRCS)
|
|
# ARM-specific assembly files
|
|
if(CONFIG_ARCH_ARM)
|
|
set(RT_BUILTIN_ARCH arm)
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
adddf3vfp.S
|
|
addsf3.S
|
|
addsf3vfp.S
|
|
divmodsi4.S
|
|
divsi3.S
|
|
modsi3.S
|
|
subdf3vfp.S
|
|
subsf3vfp.S
|
|
muldf3vfp.S
|
|
mulsf3vfp.S
|
|
negdf2vfp.S
|
|
negsf2vfp.S)
|
|
|
|
# Floating-Point Operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
comparesf2.S
|
|
eqdf2vfp.S
|
|
eqsf2vfp.S
|
|
extendsfdf2vfp.S
|
|
fixdfsivfp.S
|
|
fixsfsivfp.S
|
|
fixunsdfsivfp.S
|
|
fixunssfsivfp.S
|
|
floatsidfvfp.S
|
|
floatsisfvfp.S
|
|
floatunssidfvfp.S
|
|
floatunssisfvfp.S
|
|
gedf2vfp.S
|
|
gesf2vfp.S
|
|
gtdf2vfp.S
|
|
gtsf2vfp.S
|
|
ledf2vfp.S
|
|
lesf2vfp.S
|
|
ltdf2vfp.S
|
|
ltsf2vfp.S
|
|
nedf2vfp.S
|
|
nesf2vfp.S
|
|
truncdfsf2vfp.S
|
|
unorddf2vfp.S
|
|
unordsf2vfp.S)
|
|
|
|
# Synchronization operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
sync_fetch_and_add_4.S
|
|
sync_fetch_and_add_8.S
|
|
sync_fetch_and_and_4.S
|
|
sync_fetch_and_and_8.S
|
|
sync_fetch_and_max_4.S
|
|
sync_fetch_and_max_8.S
|
|
sync_fetch_and_min_4.S
|
|
sync_fetch_and_min_8.S
|
|
sync_fetch_and_nand_4.S
|
|
sync_fetch_and_nand_8.S
|
|
sync_fetch_and_or_4.S
|
|
sync_fetch_and_or_8.S
|
|
sync_fetch_and_sub_4.S
|
|
sync_fetch_and_sub_8.S
|
|
sync_fetch_and_umax_4.S
|
|
sync_fetch_and_umax_8.S
|
|
sync_fetch_and_umin_4.S
|
|
sync_fetch_and_umin_8.S
|
|
sync_fetch_and_xor_4.S
|
|
sync_fetch_and_xor_8.S
|
|
sync_synchronize.S)
|
|
|
|
# Memory operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
aeabi_memcmp.S
|
|
aeabi_memcpy.S
|
|
aeabi_memmove.S
|
|
aeabi_memset.S
|
|
restore_vfp_d8_d15_regs.S
|
|
save_vfp_d8_d15_regs.S)
|
|
|
|
# Division and Modulus Operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
aeabi_idivmod.S
|
|
aeabi_ldivmod.S
|
|
aeabi_uidivmod.S
|
|
aeabi_uldivmod.S
|
|
udivmodsi4.S
|
|
udivsi3.S
|
|
umodsi3.S)
|
|
|
|
# Bitwise and Other Operations
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
bswapdi2.S
|
|
bswapsi2.S
|
|
chkstk.S
|
|
clzdi2.S
|
|
clzsi2.S)
|
|
|
|
# Branch and Control Flow
|
|
list(APPEND RT_BUILTIN_ARCH_SRCS switch16.S switch32.S switch8.S switchu8.S)
|
|
|
|
else()
|
|
|
|
# Other architectures
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_SRCS
|
|
addsf3.c
|
|
divsi3.c
|
|
modsi3.c
|
|
bswapdi2.c
|
|
bswapsi2.c
|
|
clzdi2.c
|
|
clzsi2.c
|
|
divmodsi4.c
|
|
udivmodsi4.c
|
|
udivsi3.c
|
|
umodsi3.c
|
|
comparesf2.c)
|
|
|
|
endif()
|
|
|
|
if(CONFIG_ARCH_ARM64)
|
|
set(ARCH "aarch64")
|
|
list(APPEND RT_BUILTIN_ARCH_SRCS chkstk.S lse.S fp_mode.c)
|
|
elseif(CONFIG_ARCH_RISCV)
|
|
set(ARCH "riscv")
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
muldi3.S
|
|
mulsi3.S
|
|
restore.S
|
|
save.S
|
|
fp_mode.c)
|
|
else()
|
|
list(APPEND RT_BUILTIN_SRCS muldi3.c)
|
|
endif()
|
|
|
|
if(CONFIG_ARCH_X86_64)
|
|
set(ARCH "x86_64")
|
|
list(
|
|
APPEND
|
|
RT_BUILTIN_ARCH_SRCS
|
|
chkstk2.S
|
|
chkstk.S
|
|
floatundidf.S
|
|
floatundisf.S
|
|
floatundixf.S
|
|
floatdidf.c
|
|
floatdisf.c
|
|
floatdixf.c)
|
|
else()
|
|
list(APPEND RT_BUILTIN_SRCS floatundidf.c floatundisf.c floatundixf.c)
|
|
endif()
|
|
|
|
list(APPEND INCDIR
|
|
${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins/${RT_BUILTIN_ARCH})
|
|
|
|
foreach(src ${RT_BUILTIN_SRCS})
|
|
string(PREPEND src ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins/)
|
|
list(APPEND COMPILER_RT_SRCS ${src})
|
|
endforeach()
|
|
|
|
foreach(src ${RT_BUILTIN_ARCH_SRCS})
|
|
string(
|
|
PREPEND src
|
|
${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins/${RT_BUILTIN_ARCH}/)
|
|
list(APPEND COMPILER_RT_SRCS ${src})
|
|
endforeach()
|
|
|
|
# Add the sources to the target
|
|
target_sources(compiler-rt PRIVATE ${COMPILER_RT_SRCS})
|
|
|
|
target_compile_options(
|
|
compiler-rt
|
|
PRIVATE -Wno-shift-count-negative
|
|
-Wno-constant-conversion
|
|
-Wshift-count-overflow
|
|
-Wno-undef
|
|
-Wno-incompatible-pointer-types
|
|
-Wno-visibility
|
|
-Wno-macro-redefined)
|
|
|
|
target_include_directories(compiler-rt PRIVATE ${INCDIR})
|
|
endif()
|