1 # This directory contains a large amount of C code which provides
2 # generic implementations of the core runtime library along with optimized
3 # architecture-specific code in various subdirectories.
5 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
6 cmake_minimum_required(VERSION 3.20.0)
8 set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
9 project(CompilerRTBuiltins C ASM)
10 set(COMPILER_RT_STANDALONE_BUILD TRUE)
11 set(COMPILER_RT_BUILTINS_STANDALONE_BUILD TRUE)
13 set(COMPILER_RT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..")
15 set(LLVM_COMMON_CMAKE_UTILS "${COMPILER_RT_SOURCE_DIR}/../cmake")
17 # Add path for custom modules
18 list(INSERT CMAKE_MODULE_PATH 0
19 "${COMPILER_RT_SOURCE_DIR}/cmake"
20 "${COMPILER_RT_SOURCE_DIR}/cmake/Modules"
21 "${LLVM_COMMON_CMAKE_UTILS}"
22 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
25 include(base-config-ix)
26 include(CompilerRTUtils)
28 if (NOT LLVM_RUNTIMES_BUILD)
31 construct_compiler_rt_default_triple()
33 include(SetPlatformToolchainTools)
35 include(CompilerRTDarwinUtils)
40 include(AddCompilerRT)
43 # Simplified version of what's set in cmake/config-ix.cmake; not including
44 # builtins, which are linked separately.
45 set(MINGW_LIBRARIES mingw32 moldname mingwex msvcrt advapi32 shell32
46 user32 kernel32 mingw32 moldname mingwex msvcrt)
50 if (COMPILER_RT_STANDALONE_BUILD)
51 # When compiler-rt is being built standalone, possibly as a cross-compilation
52 # target, the target may or may not want position independent code. This
53 # option provides an avenue through which the flag may be controlled when an
54 # LLVM configuration is not being utilized.
55 option(COMPILER_RT_BUILTINS_ENABLE_PIC
56 "Turns on or off -fPIC for the builtin library source"
60 include(builtin-config-ix)
61 include(CMakeDependentOption)
62 include(CMakePushCheckState)
64 option(COMPILER_RT_BUILTINS_HIDE_SYMBOLS
65 "Do not export any symbols from the static library." ON)
67 # TODO: Need to add a mechanism for logging errors when builtin source files are
68 # added to a sub-directory and not this CMakeLists file.
191 # We only build BF16 files when "__bf16" is available.
198 set(GENERIC_TF_SOURCES
227 option(COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN
228 "Skip the atomic builtin (these should normally be provided by a shared library)"
231 if(NOT FUCHSIA AND NOT COMPILER_RT_BAREMETAL_BUILD AND NOT COMPILER_RT_GPU_BUILD)
235 enable_execute_stack.c
240 option(COMPILER_RT_LIBATOMIC_USE_PTHREAD
241 "Whether libatomic should use pthreads if available."
244 if(COMPILER_RT_LIBATOMIC_USE_PTHREAD)
245 add_compile_definitions(_LIBATOMIC_USE_PTHREAD)
248 if(COMPILER_RT_HAS_ATOMIC_KEYWORD AND NOT COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN)
259 atomic_flag_clear_explicit.c
260 atomic_flag_test_and_set.c
261 atomic_flag_test_and_set_explicit.c
262 atomic_signal_fence.c
263 atomic_thread_fence.c
281 # These files are used on 32-bit and 64-bit x86.
293 # Implement extended-precision builtins, assuming long double is 80 bits.
294 # long double is not 80 bits on Android or MSVC.
295 set(x86_80_BIT_SOURCES
315 ${GENERIC_TF_SOURCES}
331 ${x86_80_BIT_SOURCES}
342 # Darwin x86_64 Haswell
343 set(x86_64h_SOURCES ${x86_64_SOURCES})
372 ${x86_80_BIT_SOURCES}
385 # Use C versions of functions when building on MSVC
386 # MSVC's assembler takes Intel syntax, not AT&T syntax.
387 # Also use only MSVC compilable builtin implementations.
394 set(i386_SOURCES ${GENERIC_SOURCES} ${x86_ARCH_SOURCES})
395 endif () # if (NOT MSVC)
398 # builtin support for Targets that have Arm state or have Thumb2
399 set(arm_or_thumb2_base_SOURCES
416 arm/sync_fetch_and_add_4.S
417 arm/sync_fetch_and_add_8.S
418 arm/sync_fetch_and_and_4.S
419 arm/sync_fetch_and_and_8.S
420 arm/sync_fetch_and_max_4.S
421 arm/sync_fetch_and_max_8.S
422 arm/sync_fetch_and_min_4.S
423 arm/sync_fetch_and_min_8.S
424 arm/sync_fetch_and_nand_4.S
425 arm/sync_fetch_and_nand_8.S
426 arm/sync_fetch_and_or_4.S
427 arm/sync_fetch_and_or_8.S
428 arm/sync_fetch_and_sub_4.S
429 arm/sync_fetch_and_sub_8.S
430 arm/sync_fetch_and_umax_4.S
431 arm/sync_fetch_and_umax_8.S
432 arm/sync_fetch_and_umin_4.S
433 arm/sync_fetch_and_umin_8.S
434 arm/sync_fetch_and_xor_4.S
435 arm/sync_fetch_and_xor_8.S
438 # builtin support for Thumb-only targets with very limited Thumb2 technology,
439 # such as v6-m and v8-m.baseline
440 set(thumb1_base_SOURCES
450 arm/aeabi_cdcmpeq_check_nan.c
452 arm/aeabi_cfcmpeq_check_nan.c
468 set(arm_Thumb1_JT_SOURCES
474 set(arm_Thumb1_SjLj_EH_SOURCES
475 arm/restore_vfp_d8_d15_regs.S
476 arm/save_vfp_d8_d15_regs.S
478 set(arm_Thumb1_VFPv2_DP_SOURCES
486 arm/floatunssidfvfp.S
498 set(arm_Thumb1_VFPv2_SP_SOURCES
505 arm/floatunssisfvfp.S
516 set(arm_Thumb1_icache_SOURCES
517 arm/sync_synchronize.S
520 # thumb1 calling into Arm to cover support
521 set(arm_Thumb1_SOURCES
522 ${arm_Thumb1_JT_SOURCES}
523 ${arm_Thumb1_SjLj_EH_SOURCES}
524 ${arm_Thumb1_VFPv2_DP_SOURCES}
525 ${arm_Thumb1_VFPv2_SP_SOURCES}
526 ${arm_Thumb1_icache_SOURCES}
529 # base functionality for Arm Targets prior to Arm v7-a and Armv6-m such as v6,
532 ${arm_or_thumb2_base_SOURCES}
543 ${arm_or_thumb2_base_SOURCES}
548 ${thumb1_base_SOURCES}
551 # TODO the EABI sources should only be added to EABI targets
553 ${arm_or_thumb2_base_SOURCES}
556 ${arm_Thumb1_SOURCES}
560 ${thumb1_base_SOURCES}
566 ${GENERIC_TF_SOURCES}
572 if (COMPILER_RT_HAS_AARCH64_SME)
573 if (NOT COMPILER_RT_DISABLE_AARCH64_FMV AND COMPILER_RT_HAS_FNO_BUILTIN_FLAG AND (COMPILER_RT_HAS_AUXV OR COMPILER_RT_BAREMETAL_BUILD))
574 list(APPEND aarch64_SOURCES aarch64/sme-abi.S aarch64/sme-libc-mem-routines.S aarch64/sme-abi-init.c aarch64/sme-abi-vg.c aarch64/sme-libc-routines.c)
575 message(STATUS "AArch64 SME ABI routines enabled")
576 set_source_files_properties(aarch64/sme-libc-routines.c PROPERTIES COMPILE_FLAGS "-fno-builtin")
578 if(COMPILER_RT_DISABLE_AARCH64_FMV)
579 message(WARNING "AArch64 SME ABI routines require function multiversioning support.")
581 if(NOT COMPILER_RT_HAS_FNO_BUILTIN_FLAG)
582 message(WARNING "AArch64 SME ABI routines require '-fno-builtin'")
584 if(NOT (COMPILER_RT_HAS_AUXV OR COMPILER_RT_BAREMETAL_BUILD))
585 message(WARNING "AArch64 SME ABI routines requires sys/auxv.h or COMPILER_RT_BAREMETAL_BUILD flag")
587 message(STATUS "AArch64 SME ABI routines disabled")
591 # Generate outline atomics helpers from lse.S base
592 set(OA_HELPERS_DIR "${CMAKE_CURRENT_BINARY_DIR}/outline_atomic_helpers.dir")
593 file(MAKE_DIRECTORY "${OA_HELPERS_DIR}")
596 set(COMPILER_RT_LINK_OR_COPY create_symlink)
598 set(COMPILER_RT_LINK_OR_COPY copy)
601 foreach(pat cas swp ldadd ldclr ldeor ldset)
602 foreach(size 1 2 4 8 16)
603 foreach(model 1 2 3 4 5)
604 if(pat STREQUAL "cas" OR NOT size STREQUAL "16")
605 set(source_asm "${CMAKE_CURRENT_SOURCE_DIR}/aarch64/lse.S")
606 set(helper_asm "${OA_HELPERS_DIR}/outline_atomic_${pat}${size}_${model}.S")
608 OUTPUT "${helper_asm}"
609 COMMAND ${CMAKE_COMMAND} -E ${COMPILER_RT_LINK_OR_COPY} "${source_asm}" "${helper_asm}"
610 DEPENDS "${source_asm}"
612 set_source_files_properties("${helper_asm}"
614 COMPILE_DEFINITIONS "L_${pat};SIZE=${size};MODEL=${model}"
615 INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}"
617 list(APPEND aarch64_SOURCES "${helper_asm}")
630 set(amdgcn_SOURCES ${GENERIC_SOURCES})
632 set(armv4t_SOURCES ${arm_min_SOURCES})
633 set(armv5te_SOURCES ${arm_min_SOURCES})
634 set(armv6_SOURCES ${arm_min_SOURCES})
635 set(armhf_SOURCES ${arm_SOURCES})
636 set(armv7_SOURCES ${arm_SOURCES})
637 set(armv7s_SOURCES ${arm_SOURCES})
638 set(armv7k_SOURCES ${arm_SOURCES})
639 set(arm64_SOURCES ${aarch64_SOURCES})
640 set(arm64e_SOURCES ${aarch64_SOURCES})
641 set(arm64_32_SOURCES ${aarch64_SOURCES})
643 # macho_embedded archs
644 set(armv6m_SOURCES ${thumb1_SOURCES})
645 set(armv7m_SOURCES ${arm_SOURCES})
646 set(armv7em_SOURCES ${arm_SOURCES})
647 set(armv8m.base_SOURCES ${thumb1_SOURCES})
648 set(armv8m.main_SOURCES ${arm_SOURCES})
649 set(armv8.1m.main_SOURCES ${arm_SOURCES})
665 hexagon/common_entry_exit_abi1.S
666 hexagon/common_entry_exit_abi2.S
667 hexagon/common_entry_exit_legacy.S
676 hexagon/fastmath2_dlib_asm.S
677 hexagon/fastmath2_ldlib_asm.S
678 hexagon/fastmath_dlib_asm.S
679 hexagon/memcpy_forward_vp4cp4n2.S
680 hexagon/memcpy_likely_aligned.S
692 ${GENERIC_TF_SOURCES}
695 set(loongarch_SOURCES
698 ${GENERIC_TF_SOURCES}
700 set(loongarch64_SOURCES
704 set(mips_SOURCES ${GENERIC_SOURCES})
705 set(mipsel_SOURCES ${mips_SOURCES})
706 set(mips64_SOURCES ${GENERIC_TF_SOURCES}
708 set(mips64el_SOURCES ${GENERIC_TF_SOURCES}
711 set(nvptx64_SOURCES ${GENERIC_SOURCES})
713 set(powerpc_SOURCES ${GENERIC_SOURCES})
715 set(powerpcspe_SOURCES ${GENERIC_SOURCES})
717 set(powerpc64_SOURCES
730 # These routines require __int128, which isn't supported on AIX.
731 if (NOT OS_NAME MATCHES "AIX")
732 set(powerpc64_SOURCES
739 set(powerpc64le_SOURCES ${powerpc64_SOURCES})
747 ${GENERIC_TF_SOURCES}
758 set(sparc_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
759 set(sparcv9_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
762 ${GENERIC_TF_SOURCES}
766 ${GENERIC_TF_SOURCES}
772 ve/grow_stack_align.S
773 ${GENERIC_TF_SOURCES}
776 add_custom_target(builtins)
777 set_target_properties(builtins PROPERTIES FOLDER "Compiler-RT/Metatargets")
779 option(COMPILER_RT_ENABLE_SOFTWARE_INT128
780 "Enable the int128 builtin routines for all targets."
784 add_subdirectory(Darwin-excludes)
785 add_subdirectory(macho_embedded)
786 darwin_add_builtin_libraries(${BUILTIN_SUPPORTED_OS})
788 set(BUILTIN_CFLAGS "")
789 add_security_warnings(BUILTIN_CFLAGS 0)
791 if (COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
792 append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full BUILTIN_CFLAGS)
795 append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 BUILTIN_CFLAGS)
796 append_list_if(COMPILER_RT_HAS_WBUILTIN_DECLARATION_MISMATCH_FLAG -Werror=builtin-declaration-mismatch BUILTIN_CFLAGS)
798 # Don't embed directives for picking any specific CRT
800 set(CMAKE_MSVC_RUNTIME_LIBRARY "")
801 append_list_if(COMPILER_RT_HAS_ZL_FLAG /Zl BUILTIN_CFLAGS)
804 # These flags would normally be added to CMAKE_C_FLAGS by the llvm
805 # cmake step. Add them manually if this is a standalone build.
806 if(COMPILER_RT_STANDALONE_BUILD)
807 if(COMPILER_RT_BUILTINS_ENABLE_PIC)
808 append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC BUILTIN_CFLAGS)
810 append_list_if(COMPILER_RT_HAS_FNO_BUILTIN_FLAG -fno-builtin BUILTIN_CFLAGS)
811 if(COMPILER_RT_BUILTINS_HIDE_SYMBOLS)
812 append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG -fvisibility=hidden BUILTIN_CFLAGS)
814 if(NOT COMPILER_RT_DEBUG)
815 append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fomit-frame-pointer BUILTIN_CFLAGS)
819 # Directly targeting the GPU requires a few extra flags.
820 if("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "amdgcn|nvptx")
821 append_list_if(COMPILER_RT_HAS_FFREESTANDING_FLAG -ffreestanding BUILTIN_CFLAGS)
822 append_list_if(COMPILER_RT_HAS_NOGPULIB_FLAG -nogpulib BUILTIN_CFLAGS)
823 append_list_if(COMPILER_RT_HAS_FLTO_FLAG -flto BUILTIN_CFLAGS)
824 append_list_if(COMPILER_RT_HAS_FCONVERGENT_FUNCTIONS_FLAG
825 -fconvergent-functions BUILTIN_CFLAGS)
827 # AMDGPU targets want to use a generic ABI.
828 if("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "amdgcn")
829 append_list_if(COMPILER_RT_HAS_CODE_OBJECT_VERSION_FLAG
830 "SHELL:-Xclang -mcode-object-version=none" BUILTIN_CFLAGS)
836 if(COMPILER_RT_BUILTINS_HIDE_SYMBOLS)
837 append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG VISIBILITY_HIDDEN BUILTIN_DEFS)
840 if(COMPILER_RT_DISABLE_AARCH64_FMV)
841 list(APPEND BUILTIN_DEFS DISABLE_AARCH64_FMV)
844 append_list_if(COMPILER_RT_HAS_ASM_LSE HAS_ASM_LSE BUILTIN_DEFS)
846 foreach (arch ${BUILTIN_SUPPORTED_ARCH})
847 if (CAN_TARGET_${arch})
848 cmake_push_check_state()
849 # TODO: we should probably make most of the checks in builtin-config depend on the target flags.
850 message(STATUS "Performing additional configure checks with target flags: ${TARGET_${arch}_CFLAGS}")
851 set(BUILTIN_CFLAGS_${arch} ${BUILTIN_CFLAGS})
852 list(APPEND CMAKE_REQUIRED_FLAGS ${TARGET_${arch}_CFLAGS} ${BUILTIN_CFLAGS_${arch}})
853 # For ARM archs, exclude any VFP builtins if VFP is not supported
854 if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em|armv8m.main|armv8.1m.main)$")
855 string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}")
856 check_compile_definition(__ARM_FP "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP)
857 if(NOT COMPILER_RT_HAS_${arch}_VFP)
858 list(REMOVE_ITEM ${arch}_SOURCES ${arm_Thumb1_VFPv2_DP_SOURCES} ${arm_Thumb1_VFPv2_SP_SOURCES} ${arm_Thumb1_SjLj_EH_SOURCES})
860 # Exclude any double-precision builtins if VFP is single-precision-only
861 try_compile_only(COMPILER_RT_HAS_${arch}_VFP_DP
862 SOURCE "#if !(__ARM_FP & 0x8)
863 #error No double-precision support!
865 int main(void) { return 0; }")
866 if(NOT COMPILER_RT_HAS_${arch}_VFP_DP)
867 list(REMOVE_ITEM ${arch}_SOURCES ${arm_Thumb1_VFPv2_DP_SOURCES})
871 check_c_source_compiles("_Float16 foo(_Float16 x) { return x; }"
872 COMPILER_RT_HAS_${arch}_FLOAT16)
873 append_list_if(COMPILER_RT_HAS_${arch}_FLOAT16 -DCOMPILER_RT_HAS_FLOAT16 BUILTIN_CFLAGS_${arch})
874 check_c_source_compiles("__bf16 foo(__bf16 x) { return x; }"
875 COMPILER_RT_HAS_${arch}_BFLOAT16)
876 # Build BF16 files only when "__bf16" is available.
877 if(COMPILER_RT_HAS_${arch}_BFLOAT16)
878 list(APPEND ${arch}_SOURCES ${BF16_SOURCES})
881 # Remove a generic C builtin when an arch-specific builtin is specified.
882 filter_builtin_sources(${arch}_SOURCES ${arch})
884 # Needed for clear_cache on debug mode, due to r7's usage in inline asm.
885 # Release mode already sets it via -O2/3, Debug mode doesn't.
886 if (${arch} STREQUAL "armhf")
887 list(APPEND BUILTIN_CFLAGS_${arch} -fomit-frame-pointer -DCOMPILER_RT_ARMHF_TARGET)
890 # For RISCV32, we must force enable int128 for compiling long
892 if(COMPILER_RT_ENABLE_SOFTWARE_INT128 OR "${arch}" STREQUAL "riscv32")
893 list(APPEND BUILTIN_CFLAGS_${arch} -fforce-enable-int128)
896 add_compiler_rt_runtime(clang_rt.builtins
900 SOURCES ${${arch}_SOURCES}
902 CFLAGS ${BUILTIN_CFLAGS_${arch}}
903 PARENT_TARGET builtins)
904 cmake_pop_check_state()
909 add_dependencies(compiler-rt builtins)
911 option(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC
912 "Build standalone shared atomic library."
915 if(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC)
916 add_custom_target(builtins-standalone-atomic)
917 set(BUILTIN_TYPE SHARED)
918 if(OS_NAME MATCHES "AIX")
919 include(CompilerRTAIXUtils)
920 if(NOT COMPILER_RT_LIBATOMIC_LINK_FLAGS)
921 get_aix_libatomic_default_link_flags(COMPILER_RT_LIBATOMIC_LINK_FLAGS
922 "${CMAKE_CURRENT_SOURCE_DIR}/ppc/atomic.exp")
924 # For different versions of cmake, SHARED behaves differently. For some
925 # versions, we might need MODULE rather than SHARED.
926 get_aix_libatomic_type(BUILTIN_TYPE)
928 list(APPEND COMPILER_RT_LIBATOMIC_LINK_FLAGS -nodefaultlibs)
930 foreach (arch ${BUILTIN_SUPPORTED_ARCH})
931 if(CAN_TARGET_${arch})
932 list(APPEND COMPILER_RT_LIBATOMIC_LINK_LIBS_${arch} clang_rt.builtins-${arch})
933 append_list_if(MINGW "${MINGW_LIBRARIES}" COMPILER_RT_LIBATOMIC_LINK_LIBS_${arch})
934 add_compiler_rt_runtime(clang_rt.atomic
938 LINK_FLAGS ${COMPILER_RT_LIBATOMIC_LINK_FLAGS}
939 LINK_LIBS ${COMPILER_RT_LIBATOMIC_LINK_LIBS_${arch}}
940 PARENT_TARGET builtins-standalone-atomic)
943 # FIXME: On AIX, we have to archive built shared libraries into a static
944 # archive, i.e., libatomic.a. Once cmake adds support of such usage for AIX,
945 # this ad-hoc part can be removed.
946 if(OS_NAME MATCHES "AIX")
947 archive_aix_libatomic(clang_rt.atomic libatomic
948 ARCHS ${BUILTIN_SUPPORTED_ARCH}
949 PARENT_TARGET builtins-standalone-atomic)
951 add_dependencies(compiler-rt builtins-standalone-atomic)
954 cmake_dependent_option(COMPILER_RT_BUILD_CRT "Build crtbegin.o/crtend.o" ON "COMPILER_RT_HAS_CRT" OFF)
956 if (COMPILER_RT_BUILD_CRT)
957 add_compiler_rt_component(crt)
959 option(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY "Use eh_frame in crtbegin.o/crtend.o" ON)
961 include(CheckSectionExists)
962 check_section_exists(".init_array" COMPILER_RT_HAS_INITFINI_ARRAY
963 SOURCE "volatile int x;\n__attribute__((constructor)) void f(void) {x = 0;}\nint main(void) { return 0; }\n")
965 append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 CRT_CFLAGS)
966 append_list_if(COMPILER_RT_HAS_INITFINI_ARRAY -DCRT_HAS_INITFINI_ARRAY CRT_CFLAGS)
967 append_list_if(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY -DEH_USE_FRAME_REGISTRY CRT_CFLAGS)
968 append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC CRT_CFLAGS)
969 append_list_if(COMPILER_RT_HAS_WNO_PEDANTIC -Wno-pedantic CRT_CFLAGS)
970 if (COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
971 append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full CRT_CFLAGS)
974 foreach(arch ${BUILTIN_SUPPORTED_ARCH})
975 add_compiler_rt_runtime(clang_rt.crtbegin
978 SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtbegin.c
981 add_compiler_rt_runtime(clang_rt.crtend
984 SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtend.c
989 add_dependencies(compiler-rt crt)