1if (NOT TARGET pico_mem_ops)
2    #shims for ROM functions for -lgcc functions  (listed below)
3    pico_add_library(pico_mem_ops)
4
5    # no custom implementation; falls thru to compiler
6    pico_add_library(pico_mem_ops_compiler)
7
8    # add alias "default" which is just pico.
9    add_library(pico_mem_ops_default INTERFACE)
10    if (PICO_RP2040)
11        # RP2040 bootrom has optimized versions
12        target_link_libraries(pico_mem_ops_default INTERFACE pico_mem_ops_pico)
13    else()
14        # beware commpiler memcpy cannot be used for unaligned copies in peripheral space
15        target_link_libraries(pico_mem_ops_default INTERFACE pico_mem_ops_compiler)
16    endif()
17
18    set(PICO_DEFAULT_MEM_OPS_IMPL pico_mem_ops_default)
19
20    pico_add_library(pico_mem_ops_pico)
21    target_link_libraries(pico_mem_ops INTERFACE
22            $<IF:$<BOOL:$<TARGET_PROPERTY:PICO_TARGET_MEM_OPS_IMPL>>,$<TARGET_PROPERTY:PICO_TARGET_MEM_OPS_IMPL>,${PICO_DEFAULT_MEM_OPS_IMPL}>)
23
24    target_sources(pico_mem_ops_pico INTERFACE
25            ${CMAKE_CURRENT_LIST_DIR}/mem_ops_aeabi.S
26            )
27    target_include_directories(pico_mem_ops_pico_headers SYSTEM INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include)
28    pico_mirrored_target_link_libraries(pico_mem_ops_pico INTERFACE pico_base)
29
30    target_link_libraries(pico_mem_ops_pico INTERFACE pico_bootrom)
31
32    pico_wrap_function(pico_mem_ops_pico memcpy)
33    pico_wrap_function(pico_mem_ops_pico memset)
34    pico_wrap_function(pico_mem_ops_pico __aeabi_memcpy)
35    pico_wrap_function(pico_mem_ops_pico __aeabi_memset)
36    pico_wrap_function(pico_mem_ops_pico __aeabi_memcpy4)
37    pico_wrap_function(pico_mem_ops_pico __aeabi_memset4)
38    pico_wrap_function(pico_mem_ops_pico __aeabi_memcpy8)
39    pico_wrap_function(pico_mem_ops_pico __aeabi_memset8)
40
41    macro(pico_set_mem_ops_implementation TARGET IMPL)
42        get_target_property(target_type ${TARGET} TYPE)
43        if ("EXECUTABLE" STREQUAL "${target_type}")
44            set_target_properties(${TARGET} PROPERTIES PICO_TARGET_MEM_OPS_IMPL "pico_mem_ops_${IMPL}")
45        else()
46            message(FATAL_ERROR "mem_ops implementation must be set on executable not library")
47        endif()
48    endmacro()
49endif()
50