xref: /llvm-project/libc/src/string/CMakeLists.txt (revision 631a6e0004e57ca85569b99ea411418627925697)
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