[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / libc / src / string / CMakeLists.txt
blobb073a62f957a7346110885ad7d1a8cc23a6a51df
1 add_subdirectory(memory_utils)
3 add_header_library(
4   string_utils
5   HDRS
6     string_utils.h
7   DEPENDS
8     .memory_utils.inline_bzero
9     .memory_utils.inline_memcpy
10     libc.include.stdlib
11     libc.src.__support.common
12     libc.src.__support.CPP.bitset
15 add_header_library(
16   allocating_string_utils
17   HDRS
18     allocating_string_utils.h
19   DEPENDS
20     .memory_utils.inline_memcpy
21     libc.include.stdlib
22     libc.src.__support.CPP.optional
23     libc.src.__support.macros.config
26 add_entrypoint_object(
27   bcopy
28   SRCS
29     bcopy.cpp
30   HDRS
31     bcopy.h
34 add_entrypoint_object(
35   index
36   SRCS
37     index.cpp
38   HDRS
39     index.h
40   DEPENDS
41     .string_utils
44 add_entrypoint_object(
45   memccpy
46   SRCS
47     memccpy.cpp
48   HDRS
49     memccpy.h
52 add_entrypoint_object(
53   mempcpy
54   SRCS
55     mempcpy.cpp
56   HDRS
57     mempcpy.h
58   DEPENDS
59     .memory_utils.inline_memcpy
62 add_entrypoint_object(
63   memmem
64   SRCS
65     memmem.cpp
66   HDRS
67     memmem.h
68   DEPENDS
69     .memory_utils.inline_memmem
72 add_entrypoint_object(
73   memchr
74   SRCS
75     memchr.cpp
76   HDRS
77     memchr.h
78   DEPENDS
79     .string_utils
82 add_entrypoint_object(
83   memrchr
84   SRCS
85     memrchr.cpp
86   HDRS
87     memrchr.h
90 add_entrypoint_object(
91   rindex
92   SRCS
93     rindex.cpp
94   HDRS
95     rindex.h
96   DEPENDS
97     .string_utils
100 add_entrypoint_object(
101   stpcpy
102   SRCS
103     stpcpy.cpp
104   HDRS
105     stpcpy.h
106   DEPENDS
107     .mempcpy
108     .string_utils
111 add_entrypoint_object(
112   stpncpy
113   SRCS
114     stpncpy.cpp
115   HDRS
116     stpncpy.h
117   DEPENDS
118     .memory_utils.inline_bzero
121 add_entrypoint_object(
122   strcat
123   SRCS
124     strcat.cpp
125   HDRS
126     strcat.h
127   DEPENDS
128     .strcpy
129     .string_utils
132 add_entrypoint_object(
133   strchr
134   SRCS
135     strchr.cpp
136   HDRS
137     strchr.h
138   DEPENDS
139     .string_utils
142 add_entrypoint_object(
143   strchrnul
144   SRCS
145     strchrnul.cpp
146   HDRS
147     strchrnul.h
148   DEPENDS
149     .string_utils
152 add_entrypoint_object(
153   strcmp
154   SRCS
155     strcmp.cpp
156   HDRS
157     strcmp.h
158   DEPENDS
159     .memory_utils.inline_strcmp
162 add_entrypoint_object(
163   strcasecmp
164   SRCS
165     strcasecmp.cpp
166   HDRS
167     strcasecmp.h
168   DEPENDS
169     .memory_utils.inline_strcmp
170     libc.src.__support.ctype_utils
173 add_entrypoint_object(
174   strcasestr
175   SRCS
176     strcasestr.cpp
177   HDRS
178     strcasestr.h
179   DEPENDS
180     .memory_utils.inline_strstr
181     libc.src.__support.ctype_utils
184 add_entrypoint_object(
185   strcoll
186   SRCS
187     strcoll.cpp
188   HDRS
189     strcoll.h
192 add_entrypoint_object(
193   strcpy
194   SRCS
195     strcpy.cpp
196   HDRS
197     strcpy.h
198   DEPENDS
199     .memory_utils.inline_memcpy
200     .string_utils
203 add_entrypoint_object(
204   strcspn
205   SRCS
206     strcspn.cpp
207   HDRS
208     strcspn.h
209   DEPENDS
210     .string_utils
213 add_entrypoint_object(
214   strdup
215   SRCS
216     strdup.cpp
217   HDRS
218     strdup.h
219   DEPENDS
220     .memory_utils.inline_memcpy
221     .string_utils
222     libc.include.stdlib
223     libc.src.errno.errno
226 add_entrypoint_object(
227   strerror
228   SRCS
229     strerror.cpp
230   HDRS
231     strerror.h
232   DEPENDS
233     libc.src.__support.StringUtil.error_to_string
236 add_entrypoint_object(
237   strerror_r
238   SRCS
239     strerror_r.cpp
240   HDRS
241     strerror_r.h
242   DEPENDS
243     libc.src.__support.StringUtil.error_to_string
246 add_entrypoint_object(
247   strlcat
248   SRCS
249     strlcat.cpp
250   HDRS
251     strlcat.h
252   DEPENDS
253     .string_utils
254     libc.include.string
257 add_entrypoint_object(
258   strlcpy
259   SRCS
260     strlcpy.cpp
261   HDRS
262     strlcpy.h
263   DEPENDS
264     .string_utils
265     libc.include.string
268 add_entrypoint_object(
269   strlen
270   SRCS
271     strlen.cpp
272   HDRS
273     strlen.h
274   DEPENDS
275     .string_utils
276     libc.include.string
279 add_entrypoint_object(
280   strncat
281   SRCS
282     strncat.cpp
283   HDRS
284     strncat.h
285   DEPENDS
286     .strncpy
287     .string_utils
290 add_entrypoint_object(
291   strncmp
292   SRCS
293     strncmp.cpp
294   HDRS
295     strncmp.h
296   DEPENDS
297     .memory_utils.inline_strcmp
300 add_entrypoint_object(
301   strncasecmp
302   SRCS
303     strncasecmp.cpp
304   HDRS
305     strncasecmp.h
306   DEPENDS
307     .memory_utils.inline_strcmp
308     libc.src.__support.ctype_utils
311 add_entrypoint_object(
312   strncpy
313   SRCS
314     strncpy.cpp
315   HDRS
316     strncpy.h
319 add_entrypoint_object(
320   strndup
321   SRCS
322     strndup.cpp
323   HDRS
324     strndup.h
325   DEPENDS
326     .memory_utils.inline_memcpy
327     .string_utils
328     libc.include.stdlib
329     libc.src.__support.CPP.new
332 add_entrypoint_object(
333   strnlen
334   SRCS
335     strnlen.cpp
336   HDRS
337     strnlen.h
338   DEPENDS
339     .string_utils
342 add_entrypoint_object(
343   strpbrk
344   SRCS
345     strpbrk.cpp
346   HDRS
347     strpbrk.h
348   DEPENDS
349     .string_utils
352 add_entrypoint_object(
353   strrchr
354   SRCS
355     strrchr.cpp
356   HDRS
357     strrchr.h
358   DEPENDS
359     .string_utils
362 add_entrypoint_object(
363   strsep
364   SRCS
365     strsep.cpp
366   HDRS
367     strsep.h
368   DEPENDS
369     .string_utils
372 add_entrypoint_object(
373   strsignal
374   SRCS
375     strsignal.cpp
376   HDRS
377     strsignal.h
378   DEPENDS
379     libc.src.__support.StringUtil.signal_to_string
382 add_entrypoint_object(
383   strspn
384   SRCS
385     strspn.cpp
386   HDRS
387     strspn.h
388   DEPENDS
389     libc.src.__support.CPP.bitset
392 add_entrypoint_object(
393   strstr
394   SRCS
395     strstr.cpp
396   HDRS
397     strstr.h
398   DEPENDS
399     .memory_utils.inline_strstr
402 add_entrypoint_object(
403   strtok
404   SRCS
405     strtok.cpp
406   HDRS
407     strtok.h
408   DEPENDS
409     .string_utils
412 add_entrypoint_object(
413   strtok_r
414   SRCS
415     strtok_r.cpp
416   HDRS
417     strtok_r.h
418   DEPENDS
419     .string_utils
422 add_entrypoint_object(
423   strxfrm
424   SRCS
425     strxfrm.cpp
426   HDRS
427     strxfrm.h
428   DEPENDS
429     .string_utils
430     .memory_utils.inline_memcpy
433 # Helper to define a function with multiple implementations
434 # - Computes flags to satisfy required/rejected features and arch,
435 # - Declares an entry point,
436 # - Attach the REQUIRE_CPU_FEATURES property to the target,
437 # - Add the fully qualified target to `${name}_implementations` global property for tests.
438 function(add_implementation name impl_name)
439   cmake_parse_arguments(
440     "ADD_IMPL"
441     "" # Optional arguments
442     "" # Single value arguments
443     "REQUIRE;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS;MLLVM_COMPILE_OPTIONS" # Multi value arguments
444     ${ARGN})
446   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
447     # Note that '-mllvm' needs to be prefixed with 'SHELL:' to prevent CMake flag deduplication.
448     foreach(opt IN LISTS ADD_IMPL_MLLVM_COMPILE_OPTIONS)
449       list(APPEND ADD_IMPL_COMPILE_OPTIONS "SHELL:-mllvm ${opt}")
450     endforeach()
451   endif()
453   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
454     # Prevent warning when passing x86 SIMD types as template arguments.
455     # e.g. "warning: ignoring attributes on template argument ā€˜__m128iā€™ [-Wignored-attributes]"
456     list(APPEND ADD_IMPL_COMPILE_OPTIONS "-Wno-ignored-attributes")
457   endif()
459   add_entrypoint_object(${impl_name}
460     NAME ${name}
461     SRCS ${ADD_IMPL_SRCS}
462     HDRS ${ADD_IMPL_HDRS}
463     DEPENDS ${ADD_IMPL_DEPENDS}
464     COMPILE_OPTIONS -O3 ${ADD_IMPL_COMPILE_OPTIONS}
465   )
466   get_fq_target_name(${impl_name} fq_target_name)
467   set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
468   set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
469 endfunction()
471 # ------------------------------------------------------------------------------
472 # bcmp
473 # ------------------------------------------------------------------------------
475 function(add_bcmp bcmp_name)
476   add_implementation(bcmp ${bcmp_name}
477     SRCS ${LIBC_SOURCE_DIR}/src/string/bcmp.cpp
478     HDRS ${LIBC_SOURCE_DIR}/src/string/bcmp.h
479     DEPENDS
480       .memory_utils.memory_utils
481       libc.include.string
482     ${ARGN}
483   )
484 endfunction()
486 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
487   add_bcmp(bcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
488   add_bcmp(bcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
489   add_bcmp(bcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
490   add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
491   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
492   add_bcmp(bcmp)
493 else()
494   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
495   add_bcmp(bcmp)
496 endif()
498 # ------------------------------------------------------------------------------
499 # bzero
500 # ------------------------------------------------------------------------------
502 function(add_bzero bzero_name)
503   add_implementation(bzero ${bzero_name}
504     SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
505     HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
506     DEPENDS
507       .memory_utils.inline_memset
508       libc.include.string
509     ${ARGN}
510   )
511 endfunction()
513 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
514   add_bzero(bzero_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
515   add_bzero(bzero_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
516   add_bzero(bzero_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
517   add_bzero(bzero_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
518   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
519   add_bzero(bzero)
520 else()
521   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
522   add_bzero(bzero)
523 endif()
525 # ------------------------------------------------------------------------------
526 # memcmp
527 # ------------------------------------------------------------------------------
529 function(add_memcmp memcmp_name)
530   add_implementation(memcmp ${memcmp_name}
531     SRCS ${LIBC_SOURCE_DIR}/src/string/memcmp.cpp
532     HDRS ${LIBC_SOURCE_DIR}/src/string/memcmp.h
533     DEPENDS
534       .memory_utils.inline_memcmp
535       libc.include.string
536     ${ARGN}
537   )
538 endfunction()
540 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
541   add_memcmp(memcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
542   add_memcmp(memcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
543   add_memcmp(memcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
544   add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
545   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
546   add_memcmp(memcmp)
547 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
548   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
549   add_memcmp(memcmp)
550 else()
551   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
552   add_memcmp(memcmp)
553 endif()
555 # ------------------------------------------------------------------------------
556 # memcpy
557 # ------------------------------------------------------------------------------
559 function(add_memcpy memcpy_name)
560   add_implementation(memcpy ${memcpy_name}
561     SRCS ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp
562     HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
563     DEPENDS
564       .memory_utils.inline_memcpy
565       libc.include.string
566     ${ARGN}
567   )
568 endfunction()
570 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
571   add_memcpy(memcpy_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
572   add_memcpy(memcpy_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
573   add_memcpy(memcpy_x86_64_opt_avx    COMPILE_OPTIONS -march=sandybridge    REQUIRE AVX)
574   add_memcpy(memcpy_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
575   add_memcpy(memcpy_x86_64_opt_sw_prefetch_sse4   COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=nehalem        REQUIRE SSE4_2)
576   add_memcpy(memcpy_x86_64_opt_sw_prefetch_avx    COMPILE_OPTIONS -DLIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING -march=sandybridge    REQUIRE AVX)
577   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
578   add_memcpy(memcpy)
579 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
580   # Disable tail merging as it leads to lower performance.
581   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
582                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
583   add_memcpy(memcpy                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
584 else()
585   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
586   add_memcpy(memcpy)
587 endif()
589 # ------------------------------------------------------------------------------
590 # memmove
591 # ------------------------------------------------------------------------------
593 function(add_memmove memmove_name)
594   add_implementation(memmove ${memmove_name}
595     SRCS ${LIBC_SOURCE_DIR}/src/string/memmove.cpp
596     HDRS ${LIBC_SOURCE_DIR}/src/string/memmove.h
597     DEPENDS
598       .memory_utils.inline_memcpy
599       libc.include.string
600     ${ARGN}
601   )
602 endfunction()
604 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
605   add_memmove(memmove_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
606   add_memmove(memmove_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
607   add_memmove(memmove_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
608   add_memmove(memmove_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
609   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
610   add_memmove(memmove)
611 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
612   # Disable tail merging as it leads to lower performance.
613   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
614                                         MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
615   add_memmove(memmove                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
616 else()
617   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
618   add_memmove(memmove)
619 endif()
621 # ------------------------------------------------------------------------------
622 # memset
623 # ------------------------------------------------------------------------------
625 function(add_memset memset_name)
626   add_implementation(memset ${memset_name}
627     SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
628     HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
629     DEPENDS
630       .memory_utils.inline_memset
631       libc.include.string
632     ${ARGN}
633   )
634 endfunction()
636 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
637   add_memset(memset_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
638   add_memset(memset_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
639   add_memset(memset_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
640   add_memset(memset_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
641   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
642   add_memset(memset)
643 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
644   # Disable tail merging as it leads to lower performance.
645   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
646                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
647   add_memset(memset                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
648 else()
649   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
650   add_memset(memset)
651 endif()