Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / libc / src / string / CMakeLists.txt
blob67675b682081c676473dc22087180c4530ef0b8f
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(string_config_options)
7   list(PREPEND string_config_options "COMPILE_OPTIONS")
8 endif()
10 add_header_library(
11   string_utils
12   HDRS
13     string_utils.h
14   DEPENDS
15     .memory_utils.inline_bzero
16     .memory_utils.inline_memcpy
17     libc.include.stdlib
18     libc.src.__support.common
19     libc.src.__support.CPP.bitset
20   ${string_config_options}
23 add_header_library(
24   allocating_string_utils
25   HDRS
26     allocating_string_utils.h
27   DEPENDS
28     .memory_utils.inline_memcpy
29     libc.include.stdlib
30     libc.src.__support.CPP.optional
31     libc.src.__support.macros.config
34 add_entrypoint_object(
35   bcopy
36   SRCS
37     bcopy.cpp
38   HDRS
39     bcopy.h
42 add_entrypoint_object(
43   index
44   SRCS
45     index.cpp
46   HDRS
47     index.h
48   DEPENDS
49     .string_utils
52 add_entrypoint_object(
53   memccpy
54   SRCS
55     memccpy.cpp
56   HDRS
57     memccpy.h
60 add_entrypoint_object(
61   mempcpy
62   SRCS
63     mempcpy.cpp
64   HDRS
65     mempcpy.h
66   DEPENDS
67     .memory_utils.inline_memcpy
70 add_entrypoint_object(
71   memmem
72   SRCS
73     memmem.cpp
74   HDRS
75     memmem.h
76   DEPENDS
77     .memory_utils.inline_memmem
80 add_entrypoint_object(
81   memchr
82   SRCS
83     memchr.cpp
84   HDRS
85     memchr.h
86   DEPENDS
87     .string_utils
90 add_entrypoint_object(
91   memrchr
92   SRCS
93     memrchr.cpp
94   HDRS
95     memrchr.h
98 add_entrypoint_object(
99   rindex
100   SRCS
101     rindex.cpp
102   HDRS
103     rindex.h
104   DEPENDS
105     .string_utils
108 add_entrypoint_object(
109   stpcpy
110   SRCS
111     stpcpy.cpp
112   HDRS
113     stpcpy.h
114   DEPENDS
115     .mempcpy
116     .string_utils
119 add_entrypoint_object(
120   stpncpy
121   SRCS
122     stpncpy.cpp
123   HDRS
124     stpncpy.h
125   DEPENDS
126     .memory_utils.inline_bzero
129 add_entrypoint_object(
130   strcat
131   SRCS
132     strcat.cpp
133   HDRS
134     strcat.h
135   DEPENDS
136     .strcpy
137     .string_utils
140 add_entrypoint_object(
141   strchr
142   SRCS
143     strchr.cpp
144   HDRS
145     strchr.h
146   DEPENDS
147     .string_utils
150 add_entrypoint_object(
151   strchrnul
152   SRCS
153     strchrnul.cpp
154   HDRS
155     strchrnul.h
156   DEPENDS
157     .string_utils
160 add_entrypoint_object(
161   strcmp
162   SRCS
163     strcmp.cpp
164   HDRS
165     strcmp.h
166   DEPENDS
167     .memory_utils.inline_strcmp
170 add_entrypoint_object(
171   strcasecmp
172   SRCS
173     strcasecmp.cpp
174   HDRS
175     strcasecmp.h
176   DEPENDS
177     .memory_utils.inline_strcmp
178     libc.src.__support.ctype_utils
181 add_entrypoint_object(
182   strcasestr
183   SRCS
184     strcasestr.cpp
185   HDRS
186     strcasestr.h
187   DEPENDS
188     .memory_utils.inline_strstr
189     libc.src.__support.ctype_utils
192 add_entrypoint_object(
193   strcoll
194   SRCS
195     strcoll.cpp
196   HDRS
197     strcoll.h
200 add_entrypoint_object(
201   strcpy
202   SRCS
203     strcpy.cpp
204   HDRS
205     strcpy.h
206   DEPENDS
207     .memory_utils.inline_memcpy
208     .string_utils
211 add_entrypoint_object(
212   strcspn
213   SRCS
214     strcspn.cpp
215   HDRS
216     strcspn.h
217   DEPENDS
218     .string_utils
221 add_entrypoint_object(
222   strdup
223   SRCS
224     strdup.cpp
225   HDRS
226     strdup.h
227   DEPENDS
228     .memory_utils.inline_memcpy
229     .string_utils
230     libc.include.stdlib
231     libc.src.errno.errno
234 add_entrypoint_object(
235   strerror
236   SRCS
237     strerror.cpp
238   HDRS
239     strerror.h
240   DEPENDS
241     libc.src.__support.StringUtil.error_to_string
244 add_entrypoint_object(
245   strerror_r
246   SRCS
247     strerror_r.cpp
248   HDRS
249     strerror_r.h
250   DEPENDS
251     libc.src.__support.StringUtil.error_to_string
254 add_entrypoint_object(
255   strlcat
256   SRCS
257     strlcat.cpp
258   HDRS
259     strlcat.h
260   DEPENDS
261     .string_utils
262     libc.include.string
265 add_entrypoint_object(
266   strlcpy
267   SRCS
268     strlcpy.cpp
269   HDRS
270     strlcpy.h
271   DEPENDS
272     .string_utils
273     libc.include.string
276 add_entrypoint_object(
277   strlen
278   SRCS
279     strlen.cpp
280   HDRS
281     strlen.h
282   DEPENDS
283     .string_utils
284     libc.include.string
287 add_entrypoint_object(
288   strncat
289   SRCS
290     strncat.cpp
291   HDRS
292     strncat.h
293   DEPENDS
294     .strncpy
295     .string_utils
298 add_entrypoint_object(
299   strncmp
300   SRCS
301     strncmp.cpp
302   HDRS
303     strncmp.h
304   DEPENDS
305     .memory_utils.inline_strcmp
308 add_entrypoint_object(
309   strncasecmp
310   SRCS
311     strncasecmp.cpp
312   HDRS
313     strncasecmp.h
314   DEPENDS
315     .memory_utils.inline_strcmp
316     libc.src.__support.ctype_utils
319 add_entrypoint_object(
320   strncpy
321   SRCS
322     strncpy.cpp
323   HDRS
324     strncpy.h
327 add_entrypoint_object(
328   strndup
329   SRCS
330     strndup.cpp
331   HDRS
332     strndup.h
333   DEPENDS
334     .memory_utils.inline_memcpy
335     .string_utils
336     libc.include.stdlib
337     libc.src.__support.CPP.new
340 add_entrypoint_object(
341   strnlen
342   SRCS
343     strnlen.cpp
344   HDRS
345     strnlen.h
346   DEPENDS
347     .string_utils
350 add_entrypoint_object(
351   strpbrk
352   SRCS
353     strpbrk.cpp
354   HDRS
355     strpbrk.h
356   DEPENDS
357     .string_utils
360 add_entrypoint_object(
361   strrchr
362   SRCS
363     strrchr.cpp
364   HDRS
365     strrchr.h
366   DEPENDS
367     .string_utils
370 add_entrypoint_object(
371   strsep
372   SRCS
373     strsep.cpp
374   HDRS
375     strsep.h
376   DEPENDS
377     .string_utils
380 add_entrypoint_object(
381   strsignal
382   SRCS
383     strsignal.cpp
384   HDRS
385     strsignal.h
386   DEPENDS
387     libc.src.__support.StringUtil.signal_to_string
390 add_entrypoint_object(
391   strspn
392   SRCS
393     strspn.cpp
394   HDRS
395     strspn.h
396   DEPENDS
397     libc.src.__support.CPP.bitset
400 add_entrypoint_object(
401   strstr
402   SRCS
403     strstr.cpp
404   HDRS
405     strstr.h
406   DEPENDS
407     .memory_utils.inline_strstr
410 add_entrypoint_object(
411   strtok
412   SRCS
413     strtok.cpp
414   HDRS
415     strtok.h
416   DEPENDS
417     .string_utils
420 add_entrypoint_object(
421   strtok_r
422   SRCS
423     strtok_r.cpp
424   HDRS
425     strtok_r.h
426   DEPENDS
427     .string_utils
430 add_entrypoint_object(
431   strxfrm
432   SRCS
433     strxfrm.cpp
434   HDRS
435     strxfrm.h
436   DEPENDS
437     .string_utils
438     .memory_utils.inline_memcpy
441 # Helper to define a function with multiple implementations
442 # - Computes flags to satisfy required/rejected features and arch,
443 # - Declares an entry point,
444 # - Attach the REQUIRE_CPU_FEATURES property to the target,
445 # - Add the fully qualified target to `${name}_implementations` global property for tests.
446 function(add_implementation name impl_name)
447   cmake_parse_arguments(
448     "ADD_IMPL"
449     "" # Optional arguments
450     "" # Single value arguments
451     "REQUIRE;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS;MLLVM_COMPILE_OPTIONS" # Multi value arguments
452     ${ARGN})
454   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
455     # Note that '-mllvm' needs to be prefixed with 'SHELL:' to prevent CMake flag deduplication.
456     foreach(opt IN LISTS ADD_IMPL_MLLVM_COMPILE_OPTIONS)
457       list(APPEND ADD_IMPL_COMPILE_OPTIONS "SHELL:-mllvm ${opt}")
458     endforeach()
459   endif()
461   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
462     # Prevent warning when passing x86 SIMD types as template arguments.
463     # e.g. "warning: ignoring attributes on template argument ā€˜__m128iā€™ [-Wignored-attributes]"
464     list(APPEND ADD_IMPL_COMPILE_OPTIONS "-Wno-ignored-attributes")
465   endif()
467   add_entrypoint_object(${impl_name}
468     NAME ${name}
469     SRCS ${ADD_IMPL_SRCS}
470     HDRS ${ADD_IMPL_HDRS}
471     DEPENDS ${ADD_IMPL_DEPENDS}
472     COMPILE_OPTIONS -O3 ${ADD_IMPL_COMPILE_OPTIONS}
473   )
474   get_fq_target_name(${impl_name} fq_target_name)
475   set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
476   set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
477 endfunction()
479 # ------------------------------------------------------------------------------
480 # bcmp
481 # ------------------------------------------------------------------------------
483 function(add_bcmp bcmp_name)
484   add_implementation(bcmp ${bcmp_name}
485     SRCS ${LIBC_SOURCE_DIR}/src/string/bcmp.cpp
486     HDRS ${LIBC_SOURCE_DIR}/src/string/bcmp.h
487     DEPENDS
488       .memory_utils.memory_utils
489       libc.include.string
490     ${ARGN}
491   )
492 endfunction()
494 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
495   add_bcmp(bcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
496   add_bcmp(bcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
497   add_bcmp(bcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
498   add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
499   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
500   add_bcmp(bcmp)
501 elseif(LIBC_TARGET_ARCHITECTURE_IS_GPU)
502   add_bcmp(bcmp)
503 else()
504   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
505   add_bcmp(bcmp)
506 endif()
508 # ------------------------------------------------------------------------------
509 # bzero
510 # ------------------------------------------------------------------------------
512 function(add_bzero bzero_name)
513   add_implementation(bzero ${bzero_name}
514     SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
515     HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
516     DEPENDS
517       .memory_utils.inline_memset
518       libc.include.string
519     ${ARGN}
520   )
521 endfunction()
523 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
524   add_bzero(bzero_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
525   add_bzero(bzero_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
526   add_bzero(bzero_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
527   add_bzero(bzero_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
528   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
529   add_bzero(bzero)
530 elseif(LIBC_TARGET_ARCHITECTURE_IS_GPU)
531   add_bzero(bzero)
532 else()
533   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
534   add_bzero(bzero)
535 endif()
537 # ------------------------------------------------------------------------------
538 # memcmp
539 # ------------------------------------------------------------------------------
541 function(add_memcmp memcmp_name)
542   add_implementation(memcmp ${memcmp_name}
543     SRCS ${LIBC_SOURCE_DIR}/src/string/memcmp.cpp
544     HDRS ${LIBC_SOURCE_DIR}/src/string/memcmp.h
545     DEPENDS
546       .memory_utils.inline_memcmp
547       libc.include.string
548     ${ARGN}
549   )
550 endfunction()
552 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
553   add_memcmp(memcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
554   add_memcmp(memcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
555   add_memcmp(memcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
556   add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
557   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
558   add_memcmp(memcmp)
559 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
560   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
561   add_memcmp(memcmp)
562 elseif(LIBC_TARGET_ARCHITECTURE_IS_GPU)
563   add_memcmp(memcmp)
564 else()
565   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
566   add_memcmp(memcmp)
567 endif()
569 # ------------------------------------------------------------------------------
570 # memcpy
571 # ------------------------------------------------------------------------------
573 function(add_memcpy memcpy_name)
574   add_implementation(memcpy ${memcpy_name}
575     SRCS ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp
576     HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
577     DEPENDS
578       .memory_utils.inline_memcpy
579       libc.include.string
580     ${ARGN}
581   )
582 endfunction()
584 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
585   add_memcpy(memcpy_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
586   add_memcpy(memcpy_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
587   add_memcpy(memcpy_x86_64_opt_avx    COMPILE_OPTIONS -march=sandybridge    REQUIRE AVX)
588   add_memcpy(memcpy_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
589   add_memcpy(memcpy_x86_64_opt_sw_prefetch_sse4   COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=nehalem        REQUIRE SSE4_2)
590   add_memcpy(memcpy_x86_64_opt_sw_prefetch_avx    COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=sandybridge    REQUIRE AVX)
591   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
592   add_memcpy(memcpy)
593 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
594   # Disable tail merging as it leads to lower performance.
595   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
596                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
597   add_memcpy(memcpy                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
598 elseif(LIBC_TARGET_ARCHITECTURE_IS_GPU)
599   add_memcpy(memcpy)
600 else()
601   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
602   add_memcpy(memcpy)
603 endif()
605 # ------------------------------------------------------------------------------
606 # memmove
607 # ------------------------------------------------------------------------------
609 function(add_memmove memmove_name)
610   add_implementation(memmove ${memmove_name}
611     SRCS ${LIBC_SOURCE_DIR}/src/string/memmove.cpp
612     HDRS ${LIBC_SOURCE_DIR}/src/string/memmove.h
613     DEPENDS
614       .memory_utils.inline_memcpy
615       libc.include.string
616     ${ARGN}
617   )
618 endfunction()
620 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
621   add_memmove(memmove_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
622   add_memmove(memmove_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
623   add_memmove(memmove_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
624   add_memmove(memmove_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
625   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
626   add_memmove(memmove)
627 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
628   # Disable tail merging as it leads to lower performance.
629   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
630                                         MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
631   add_memmove(memmove                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
632 elseif(LIBC_TARGET_ARCHITECTURE_IS_GPU)
633   add_memmove(memmove)
634 else()
635   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
636   add_memmove(memmove)
637 endif()
639 # ------------------------------------------------------------------------------
640 # memset
641 # ------------------------------------------------------------------------------
643 function(add_memset memset_name)
644   add_implementation(memset ${memset_name}
645     SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
646     HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
647     DEPENDS
648       .memory_utils.inline_memset
649       libc.include.string
650     ${ARGN}
651   )
652 endfunction()
654 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
655   add_memset(memset_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
656   add_memset(memset_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
657   add_memset(memset_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
658   add_memset(memset_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
659   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
660   add_memset(memset)
661 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
662   # Disable tail merging as it leads to lower performance.
663   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
664                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
665   add_memset(memset                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
666 elseif(LIBC_TARGET_ARCHITECTURE_IS_GPU)
667   add_memset(memset)
668 else()
669   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
670   add_memset(memset)
671 endif()