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