blob: 2c607bf8ea8953665bcd336da03b098846c51787 [file] [log] [blame]
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()