Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
Find file
Copy path
Fetching contributors…
| # This directory contains a large amount of C code which provides | |
| # generic implementations of the core runtime library along with optimized | |
| # architecture-specific code in various subdirectories. | |
| if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) | |
| cmake_minimum_required(VERSION 3.4.3) | |
| project(CompilerRTBuiltins C ASM) | |
| set(COMPILER_RT_STANDALONE_BUILD TRUE) | |
| set(COMPILER_RT_BUILTINS_STANDALONE_BUILD TRUE) | |
| list(INSERT CMAKE_MODULE_PATH 0 | |
| "${CMAKE_SOURCE_DIR}/../../cmake" | |
| "${CMAKE_SOURCE_DIR}/../../cmake/Modules") | |
| include(base-config-ix) | |
| include(CompilerRTUtils) | |
| load_llvm_config() | |
| construct_compiler_rt_default_triple() | |
| if(APPLE) | |
| include(CompilerRTDarwinUtils) | |
| endif() | |
| include(AddCompilerRT) | |
| endif() | |
| include(builtin-config-ix) | |
| # TODO: Need to add a mechanism for logging errors when builtin source files are | |
| # added to a sub-directory and not this CMakeLists file. | |
| set(GENERIC_SOURCES | |
| absvdi2.c | |
| absvsi2.c | |
| absvti2.c | |
| adddf3.c | |
| addsf3.c | |
| addtf3.c | |
| addvdi3.c | |
| addvsi3.c | |
| addvti3.c | |
| apple_versioning.c | |
| ashldi3.c | |
| ashlti3.c | |
| ashrdi3.c | |
| ashrti3.c | |
| bswapdi2.c | |
| bswapsi2.c | |
| clzdi2.c | |
| clzsi2.c | |
| clzti2.c | |
| cmpdi2.c | |
| cmpti2.c | |
| comparedf2.c | |
| comparesf2.c | |
| ctzdi2.c | |
| ctzsi2.c | |
| ctzti2.c | |
| divdc3.c | |
| divdf3.c | |
| divdi3.c | |
| divmoddi4.c | |
| divmodsi4.c | |
| divsc3.c | |
| divsf3.c | |
| divsi3.c | |
| divtc3.c | |
| divti3.c | |
| divtf3.c | |
| extendsfdf2.c | |
| extendhfsf2.c | |
| ffsdi2.c | |
| ffssi2.c | |
| ffsti2.c | |
| fixdfdi.c | |
| fixdfsi.c | |
| fixdfti.c | |
| fixsfdi.c | |
| fixsfsi.c | |
| fixsfti.c | |
| fixunsdfdi.c | |
| fixunsdfsi.c | |
| fixunsdfti.c | |
| fixunssfdi.c | |
| fixunssfsi.c | |
| fixunssfti.c | |
| floatdidf.c | |
| floatdisf.c | |
| floatsidf.c | |
| floatsisf.c | |
| floattidf.c | |
| floattisf.c | |
| floatundidf.c | |
| floatundisf.c | |
| floatunsidf.c | |
| floatunsisf.c | |
| floatuntidf.c | |
| floatuntisf.c | |
| int_util.c | |
| lshrdi3.c | |
| lshrti3.c | |
| moddi3.c | |
| modsi3.c | |
| modti3.c | |
| muldc3.c | |
| muldf3.c | |
| muldi3.c | |
| mulodi4.c | |
| mulosi4.c | |
| muloti4.c | |
| mulsc3.c | |
| mulsf3.c | |
| multi3.c | |
| multf3.c | |
| mulvdi3.c | |
| mulvsi3.c | |
| mulvti3.c | |
| negdf2.c | |
| negdi2.c | |
| negsf2.c | |
| negti2.c | |
| negvdi2.c | |
| negvsi2.c | |
| negvti2.c | |
| os_version_check.c | |
| paritydi2.c | |
| paritysi2.c | |
| parityti2.c | |
| popcountdi2.c | |
| popcountsi2.c | |
| popcountti2.c | |
| powidf2.c | |
| powisf2.c | |
| powitf2.c | |
| subdf3.c | |
| subsf3.c | |
| subvdi3.c | |
| subvsi3.c | |
| subvti3.c | |
| subtf3.c | |
| trampoline_setup.c | |
| truncdfhf2.c | |
| truncdfsf2.c | |
| truncsfhf2.c | |
| ucmpdi2.c | |
| ucmpti2.c | |
| udivdi3.c | |
| udivmoddi4.c | |
| udivmodsi4.c | |
| udivmodti4.c | |
| udivsi3.c | |
| udivti3.c | |
| umoddi3.c | |
| umodsi3.c | |
| umodti3.c) | |
| set(GENERIC_TF_SOURCES | |
| comparetf2.c | |
| extenddftf2.c | |
| extendsftf2.c | |
| fixtfdi.c | |
| fixtfsi.c | |
| fixtfti.c | |
| fixunstfdi.c | |
| fixunstfsi.c | |
| fixunstfti.c | |
| floatditf.c | |
| floatsitf.c | |
| floattitf.c | |
| floatunditf.c | |
| floatunsitf.c | |
| floatuntitf.c | |
| multc3.c | |
| trunctfdf2.c | |
| trunctfsf2.c) | |
| option(COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN | |
| "Skip the atomic builtin (these should normally be provided by a shared library)" | |
| On) | |
| if(NOT FUCHSIA AND NOT COMPILER_RT_BAREMETAL_BUILD) | |
| set(GENERIC_SOURCES | |
| ${GENERIC_SOURCES} | |
| emutls.c | |
| enable_execute_stack.c | |
| eprintf.c) | |
| endif() | |
| if(COMPILER_RT_HAS_ATOMIC_KEYWORD AND NOT COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN) | |
| set(GENERIC_SOURCES | |
| ${GENERIC_SOURCES} | |
| atomic.c) | |
| endif() | |
| if(APPLE) | |
| set(GENERIC_SOURCES | |
| ${GENERIC_SOURCES} | |
| 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) | |
| endif() | |
| if (HAVE_UNWIND_H) | |
| set(GENERIC_SOURCES | |
| ${GENERIC_SOURCES} | |
| gcc_personality_v0.c) | |
| endif () | |
| if (NOT FUCHSIA) | |
| set(GENERIC_SOURCES | |
| ${GENERIC_SOURCES} | |
| clear_cache.c) | |
| endif() | |
| # These sources work on all x86 variants, but only x86 variants. | |
| set(x86_ARCH_SOURCES | |
| cpu_model.c | |
| divxc3.c | |
| fixxfdi.c | |
| fixxfti.c | |
| fixunsxfdi.c | |
| fixunsxfsi.c | |
| fixunsxfti.c | |
| floatdixf.c | |
| floattixf.c | |
| floatundixf.c | |
| floatuntixf.c | |
| mulxc3.c | |
| powixf2.c | |
| ) | |
| if (NOT MSVC) | |
| set(x86_64_SOURCES | |
| x86_64/floatdidf.c | |
| x86_64/floatdisf.c | |
| x86_64/floatdixf.c | |
| x86_64/floatundidf.S | |
| x86_64/floatundisf.S | |
| x86_64/floatundixf.S) | |
| filter_builtin_sources(x86_64_SOURCES EXCLUDE x86_64_SOURCES "${x86_64_SOURCES};${GENERIC_SOURCES}") | |
| set(x86_64h_SOURCES ${x86_64_SOURCES}) | |
| if (WIN32) | |
| set(x86_64_SOURCES | |
| ${x86_64_SOURCES} | |
| x86_64/chkstk.S | |
| x86_64/chkstk2.S) | |
| endif() | |
| set(i386_SOURCES | |
| i386/ashldi3.S | |
| i386/ashrdi3.S | |
| i386/divdi3.S | |
| i386/floatdidf.S | |
| i386/floatdisf.S | |
| i386/floatdixf.S | |
| i386/floatundidf.S | |
| i386/floatundisf.S | |
| i386/floatundixf.S | |
| i386/lshrdi3.S | |
| i386/moddi3.S | |
| i386/muldi3.S | |
| i386/udivdi3.S | |
| i386/umoddi3.S) | |
| filter_builtin_sources(i386_SOURCES EXCLUDE i386_SOURCES "${i386_SOURCES};${GENERIC_SOURCES}") | |
| if (WIN32) | |
| set(i386_SOURCES | |
| ${i386_SOURCES} | |
| i386/chkstk.S | |
| i386/chkstk2.S) | |
| endif() | |
| else () # MSVC | |
| # Use C versions of functions when building on MSVC | |
| # MSVC's assembler takes Intel syntax, not AT&T syntax. | |
| # Also use only MSVC compilable builtin implementations. | |
| set(x86_64_SOURCES | |
| x86_64/floatdidf.c | |
| x86_64/floatdisf.c | |
| x86_64/floatdixf.c | |
| ${GENERIC_SOURCES}) | |
| set(x86_64h_SOURCES ${x86_64_SOURCES}) | |
| set(i386_SOURCES ${GENERIC_SOURCES}) | |
| endif () # if (NOT MSVC) | |
| set(x86_64h_SOURCES ${x86_64h_SOURCES} ${x86_ARCH_SOURCES}) | |
| set(x86_64_SOURCES ${x86_64_SOURCES} ${x86_ARCH_SOURCES}) | |
| set(i386_SOURCES ${i386_SOURCES} ${x86_ARCH_SOURCES}) | |
| set(i686_SOURCES ${i686_SOURCES} ${x86_ARCH_SOURCES}) | |
| set(arm_SOURCES | |
| arm/bswapdi2.S | |
| arm/bswapsi2.S | |
| arm/clzdi2.S | |
| arm/clzsi2.S | |
| arm/comparesf2.S | |
| arm/divmodsi4.S | |
| arm/divsi3.S | |
| arm/modsi3.S | |
| arm/sync_fetch_and_add_4.S | |
| arm/sync_fetch_and_add_8.S | |
| arm/sync_fetch_and_and_4.S | |
| arm/sync_fetch_and_and_8.S | |
| arm/sync_fetch_and_max_4.S | |
| arm/sync_fetch_and_max_8.S | |
| arm/sync_fetch_and_min_4.S | |
| arm/sync_fetch_and_min_8.S | |
| arm/sync_fetch_and_nand_4.S | |
| arm/sync_fetch_and_nand_8.S | |
| arm/sync_fetch_and_or_4.S | |
| arm/sync_fetch_and_or_8.S | |
| arm/sync_fetch_and_sub_4.S | |
| arm/sync_fetch_and_sub_8.S | |
| arm/sync_fetch_and_umax_4.S | |
| arm/sync_fetch_and_umax_8.S | |
| arm/sync_fetch_and_umin_4.S | |
| arm/sync_fetch_and_umin_8.S | |
| arm/sync_fetch_and_xor_4.S | |
| arm/sync_fetch_and_xor_8.S | |
| arm/udivmodsi4.S | |
| arm/udivsi3.S | |
| arm/umodsi3.S) | |
| filter_builtin_sources(arm_SOURCES EXCLUDE arm_SOURCES "${arm_SOURCES};${GENERIC_SOURCES}") | |
| set(thumb1_SOURCES | |
| arm/divsi3.S | |
| arm/udivsi3.S | |
| arm/comparesf2.S | |
| arm/addsf3.S | |
| ${GENERIC_SOURCES}) | |
| set(arm_EABI_SOURCES | |
| arm/aeabi_cdcmp.S | |
| arm/aeabi_cdcmpeq_check_nan.c | |
| arm/aeabi_cfcmp.S | |
| arm/aeabi_cfcmpeq_check_nan.c | |
| arm/aeabi_dcmp.S | |
| arm/aeabi_div0.c | |
| arm/aeabi_drsub.c | |
| arm/aeabi_fcmp.S | |
| arm/aeabi_frsub.c | |
| arm/aeabi_idivmod.S | |
| arm/aeabi_ldivmod.S | |
| arm/aeabi_memcmp.S | |
| arm/aeabi_memcpy.S | |
| arm/aeabi_memmove.S | |
| arm/aeabi_memset.S | |
| arm/aeabi_uidivmod.S | |
| arm/aeabi_uldivmod.S) | |
| set(arm_Thumb1_JT_SOURCES | |
| arm/switch16.S | |
| arm/switch32.S | |
| arm/switch8.S | |
| arm/switchu8.S) | |
| set(arm_Thumb1_SjLj_EH_SOURCES | |
| arm/restore_vfp_d8_d15_regs.S | |
| arm/save_vfp_d8_d15_regs.S) | |
| set(arm_Thumb1_VFPv2_SOURCES | |
| arm/adddf3vfp.S | |
| arm/addsf3vfp.S | |
| arm/divdf3vfp.S | |
| arm/divsf3vfp.S | |
| arm/eqdf2vfp.S | |
| arm/eqsf2vfp.S | |
| arm/extendsfdf2vfp.S | |
| arm/fixdfsivfp.S | |
| arm/fixsfsivfp.S | |
| arm/fixunsdfsivfp.S | |
| arm/fixunssfsivfp.S | |
| arm/floatsidfvfp.S | |
| arm/floatsisfvfp.S | |
| arm/floatunssidfvfp.S | |
| arm/floatunssisfvfp.S | |
| arm/gedf2vfp.S | |
| arm/gesf2vfp.S | |
| arm/gtdf2vfp.S | |
| arm/gtsf2vfp.S | |
| arm/ledf2vfp.S | |
| arm/lesf2vfp.S | |
| arm/ltdf2vfp.S | |
| arm/ltsf2vfp.S | |
| arm/muldf3vfp.S | |
| arm/mulsf3vfp.S | |
| arm/nedf2vfp.S | |
| arm/negdf2vfp.S | |
| arm/negsf2vfp.S | |
| arm/nesf2vfp.S | |
| arm/subdf3vfp.S | |
| arm/subsf3vfp.S | |
| arm/truncdfsf2vfp.S | |
| arm/unorddf2vfp.S | |
| arm/unordsf2vfp.S) | |
| set(arm_Thumb1_icache_SOURCES | |
| arm/sync_synchronize.S) | |
| set(arm_Thumb1_SOURCES | |
| ${arm_Thumb1_JT_SOURCES} | |
| ${arm_Thumb1_SjLj_EH_SOURCES} | |
| ${arm_Thumb1_VFPv2_SOURCES} | |
| ${arm_Thumb1_icache_SOURCES}) | |
| if(MINGW) | |
| set(arm_SOURCES | |
| arm/aeabi_idivmod.S | |
| arm/aeabi_ldivmod.S | |
| arm/aeabi_uidivmod.S | |
| arm/aeabi_uldivmod.S | |
| arm/chkstk.S | |
| divmoddi4.c | |
| divmodsi4.c | |
| divdi3.c | |
| divsi3.c | |
| fixdfdi.c | |
| fixsfdi.c | |
| fixunsdfdi.c | |
| fixunssfdi.c | |
| floatdidf.c | |
| floatdisf.c | |
| floatundidf.c | |
| floatundisf.c | |
| mingw_fixfloat.c | |
| moddi3.c | |
| udivmoddi4.c | |
| udivmodsi4.c | |
| udivsi3.c | |
| umoddi3.c | |
| emutls.c) | |
| filter_builtin_sources(arm_SOURCES EXCLUDE arm_SOURCES "${arm_SOURCES};${GENERIC_SOURCES}") | |
| elseif(NOT WIN32) | |
| # TODO the EABI sources should only be added to EABI targets | |
| set(arm_SOURCES | |
| ${arm_SOURCES} | |
| ${arm_EABI_SOURCES} | |
| ${arm_Thumb1_SOURCES}) | |
| set(thumb1_SOURCES | |
| ${thumb1_SOURCES} | |
| ${arm_EABI_SOURCES}) | |
| endif() | |
| set(aarch64_SOURCES | |
| ${GENERIC_TF_SOURCES} | |
| ${GENERIC_SOURCES}) | |
| if (MINGW) | |
| set(aarch64_SOURCES | |
| ${aarch64_SOURCES} | |
| aarch64/chkstk.S) | |
| endif() | |
| set(armhf_SOURCES ${arm_SOURCES}) | |
| set(armv7_SOURCES ${arm_SOURCES}) | |
| set(armv7s_SOURCES ${arm_SOURCES}) | |
| set(armv7k_SOURCES ${arm_SOURCES}) | |
| set(arm64_SOURCES ${aarch64_SOURCES}) | |
| # macho_embedded archs | |
| set(armv6m_SOURCES ${thumb1_SOURCES}) | |
| set(armv7m_SOURCES ${arm_SOURCES}) | |
| set(armv7em_SOURCES ${arm_SOURCES}) | |
| # hexagon arch | |
| set(hexagon_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES}) | |
| set(hexagon_SOURCES | |
| hexagon/common_entry_exit_abi1.S | |
| hexagon/common_entry_exit_abi2.S | |
| hexagon/common_entry_exit_legacy.S | |
| hexagon/dfaddsub.S | |
| hexagon/dfdiv.S | |
| hexagon/dffma.S | |
| hexagon/dfminmax.S | |
| hexagon/dfmul.S | |
| hexagon/dfsqrt.S | |
| hexagon/divdi3.S | |
| hexagon/divsi3.S | |
| hexagon/fabs_opt.S | |
| hexagon/fastmath2_dlib_asm.S | |
| hexagon/fastmath2_ldlib_asm.S | |
| hexagon/fastmath_dlib_asm.S | |
| hexagon/fma_opt.S | |
| hexagon/fmax_opt.S | |
| hexagon/fmin_opt.S | |
| hexagon/memcpy_forward_vp4cp4n2.S | |
| hexagon/memcpy_likely_aligned.S | |
| hexagon/moddi3.S | |
| hexagon/modsi3.S | |
| hexagon/sfdiv_opt.S | |
| hexagon/sfsqrt_opt.S | |
| hexagon/udivdi3.S | |
| hexagon/udivmoddi4.S | |
| hexagon/udivmodsi4.S | |
| hexagon/udivsi3.S | |
| hexagon/umoddi3.S | |
| hexagon/umodsi3.S) | |
| set(mips_SOURCES ${GENERIC_SOURCES}) | |
| set(mipsel_SOURCES ${mips_SOURCES}) | |
| set(mips64_SOURCES ${GENERIC_TF_SOURCES} | |
| ${mips_SOURCES}) | |
| set(mips64el_SOURCES ${GENERIC_TF_SOURCES} | |
| ${mips_SOURCES}) | |
| set(powerpc64_SOURCES | |
| ppc/divtc3.c | |
| ppc/fixtfdi.c | |
| ppc/fixunstfti.c | |
| ppc/fixunstfdi.c | |
| ppc/floattitf.c | |
| ppc/floatditf.c | |
| ppc/floatunditf.c | |
| ppc/gcc_qadd.c | |
| ppc/gcc_qdiv.c | |
| ppc/gcc_qmul.c | |
| ppc/gcc_qsub.c | |
| ppc/multc3.c | |
| ${GENERIC_SOURCES}) | |
| set(powerpc64le_SOURCES ${powerpc64_SOURCES}) | |
| set(riscv_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES}) | |
| set(riscv32_SOURCES | |
| riscv/mulsi3.S | |
| ${riscv_SOURCES}) | |
| set(riscv64_SOURCES ${riscv_SOURCES}) | |
| set(wasm32_SOURCES | |
| ${GENERIC_TF_SOURCES} | |
| ${GENERIC_SOURCES}) | |
| set(wasm64_SOURCES | |
| ${GENERIC_TF_SOURCES} | |
| ${GENERIC_SOURCES}) | |
| add_custom_target(builtins) | |
| set_target_properties(builtins PROPERTIES FOLDER "Compiler-RT Misc") | |
| if (APPLE) | |
| add_subdirectory(Darwin-excludes) | |
| add_subdirectory(macho_embedded) | |
| darwin_add_builtin_libraries(${BUILTIN_SUPPORTED_OS}) | |
| else () | |
| set(BUILTIN_CFLAGS "") | |
| append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 BUILTIN_CFLAGS) | |
| # These flags would normally be added to CMAKE_C_FLAGS by the llvm | |
| # cmake step. Add them manually if this is a standalone build. | |
| if(COMPILER_RT_STANDALONE_BUILD) | |
| append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC BUILTIN_CFLAGS) | |
| append_list_if(COMPILER_RT_HAS_FNO_BUILTIN_FLAG -fno-builtin BUILTIN_CFLAGS) | |
| if(NOT ANDROID) | |
| append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG -fvisibility=hidden BUILTIN_CFLAGS) | |
| endif() | |
| if(NOT COMPILER_RT_DEBUG) | |
| append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fomit-frame-pointer BUILTIN_CFLAGS) | |
| endif() | |
| endif() | |
| set(BUILTIN_DEFS "") | |
| if(NOT ANDROID) | |
| append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG VISIBILITY_HIDDEN BUILTIN_DEFS) | |
| endif() | |
| foreach (arch ${BUILTIN_SUPPORTED_ARCH}) | |
| if (CAN_TARGET_${arch}) | |
| # NOTE: some architectures (e.g. i386) have multiple names. Ensure that | |
| # we catch them all. | |
| set(_arch ${arch}) | |
| if("${arch}" STREQUAL "armv6m") | |
| set(_arch "arm|armv6m") | |
| elseif("${arch}" MATCHES "^(armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") | |
| set(_arch "arm") | |
| endif() | |
| # For ARM archs, exclude any VFP builtins if VFP is not supported | |
| if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$") | |
| string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}") | |
| check_compile_definition(__VFP_FP__ "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP) | |
| if(NOT COMPILER_RT_HAS_${arch}_VFP) | |
| list(REMOVE_ITEM ${arch}_SOURCES ${arm_Thumb1_VFPv2_SOURCES} ${arm_Thumb1_SjLj_EH_SOURCES}) | |
| endif() | |
| endif() | |
| # Filter out generic versions of routines that are re-implemented in | |
| # architecture specific manner. This prevents multiple definitions of the | |
| # same symbols, making the symbol selection non-deterministic. | |
| foreach (_file ${${arch}_SOURCES}) | |
| if (${_file} MATCHES ${_arch}/*) | |
| get_filename_component(_name ${_file} NAME) | |
| string(REPLACE ".S" ".c" _cname "${_name}") | |
| list(REMOVE_ITEM ${arch}_SOURCES ${_cname}) | |
| endif () | |
| endforeach () | |
| # Needed for clear_cache on debug mode, due to r7's usage in inline asm. | |
| # Release mode already sets it via -O2/3, Debug mode doesn't. | |
| if (${arch} STREQUAL "armhf") | |
| list(APPEND BUILTIN_CFLAGS -fomit-frame-pointer -DCOMPILER_RT_ARMHF_TARGET) | |
| endif() | |
| # For RISCV32, we must force enable int128 for compiling long | |
| # double routines. | |
| if("${arch}" STREQUAL "riscv32") | |
| list(APPEND BUILTIN_CFLAGS -fforce-enable-int128) | |
| endif() | |
| add_compiler_rt_runtime(clang_rt.builtins | |
| STATIC | |
| ARCHS ${arch} | |
| SOURCES ${${arch}_SOURCES} | |
| DEFS ${BUILTIN_DEFS} | |
| CFLAGS ${BUILTIN_CFLAGS} | |
| PARENT_TARGET builtins) | |
| endif () | |
| endforeach () | |
| endif () | |
| add_dependencies(compiler-rt builtins) |