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  strchr
63  SRCS
64    strchr.cpp
65  HDRS
66    strchr.h
67)
68
69add_entrypoint_object(
70  strstr
71  SRCS
72    strstr.cpp
73  HDRS
74    strstr.h
75)
76
77add_entrypoint_object(
78  strnlen
79  SRCS
80    strnlen.cpp
81  HDRS
82    strnlen.h
83  DEPENDS
84    .string_utils
85)
86
87add_entrypoint_object(
88  memrchr
89  SRCS
90    memrchr.cpp
91  HDRS
92    memrchr.h
93)
94
95add_entrypoint_object(
96  strrchr
97  SRCS
98    strrchr.cpp
99  HDRS
100    strrchr.h
101)
102
103add_entrypoint_object(
104  strcspn
105  SRCS
106    strcspn.cpp
107  HDRS
108    strcspn.h
109  DEPENDS
110    .string_utils
111)
112
113add_entrypoint_object(
114  strspn
115  SRCS
116    strspn.cpp
117  HDRS
118    strspn.h
119  DEPENDS
120    libc.utils.CPP.standalone_cpp
121)
122
123add_entrypoint_object(
124  strpbrk
125  SRCS
126    strpbrk.cpp
127  HDRS
128    strpbrk.h
129  DEPENDS
130    .string_utils
131)
132
133add_entrypoint_object(
134  strtok
135  SRCS
136    strtok.cpp
137  HDRS
138    strtok.h
139  DEPENDS
140    .string_utils
141)
142
143add_entrypoint_object(
144  strtok_r
145  SRCS
146    strtok_r.cpp
147  HDRS
148    strtok_r.h
149  DEPENDS
150    .string_utils
151)
152
153# Helper to define a function with multiple implementations
154# - Computes flags to satisfy required/rejected features and arch,
155# - Declares an entry point,
156# - Attach the REQUIRE_CPU_FEATURES property to the target,
157# - Add the fully qualified target to `${name}_implementations` global property for tests.
158function(add_implementation name impl_name)
159  cmake_parse_arguments(
160    "ADD_IMPL"
161    "" # Optional arguments
162    "MARCH" # Single value arguments
163    "REQUIRE;REJECT;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
164    ${ARGN})
165  compute_flags(flags
166    MARCH ${ADD_IMPL_MARCH}
167    REQUIRE ${ADD_IMPL_REQUIRE}
168    REJECT ${ADD_IMPL_REJECT}
169  )
170  add_entrypoint_object(${impl_name}
171    NAME ${name}
172    SRCS ${ADD_IMPL_SRCS}
173    HDRS ${ADD_IMPL_HDRS}
174    DEPENDS ${ADD_IMPL_DEPENDS}
175    COMPILE_OPTIONS ${ADD_IMPL_COMPILE_OPTIONS} ${flags} -O2
176  )
177  get_fq_target_name(${impl_name} fq_target_name)
178  set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
179  set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
180endfunction()
181
182# ------------------------------------------------------------------------------
183# memcpy
184# ------------------------------------------------------------------------------
185
186# include the relevant architecture specific implementations
187if(${LIBC_TARGET_MACHINE} STREQUAL "x86_64")
188  set(LIBC_STRING_TARGET_ARCH "x86")
189  set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/x86/memcpy.cpp)
190else()
191  set(LIBC_STRING_TARGET_ARCH ${LIBC_TARGET_MACHINE})
192  set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp)
193endif()
194
195function(add_memcpy memcpy_name)
196  add_implementation(memcpy ${memcpy_name}
197    SRCS ${MEMCPY_SRC}
198    HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
199    DEPENDS
200      .memory_utils.memory_utils
201      libc.include.string
202    COMPILE_OPTIONS
203      -fno-builtin-memcpy
204    ${ARGN}
205  )
206endfunction()
207
208if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
209  add_memcpy(memcpy MARCH native)
210else()
211  add_memcpy(memcpy)
212endif()
213
214# ------------------------------------------------------------------------------
215# memset
216# ------------------------------------------------------------------------------
217
218function(add_memset memset_name)
219  add_implementation(memset ${memset_name}
220    SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
221    HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
222    DEPENDS
223      .memory_utils.memory_utils
224      libc.include.string
225    COMPILE_OPTIONS
226      -fno-builtin-memset
227    ${ARGN}
228  )
229endfunction()
230
231if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
232  add_memset(memset MARCH native)
233else()
234  add_memset(memset)
235endif()
236
237# ------------------------------------------------------------------------------
238# bzero
239# ------------------------------------------------------------------------------
240
241function(add_bzero bzero_name)
242  add_implementation(bzero ${bzero_name}
243    SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
244    HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
245    DEPENDS
246      .memory_utils.memory_utils
247      libc.include.string
248    COMPILE_OPTIONS
249      -fno-builtin-memset
250      -fno-builtin-bzero
251    ${ARGN}
252  )
253endfunction()
254
255if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
256  add_bzero(bzero MARCH native)
257else()
258  add_bzero(bzero)
259endif()
260
261# ------------------------------------------------------------------------------
262# Add all other relevant implementations for the native target.
263# ------------------------------------------------------------------------------
264
265if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_STRING_TARGET_ARCH})
266  include(${LIBC_STRING_TARGET_ARCH}/CMakeLists.txt)
267endif()
268