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