From 9ee399a48637a18105fab6a410acef2d999b38e2 Mon Sep 17 00:00:00 2001
From: Emilio Corigliano <emilio.corigliano@skywarder.eu>
Date: Fri, 19 Apr 2024 15:45:01 +0200
Subject: [PATCH] [ASPIS] Modified building pipeline, now boardcore library is
 successfully built

After the optimization passes, the bitcode generated is compiled for the appropriate target and with the c++ compilation flags with clang++.
The compiled object file is then archived in a static library with llvm-ar.
Finally, to create the library in cmake we create an imported library, link it with the miosix interface library and add all the options of boardcore libraries.
Finally is created the alias library Skyward::Boardcore::${BOARD_NAME}
---
 cmake/aspis.cmake     | 31 ----------------
 cmake/boardcore.cmake | 84 +++++++++++++++++++++----------------------
 libs/miosix-kernel    |  2 +-
 3 files changed, 43 insertions(+), 74 deletions(-)
 delete mode 100644 cmake/aspis.cmake

diff --git a/cmake/aspis.cmake b/cmake/aspis.cmake
deleted file mode 100644
index 63f30a5fe..000000000
--- a/cmake/aspis.cmake
+++ /dev/null
@@ -1,31 +0,0 @@
-# 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)
-
-
-# function(aspis_passes source_files external_files)
-#
-#   llvmir_attach_bc_target(${source_files}_ir ${source_files})
-#   llvmir_attach_link_target(${source_files}_link ${source_files}_ir)
-#   llvmir_attach_opt_pass_target(${source_files}_eddi ${source_files}_link -${ASPIS_PASSES_PATH}/libEDDI)
-#
-#   llvmir_attach_bc_target(${external_files}_ir ${external_files})
-#   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")
-
-#     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)
-
-# endfunction()
\ No newline at end of file
diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake
index e0ee49b61..3f489d233 100644
--- a/cmake/boardcore.cmake
+++ b/cmake/boardcore.cmake
@@ -26,7 +26,6 @@ cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH BOARDCORE_PATH)
 include(${BOARDCORE_PATH}/cmake/dependencies.cmake)
 include(${BOARDCORE_PATH}/cmake/boardcore-host.cmake)
 include(${BOARDCORE_PATH}/cmake/boards.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)
@@ -144,21 +143,17 @@ set(DUPLICATE_SRC
     ${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}")
-
-function(add_options_boardcore_library LIB)
+function(add_options_boardcore_library LIB TYPE)
     # Only one include directory for Boardcore!
-    target_include_directories(${LIB} PUBLIC ${BOARDCORE_PATH}/src/shared)
+    target_include_directories(${LIB} ${TYPE} ${BOARDCORE_PATH}/src/shared)
 
     # Define DEBUG when in Debug mode
-    target_compile_definitions(${LIB} PUBLIC $<$<CONFIG:Debug>:DEBUG>)
-    target_compile_options(${LIB} PUBLIC -gdwarf-4) 
+    target_compile_definitions(${LIB} ${TYPE} $<$<CONFIG:Debug>:DEBUG>)
+    # Reference https://github.com/google/oss-fuzz/issues/11698
+    target_compile_options(${LIB} ${TYPE} -gdwarf-4) 
 
     # Link libraries
-    target_link_libraries(${LIB} PUBLIC
+    target_link_libraries(${LIB} ${TYPE}
         $<TARGET_OBJECTS:Miosix::Boot::${BOARD_NAME}>
         $<LINK_GROUP:RESCAN,Miosix::Kernel::${BOARD_NAME},stdc++,c,m,gcc,atomic>
         TSCPP::TSCPP
@@ -170,9 +165,9 @@ function(add_options_boardcore_library LIB)
 
     # Link MxGui if supported by the target
     if(DEFINED MXGUI_BASE_BOARD_NAME)
-        target_link_libraries(${LIB} PUBLIC MxGui::${MXGUI_BASE_BOARD_NAME})
+        target_link_libraries(${LIB} ${TYPE} MxGui::${MXGUI_BASE_BOARD_NAME})
     elseif(TARGET MxGui::${BOARD_NAME})
-        target_link_libraries(${LIB} PUBLIC MxGui::${BOARD_NAME})
+        target_link_libraries(${LIB} ${TYPE} MxGui::${BOARD_NAME})
     endif()
 endfunction()
 
@@ -200,7 +195,7 @@ function(add_boardcore_library BOARD_OPTIONS_FILE)
     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}})
