diff --git a/cmake/aspis.cmake b/cmake/aspis.cmake index 6e6287d55a0454d16d387e8183b40e6e122e0cdf..63f30a5fe7429d3511a0317e35c21b62dc734bb9 100644 --- a/cmake/aspis.cmake +++ b/cmake/aspis.cmake @@ -1,7 +1,7 @@ -include(${SBS_BASE}/libs/miosix-kernel/miosix/cmake/cmake-utils/cmake/LLVMIRUtil.cmake) +# include(${SBS_BASE}/libs/miosix-kernel/miosix/cmake/cmake-utils/cmake/LLVMIRUtil.cmake) -set(ASPIS_BASE_PATH ~/ASPIS) -set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes) +# set(ASPIS_BASE_PATH ~/ASPIS) +# set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes) # function(aspis_passes source_files external_files) @@ -14,18 +14,18 @@ set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes) # llvmir_attach_link_target(${external_files}_link ${external_files}_ir) # # endfunction() -function(aspis_passes TARGET) - set_target_properties(${TARGET} PROPERTIES LINKER_LANGUAGE CXX) - target_compile_options(${TARGET} PUBLIC "-O0") +# function(aspis_passes TARGET) +# set_target_properties(${TARGET} PROPERTIES LINKER_LANGUAGE CXX) +# target_compile_options(${TARGET} PUBLIC "-O0") - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "5.0.0" OR - CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "5.0.0") - target_compile_options(${TARGET} PUBLIC -Xclang -disable-O0-optnone) - endif() +# if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "5.0.0" OR +# CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "5.0.0") +# target_compile_options(${TARGET} PUBLIC -Xclang -disable-O0-optnone) +# endif() - llvmir_attach_bc_target(${TARGET}_ir ${TARGET}) - llvmir_attach_link_target(${TARGET}_link ${TARGET}_ir) - # llvmir_attach_opt_pass_target(${TARGET}_eddi ${TARGET}_link -${ASPIS_PASSES_PATH}/libEDDI) - llvmir_attach_executable(${TARGET}_exe ${TARGET}_link) +# llvmir_attach_bc_target(${TARGET}_ir ${TARGET}) +# llvmir_attach_link_target(${TARGET}_link ${TARGET}_ir) +# # llvmir_attach_opt_pass_target(${TARGET}_eddi ${TARGET}_link -${ASPIS_PASSES_PATH}/libEDDI) +# llvmir_attach_executable(${TARGET}_exe ${TARGET}_link) -endfunction() \ No newline at end of file +# endfunction() \ No newline at end of file diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake index b45ff0b53fae4a5620a104a5a32253d665b054ff..4f3bbd20ffbd90bb706f15c2e0ae8cc89c0dfee8 100644 --- a/cmake/boardcore.cmake +++ b/cmake/boardcore.cmake @@ -27,6 +27,9 @@ include(${BOARDCORE_PATH}/cmake/dependencies.cmake) include(${BOARDCORE_PATH}/cmake/boardcore-host.cmake) include(${BOARDCORE_PATH}/cmake/boards.cmake) +set(ASPIS_BASE_PATH ~/ASPIS) +set(ASPIS_PASSES_PATH ${ASPIS_BASE_PATH}/build/passes) + # Boardcore source files set(BOARDCORE_SRC # Actuators @@ -135,14 +138,85 @@ set(BOARDCORE_SRC ${BOARDCORE_PATH}/src/shared/utils/TestUtils/TestHelper.cpp ) +set(DUPLICATE_SRC + ${BOARDCORE_PATH}/src/tests/aspis/duplicate.cpp + ${BOARDCORE_PATH}/src/tests/aspis/dummy.cpp +) + +# # Set flag for miosix base path +# set(BASE_MIOSIX_TOOLCHAIN /home/ecorigliano/temp/arm-miosix-eabi) +# set(CMAKE_LINKER "${BASE_MIOSIX_TOOLCHAIN}/bin/arm-miosix-eabi-ld") # using patched miosix linker +# add_link_options("-fuse-ld=${CMAKE_LINKER}") + # Creates the Skyward::Boardcore::${BOARD_NAME} library function(add_boardcore_library BOARD_OPTIONS_FILE) # Get board options include(${BOARD_OPTIONS_FILE}) + # Create a library for the duplications + set(DUPLICATION_LIB duplication-${BOARD_NAME}) + add_library(${DUPLICATION_LIB} STATIC EXCLUDE_FROM_ALL ${DUPLICATE_SRC}) + target_compile_options(${DUPLICATION_LIB} PUBLIC ${CMAKE_CXX_FLAGS} -flto) + # Create a library for the board set(BOARDCORE_LIB boardcore-${BOARD_NAME}) add_library(${BOARDCORE_LIB} STATIC EXCLUDE_FROM_ALL ${BOARDCORE_SRC}) + target_compile_options(${BOARDCORE_LIB} PUBLIC ${CMAKE_CXX_FLAGS} -flto) + + # Create list of compiled duplicated sources for each board + set(DUPLICATE_COMPILED_SOURCES DUPLICATE_COMP-${BOARD_NAME}) + list(TRANSFORM DUPLICATE_SRC APPEND ".o" OUTPUT_VARIABLE DUPLICATE_COMPILED_SOURCES) + list(TRANSFORM DUPLICATE_COMPILED_SOURCES REPLACE ${BOARDCORE_PATH} "") + list(TRANSFORM DUPLICATE_COMPILED_SOURCES PREPEND ${BOARDCORE_PATH}/build/CMakeFiles/${DUPLICATION_LIB}.dir) + + # Create list of compiled boardcore sources for each board + set(BOARDCORE_COMPILED_SOURCES ${BOARDCORE_COMP-${BOARD_NAME}}) + list(TRANSFORM BOARDCORE_SRC APPEND ".o" OUTPUT_VARIABLE BOARDCORE_COMPILED_SOURCES) + list(TRANSFORM BOARDCORE_COMPILED_SOURCES REPLACE ${BOARDCORE_PATH} "") + list(TRANSFORM BOARDCORE_COMPILED_SOURCES PREPEND ${BOARDCORE_PATH}/build/CMakeFiles/${BOARDCORE_LIB}.dir) + + + add_custom_command( + OUTPUT duplicated-${BOARD_NAME}.ll.bak + COMMAND echo ${DUPLICATE_COMPILED_SOURCES} + COMMAND echo "STARTING DUPLICATED *.cpp.o" + COMMAND pwd + COMMAND llvm-link ${DUPLICATE_COMPILED_SOURCES} -o duplication-${BOARD_NAME}.ll + # COMMAND llvm-link -v CMakeFiles/duplication-stm32f767zi_compute_unit.dir/src/tests/aspis/ -o linked-${BOARD_NAME}.ll + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication-${BOARD_NAME}.ll -o funcToRef.ll + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -eddi_verify funcToRef.ll -o dataProtection.ll + COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.ll -o simplifycfg.ll + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.ll -o duplicated-${BOARD_NAME}.ll.bak + COMMAND echo "REMOVING ALL *.ll" + COMMAND rm *.ll + DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}> + COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak" + ) + + # add_custom_command( + # TARGET ${DUPLICATION_LIB} POST_BUILD + # COMMAND echo "STARTING DUPLICATED *.ll" + # COMMAND llvm-link ${DUPLICATION_LIB} -o linked-${BOARD_NAME}.ll + # COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication-${BOARD_NAME}.ll -o funcToRef.ll + # COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -eddi_verify funcToRef.ll -o dataProtection.ll + # COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.ll -o simplifycfg.ll + # COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.ll -o duplicated-${BOARD_NAME}.ll.bak + # COMMAND echo "REMOVING ALL *.ll" + # COMMAND rm *.ll + # BYPRODUCTS duplicated-${BOARD_NAME}.ll.bak + # DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}> + # COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak" + # VERBATIM + # ) + + # add_custom_command( + # TARGET ${TARGET} POST_BUILD + # COMMAND ${CMAKE_OBJCOPY} -O ihex ${TARGET} ${TARGET}.hex + # COMMAND ${CMAKE_OBJCOPY} -O binary ${TARGET} ${TARGET}.bin + # BYPRODUCTS ${TARGET}.hex ${TARGET}.bin + # VERBATIM + # ) + # Only one include directory for Boardcore! target_include_directories(${BOARDCORE_LIB} PUBLIC ${BOARDCORE_PATH}/src/shared) @@ -159,6 +233,7 @@ function(add_boardcore_library BOARD_OPTIONS_FILE) fmt::fmt-header-only Catch2::Catch2 Mavlink::Mavlink + ${DUPLICATION_LIB} ) # Link MxGui if supported by the target @@ -168,8 +243,34 @@ function(add_boardcore_library BOARD_OPTIONS_FILE) target_link_libraries(${BOARDCORE_LIB} PUBLIC MxGui::${BOARD_NAME}) endif() + add_custom_command( + OUTPUT out-${BOARD_NAME}.ll + # TARGET ${BOARDCORE_LIB} POST_BUILD + COMMAND echo ${BOARDCORE_COMPILED_SOURCES} + COMMAND echo "STARTING BOARDCORE *.cpp.o" + COMMAND pwd + COMMAND llvm-link ${BOARDCORE_COMPILED_SOURCES} duplicated-${BOARD_NAME}.ll.bak -o linked-${BOARD_NAME}.ll + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -duplicate_globals linked-${BOARD_NAME}.ll -o out-${BOARD_NAME}.ll.bak + COMMAND rm *.ll + COMMAND mv out-${BOARD_NAME}.ll.bak out-${BOARD_NAME}.ll + DEPENDS duplicated-${BOARD_NAME}.ll.bak $<TARGET_FILE:${BOARDCORE_LIB}> + COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.ll" + ) + # add_dependencies(out-${BOARD_NAME}.ll ${BOARDCORE_LIB}) + # add_dependencies(out-${BOARD_NAME}.ll duplicated-${BOARD_NAME}.ll.bak) + + set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME}) + add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL out-${BOARD_NAME}.ll) + target_link_libraries(${BOARDCORE_FINAL} PUBLIC ${BOARDCORE_LIB}) + + # add_custom_target(boardcore-target-${BOARD_NAME} ALL DEPENDS out-${BOARD_NAME}.ll) + # add_dependencies(boardcore-target-${BOARD_NAME} ${BOARDCORE_LIB}) + + # add_custom_target(duplicated-target-${BOARD_NAME} DEPENDS duplicated-${BOARD_NAME}.ll.bak) + # add_dependencies(duplicated-target-${BOARD_NAME} ${BOARDCORE_LIB}) + # Create a nice alias for the library - add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_LIB}) + add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_FINAL}) endfunction() # Create the Miosix libraries for Boardcore custom boards diff --git a/cmake/sbs.cmake b/cmake/sbs.cmake index 4ba733c68768da49745e8cc6a5c32baae3745edb..25d03aa9b102ff174aed3c42c7b8220f95adbced 100644 --- a/cmake/sbs.cmake +++ b/cmake/sbs.cmake @@ -32,9 +32,6 @@ cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH SBS_BASE) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) include(boardcore) -# Include cmake functions to use ASPIS in a simple way -include(aspis) - # Command to print all the available boards used by the sbs script string(REPLACE ";" "\\n" BOARDS_STR "${MIOSIX_BOARDS};${BOARDCORE_BOARDS}") add_custom_target( @@ -59,9 +56,6 @@ function(sbs_target TARGET OPT_BOARD) # Linker script and linking options are eredited from the kernel library - # Apply ASPIS passes - aspis_passes(${TARGET}) - # Add a post build command to create the hex file to flash on the board add_custom_command( TARGET ${TARGET} POST_BUILD diff --git a/src/tests/aspis/dummy.cpp b/src/tests/aspis/dummy.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391