1add_subdirectory(memory_utils) 2 3add_header_library( 4 string_utils 5 HDRS 6 string_utils.h 7 DEPENDS 8 libc.utils.CPP.standalone_cpp 9) 10 11add_entrypoint_object( 12 strcat 13 SRCS 14 strcat.cpp 15 HDRS 16 strcat.h 17 DEPENDS 18 .strcpy 19 .string_utils 20) 21 22add_entrypoint_object( 23 strcpy 24 SRCS 25 strcpy.cpp 26 HDRS 27 strcpy.h 28 DEPENDS 29 .memcpy 30 .string_utils 31) 32 33add_entrypoint_object( 34 strlen 35 SRCS 36 strlen.cpp 37 HDRS 38 strlen.h 39 DEPENDS 40 libc.include.string 41) 42 43add_entrypoint_object( 44 strcmp 45 SRCS 46 strcmp.cpp 47 HDRS 48 strcmp.h 49) 50 51add_entrypoint_object( 52 memchr 53 SRCS 54 memchr.cpp 55 HDRS 56 memchr.h 57 DEPENDS 58 .string_utils 59) 60 61add_entrypoint_object( 62 memcmp 63 SRCS 64 memcmp.cpp 65 HDRS 66 memcmp.h 67) 68 69add_entrypoint_object( 70 memmove 71 SRCS 72 memmove.cpp 73 HDRS 74 memmove.h 75 DEPENDS 76 libc.src.__support.integer_operations 77 libc.src.string.memcpy 78) 79 80add_entrypoint_object( 81 strchr 82 SRCS 83 strchr.cpp 84 HDRS 85 strchr.h 86) 87 88add_entrypoint_object( 89 strstr 90 SRCS 91 strstr.cpp 92 HDRS 93 strstr.h 94) 95 96add_entrypoint_object( 97 strncpy 98 SRCS 99 strncpy.cpp 100 HDRS 101 strncpy.h 102) 103 104add_entrypoint_object( 105 strnlen 106 SRCS 107 strnlen.cpp 108 HDRS 109 strnlen.h 110 DEPENDS 111 .string_utils 112) 113 114add_entrypoint_object( 115 memrchr 116 SRCS 117 memrchr.cpp 118 HDRS 119 memrchr.h 120) 121 122add_entrypoint_object( 123 strrchr 124 SRCS 125 strrchr.cpp 126 HDRS 127 strrchr.h 128) 129 130add_entrypoint_object( 131 strcspn 132 SRCS 133 strcspn.cpp 134 HDRS 135 strcspn.h 136 DEPENDS 137 .string_utils 138) 139 140add_entrypoint_object( 141 strspn 142 SRCS 143 strspn.cpp 144 HDRS 145 strspn.h 146 DEPENDS 147 libc.utils.CPP.standalone_cpp 148) 149 150add_entrypoint_object( 151 strpbrk 152 SRCS 153 strpbrk.cpp 154 HDRS 155 strpbrk.h 156 DEPENDS 157 .string_utils 158) 159 160add_entrypoint_object( 161 strtok 162 SRCS 163 strtok.cpp 164 HDRS 165 strtok.h 166 DEPENDS 167 .string_utils 168) 169 170add_entrypoint_object( 171 strtok_r 172 SRCS 173 strtok_r.cpp 174 HDRS 175 strtok_r.h 176 DEPENDS 177 .string_utils 178) 179 180# Helper to define a function with multiple implementations 181# - Computes flags to satisfy required/rejected features and arch, 182# - Declares an entry point, 183# - Attach the REQUIRE_CPU_FEATURES property to the target, 184# - Add the fully qualified target to `${name}_implementations` global property for tests. 185function(add_implementation name impl_name) 186 cmake_parse_arguments( 187 "ADD_IMPL" 188 "" # Optional arguments 189 "MARCH" # Single value arguments 190 "REQUIRE;REJECT;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments 191 ${ARGN}) 192 compute_flags(flags 193 MARCH ${ADD_IMPL_MARCH} 194 REQUIRE ${ADD_IMPL_REQUIRE} 195 REJECT ${ADD_IMPL_REJECT} 196 ) 197 add_entrypoint_object(${impl_name} 198 NAME ${name} 199 SRCS ${ADD_IMPL_SRCS} 200 HDRS ${ADD_IMPL_HDRS} 201 DEPENDS ${ADD_IMPL_DEPENDS} 202 COMPILE_OPTIONS ${ADD_IMPL_COMPILE_OPTIONS} ${flags} -O2 203 ) 204 get_fq_target_name(${impl_name} fq_target_name) 205 set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}") 206 set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}") 207endfunction() 208 209# ------------------------------------------------------------------------------ 210# memcpy 211# ------------------------------------------------------------------------------ 212 213# include the relevant architecture specific implementations 214if(${LIBC_TARGET_MACHINE} STREQUAL "x86_64") 215 set(LIBC_STRING_TARGET_ARCH "x86") 216 set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/x86/memcpy.cpp) 217elseif(${LIBC_TARGET_MACHINE} STREQUAL "aarch64") 218 set(LIBC_STRING_TARGET_ARCH "aarch64") 219 set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/aarch64/memcpy.cpp) 220#Disable tail merging as it leads to lower performance 221 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm --tail-merge-threshold=0") 222else() 223 set(LIBC_STRING_TARGET_ARCH ${LIBC_TARGET_MACHINE}) 224 set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp) 225endif() 226 227function(add_memcpy memcpy_name) 228 add_implementation(memcpy ${memcpy_name} 229 SRCS ${MEMCPY_SRC} 230 HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h 231 DEPENDS 232 .memory_utils.memory_utils 233 libc.include.string 234 COMPILE_OPTIONS 235 -fno-builtin-memcpy 236 ${ARGN} 237 ) 238endfunction() 239 240if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86") 241 add_memcpy(memcpy MARCH native) 242else() 243 add_memcpy(memcpy) 244endif() 245 246# ------------------------------------------------------------------------------ 247# memset 248# ------------------------------------------------------------------------------ 249 250function(add_memset memset_name) 251 add_implementation(memset ${memset_name} 252 SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp 253 HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h 254 DEPENDS 255 .memory_utils.memory_utils 256 libc.include.string 257 COMPILE_OPTIONS 258 -fno-builtin-memset 259 ${ARGN} 260 ) 261endfunction() 262 263if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86") 264 add_memset(memset MARCH native) 265else() 266 add_memset(memset) 267endif() 268 269# ------------------------------------------------------------------------------ 270# bzero 271# ------------------------------------------------------------------------------ 272 273function(add_bzero bzero_name) 274 add_implementation(bzero ${bzero_name} 275 SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp 276 HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h 277 DEPENDS 278 .memory_utils.memory_utils 279 libc.include.string 280 COMPILE_OPTIONS 281 -fno-builtin-memset 282 -fno-builtin-bzero 283 ${ARGN} 284 ) 285endfunction() 286 287if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86") 288 add_bzero(bzero MARCH native) 289else() 290 add_bzero(bzero) 291endif() 292 293# ------------------------------------------------------------------------------ 294# Add all other relevant implementations for the native target. 295# ------------------------------------------------------------------------------ 296 297if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_STRING_TARGET_ARCH}) 298 include(${LIBC_STRING_TARGET_ARCH}/CMakeLists.txt) 299endif() 300