add_subdirectory(memory_utils) if(LIBC_CONF_STRING_UNSAFE_WIDE_READ) list(APPEND string_config_options "-DLIBC_COPT_STRING_UNSAFE_WIDE_READ") endif() if(LIBC_CONF_MEMSET_X86_USE_SOFTWARE_PREFETCHING) list(APPEND string_config_options "-DLIBC_COPT_MEMSET_X86_USE_SOFTWARE_PREFETCHING") endif() if(string_config_options) list(PREPEND string_config_options "COMPILE_OPTIONS") endif() add_header_library( string_utils HDRS string_utils.h DEPENDS .memory_utils.inline_bzero .memory_utils.inline_memcpy libc.hdr.types.size_t libc.include.stdlib libc.src.__support.CPP.bitset libc.src.__support.CPP.type_traits libc.src.__support.common ${string_config_options} ) add_header_library( allocating_string_utils HDRS allocating_string_utils.h DEPENDS .memory_utils.inline_memcpy libc.include.stdlib libc.src.__support.CPP.optional libc.src.__support.macros.config ) add_entrypoint_object( memccpy SRCS memccpy.cpp HDRS memccpy.h ) add_entrypoint_object( mempcpy SRCS mempcpy.cpp HDRS mempcpy.h DEPENDS .memory_utils.inline_memcpy ) add_entrypoint_object( memmem SRCS memmem.cpp HDRS memmem.h DEPENDS .memory_utils.inline_memmem ) add_entrypoint_object( memchr SRCS memchr.cpp HDRS memchr.h DEPENDS .string_utils ) add_entrypoint_object( memrchr SRCS memrchr.cpp HDRS memrchr.h ) add_entrypoint_object( stpcpy SRCS stpcpy.cpp HDRS stpcpy.h DEPENDS .mempcpy .string_utils ) add_entrypoint_object( stpncpy SRCS stpncpy.cpp HDRS stpncpy.h DEPENDS .memory_utils.inline_bzero ) add_entrypoint_object( strcat SRCS strcat.cpp HDRS strcat.h DEPENDS .strcpy .string_utils libc.include.llvm-libc-types.size_t ) add_entrypoint_object( strchr SRCS strchr.cpp HDRS strchr.h DEPENDS .string_utils ) add_entrypoint_object( strchrnul SRCS strchrnul.cpp HDRS strchrnul.h DEPENDS .string_utils ) add_entrypoint_object( strcmp SRCS strcmp.cpp HDRS strcmp.h DEPENDS .memory_utils.inline_strcmp ) add_entrypoint_object( strcasestr SRCS strcasestr.cpp HDRS strcasestr.h DEPENDS .memory_utils.inline_strstr libc.src.__support.ctype_utils ) add_entrypoint_object( strcoll SRCS strcoll.cpp HDRS strcoll.h ) add_entrypoint_object( strcoll_l SRCS strcoll_l.cpp HDRS strcoll_l.h ) add_entrypoint_object( strcpy SRCS strcpy.cpp HDRS strcpy.h DEPENDS .memory_utils.inline_memcpy .string_utils ) add_entrypoint_object( strcspn SRCS strcspn.cpp HDRS strcspn.h DEPENDS .string_utils ) add_entrypoint_object( strdup SRCS strdup.cpp HDRS strdup.h DEPENDS .memory_utils.inline_memcpy .string_utils libc.hdr.stdlib_macros libc.src.errno.errno libc.include.llvm-libc-types.size_t ) add_entrypoint_object( strerror SRCS strerror.cpp HDRS strerror.h DEPENDS libc.src.__support.StringUtil.error_to_string ) add_entrypoint_object( strerror_r SRCS strerror_r.cpp HDRS strerror_r.h DEPENDS libc.src.__support.StringUtil.error_to_string ) add_entrypoint_object( strlcat SRCS strlcat.cpp HDRS strlcat.h DEPENDS .string_utils libc.include.llvm-libc-types.size_t ) add_entrypoint_object( strlcpy SRCS strlcpy.cpp HDRS strlcpy.h DEPENDS .string_utils libc.include.llvm-libc-types.size_t ) add_entrypoint_object( strlen SRCS strlen.cpp HDRS strlen.h DEPENDS .string_utils libc.include.llvm-libc-types.size_t ) add_entrypoint_object( strncat SRCS strncat.cpp HDRS strncat.h DEPENDS .strncpy .string_utils libc.include.llvm-libc-types.size_t ) add_entrypoint_object( strncmp SRCS strncmp.cpp HDRS strncmp.h DEPENDS .memory_utils.inline_strcmp ) add_entrypoint_object( strncpy SRCS strncpy.cpp HDRS strncpy.h ) add_entrypoint_object( strndup SRCS strndup.cpp HDRS strndup.h DEPENDS .memory_utils.inline_memcpy .string_utils libc.include.stdlib libc.src.__support.CPP.new libc.include.llvm-libc-types.size_t ) add_entrypoint_object( strnlen SRCS strnlen.cpp HDRS strnlen.h DEPENDS .string_utils ) add_entrypoint_object( strpbrk SRCS strpbrk.cpp HDRS strpbrk.h DEPENDS .string_utils ) add_entrypoint_object( strrchr SRCS strrchr.cpp HDRS strrchr.h DEPENDS .string_utils ) add_entrypoint_object( strsep SRCS strsep.cpp HDRS strsep.h DEPENDS .string_utils ) add_entrypoint_object( strsignal SRCS strsignal.cpp HDRS strsignal.h DEPENDS libc.src.__support.StringUtil.signal_to_string ) add_entrypoint_object( strspn SRCS strspn.cpp HDRS strspn.h DEPENDS libc.src.__support.CPP.bitset ) add_entrypoint_object( strstr SRCS strstr.cpp HDRS strstr.h DEPENDS .memory_utils.inline_strstr ) add_entrypoint_object( strtok SRCS strtok.cpp HDRS strtok.h DEPENDS .string_utils ) add_entrypoint_object( strtok_r SRCS strtok_r.cpp HDRS strtok_r.h DEPENDS .string_utils ) add_entrypoint_object( strxfrm SRCS strxfrm.cpp HDRS strxfrm.h DEPENDS .string_utils .memory_utils.inline_memcpy ) add_entrypoint_object( strxfrm_l SRCS strxfrm_l.cpp HDRS strxfrm_l.h DEPENDS .string_utils .memory_utils.inline_memcpy ) add_entrypoint_object( memset_explicit SRCS memset_explicit.cpp HDRS memset_explicit.h DEPENDS .string_utils .memory_utils.inline_memset ) # ------------------------------------------------------------------------------ # memcmp # ------------------------------------------------------------------------------ function(add_memcmp memcmp_name) add_implementation(memcmp ${memcmp_name} SRCS ${LIBC_SOURCE_DIR}/src/string/memcmp.cpp HDRS ${LIBC_SOURCE_DIR}/src/string/memcmp.h DEPENDS .memory_utils.inline_memcmp libc.include.string ${ARGN} ) endfunction() if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) add_memcmp(memcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) add_memcmp(memcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) add_memcmp(memcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW) add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memcmp(memcmp) elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memcmp(memcmp) elseif(LIBC_TARGET_OS_IS_GPU) add_memcmp(memcmp) else() add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memcmp(memcmp) endif() # ------------------------------------------------------------------------------ # memcpy # ------------------------------------------------------------------------------ function(add_memcpy memcpy_name) add_implementation(memcpy ${memcpy_name} SRCS ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h DEPENDS .memory_utils.inline_memcpy libc.include.string ${ARGN} ) endfunction() if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) add_memcpy(memcpy_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) add_memcpy(memcpy_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) add_memcpy(memcpy_x86_64_opt_avx COMPILE_OPTIONS -march=sandybridge REQUIRE AVX) add_memcpy(memcpy_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) add_memcpy(memcpy_x86_64_opt_sw_prefetch_sse4 COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=nehalem REQUIRE SSE4_2) add_memcpy(memcpy_x86_64_opt_sw_prefetch_avx COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=sandybridge REQUIRE AVX) add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memcpy(memcpy) elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) # Disable tail merging as it leads to lower performance. add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE} MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") add_memcpy(memcpy MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") elseif(LIBC_TARGET_OS_IS_GPU) add_memcpy(memcpy) else() add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memcpy(memcpy) endif() # ------------------------------------------------------------------------------ # memmove # ------------------------------------------------------------------------------ function(add_memmove memmove_name) add_implementation(memmove ${memmove_name} SRCS ${LIBC_SOURCE_DIR}/src/string/memmove.cpp HDRS ${LIBC_SOURCE_DIR}/src/string/memmove.h DEPENDS .memory_utils.inline_memcpy libc.include.string ${ARGN} ) endfunction() if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) add_memmove(memmove_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) add_memmove(memmove_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) add_memmove(memmove_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) add_memmove(memmove_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memmove(memmove) elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) # Disable tail merging as it leads to lower performance. add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE} MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") add_memmove(memmove MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") elseif(LIBC_TARGET_OS_IS_GPU) add_memmove(memmove) else() add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memmove(memmove) endif() # ------------------------------------------------------------------------------ # memset # ------------------------------------------------------------------------------ function(add_memset memset_name) add_implementation(memset ${memset_name} SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h DEPENDS .memory_utils.inline_memset libc.include.string ${ARGN} ) endfunction() if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) add_memset(memset_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) add_memset(memset_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) add_memset(memset_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) add_memset(memset_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) add_memset(memset_x86_64_opt_sw_prefetch COMPILE_OPTIONS -DLIBC_COPT_MEMSET_X86_USE_SOFTWARE_PREFETCHING) add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memset(memset) elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) # Disable tail merging as it leads to lower performance. add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE} MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") add_memset(memset MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") elseif(LIBC_TARGET_OS_IS_GPU) add_memset(memset) else() add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) add_memset(memset) endif()