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
37# Helper to define a function with multiple implementations
38# - Computes flags to satisfy required/rejected features and arch,
39# - Declares an entry point,
40# - Attach the REQUIRE_CPU_FEATURES property to the target,
41# - Add the fully qualified target to `${name}_implementations` global property for tests.
42function(add_implementation name impl_name)
43  cmake_parse_arguments(
44    "ADD_IMPL"
45    "" # Optional arguments
46    "MARCH" # Single value arguments
47    "REQUIRE;REJECT;SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi value arguments
48    ${ARGN})
49  compute_flags(flags
50    MARCH ${ADD_IMPL_MARCH}
51    REQUIRE ${ADD_IMPL_REQUIRE}
52    REJECT ${ADD_IMPL_REJECT}
53  )
54  add_entrypoint_object(${impl_name}
55    NAME ${name}
56    SRCS ${ADD_IMPL_SRCS}
57    HDRS ${ADD_IMPL_HDRS}
58    DEPENDS ${ADD_IMPL_DEPENDS}
59    COMPILE_OPTIONS ${ADD_IMPL_COMPILE_OPTIONS} ${flags}
60  )
61  get_fq_target_name(${impl_name} fq_target_name)
62  set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
63  set_property(GLOBAL APPEND PROPERTY "${name}_implementations" "${fq_target_name}")
64endfunction()
65
66# ------------------------------------------------------------------------------
67# memcpy
68# ------------------------------------------------------------------------------
69
70# include the relevant architecture specific implementations
71if(${LIBC_TARGET_MACHINE} STREQUAL "x86_64")
72  set(LIBC_STRING_TARGET_ARCH "x86")
73else()
74  set(LIBC_STRING_TARGET_ARCH ${LIBC_TARGET_MACHINE})
75endif()
76
77function(add_memcpy memcpy_name)
78  add_implementation(memcpy ${memcpy_name}
79    SRCS ${LIBC_SOURCE_DIR}/src/string/${LIBC_STRING_TARGET_ARCH}/memcpy.cpp
80    HDRS ${LIBC_SOURCE_DIR}/src/string/memcpy.h
81    DEPENDS
82      .memory_utils.memory_utils
83      libc.include.string
84    COMPILE_OPTIONS
85      -fno-builtin-memcpy
86    ${ARGN}
87  )
88endfunction()
89
90add_memcpy(memcpy MARCH native)
91
92# ------------------------------------------------------------------------------
93# memset
94# ------------------------------------------------------------------------------
95
96function(add_memset memset_name)
97  add_implementation(memset ${memset_name}
98    SRCS ${LIBC_SOURCE_DIR}/src/string/memset.cpp
99    HDRS ${LIBC_SOURCE_DIR}/src/string/memset.h
100    DEPENDS
101      .memory_utils.memory_utils
102      libc.include.string
103    COMPILE_OPTIONS
104      -fno-builtin-memset
105    ${ARGN}
106  )
107endfunction()
108
109add_memset(memset MARCH native)
110
111# ------------------------------------------------------------------------------
112# bzero
113# ------------------------------------------------------------------------------
114
115function(add_bzero bzero_name)
116  add_implementation(bzero ${bzero_name}
117    SRCS ${LIBC_SOURCE_DIR}/src/string/bzero.cpp
118    HDRS ${LIBC_SOURCE_DIR}/src/string/bzero.h
119    DEPENDS
120      .memory_utils.memory_utils
121      libc.include.string
122    COMPILE_OPTIONS
123      -fno-builtin-memset
124      -fno-builtin-bzero
125    ${ARGN}
126  )
127endfunction()
128
129add_bzero(bzero MARCH native)
130
131# ------------------------------------------------------------------------------
132# Add all other relevant implementations for the native target.
133# ------------------------------------------------------------------------------
134
135if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_STRING_TARGET_ARCH})
136  include(${LIBC_STRING_TARGET_ARCH}/CMakeLists.txt)
137endif()
138