1add_subdirectory(memory_utils) 2 3if(LIBC_CONF_STRING_UNSAFE_WIDE_READ) 4 list(APPEND string_config_options "-DLIBC_COPT_STRING_UNSAFE_WIDE_READ") 5endif() 6if(LIBC_CONF_MEMSET_X86_USE_SOFTWARE_PREFETCHING) 7 list(APPEND string_config_options "-DLIBC_COPT_MEMSET_X86_USE_SOFTWARE_PREFETCHING") 8endif() 9if(string_config_options) 10 list(PREPEND string_config_options "COMPILE_OPTIONS") 11endif() 12 13add_header_library( 14 string_utils 15 HDRS 16 string_utils.h 17 DEPENDS 18 .memory_utils.inline_bzero 19 .memory_utils.inline_memcpy 20 libc.hdr.types.size_t 21 libc.include.stdlib 22 libc.src.__support.CPP.bitset 23 libc.src.__support.CPP.type_traits 24 libc.src.__support.common 25 ${string_config_options} 26) 27 28add_header_library( 29 allocating_string_utils 30 HDRS 31 allocating_string_utils.h 32 DEPENDS 33 .memory_utils.inline_memcpy 34 libc.include.stdlib 35 libc.src.__support.CPP.optional 36 libc.src.__support.macros.config 37) 38 39add_entrypoint_object( 40 memccpy 41 SRCS 42 memccpy.cpp 43 HDRS 44 memccpy.h 45) 46 47add_entrypoint_object( 48 mempcpy 49 SRCS 50 mempcpy.cpp 51 HDRS 52 mempcpy.h 53 DEPENDS 54 .memory_utils.inline_memcpy 55) 56 57add_entrypoint_object( 58 memmem 59 SRCS 60 memmem.cpp 61 HDRS 62 memmem.h 63 DEPENDS 64 .memory_utils.inline_memmem 65) 66 67add_entrypoint_object( 68 memchr 69 SRCS 70 memchr.cpp 71 HDRS 72 memchr.h 73 DEPENDS 74 .string_utils 75) 76 77add_entrypoint_object( 78 memrchr 79 SRCS 80 memrchr.cpp 81 HDRS 82 memrchr.h 83) 84 85add_entrypoint_object( 86 stpcpy 87 SRCS 88 stpcpy.cpp 89 HDRS 90 stpcpy.h 91 DEPENDS 92 .mempcpy 93 .string_utils 94) 95 96add_entrypoint_object( 97 stpncpy 98 SRCS 99 stpncpy.cpp 100 HDRS 101 stpncpy.h 102 DEPENDS 103 .memory_utils.inline_bzero 104) 105 106add_entrypoint_object( 107 strcat 108 SRCS 109 strcat.cpp 110 HDRS 111 strcat.h 112 DEPENDS 113 .strcpy 114 .string_utils 115 libc.include.llvm-libc-types.size_t 116) 117 118add_entrypoint_object( 119 strchr 120 SRCS 121 strchr.cpp 122 HDRS 123 strchr.h 124 DEPENDS 125 .string_utils 126) 127 128add_entrypoint_object( 129 strchrnul 130 SRCS 131 strchrnul.cpp 132 HDRS 133 strchrnul.h 134 DEPENDS 135 .string_utils 136) 137 138add_entrypoint_object( 139 strcmp 140 SRCS 141 strcmp.cpp 142 HDRS 143 strcmp.h 144 DEPENDS 145 .memory_utils.inline_strcmp 146) 147 148add_entrypoint_object( 149 strcasestr 150 SRCS 151 strcasestr.cpp 152 HDRS 153 strcasestr.h 154 DEPENDS 155 .memory_utils.inline_strstr 156 libc.src.__support.ctype_utils 157) 158 159add_entrypoint_object( 160 strcoll 161 SRCS 162 strcoll.cpp 163 HDRS 164 strcoll.h 165) 166 167add_entrypoint_object( 168 strcoll_l 169 SRCS 170 strcoll_l.cpp 171 HDRS 172 strcoll_l.h 173) 174 175add_entrypoint_object( 176 strcpy 177 SRCS 178 strcpy.cpp 179 HDRS 180 strcpy.h 181 DEPENDS 182 .memory_utils.inline_memcpy 183 .string_utils 184) 185 186add_entrypoint_object( 187 strcspn 188 SRCS 189 strcspn.cpp 190 HDRS 191 strcspn.h 192 DEPENDS 193 .string_utils 194) 195 196add_entrypoint_object( 197 strdup 198 SRCS 199 strdup.cpp 200 HDRS 201 strdup.h 202 DEPENDS 203 .memory_utils.inline_memcpy 204 .string_utils 205 libc.hdr.stdlib_macros 206 libc.src.errno.errno 207 libc.include.llvm-libc-types.size_t 208) 209 210add_entrypoint_object( 211 strerror 212 SRCS 213 strerror.cpp 214 HDRS 215 strerror.h 216 DEPENDS 217 libc.src.__support.StringUtil.error_to_string 218) 219 220add_entrypoint_object( 221 strerror_r 222 SRCS 223 strerror_r.cpp 224 HDRS 225 strerror_r.h 226 DEPENDS 227 libc.src.__support.StringUtil.error_to_string 228) 229 230add_entrypoint_object( 231 strlcat 232 SRCS 233 strlcat.cpp 234 HDRS 235 strlcat.h 236 DEPENDS 237 .string_utils 238 libc.include.llvm-libc-types.size_t 239) 240 241add_entrypoint_object( 242 strlcpy 243 SRCS 244 strlcpy.cpp 245 HDRS 246 strlcpy.h 247 DEPENDS 248 .string_utils 249 libc.include.llvm-libc-types.size_t 250) 251 252add_entrypoint_object( 253 strlen 254 SRCS 255 strlen.cpp 256 HDRS 257 strlen.h 258 DEPENDS 259 .string_utils 260 libc.include.llvm-libc-types.size_t 261) 262 263add_entrypoint_object( 264 strncat 265 SRCS 266 strncat.cpp 267 HDRS 268 strncat.h 269 DEPENDS 270 .strncpy 271 .string_utils 272 libc.include.llvm-libc-types.size_t 273) 274 275add_entrypoint_object( 276 strncmp 277 SRCS 278 strncmp.cpp 279 HDRS 280 strncmp.h 281 DEPENDS 282 .memory_utils.inline_strcmp 283) 284 285add_entrypoint_object( 286 strncpy 287 SRCS 288 strncpy.cpp 289 HDRS 290 strncpy.h 291) 292 293add_entrypoint_object( 294 strndup 295 SRCS 296 strndup.cpp 297 HDRS 298 strndup.h 299 DEPENDS 300 .memory_utils.inline_memcpy 301 .string_utils 302 libc.include.stdlib 303 libc.src.__support.CPP.new 304 libc.include.llvm-libc-types.size_t 305) 306 307add_entrypoint_object( 308 strnlen 309 SRCS 310 strnlen.cpp 311 HDRS 312 strnlen.h 313 DEPENDS 314 .string_utils 315) 316 317add_entrypoint_object( 318 strpbrk 319 SRCS 320 strpbrk.cpp 321 HDRS 322 strpbrk.h 323 DEPENDS 324 .string_utils 325) 326 327add_entrypoint_object( 328 strrchr 329 SRCS 330 strrchr.cpp 331 HDRS 332 strrchr.h 333 DEPENDS 334 .string_utils 335) 336 337add_entrypoint_object( 338 strsep 339 SRCS 340 strsep.cpp 341 HDRS 342 strsep.h 343 DEPENDS 344 .string_utils 345) 346 347add_entrypoint_object( 348 strsignal 349 SRCS 350 strsignal.cpp 351 HDRS 352 strsignal.h 353 DEPENDS 354 libc.src.__support.StringUtil.signal_to_string 355) 356 357add_entrypoint_object( 358 strspn 359 SRCS 360 strspn.cpp 361 HDRS 362 strspn.h 363 DEPENDS 364 libc.src.__support.CPP.bitset 365) 366 367add_entrypoint_object( 368 strstr 369 SRCS 370 strstr.cpp 371 HDRS 372 strstr.h 373 DEPENDS 374 .memory_utils.inline_strstr 375) 376 377add_entrypoint_object( 378 strtok 379 SRCS 380 strtok.cpp 381 HDRS 382 strtok.h 383 DEPENDS 384 .string_utils 385) 386 387add_entrypoint_object( 388 strtok_r 389 SRCS 390 strtok_r.cpp 391 HDRS 392 strtok_r.h 393 DEPENDS 394 .string_utils 395) 396 397add_entrypoint_object( 398 strxfrm 399 SRCS 400 strxfrm.cpp 401 HDRS 402 strxfrm.h 403 DEPENDS 404 .string_utils 405 .memory_utils.inline_memcpy 406) 407 408add_entrypoint_object( 409 strxfrm_l 410 SRCS 411 strxfrm_l.cpp 412 HDRS 413 strxfrm_l.h 414 DEPENDS 415 .string_utils 416 .memory_utils.inline_memcpy 417) 418 419add_entrypoint_object( 420 memset_explicit 421 SRCS 422 memset_explicit.cpp 423 HDRS 424 memset_explicit.h 425 DEPENDS 426 .string_utils 427 .memory_utils.inline_memset 428) 429 430# ------------------------------------------------------------------------------ 431# memcmp 432# ------------------------------------------------------------------------------ 433 434function(add_memcmp memcmp_name) 435 add_implementation(memcmp ${memcmp_name} 436 SRCS ${LIBC_SOURCE_DIR}/src/string/memcmp.cpp 437 HDRS ${LIBC_SOURCE_DIR}/src/string/memcmp.h 438 DEPENDS 439 .memory_utils.inline_memcmp 440 libc.include.string 441 ${ARGN} 442 ) 443endfunction() 444 445if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) 446 add_memcmp(memcmp_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) 447 add_memcmp(memcmp_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) 448 add_memcmp(memcmp_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) 449 add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW) 450 add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 451 add_memcmp(memcmp) 452elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) 453 add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 454 add_memcmp(memcmp) 455elseif(LIBC_TARGET_OS_IS_GPU) 456 add_memcmp(memcmp) 457else() 458 add_memcmp(memcmp_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 459 add_memcmp(memcmp) 460endif() 461 462# ------------------------------------------------------------------------------ 463# memcpy 464# ------------------------------------------------------------------------------ 465 466function(add_memcpy memcpy_name) 467 add_implementation(memcpy ${memcpy_name} 468 SRCS ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp 469 HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h 470 DEPENDS 471 .memory_utils.inline_memcpy 472 libc.include.string 473 ${ARGN} 474 ) 475endfunction() 476 477if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) 478 add_memcpy(memcpy_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) 479 add_memcpy(memcpy_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) 480 add_memcpy(memcpy_x86_64_opt_avx COMPILE_OPTIONS -march=sandybridge REQUIRE AVX) 481 add_memcpy(memcpy_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) 482 add_memcpy(memcpy_x86_64_opt_sw_prefetch_sse4 COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=nehalem REQUIRE SSE4_2) 483 add_memcpy(memcpy_x86_64_opt_sw_prefetch_avx COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=sandybridge REQUIRE AVX) 484 add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 485 add_memcpy(memcpy) 486elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) 487 # Disable tail merging as it leads to lower performance. 488 add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE} 489 MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") 490 add_memcpy(memcpy MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") 491elseif(LIBC_TARGET_OS_IS_GPU) 492 add_memcpy(memcpy) 493else() 494 add_memcpy(memcpy_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 495 add_memcpy(memcpy) 496endif() 497 498# ------------------------------------------------------------------------------ 499# memmove 500# ------------------------------------------------------------------------------ 501 502function(add_memmove memmove_name) 503 add_implementation(memmove ${memmove_name} 504 SRCS ${LIBC_SOURCE_DIR}/src/string/memmove.cpp 505 HDRS ${LIBC_SOURCE_DIR}/src/string/memmove.h 506 DEPENDS 507 .memory_utils.inline_memcpy 508 libc.include.string 509 ${ARGN} 510 ) 511endfunction() 512 513if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) 514 add_memmove(memmove_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) 515 add_memmove(memmove_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) 516 add_memmove(memmove_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) 517 add_memmove(memmove_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) 518 add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 519 add_memmove(memmove) 520elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) 521 # Disable tail merging as it leads to lower performance. 522 add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE} 523 MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") 524 add_memmove(memmove MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") 525elseif(LIBC_TARGET_OS_IS_GPU) 526 add_memmove(memmove) 527else() 528 add_memmove(memmove_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 529 add_memmove(memmove) 530endif() 531 532# ------------------------------------------------------------------------------ 533# memset 534# ------------------------------------------------------------------------------ 535 536function(add_memset memset_name) 537 add_implementation(memset ${memset_name} 538 SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp 539 HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h 540 DEPENDS 541 .memory_utils.inline_memset 542 libc.include.string 543 ${ARGN} 544 ) 545endfunction() 546 547if(${LIBC_TARGET_ARCHITECTURE_IS_X86}) 548 add_memset(memset_x86_64_opt_sse2 COMPILE_OPTIONS -march=k8 REQUIRE SSE2) 549 add_memset(memset_x86_64_opt_sse4 COMPILE_OPTIONS -march=nehalem REQUIRE SSE4_2) 550 add_memset(memset_x86_64_opt_avx2 COMPILE_OPTIONS -march=haswell REQUIRE AVX2) 551 add_memset(memset_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F) 552 add_memset(memset_x86_64_opt_sw_prefetch COMPILE_OPTIONS -DLIBC_COPT_MEMSET_X86_USE_SOFTWARE_PREFETCHING) 553 add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 554 add_memset(memset) 555elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64}) 556 # Disable tail merging as it leads to lower performance. 557 add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE} 558 MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") 559 add_memset(memset MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0") 560elseif(LIBC_TARGET_OS_IS_GPU) 561 add_memset(memset) 562else() 563 add_memset(memset_opt_host COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}) 564 add_memset(memset) 565endif() 566