1add_subdirectory(memory_utils)
2
3add_entrypoint_object(
4  strcat
5  SRCS
6    strcat.cpp
7  HDRS
8    strcat.h
9  DEPENDS
10    .strcpy
11    .strlen
12    libc.include.string
13)
14
15add_entrypoint_object(
16  strcpy
17  SRCS
18    strcpy.cpp
19  HDRS
20    strcpy.h
21  DEPENDS
22    .memcpy
23    .strlen
24    libc.include.string
25)
26
27add_entrypoint_object(
28  strlen
29  SRCS
30    strlen.cpp
31  HDRS
32    strlen.h
33  DEPENDS
34    libc.include.string
35)
36
37add_entrypoint_object(
38  strcmp
39  SRCS
40    strcmp.cpp
41  HDRS
42    strcmp.h
43  DEPENDS
44    libc.include.string
45)
46
47add_entrypoint_object(
48  memchr
49  SRCS
50    memchr.cpp
51  HDRS
52    memchr.h
53)
54
55add_entrypoint_object(
56  strchr
57  SRCS
58    strchr.cpp
59  HDRS
60    strchr.h
61)
62
63# Helper to define a function with multiple implementations
64# - Computes flags to satisfy required/rejected features and arch,
65# - Declares an entry point,
66# - Attach the REQUIRE_CPU_FEATURES property to the target,
67# - Add the fully qualified target to `${name}_implementations` global property for tests.
68function(add_implementation name impl_name)
69  cmake_parse_arguments(
70    "ADD_IMPL"
71    "" # Optional arguments
72    "MARCH" # Single value arguments
73    "REQUIRE;REJECT;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
74    ${ARGN})
75  compute_flags(flags
76    MARCH ${ADD_IMPL_MARCH}
77    REQUIRE ${ADD_IMPL_REQUIRE}
78    REJECT ${ADD_IMPL_REJECT}
79  )
80  add_entrypoint_object(${impl_name}
81    NAME ${name}
82    SRCS ${ADD_IMPL_SRCS}
83    HDRS ${ADD_IMPL_HDRS}
84    DEPENDS ${ADD_IMPL_DEPENDS}
85    COMPILE_OPTIONS ${ADD_IMPL_COMPILE_OPTIONS} ${flags} -O2
86  )
87  get_fq_target_name(${impl_name} fq_target_name)
88  set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
89  set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
90endfunction()
91
92# ------------------------------------------------------------------------------
93# memcpy
94# ------------------------------------------------------------------------------
95
96# include the relevant architecture specific implementations
97if(${LIBC_TARGET_MACHINE} STREQUAL "x86_64")
98  set(LIBC_STRING_TARGET_ARCH "x86")
99  set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/x86/memcpy.cpp)
100else()
101  set(LIBC_STRING_TARGET_ARCH ${LIBC_TARGET_MACHINE})
102  set(MEMCPY_SRC ${LIBC_SOURCE_DIR}/src/string/memcpy.cpp)
103endif()
104
105function(add_memcpy memcpy_name)
106  add_implementation(memcpy ${memcpy_name}
107    SRCS ${MEMCPY_SRC}
108    HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
109    DEPENDS
110      .memory_utils.memory_utils
111      libc.include.string
112    COMPILE_OPTIONS
113      -fno-builtin-memcpy
114    ${ARGN}
115  )
116endfunction()
117
118if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
119  add_memcpy(memcpy MARCH native)
120else()
121  add_memcpy(memcpy)
122endif()
123
124# ------------------------------------------------------------------------------
125# memset
126# ------------------------------------------------------------------------------
127
128function(add_memset memset_name)
129  add_implementation(memset ${memset_name}
130    SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
131    HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
132    DEPENDS
133      .memory_utils.memory_utils
134      libc.include.string
135    COMPILE_OPTIONS
136      -fno-builtin-memset
137    ${ARGN}
138  )
139endfunction()
140
141if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
142  add_memset(memset MARCH native)
143else()
144  add_memset(memset)
145endif()
146
147# ------------------------------------------------------------------------------
148# bzero
149# ------------------------------------------------------------------------------
150
151function(add_bzero bzero_name)
152  add_implementation(bzero ${bzero_name}
153    SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
154    HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
155    DEPENDS
156      .memory_utils.memory_utils
157      libc.include.string
158    COMPILE_OPTIONS
159      -fno-builtin-memset
160      -fno-builtin-bzero
161    ${ARGN}
162  )
163endfunction()
164
165if(${LIBC_STRING_TARGET_ARCH} STREQUAL "x86")
166  add_bzero(bzero MARCH native)
167else()
168  add_bzero(bzero)
169endif()
170
171# ------------------------------------------------------------------------------
172# Add all other relevant implementations for the native target.
173# ------------------------------------------------------------------------------
174
175if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_STRING_TARGET_ARCH})
176  include(${LIBC_STRING_TARGET_ARCH}/CMakeLists.txt)
177endif()
178