+    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)
@@ -208,7 +203,6 @@ function(add_boardcore_library BOARD_OPTIONS_FILE)
     add_custom_command(
         OUTPUT duplicated-${BOARD_NAME}.ll.bak
         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
@@ -217,51 +211,57 @@ function(add_boardcore_library BOARD_OPTIONS_FILE)
         COMMENT "Applying ASPIS passes: duplicated-${BOARD_NAME}.ll.bak"
     )
 
-    add_options_boardcore_library(${BOARDCORE_LIB})
-    add_options_boardcore_library(${DUPLICATION_LIB})
+    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
-        # TARGET ${BOARDCORE_LIB} POST_BUILD
         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
-        # COMMAND clang ${COMPILE_FLAGS} ${COMPILE_DEFINITIONS} ${INCLUDE_DIRECTORIES} -c -o compiled-${BOARD_NAME}.o out-${BOARD_NAME}.bc
-        # COMMAND llvm-ar r libboardcore-lib-${BOARD_NAME}.a compiled-${BOARD_NAME}.o
-        # COMMAND llc -filetype=obj -o compiled-${BOARD_NAME} 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
     )
-    # IMPORTANT! $<TARGET_PROPERTY:${BOARDCORE_LIB},COMPILE_OPTIONS>
 
-    set(BOARDCORE_FINAL boardcore-lib-${BOARD_NAME})
-    add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc)
-    target_link_libraries(${BOARDCORE_FINAL} PUBLIC Miosix::Interface::${BOARD_NAME})
-    add_options_boardcore_library(${BOARDCORE_FINAL})
     add_dependencies(libboardcore-target-${BOARD_NAME} ${BOARDCORE_LIB})
-    add_dependencies(${BOARDCORE_FINAL} libboardcore-target-${BOARD_NAME})
-    add_dependencies(${BOARDCORE_FINAL} ${BOARDCORE_LIB})
-
-    ### Trying imported library
-    # add_library(${BOARDCORE_FINAL} STATIC IMPORTED)
-    # add_dependencies(${BOARDCORE_FINAL} libboardcore-target-${BOARD_NAME})
-    # set_target_properties(${BOARDCORE_FINAL} PROPERTIES IMPORTED_LOCATION libboardcore-lib-${BOARD_NAME}.a)
-    # target_link_libraries(${BOARDCORE_FINAL} INTERFACE Miosix::Interface::${BOARD_NAME})
-
-    ### Trying using the utility
-    # llvmir_attach_library(${BOARDCORE_FINAL} out-${BOARD_NAME}.bc STATIC EXCLUDE_FROM_ALL)
-
-    # add_library(${BOARDCORE_FINAL} STATIC EXCLUDE_FROM_ALL compiled-${BOARD_NAME})
-    # add_dependencies(${BOARDCORE_FINAL} ${BOARDCORE_LIB})
-    # target_link_libraries(${BOARDCORE_FINAL} PUBLIC ${BOARDCORE_LIB} ${CMAKE_CURRENT_BINARY_DIR}/out-${BOARD_NAME}.bc)
-    # set_target_properties(${BOARDCORE_FINAL} PROPERTIES LINKER_LANGUAGE CXX)
+
+    # 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)
 
     # Create a nice alias for the library
     add_library(Skyward::Boardcore::${BOARD_NAME} ALIAS ${BOARDCORE_FINAL})
diff --git a/libs/miosix-kernel b/libs/miosix-kernel
index 9182ba50b..c38939b1a 160000
--- a/libs/miosix-kernel
+++ b/libs/miosix-kernel
@@ -1 +1 @@
-Subproject commit 9182ba50b49edccf12ac7f041b0c4eef6790cce0
+Subproject commit c38939b1a5538973b27cd8903aef1525fa8c1bc5
-- 
GitLab