diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake index 3f489d2336708b6d8e89976855aa580703edb89e..c59f2ce5b4af78d3607e2094feabf4e91498461d 100644 --- a/cmake/boardcore.cmake +++ b/cmake/boardcore.cmake @@ -138,12 +138,57 @@ set(BOARDCORE_SRC ${BOARDCORE_PATH}/src/shared/utils/TestUtils/TestHelper.cpp ) -set(DUPLICATE_SRC +set(PROTECT_SRC ${BOARDCORE_PATH}/src/tests/aspis/duplicate.cpp ${BOARDCORE_PATH}/src/tests/aspis/dummy.cpp ) -function(add_options_boardcore_library LIB TYPE) +# Given two libs, it creates a static library +function(apply_aspis_passes TO_PROTECT_LIB EXTERNAL_LIB OUTLIBRARY CXXFLAGS_RET) + # Getting the sources of the two libraries + get_property(TO_PROTECT_SRC TARGET ${TO_PROTECT_LIB} PROPERTY SOURCES) + get_property(EXTERNAL_SRC TARGET ${EXTERNAL_LIB} PROPERTY SOURCES) + + # Create list of compiled protected sources for each board + set(PROTECT_COMPILED_SOURCES TO_PROTECT_COMPILED) + list(TRANSFORM TO_PROTECT_SRC APPEND ".o" OUTPUT_VARIABLE PROTECT_COMPILED_SOURCES) + list(TRANSFORM PROTECT_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "") + list(TRANSFORM PROTECT_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TO_PROTECT_LIB}.dir/) + + # Create list of compiled boardcore sources for each board + set(EXTERNAL_COMPILED_SOURCES EXTERNAL_COMPILED) + list(TRANSFORM EXTERNAL_SRC APPEND ".o" OUTPUT_VARIABLE EXTERNAL_COMPILED_SOURCES) + list(TRANSFORM EXTERNAL_COMPILED_SOURCES REPLACE ${CMAKE_SOURCE_DIR} "") + list(TRANSFORM EXTERNAL_COMPILED_SOURCES PREPEND ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${EXTERNAL_LIB}.dir/) + + add_custom_target( + ${OUTLIBRARY}-target + BYPRODUCTS lib${OUTLIBRARY}.a + COMMAND llvm-link ${PROTECT_COMPILED_SOURCES} -o duplication.bc + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -func_ret_to_ref duplication.bc -o funcToRef.bc + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libSEDDI.so -eddi_verify funcToRef.bc -o dataProtection.bc + COMMAND opt --bugpoint-enable-legacy-pm -simplifycfg dataProtection.bc -o simplifycfg.bc + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libRASM.so -rasm_verify simplifycfg.bc -o protected.bc + COMMAND llvm-link ${EXTERNAL_COMPILED_SOURCES} protected.bc -o linked.bc + COMMAND opt --bugpoint-enable-legacy-pm -load ${ASPIS_PASSES_PATH}/libEDDI.so -duplicate_globals linked.bc -o out.bc + COMMAND echo "cxxflags_ret : ${CXXFLAGS_RET} ${${CXXFLAGS_RET}}" + COMMAND echo "CXXFLAGS_BASE: ${CXXFLAGS_BASE}" + # COMMAND clang++ -c --target=arm-none-eabi ${${CXXFLAGS_RET}} -o compiled.o out.bc + COMMAND clang++ -c --target=arm-none-eabi ${CXXFLAGS_RET} -o compiled.o out.bc + COMMAND llvm-ar ru lib${OUTLIBRARY}.a compiled.o + COMMAND_EXPAND_LISTS + COMMENT "Applying ASPIS passes and creating archive lib${OUTLIBRARY}.a" + ) + add_dependencies(${OUTLIBRARY}-target ${TO_PROTECT_LIB}) + add_dependencies(${OUTLIBRARY}-target ${EXTERNAL_LIB}) + + # Importing the just built library + add_library(${OUTLIBRARY} STATIC IMPORTED) + add_dependencies(${OUTLIBRARY} ${OUTLIBRARY}-target) + set_target_properties(${OUTLIBRARY} PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib${OUTLIBRARY}.a) +endfunction() + +function(add_options_boardcore_library LIB TYPE BOARD_NAME) # Only one include directory for Boardcore! target_include_directories(${LIB} ${TYPE} ${BOARDCORE_PATH}/src/shared) @@ -177,91 +222,25 @@ function(add_boardcore_library BOARD_OPTIONS_FILE) 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} PRIVATE -S -emit-llvm) - target_link_libraries(${DUPLICATION_LIB} PUBLIC Miosix::Interface::${BOARD_NAME}) + set(PROTECTED_LIB duplication-${BOARD_NAME}) + add_library(${PROTECTED_LIB} STATIC EXCLUDE_FROM_ALL ${PROTECT_SRC}) + target_compile_options(${PROTECTED_LIB} PRIVATE -S -emit-llvm) + add_options_boardcore_library(${PROTECTED_LIB} PUBLIC ${BOARD_NAME}) + target_link_libraries(${PROTECTED_LIB} PUBLIC Miosix::Interface::${BOARD_NAME}) # 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} PRIVATE -S -emit-llvm) + add_options_boardcore_library(${BOARDCORE_LIB} PUBLIC ${BOARD_NAME}) target_link_libraries(${BOARDCORE_LIB} PUBLIC Miosix::Interface::${BOARD_NAME}) - # 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 ${CMAKE_CURRENT_BINARY_DIR}/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 ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${BOARDCORE_LIB}.dir) - - add_custom_command( - OUTPUT duplicated-${BOARD_NAME}.ll.bak - COMMAND llvm-link ${DUPLICATE_COMPILED_SOURCES} -o duplication-${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 - DEPENDS $<TARGET_FILE:${DUPLICATION_LIB}> - COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak" - ) - - add_options_boardcore_library(${BOARDCORE_LIB} PUBLIC) - add_options_boardcore_library(${DUPLICATION_LIB} PUBLIC) - target_link_libraries(${BOARDCORE_LIB} PUBLIC ${DUPLICATION_LIB}) - - add_custom_command( - OUTPUT out-${BOARD_NAME}.bc - 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}.bc.bak - COMMAND rm *.ll - COMMAND mv out-${BOARD_NAME}.bc.bak out-${BOARD_NAME}.bc - DEPENDS duplicated-${BOARD_NAME}.ll.bak $<TARGET_FILE:${BOARDCORE_LIB}> - COMMENT "Applying ASPIS passes: out-${BOARD_NAME}.bc" - ) - - set_property( - SOURCE ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc - PROPERTY EXTERNAL_OBJECT TRUE - ) - - add_custom_target( - libboardcore-target-${BOARD_NAME} - DEPENDS out-${BOARD_NAME}.bc - ) - - add_dependencies(libboardcore-target-${BOARD_NAME} ${BOARDCORE_LIB}) - - # Compose all the building flags necessary to build the static library - set(COMPILATION_FLAGS - --target=arm-none-eabi - ${CXXFLAGS_BASE} # C++ Flags - ) - - # Command to crosscompiling the generated bitcode and creating the static library - add_custom_target( - libboardcore-lib-target-${BOARD_NAME} - COMMAND clang++ -c ${COMPILATION_FLAGS} -o compiled-${BOARD_NAME}.o out-${BOARD_NAME}.bc - COMMAND llvm-ar ru libboardcore-lib-${BOARD_NAME}.a compiled-${BOARD_NAME}.o - DEPENDS libboardcore-target-${BOARD_NAME} - COMMAND_EXPAND_LISTS - COMMENT "Creating archive: libboardcore-lib-${BOARD_NAME}.a" - ) - add_dependencies(libboardcore-lib-target-${BOARD_NAME} libboardcore-target-${BOARD_NAME}) - - # Importing the just built library set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME}) - add_library(${BOARDCORE_FINAL} STATIC IMPORTED) - add_dependencies(${BOARDCORE_FINAL} libboardcore-lib-target-${BOARD_NAME}) - set_target_properties(${BOARDCORE_FINAL} PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libboardcore-lib-${BOARD_NAME}.a) - target_link_libraries(${BOARDCORE_FINAL} INTERFACE Miosix::Interface::${BOARD_NAME}) - add_options_boardcore_library(${BOARDCORE_FINAL} INTERFACE) + get_property(CXXFLAGS_RET TARGET Miosix::Interface::${BOARD_NAME} PROPERTY TARGET_CXX_FLAGS) + + apply_aspis_passes(${PROTECTED_LIB} ${BOARDCORE_LIB} ${BOARDCORE_FINAL} "${CXXFLAGS_RET}") + add_options_boardcore_library(${BOARDCORE_FINAL} INTERFACE ${BOARD_NAME}) # Create a nice alias for the library add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_FINAL}) @@ -276,3 +255,4 @@ endforeach() foreach(BOARD_OPTIONS_FILE ${MIOSIX_BOARDS_OPTIONS_FILES} ${BOARDCORE_BOARDS_OPTIONS_FILES}) add_boardcore_library(${BOARD_OPTIONS_FILE}) endforeach() + diff --git a/cmake/sbs.cmake b/cmake/sbs.cmake index 25d03aa9b102ff174aed3c42c7b8220f95adbced..7e72aa86614508ddf61c8b7e50e4e4f186a258a0 100644 --- a/cmake/sbs.cmake +++ b/cmake/sbs.cmake @@ -41,6 +41,38 @@ add_custom_target( VERBATIM ) +function(obsw_target TARGET OPT_BOARD TO_DUPLICATE_SRCS EXTERNAL_SRCS INCLUDE_DIRS) + # Retrieve compilation flags + get_property(CXXFLAGS_RET TARGET Miosix::Interface::${OPT_BOARD} PROPERTY TARGET_CXX_FLAGS) + + # Create a library for the duplications + set(PROTECTED_LIB obsw-duplication-${TARGET}) + add_library(${PROTECTED_LIB} STATIC EXCLUDE_FROM_ALL ${${TO_DUPLICATE_SRCS}}) + target_compile_options(${PROTECTED_LIB} PRIVATE -S -emit-llvm) + target_link_libraries(${PROTECTED_LIB} PUBLIC Skyward::Boardcore::${OPT_BOARD}) + target_include_directories(${PROTECTED_LIB} PRIVATE ${${INCLUDE_DIRS}}) + + # Create a library for the board + set(EXTERNAL_LIB obsw-external-${TARGET}) + add_library(${EXTERNAL_LIB} STATIC EXCLUDE_FROM_ALL ${${EXTERNAL_SRCS}}) + target_compile_options(${EXTERNAL_LIB} PRIVATE -S -emit-llvm) + target_link_libraries(${EXTERNAL_LIB} PUBLIC Skyward::Boardcore::${OPT_BOARD}) + target_include_directories(${EXTERNAL_LIB} PRIVATE ${${INCLUDE_DIRS}}) + + # Create the OBSW library + set(OBSW_LIB obsw-lib-${TARGET}) + apply_aspis_passes(${PROTECTED_LIB} ${EXTERNAL_LIB} ${OBSW_LIB} "${CXXFLAGS_RET}") + target_include_directories(${PROTECTED_LIB} PRIVATE ${${INCLUDE_DIRS}}) + target_link_libraries(${OBSW_LIB} INTERFACE Skyward::Boardcore::${OPT_BOARD}) + + # Create a nice alias for the library + add_library(Skyward::OBSW::${OPT_BOARD} ALIAS ${OBSW_LIB}) + + target_link_libraries(${TARGET} PRIVATE Skyward::OBSW::${OPT_BOARD}) + + sbs_target(${TARGET} ${OPT_BOARD}) +endfunction() + # Function to link the Boardcore library to the target function(sbs_target TARGET OPT_BOARD) if(NOT OPT_BOARD) diff --git a/libs/miosix-kernel b/libs/miosix-kernel index c38939b1a5538973b27cd8903aef1525fa8c1bc5..36f524fe87f75655c454ad2f228798dbe57f68c6 160000 --- a/libs/miosix-kernel +++ b/libs/miosix-kernel @@ -1 +1 @@ -Subproject commit c38939b1a5538973b27cd8903aef1525fa8c1bc5 +Subproject commit 36f524fe87f75655c454ad2f228798dbe57f68c6