[libc] Deprecate LLVM_ENABLE_PROJECTS in favor of LLVM_ENABLE_RUNTIMES. (#117265)
[llvm-project.git] / libc / src / string / CMakeLists.txt
blob8fe1226dd6a7a5676aee30d0fa9518d65aededc7
1 add_subdirectory(memory_utils)
3 if(LIBC_CONF_STRING_UNSAFE_WIDE_READ)
4   list(APPEND string_config_options "-DLIBC_COPT_STRING_UNSAFE_WIDE_READ")
5 endif()
6 if(LIBC_CONF_MEMSET_X86_USE_SOFTWARE_PREFETCHING)
7   list(APPEND string_config_options "-DLIBC_COPT_MEMSET_X86_USE_SOFTWARE_PREFETCHING")
8 endif()
9 if(string_config_options)
10   list(PREPEND string_config_options "COMPILE_OPTIONS")
11 endif()
13 add_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.include.stdlib
21     libc.src.__support.common
22     libc.src.__support.CPP.bitset
23   ${string_config_options}
26 add_header_library(
27   allocating_string_utils
28   HDRS
29     allocating_string_utils.h
30   DEPENDS
31     .memory_utils.inline_memcpy
32     libc.include.stdlib
33     libc.src.__support.CPP.optional
34     libc.src.__support.macros.config
37 add_entrypoint_object(
38   bcopy
39   SRCS
40     bcopy.cpp
41   HDRS
42     bcopy.h
45 add_entrypoint_object(
46   index
47   SRCS
48     index.cpp
49   HDRS
50     index.h
51   DEPENDS
52     .string_utils
55 add_entrypoint_object(
56   memccpy
57   SRCS
58     memccpy.cpp
59   HDRS
60     memccpy.h
63 add_entrypoint_object(
64   mempcpy
65   SRCS
66     mempcpy.cpp
67   HDRS
68     mempcpy.h
69   DEPENDS
70     .memory_utils.inline_memcpy
73 add_entrypoint_object(
74   memmem
75   SRCS
76     memmem.cpp
77   HDRS
78     memmem.h
79   DEPENDS
80     .memory_utils.inline_memmem
83 add_entrypoint_object(
84   memchr
85   SRCS
86     memchr.cpp
87   HDRS
88     memchr.h
89   DEPENDS
90     .string_utils
93 add_entrypoint_object(
94   memrchr
95   SRCS
96     memrchr.cpp
97   HDRS
98     memrchr.h
101 add_entrypoint_object(
102   rindex
103   SRCS
104     rindex.cpp
105   HDRS
106     rindex.h
107   DEPENDS
108     .string_utils
111 add_entrypoint_object(
112   stpcpy
113   SRCS
114     stpcpy.cpp
115   HDRS
116     stpcpy.h
117   DEPENDS
118     .mempcpy
119     .string_utils
122 add_entrypoint_object(
123   stpncpy
124   SRCS
125     stpncpy.cpp
126   HDRS
127     stpncpy.h
128   DEPENDS
129     .memory_utils.inline_bzero
132 add_entrypoint_object(
133   strcat
134   SRCS
135     strcat.cpp
136   HDRS
137     strcat.h
138   DEPENDS
139     .strcpy
140     .string_utils
141     libc.include.llvm-libc-types.size_t
144 add_entrypoint_object(
145   strchr
146   SRCS
147     strchr.cpp
148   HDRS
149     strchr.h
150   DEPENDS
151     .string_utils
154 add_entrypoint_object(
155   strchrnul
156   SRCS
157     strchrnul.cpp
158   HDRS
159     strchrnul.h
160   DEPENDS
161     .string_utils
164 add_entrypoint_object(
165   strcmp
166   SRCS
167     strcmp.cpp
168   HDRS
169     strcmp.h
170   DEPENDS
171     .memory_utils.inline_strcmp
174 add_entrypoint_object(
175   strcasecmp
176   SRCS
177     strcasecmp.cpp
178   HDRS
179     strcasecmp.h
180   DEPENDS
181     .memory_utils.inline_strcmp
182     libc.src.__support.ctype_utils
185 add_entrypoint_object(
186   strcasestr
187   SRCS
188     strcasestr.cpp
189   HDRS
190     strcasestr.h
191   DEPENDS
192     .memory_utils.inline_strstr
193     libc.src.__support.ctype_utils
196 add_entrypoint_object(
197   strcoll
198   SRCS
199     strcoll.cpp
200   HDRS
201     strcoll.h
204 add_entrypoint_object(
205   strcoll_l
206   SRCS
207     strcoll_l.cpp
208   HDRS
209   strcoll_l.h
212 add_entrypoint_object(
213   strcpy
214   SRCS
215     strcpy.cpp
216   HDRS
217     strcpy.h
218   DEPENDS
219     .memory_utils.inline_memcpy
220     .string_utils
223 add_entrypoint_object(
224   strcspn
225   SRCS
226     strcspn.cpp
227   HDRS
228     strcspn.h
229   DEPENDS
230     .string_utils
233 add_entrypoint_object(
234   strdup
235   SRCS
236     strdup.cpp
237   HDRS
238     strdup.h
239   DEPENDS
240     .memory_utils.inline_memcpy
241     .string_utils
242     libc.hdr.stdlib_macros
243     libc.src.errno.errno
244     libc.include.llvm-libc-types.size_t
247 add_entrypoint_object(
248   strerror
249   SRCS
250     strerror.cpp
251   HDRS
252     strerror.h
253   DEPENDS
254     libc.src.__support.StringUtil.error_to_string
257 add_entrypoint_object(
258   strerror_r
259   SRCS
260     strerror_r.cpp
261   HDRS
262     strerror_r.h
263   DEPENDS
264     libc.src.__support.StringUtil.error_to_string
267 add_entrypoint_object(
268   strlcat
269   SRCS
270     strlcat.cpp
271   HDRS
272     strlcat.h
273   DEPENDS
274     .string_utils
275     libc.include.llvm-libc-types.size_t
278 add_entrypoint_object(
279   strlcpy
280   SRCS
281     strlcpy.cpp
282   HDRS
283     strlcpy.h
284   DEPENDS
285     .string_utils
286     libc.include.llvm-libc-types.size_t
289 add_entrypoint_object(
290   strlen
291   SRCS
292     strlen.cpp
293   HDRS
294     strlen.h
295   DEPENDS
296     .string_utils
297     libc.include.llvm-libc-types.size_t
300 add_entrypoint_object(
301   strncat
302   SRCS
303     strncat.cpp
304   HDRS
305     strncat.h
306   DEPENDS
307     .strncpy
308     .string_utils
309     libc.include.llvm-libc-types.size_t
312 add_entrypoint_object(
313   strncmp
314   SRCS
315     strncmp.cpp
316   HDRS
317     strncmp.h
318   DEPENDS
319     .memory_utils.inline_strcmp
322 add_entrypoint_object(
323   strncasecmp
324   SRCS
325     strncasecmp.cpp
326   HDRS
327     strncasecmp.h
328   DEPENDS
329     .memory_utils.inline_strcmp
330     libc.src.__support.ctype_utils
333 add_entrypoint_object(
334   strncpy
335   SRCS
336     strncpy.cpp
337   HDRS
338     strncpy.h
341 add_entrypoint_object(
342   strndup
343   SRCS
344     strndup.cpp
345   HDRS
346     strndup.h
347   DEPENDS
348     .memory_utils.inline_memcpy
349     .string_utils
350     libc.include.stdlib
351     libc.src.__support.CPP.new
352     libc.include.llvm-libc-types.size_t
355 add_entrypoint_object(
356   strnlen
357   SRCS
358     strnlen.cpp
359   HDRS
360     strnlen.h
361   DEPENDS
362     .string_utils
365 add_entrypoint_object(
366   strpbrk
367   SRCS
368     strpbrk.cpp
369   HDRS
370     strpbrk.h
371   DEPENDS
372     .string_utils
375 add_entrypoint_object(
376   strrchr
377   SRCS
378     strrchr.cpp
379   HDRS
380     strrchr.h
381   DEPENDS
382     .string_utils
385 add_entrypoint_object(
386   strsep
387   SRCS
388     strsep.cpp
389   HDRS
390     strsep.h
391   DEPENDS
392     .string_utils
395 add_entrypoint_object(
396   strsignal
397   SRCS
398     strsignal.cpp
399   HDRS
400     strsignal.h
401   DEPENDS
402     libc.src.__support.StringUtil.signal_to_string
405 add_entrypoint_object(
406   strspn
407   SRCS
408     strspn.cpp
409   HDRS
410     strspn.h
411   DEPENDS
412     libc.src.__support.CPP.bitset
415 add_entrypoint_object(
416   strstr
417   SRCS
418     strstr.cpp
419   HDRS
420     strstr.h
421   DEPENDS
422     .memory_utils.inline_strstr
425 add_entrypoint_object(
426   strtok
427   SRCS
428     strtok.cpp
429   HDRS
430     strtok.h
431   DEPENDS
432     .string_utils
435 add_entrypoint_object(
436   strtok_r
437   SRCS
438     strtok_r.cpp
439   HDRS
440     strtok_r.h
441   DEPENDS
442     .string_utils
445 add_entrypoint_object(
446   strxfrm
447   SRCS
448     strxfrm.cpp
449   HDRS
450     strxfrm.h
451   DEPENDS
452     .string_utils
453     .memory_utils.inline_memcpy
456 add_entrypoint_object(
457   strxfrm_l
458   SRCS
459     strxfrm_l.cpp
460   HDRS
461     strxfrm_l.h
462   DEPENDS
463     .string_utils
464     .memory_utils.inline_memcpy
467 add_entrypoint_object(
468   memset_explicit
469   SRCS
470     memset_explicit.cpp
471   HDRS
472     memset_explicit.h
473   DEPENDS
474     .string_utils
475     .memory_utils.inline_memset
478 # Helper to define a function with multiple implementations
479 # - Computes flags to satisfy required/rejected features and arch,
480 # - Declares an entry point,
481 # - Attach the REQUIRE_CPU_FEATURES property to the target,
482 # - Add the fully qualified target to `${name}_implementations` global property for tests.
483 function(add_implementation name impl_name)
484   cmake_parse_arguments(
485     "ADD_IMPL"
486     "" # Optional arguments
487     "" # Single value arguments
488     "REQUIRE;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS;MLLVM_COMPILE_OPTIONS" # Multi value arguments
489     ${ARGN})
491   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
492     # Note that '-mllvm' needs to be prefixed with 'SHELL:' to prevent CMake flag deduplication.
493     foreach(opt IN LISTS ADD_IMPL_MLLVM_COMPILE_OPTIONS)
494       list(APPEND ADD_IMPL_COMPILE_OPTIONS "SHELL:-mllvm ${opt}")
495     endforeach()
496   endif()
498   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
499     # Prevent warning when passing x86 SIMD types as template arguments.
500     # e.g. "warning: ignoring attributes on template argument ā€˜__m128iā€™ [-Wignored-attributes]"
501     list(APPEND ADD_IMPL_COMPILE_OPTIONS "-Wno-ignored-attributes")
502   endif()
504   add_entrypoint_object(${impl_name}
505     NAME ${name}
506     SRCS ${ADD_IMPL_SRCS}
507     HDRS ${ADD_IMPL_HDRS}
508     DEPENDS ${ADD_IMPL_DEPENDS}
509     COMPILE_OPTIONS ${libc_opt_high_flag} ${ADD_IMPL_COMPILE_OPTIONS}
510   )
511   get_fq_target_name(${impl_name} fq_target_name)
512   set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
513   set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
514 endfunction()
516 # ------------------------------------------------------------------------------
517 # bcmp
518 # ------------------------------------------------------------------------------
520 function(add_bcmp bcmp_name)
521   add_implementation(bcmp ${bcmp_name}
522     SRCS ${LIBC_SOURCE_DIR}/src/string/bcmp.cpp
523     HDRS ${LIBC_SOURCE_DIR}/src/string/bcmp.h
524     DEPENDS
525       .memory_utils.memory_utils
526       libc.include.string
527     ${ARGN}
528   )
529 endfunction()
531 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
532   add_bcmp(bcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
533   add_bcmp(bcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
534   add_bcmp(bcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
535   add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
536   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
537   add_bcmp(bcmp)
538 elseif(LIBC_TARGET_OS_IS_GPU)
539   add_bcmp(bcmp)
540 else()
541   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
542   add_bcmp(bcmp)
543 endif()
545 # ------------------------------------------------------------------------------
546 # bzero
547 # ------------------------------------------------------------------------------
549 function(add_bzero bzero_name)
550   add_implementation(bzero ${bzero_name}
551     SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
552     HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
553     DEPENDS
554       .memory_utils.inline_memset
555       libc.include.string
556     ${ARGN}
557   )
558 endfunction()
560 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
561   add_bzero(bzero_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
562   add_bzero(bzero_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
563   add_bzero(bzero_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
564   add_bzero(bzero_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
565   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
566   add_bzero(bzero)
567 elseif(LIBC_TARGET_OS_IS_GPU)
568   add_bzero(bzero)
569 else()
570   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
571   add_bzero(bzero)
572 endif()
574 # ------------------------------------------------------------------------------
575 # memcmp
576 # ------------------------------------------------------------------------------
578 function(add_memcmp memcmp_name)
579   add_implementation(memcmp ${memcmp_name}
580     SRCS ${LIBC_SOURCE_DIR}/src/string/memcmp.cpp
581     HDRS ${LIBC_SOURCE_DIR}/src/string/memcmp.h
582     DEPENDS
583       .memory_utils.inline_memcmp
584       libc.include.string
585     ${ARGN}
586   )
587 endfunction()
589 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
590   add_memcmp(memcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
591   add_memcmp(memcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
592   add_memcmp(memcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
593   add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
594   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
595   add_memcmp(memcmp)
596 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
597   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
598   add_memcmp(memcmp)
599 elseif(LIBC_TARGET_OS_IS_GPU)
600   add_memcmp(memcmp)
601 else()
602   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
603   add_memcmp(memcmp)
604 endif()
606 # ------------------------------------------------------------------------------
607 # memcpy
608 # ------------------------------------------------------------------------------
610 function(add_memcpy memcpy_name)
611   add_implementation(memcpy ${memcpy_name}
612     SRCS ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp
613     HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
614     DEPENDS
615       .memory_utils.inline_memcpy
616       libc.include.string
617     ${ARGN}
618   )
619 endfunction()
621 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
622   add_memcpy(memcpy_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
623   add_memcpy(memcpy_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
624   add_memcpy(memcpy_x86_64_opt_avx    COMPILE_OPTIONS -march=sandybridge    REQUIRE AVX)
625   add_memcpy(memcpy_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
626   add_memcpy(memcpy_x86_64_opt_sw_prefetch_sse4   COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=nehalem        REQUIRE SSE4_2)
627   add_memcpy(memcpy_x86_64_opt_sw_prefetch_avx    COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=sandybridge    REQUIRE AVX)
628   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
629   add_memcpy(memcpy)
630 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
631   # Disable tail merging as it leads to lower performance.
632   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
633                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
634   add_memcpy(memcpy                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
635 elseif(LIBC_TARGET_OS_IS_GPU)
636   add_memcpy(memcpy)
637 else()
638   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
639   add_memcpy(memcpy)
640 endif()
642 # ------------------------------------------------------------------------------
643 # memmove
644 # ------------------------------------------------------------------------------
646 function(add_memmove memmove_name)
647   add_implementation(memmove ${memmove_name}
648     SRCS ${LIBC_SOURCE_DIR}/src/string/memmove.cpp
649     HDRS ${LIBC_SOURCE_DIR}/src/string/memmove.h
650     DEPENDS
651       .memory_utils.inline_memcpy
652       libc.include.string
653     ${ARGN}
654   )
655 endfunction()
657 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
658   add_memmove(memmove_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
659   add_memmove(memmove_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
660   add_memmove(memmove_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
661   add_memmove(memmove_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
662   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
663   add_memmove(memmove)
664 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
665   # Disable tail merging as it leads to lower performance.
666   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
667                                         MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
668   add_memmove(memmove                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
669 elseif(LIBC_TARGET_OS_IS_GPU)
670   add_memmove(memmove)
671 else()
672   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
673   add_memmove(memmove)
674 endif()
676 # ------------------------------------------------------------------------------
677 # memset
678 # ------------------------------------------------------------------------------
680 function(add_memset memset_name)
681   add_implementation(memset ${memset_name}
682     SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
683     HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
684     DEPENDS
685       .memory_utils.inline_memset
686       libc.include.string
687     ${ARGN}
688   )
689 endfunction()
691 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
692   add_memset(memset_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
693   add_memset(memset_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
694   add_memset(memset_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
695   add_memset(memset_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
696   add_memset(memset_x86_64_opt_sw_prefetch COMPILE_OPTIONS -DLIBC_COPT_MEMSET_X86_USE_SOFTWARE_PREFETCHING)
697   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
698   add_memset(memset)
699 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
700   # Disable tail merging as it leads to lower performance.
701   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
702                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
703   add_memset(memset                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
704 elseif(LIBC_TARGET_OS_IS_GPU)
705   add_memset(memset)
706 else()
707   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
708   add_memset(memset)
709 endif()