1add_subdirectory(memory_utils)
2
3add_header_library(
4  string_utils
5  HDRS
6    string_utils.h
7  DEPENDS
8    libc.utils.CPP.standalone_cpp
9)
10
11add_entrypoint_object(
12  strcat
13  SRCS
14    strcat.cpp
15  HDRS
16    strcat.h
17  DEPENDS
18    .strcpy
19    .string_utils
20)
21
22add_entrypoint_object(
23  strcpy
24  SRCS
25    strcpy.cpp
26  HDRS
27    strcpy.h
28  DEPENDS
29    .memcpy
30    .string_utils
31)
32
33add_entrypoint_object(
34  strlen
35  SRCS
36    strlen.cpp
37  HDRS
38    strlen.h
39  DEPENDS
40    libc.include.string
41)
42
43add_entrypoint_object(
44  strcmp
45  SRCS
46    strcmp.cpp
47  HDRS
48    strcmp.h
49)
50
51add_entrypoint_object(
52  memchr
53  SRCS
54    memchr.cpp
55  HDRS
56    memchr.h
57  DEPENDS
58    .string_utils
59)
60
61add_entrypoint_object(
62  memcmp
63  SRCS
64    memcmp.cpp
65  HDRS
66    memcmp.h
67)
68
69add_entrypoint_object(
70  memmove
71  SRCS
72    memmove.cpp
73  HDRS
74    memmove.h
75  DEPENDS
76    libc.src.__support.integer_operations
77    libc.src.string.memcpy
78)
79
80add_entrypoint_object(
81  strchr
82  SRCS
83    strchr.cpp
84  HDRS
85    strchr.h
86)
87
88add_entrypoint_object(
89  strstr
90  SRCS
91    strstr.cpp
92  HDRS
93    strstr.h
94)
95
96add_entrypoint_object(
97  strncpy
98  SRCS
99    strncpy.cpp
100  HDRS
101    strncpy.h
102)
103
104add_entrypoint_object(
105  strnlen
106  SRCS
107    strnlen.cpp
108  HDRS
109    strnlen.h
110  DEPENDS
111    .string_utils
112)
113
114add_entrypoint_object(
115  memrchr
116  SRCS
117    memrchr.cpp
118  HDRS
119    memrchr.h
120)
121
122add_entrypoint_object(
123  strrchr
124  SRCS
125    strrchr.cpp
126  HDRS
127    strrchr.h
128)
129
130add_entrypoint_object(
131  strcspn
132  SRCS
133    strcspn.cpp
134  HDRS
135    strcspn.h
136  DEPENDS
137    .string_utils
138)
139
140add_entrypoint_object(
141  strspn
142  SRCS
143    strspn.cpp
144  HDRS
145    strspn.h
146  DEPENDS
147    libc.utils.CPP.standalone_cpp
148)
149
150add_entrypoint_object(
151  strpbrk
152  SRCS
153    strpbrk.cpp
154  HDRS
155    strpbrk.h
156  DEPENDS
157    .string_utils
158)
159
160add_entrypoint_object(
161  strtok
162  SRCS
163    strtok.cpp
164  HDRS
165    strtok.h
166  DEPENDS
167    .string_utils
168)
169
170add_entrypoint_object(
171  strtok_r
172  SRCS
173    strtok_r.cpp
174  HDRS
175    strtok_r.h
176  DEPENDS
177    .string_utils
178)
179
180# Helper to define a function with multiple implementations
181# - Computes flags to satisfy required/rejected features and arch,
182# - Declares an entry point,
183# - Attach the REQUIRE_CPU_FEATURES property to the target,
184# - Add the fully qualified target to `${name}_implementations` global property for tests.
185function(add_implementation name impl_name)
186  cmake_parse_arguments(
187    "ADD_IMPL"
188    "" # Optional arguments
189    "MARCH" # Single value arguments
190    "REQUIRE;REJECT;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
191    ${ARGN})
192  compute_flags(flags
193    MARCH ${ADD_IMPL_MARCH}
194    REQUIRE ${ADD_IMPL_REQUIRE}
195    REJECT ${ADD_IMPL_REJECT}
196  )
197  add_entrypoint_object(${impl_name}
198    NAME ${name}
199    SRCS ${ADD_IMPL_SRCS}
200    HDRS ${ADD_IMPL_HDRS}
201    DEPENDS ${ADD_IMPL_DEPENDS}
202    COMPILE_OPTIONS ${ADD_IMPL_COMPILE_OPTIONS} ${flags} -O2
203  )
204  get_fq_target_name(${impl_name} fq_target_name)
205  set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
206  set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
207endfunction()
208
209# ------------------------------------------------------------------------------
210# memcpy
211# ------------------------------------------------------------------------------
212
213# include the relevant architecture specific implementations
214if(${LIBC_TARGET_MACHINE} STREQUAL "x86_64")
215  set(LIBC_STRING_TARGET_ARCH "x86")
216  set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/x86/memcpy.cpp)
217elseif(${LIBC_TARGET_MACHINE} STREQUAL "aarch64")
218  set(LIBC_STRING_TARGET_ARCH "aarch64")
219  set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/aarch64/memcpy.cpp)
220#Disable tail merging as it leads to lower performance
221  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm --tail-merge-threshold=0")
222else()
223  set(LIBC_STRING_TARGET_ARCH ${LIBC_TARGET_MACHINE})
224  set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp)
225endif()
226
227function(add_memcpy memcpy_name)
228  add_implementation(memcpy ${memcpy_name}
229    SRCS ${MEMCPY_SRC}
230    HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
231    DEPENDS
232      .memory_utils.memory_utils
233      libc.include.string
234    COMPILE_OPTIONS
235      -fno-builtin-memcpy
236    ${ARGN}
237  )
238endfunction()
239
240if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
241  add_memcpy(memcpy MARCH native)
242else()
243  add_memcpy(memcpy)
244endif()
245
246# ------------------------------------------------------------------------------
247# memset
248# ------------------------------------------------------------------------------
249
250function(add_memset memset_name)
251  add_implementation(memset ${memset_name}
252    SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
253    HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
254    DEPENDS
255      .memory_utils.memory_utils
256      libc.include.string
257    COMPILE_OPTIONS
258      -fno-builtin-memset
259    ${ARGN}
260  )
261endfunction()
262
263if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
264  add_memset(memset MARCH native)
265else()
266  add_memset(memset)
267endif()
268
269# ------------------------------------------------------------------------------
270# bzero
271# ------------------------------------------------------------------------------
272
273function(add_bzero bzero_name)
274  add_implementation(bzero ${bzero_name}
275    SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
276    HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
277    DEPENDS
278      .memory_utils.memory_utils
279      libc.include.string
280    COMPILE_OPTIONS
281      -fno-builtin-memset
282      -fno-builtin-bzero
283    ${ARGN}
284  )
285endfunction()
286
287if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
288  add_bzero(bzero MARCH native)
289else()
290  add_bzero(bzero)
291endif()
292
293# ------------------------------------------------------------------------------
294# Add all other relevant implementations for the native target.
295# ------------------------------------------------------------------------------
296
297if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_STRING_TARGET_ARCH})
298  include(${LIBC_STRING_TARGET_ARCH}/CMakeLists.txt)
299endif()
300