[NFC][Py Reformat] Added more commits to .git-blame-ignore-revs
[llvm-project.git] / libc / src / string / CMakeLists.txt
blob554f33b21bd0ae85819c70f68584ab24b46bd91f
1 add_subdirectory(memory_utils)
3 add_header_library(
4   string_utils
5   HDRS
6     string_utils.h
7   DEPENDS
8     libc.include.stdlib
9     libc.src.__support.CPP.bitset
10     libc.src.__support.common
11     .memory_utils.memcpy_implementation
12     .memory_utils.bzero_implementation
15 add_header_library(
16   allocating_string_utils
17   HDRS
18     allocating_string_utils.h
19   DEPENDS
20     .memory_utils.memcpy_implementation
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.memcpy_implementation
62 add_entrypoint_object(
63   memmem
64   SRCS
65     memmem.cpp
66   HDRS
67     memmem.h
68   DEPENDS
69     .memory_utils.memmem_implementation
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.bzero_implementation
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.strcmp_implementation
162 add_entrypoint_object(
163   strcasecmp
164   SRCS
165     strcasecmp.cpp
166   HDRS
167     strcasecmp.h
168   DEPENDS
169     .memory_utils.strcmp_implementation
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.strstr_implementation
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.memcpy_implementation
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.memcpy_implementation
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.strcmp_implementation
300 add_entrypoint_object(
301   strncasecmp
302   SRCS
303     strncasecmp.cpp
304   HDRS
305     strncasecmp.h
306   DEPENDS
307     .memory_utils.strcmp_implementation
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.memcpy_implementation
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.strstr_implementation
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.memcpy_implementation
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   add_entrypoint_object(${impl_name}
454     NAME ${name}
455     SRCS ${ADD_IMPL_SRCS}
456     HDRS ${ADD_IMPL_HDRS}
457     DEPENDS ${ADD_IMPL_DEPENDS}
458     COMPILE_OPTIONS -O3 ${ADD_IMPL_COMPILE_OPTIONS}
459   )
460   get_fq_target_name(${impl_name} fq_target_name)
461   set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
462   set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
463 endfunction()
465 # ------------------------------------------------------------------------------
466 # bcmp
467 # ------------------------------------------------------------------------------
469 function(add_bcmp bcmp_name)
470   add_implementation(bcmp ${bcmp_name}
471     SRCS ${LIBC_SOURCE_DIR}/src/string/bcmp.cpp
472     HDRS ${LIBC_SOURCE_DIR}/src/string/bcmp.h
473     DEPENDS
474       .memory_utils.memory_utils
475       libc.include.string
476     ${ARGN}
477   )
478 endfunction()
480 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
481   add_bcmp(bcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
482   add_bcmp(bcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
483   add_bcmp(bcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
484   add_bcmp(bcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
485   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
486   add_bcmp(bcmp)
487 else()
488   add_bcmp(bcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
489   add_bcmp(bcmp)
490 endif()
492 # ------------------------------------------------------------------------------
493 # bzero
494 # ------------------------------------------------------------------------------
496 function(add_bzero bzero_name)
497   add_implementation(bzero ${bzero_name}
498     SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
499     HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
500     DEPENDS
501       .memory_utils.memset_implementation
502       libc.include.string
503     ${ARGN}
504   )
505 endfunction()
507 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
508   add_bzero(bzero_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
509   add_bzero(bzero_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
510   add_bzero(bzero_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
511   add_bzero(bzero_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
512   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
513   add_bzero(bzero)
514 else()
515   add_bzero(bzero_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
516   add_bzero(bzero)
517 endif()
519 # ------------------------------------------------------------------------------
520 # memcmp
521 # ------------------------------------------------------------------------------
523 function(add_memcmp memcmp_name)
524   add_implementation(memcmp ${memcmp_name}
525     SRCS ${LIBC_SOURCE_DIR}/src/string/memcmp.cpp
526     HDRS ${LIBC_SOURCE_DIR}/src/string/memcmp.h
527     DEPENDS
528       .memory_utils.memcmp_implementation
529       libc.include.string
530     ${ARGN}
531   )
532 endfunction()
534 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
535   add_memcmp(memcmp_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
536   add_memcmp(memcmp_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
537   add_memcmp(memcmp_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
538   add_memcmp(memcmp_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512BW)
539   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
540   add_memcmp(memcmp)
541 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
542   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
543   add_memcmp(memcmp)
544 else()
545   add_memcmp(memcmp_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
546   add_memcmp(memcmp)
547 endif()
549 # ------------------------------------------------------------------------------
550 # memcpy
551 # ------------------------------------------------------------------------------
553 function(add_memcpy memcpy_name)
554   add_implementation(memcpy ${memcpy_name}
555     SRCS ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp
556     HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
557     DEPENDS
558       .memory_utils.memcpy_implementation
559       libc.include.string
560     ${ARGN}
561   )
562 endfunction()
564 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
565   add_memcpy(memcpy_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
566   add_memcpy(memcpy_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
567   add_memcpy(memcpy_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
568   add_memcpy(memcpy_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
569   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
570   add_memcpy(memcpy)
571 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
572   # Disable tail merging as it leads to lower performance.
573   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
574                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
575   add_memcpy(memcpy                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
576 else()
577   add_memcpy(memcpy_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
578   add_memcpy(memcpy)
579 endif()
581 # ------------------------------------------------------------------------------
582 # memmove
583 # ------------------------------------------------------------------------------
585 function(add_memmove memmove_name)
586   add_implementation(memmove ${memmove_name}
587     SRCS ${LIBC_SOURCE_DIR}/src/string/memmove.cpp
588     HDRS ${LIBC_SOURCE_DIR}/src/string/memmove.h
589     DEPENDS
590       .memory_utils.memcpy_implementation
591       libc.include.string
592     ${ARGN}
593   )
594 endfunction()
596 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
597   add_memmove(memmove_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
598   add_memmove(memmove_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
599   add_memmove(memmove_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
600   add_memmove(memmove_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
601   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
602   add_memmove(memmove)
603 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
604   # Disable tail merging as it leads to lower performance.
605   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
606                                         MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
607   add_memmove(memmove                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
608 else()
609   add_memmove(memmove_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
610   add_memmove(memmove)
611 endif()
613 # ------------------------------------------------------------------------------
614 # memset
615 # ------------------------------------------------------------------------------
617 function(add_memset memset_name)
618   add_implementation(memset ${memset_name}
619     SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
620     HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
621     DEPENDS
622       .memory_utils.memset_implementation
623       libc.include.string
624     ${ARGN}
625   )
626 endfunction()
628 if(${LIBC_TARGET_ARCHITECTURE_IS_X86})
629   add_memset(memset_x86_64_opt_sse2   COMPILE_OPTIONS -march=k8             REQUIRE SSE2)
630   add_memset(memset_x86_64_opt_sse4   COMPILE_OPTIONS -march=nehalem        REQUIRE SSE4_2)
631   add_memset(memset_x86_64_opt_avx2   COMPILE_OPTIONS -march=haswell        REQUIRE AVX2)
632   add_memset(memset_x86_64_opt_avx512 COMPILE_OPTIONS -march=skylake-avx512 REQUIRE AVX512F)
633   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
634   add_memset(memset)
635 elseif(${LIBC_TARGET_ARCHITECTURE_IS_AARCH64})
636   # Disable tail merging as it leads to lower performance.
637   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE}
638                                       MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
639   add_memset(memset                   MLLVM_COMPILE_OPTIONS "-tail-merge-threshold=0")
640 else()
641   add_memset(memset_opt_host          COMPILE_OPTIONS ${LIBC_COMPILE_OPTIONS_NATIVE})
642   add_memset(memset)
643 endif()