From dee473878ba51e83a423ccdc77ceb05bd3ce6120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=AFc=20Crouzet?= <noic.crouzet@irit.fr> Date: Thu, 10 Oct 2024 15:51:20 +0200 Subject: [PATCH] Vortex toolchain all in one build --- Build_full_riscv_toolchain_baremetal.txt | 41 ++++++++ RV_preload.cmake | 116 +++++++++++++++++++++++ compiler-rt/cmake/base-config-ix.cmake | 4 +- libc/CMakeLists.txt | 13 ++- libc/lib/CMakeLists.txt | 72 ++++---------- 5 files changed, 186 insertions(+), 60 deletions(-) create mode 100644 Build_full_riscv_toolchain_baremetal.txt create mode 100644 RV_preload.cmake diff --git a/Build_full_riscv_toolchain_baremetal.txt b/Build_full_riscv_toolchain_baremetal.txt new file mode 100644 index 000000000000..dcbde2d00828 --- /dev/null +++ b/Build_full_riscv_toolchain_baremetal.txt @@ -0,0 +1,41 @@ +cmake -B cmake_riscv64 ./llvm \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/opt/llvm-vortex \ + -DLLVM_ENABLE_PROJECTS='clang;lld' \ + -DLLVM_DEFAULT_TARGET_TRIPLE=riscv64gc-none-unknown-eabi \ + -DLLVM_TARGETS_TO_BUILD=RISCV \ + -DLLVM_INCLUDE_TESTS=OFF \ + -DLLVM_CCACHE_BUILD=ON \ + -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON \ + \ + -DLLVM_ENABLE_RUNTIMES='libc;compiler-rt' \ + -DLLVM_RUNTIME_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi" \ + -DLLVM_BUILTIN_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi" \ + -DLLVM_RUNTIME_MULTILIBS="i;imfd" \ + -DLLVM_RUNTIME_MULTILIB_i_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi"\ + -DLLVM_RUNTIME_MULTILIB_imfd_TARGETS="riscv64-none-unknown-eabi;riscv32-none-unknown-eabi" \ + \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BAREMETAL_BUILD=ON \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_BUILTINS=ON \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_USE_BUILTINS_LIBRARY=ON \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_SANITIZERS=OFF \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_INCLUDE_TESTS=OFF \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_XRAY=OFF \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_LIBFUZZER=OFF \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_MEMPROF=OFF \ + -DRUNTIMES_riscv64-none-unknown-eabi_COMPILER_RT_BUILD_PROFILE=OFF \ + \ + -DRUNTIMES_riscv64-none-unknown-eabi_LLVM_LIBC_FULL_BUILD=ON \ + -DRUNTIMES_riscv64-none-unknown-eabi_LIBC_ENABLE_USE_BY_CLANG=ON \ + -DRUNTIMES_riscv64-none-unknown-eabi+imfd_LIBC_COMPILE_OPTIONS_DEFAULT="-march=rv64imfd" \ + -DBUILTINS_riscv64-none-unknown-eabi+imfd_CMAKE_C_FLAGS="-march=rv64i" \ + -DBUILTINS_riscv64-none-unknown-eabi+imfd_CMAKE_CXX_FLAGS="-march=rv64i" \ + -DBUILTINS_riscv64-none-unknown-eabi+imfd_CMAKE_ASM_FLAGS="-march=rv64i"\ + -DRUNTIMES_riscv32-none-unknown-eabi+imfd_LIBC_COMPILE_OPTIONS_DEFAULT="-march=rv32imfd" \ + -DBUILTINS_riscv32-none-unknown-eabi+imfd_CMAKE_C_FLAGS="-march=rv32imfd" \ + -DBUILTINS_riscv32-none-unknown-eabi+imfd_CMAKE_CXX_FLAGS="-march=rv32imfd" \ + -DBUILTINS_riscv32-none-unknown-eabi+imfd_CMAKE_ASM_FLAGS="-march=rv32imfd" + +cmake -B build ./llvm -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_LIBDIR=lib/x86_64-linux-gnu -DCMAKE_INSTALL_PREFIX=/usr/local -DLLVM_CCACHE_BUILD=ON -C ./RV_preload.cmake + +cmake --build build -j `nproc` --target install \ No newline at end of file diff --git a/RV_preload.cmake b/RV_preload.cmake new file mode 100644 index 000000000000..819ef12f31d8 --- /dev/null +++ b/RV_preload.cmake @@ -0,0 +1,116 @@ + +option(RV_64 "Enable 64 bits" ON) +option(RV_32 "Enable 32 bits" ON) +set(RV_VENDOR "none" CACHE STRING "Vendor of the toolchain") +set(RV_OS "unknown" CACHE STRING "Targeted OS of the toolchain") +set(RV_ABI "elf" CACHE STRING "ABI of the toolchain") +set(RV_EXT32 "imaf" CACHE STRING "Extensions to include") +set(RV_EXT64 "imafd" CACHE STRING "Extensions to include") + +if(RV_64) + list(APPEND RV_XLEN "64") +endif() +if(RV_32) + list(APPEND RV_XLEN "32") +endif() +set(LLVM_CCACHE_BUILD ON CACHE BOOL "") + + +set(LLVM_TARGETS_TO_BUILD RISCV CACHE STRING "") +set(LLVM_ENABLE_PROJECTS "clang;lld;libc" CACHE STRING "") +set(LLVM_ENABLE_RUNTIMES "libc;libcxx;compiler-rt" CACHE STRING "") +set(COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "") + +set(LLVM_LIBC_FULL_BUILD ON CACHE BOOL "") +set(LIBC_HDRGEN_ONLY ON CACHE BOOL "") # build libc-hdrgen first with host-host compiler +set(GENERATED_LIBC_HDRGEN_EXE "${CMAKE_CURRENT_BINARY_DIR}/bin/libc-hdrgen" CACHE STRING "") +message(STATUS "generating libc-hdrgen in ${GENERATED_LIBC_HDRGEN_EXE}") + +#set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "") +set(LIBC_ENABLE_USE_BY_CLANG ON CACHE BOOL "") +#set(LLVM_BUILD_STATIC ON CACHE BOOL "") +set(LLVM_ENABLE_TERMINFO OFF CACHE BOOL "") +set(LLVM_ENABLE_ZLIB OFF CACHE BOOL "") # does not get passed to runtimes and default is 1 + +foreach (xlen ${RV_XLEN}) + foreach(exts IN ZIP_LISTS RV_EXT32 RV_EXT64) + if(${xlen} EQUAL 32) + set(ext ${exts_0}) + endif () + if(${xlen} EQUAL 64) + set(ext ${exts_1}) + endif () + set(march "rv${xlen}${ext}") + message(STATUS "Extension added: rv${xlen}${ext}") + set(target "riscv${xlen}-${RV_VENDOR}-${RV_OS}-${RV_ABI}") + list(APPEND RV_TARGETS_TRIPLES "${target}") + + set(RUNTIMES_${target}_COMPILER_RT_BUILD_BUILTINS ON CACHE BOOL "") + # BUILTINS defs + set(BUILTINS_${target}_CMAKE_SYSTEM_NAME Generic CACHE STRING "") + set(BUILTINS_${target}_CMAKE_SYSTEM_PROCESSOR RISCV CACHE STRING "") + set(BUILTINS_${target}_CMAKE_SYSROOT "" CACHE STRING "") + + set(BUILTINS_${target}_COMPILER_RT_BAREMETAL_BUILD ON CACHE BOOL "") + set(BUILTINS_${target}_CRT_CFLAGS "-ffreestanding" CACHE STRING "") + set(BUILTINS_${target}_BUILTIN_CFLAGS "-ffreestanding" CACHE STRING "") + + + foreach(lang C;CXX;ASM) + set(BUILTINS_${target}_CMAKE_${lang}_FLAGS "--target=${target} -march=${march}" CACHE STRING "") #mabi auto + set(RUNTIMES_${target}_CMAKE_${lang}_FLAGS "--target=${target} -march=${march}" CACHE STRING "") + endforeach() + + set(RUNTIMES_${target}_CMAKE_SYSTEM_NAME Generic CACHE STRING "") + set(RUNTIMES_${target}_CMAKE_SYSTEM_PROCESSOR RISCV CACHE STRING "") + set(RUNTIMES_${target}_CMAKE_SYSROOT "" CACHE STRING "") + + set(RUNTIMES_${target}_LLVM_ENABLE_RUNTIMES "libc;libcxx" CACHE STRING "only build libc during runtime (builtins is already built") + set(RUNTIMES_${target}_COMPILER_RT_USE_BUILTINS_LIBRARY OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_SANITIZERS OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_INCLUDE_TESTS OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_XRAY OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_LIBFUZZER OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_MEMPROF OFF CACHE BOOL "") + set(RUNTIMES_${target}_COMPILER_RT_BUILD_PROFILE OFF CACHE BOOL "") + + # LIBC defs + set(RUNTIMES_${target}_LIBC_ENABLE_USE_BY_CLANG ON CACHE BOOL "") + set(RUNTIMES_${target}_LLVM_LIBC_FULL_BUILD ON CACHE BOOL "") + set(RUNTIMES_${target}_LIBC_HDRGEN_ONLY OFF CACHE BOOL "Ensure that we do not generate HDRGEN (it would be cross compiled)") + set(RUNTIMES_${target}_LIBC_HDRGEN_EXE "${GENERATED_LIBC_HDRGEN_EXE}" CACHE STRING "Point to where the native HDRGEN was compiled") + #set(RUNTIMES_${target}_LIBC_COMPILE_OPTIONS_DEFAULT "-ffreestanding" CACHE STRING "") + + # LIBCXX defs + set(RUNTIMES_${target}_LIBCXX_ENABLE_STATIC ON CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY ON CACHE BOOL "") + # LIBCXX FEATURES + set(RUNTIMES_${target}_LIBCXX_ENABLE_RANDOM_DEVICE OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_ENABLE_LOCALIZATION OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_ENABLE_UNICODE OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_ENABLE_WIDE_CHARACTERS OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_ENABLE_RTTI OFF CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_ENABLE_THREADS OFF CACHE BOOL "") + + endforeach () +endforeach() + + +list (GET RV_TARGETS_TRIPLES 0 default_target) +set(LLVM_DEFAULT_TARGET_TRIPLE ${default_target} CACHE STRING "") + +#set(LLVM_RUNTIME_MULTILIBS ${RV_EXT} CACHE STRING "") +#foreach (ext ${RV_EXT}) +# set(LLVM_RUNTIME_MULTILIB_${ext}_TARGETS ${RV_TARGETS_TRIPLES} CACHE STRING "") +#endforeach () + +set(LLVM_BUILTIN_TARGETS ${RV_TARGETS_TRIPLES} CACHE STRING "") +set(LLVM_RUNTIME_TARGETS ${RV_TARGETS_TRIPLES} CACHE STRING "") + +set(LLVM_INCLUDE_TESTS OFF CACHE BOOL "") +set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "") diff --git a/compiler-rt/cmake/base-config-ix.cmake b/compiler-rt/cmake/base-config-ix.cmake index 5a97992756a9..37a9e642adcb 100644 --- a/compiler-rt/cmake/base-config-ix.cmake +++ b/compiler-rt/cmake/base-config-ix.cmake @@ -279,9 +279,9 @@ macro(test_targets) elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "aarch64") test_target_arch(aarch64 "" "-march=armv8-a") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv32") - test_target_arch(riscv32 "" "") + test_target_arch(riscv32 "" "-march=rv32gc") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv64") - test_target_arch(riscv64 "" "") + test_target_arch(riscv64 "" "-march=rv64gc") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm32") test_target_arch(wasm32 "" "--target=wasm32-unknown-unknown") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm64") diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt index 6e0760724d96..52d0ebaac42d 100644 --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -229,9 +229,9 @@ foreach(config_path IN LISTS LIBC_CONFIG_JSON_FILE_LIST) endforeach() if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND LIBC_ENABLE_USE_BY_CLANG) - set(LIBC_INCLUDE_DIR ${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}) - set(LIBC_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) - set(LIBC_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}) + set(LIBC_INCLUDE_DIR ${LLVM_BINARY_DIR}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/include) + set(LIBC_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_PREFIX}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/include) + set(LIBC_LIBRARY_DIR ${LLVM_BINARY_DIR}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/lib) else() if(NOT LIBC_ENABLE_USE_BY_CLANG) set(LIBC_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include) @@ -259,8 +259,13 @@ endif() if(LIBC_TARGET_TRIPLE) set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBC_TARGET_TRIPLE}) elseif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR) - set(LIBC_INSTALL_LIBRARY_DIR + if(LIBC_ENABLE_USE_BY_CLANG) + set(LIBC_INSTALL_LIBRARY_DIR + ${CMAKE_INSTALL_PREFIX}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/lib) + else() + set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}) + endif() else() set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}) endif() diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt index 37acf3950b46..1cc9a03d8971 100644 --- a/libc/lib/CMakeLists.txt +++ b/libc/lib/CMakeLists.txt @@ -2,7 +2,11 @@ set(libc_archive_targets "") set(libc_archive_names "") set(libc_archive_entrypoint_lists "") if(LLVM_LIBC_FULL_BUILD) - list(APPEND libc_archive_names c m) + if(LIBC_TARGET_ARCHITECTURE_IS_GPU) + list(APPEND libc_archive_names cgpu mgpu) + else() + list(APPEND libc_archive_names c m) + endif() list(APPEND libc_archive_targets libc libm) list(APPEND libc_archive_entrypoint_lists TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS) @@ -31,44 +35,23 @@ foreach(archive IN ZIP_LISTS ) if(LLVM_LIBC_FULL_BUILD) target_link_libraries(${archive_1} PUBLIC libc-headers) - if(TARGET libc-startup) - add_dependencies(${archive_1} libc-startup) - endif() endif() list(APPEND added_archive_targets ${archive_1}) +endforeach() - # Add the offloading version of the library for offloading languages. These - # are installed in the standard search path separate from the other libraries. - if(LIBC_TARGET_OS_IS_GPU) - add_gpu_entrypoint_library( - ${archive_1}gpu - ${archive_1} - DEPENDS - ${${archive_2}} - ) - set_target_properties( - ${archive_1}gpu - PROPERTIES - ARCHIVE_OUTPUT_NAME ${archive_0}gpu-${LIBC_TARGET_ARCHITECTURE} - ARCHIVE_OUTPUT_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR} - ) - list(APPEND added_gpu_archive_targets ${archive_1}gpu) - - add_bitcode_entrypoint_library( - ${archive_1}bitcode - ${archive_1} - DEPENDS - ${${archive_2}} - ) - set_target_properties( - ${archive_1}bitcode - PROPERTIES - OUTPUT_NAME ${archive_1}.bc - ) - add_dependencies(${archive_1}gpu ${archive_1}bitcode) - list(APPEND added_gpu_bitcode_targets ${archive_1}bitcode) +if(LIBC_TARGET_TRIPLE) + set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBC_TARGET_TRIPLE}) +elseif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT LIBC_GPU_BUILD) + if(LIBC_ENABLE_USE_BY_CLANG) + set(LIBC_INSTALL_LIBRARY_DIR + ${CMAKE_INSTALL_PREFIX}/lib/clang-runtimes/${LLVM_DEFAULT_TARGET_TRIPLE}/lib) + else() + set(LIBC_INSTALL_LIBRARY_DIR + lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE}) endif() -endforeach() +else() + set(LIBC_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}) +endif() install( TARGETS ${added_archive_targets} @@ -76,25 +59,6 @@ install( COMPONENT libc ) -if(LIBC_TARGET_OS_IS_GPU) - set(gpu_install_dir lib${LLVM_LIBDIR_SUFFIX}) - if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR) - set(gpu_install_dir lib${LLVM_LIBDIR_SUFFIX}/${LLVM_HOST_TRIPLE}) - endif() - install( - TARGETS ${added_gpu_archive_targets} - ARCHIVE DESTINATION ${gpu_install_dir} - COMPONENT libc - ) - foreach(file ${added_gpu_bitcode_targets}) - install(FILES $<TARGET_PROPERTY:${file},TARGET_OBJECT> - DESTINATION ${LIBC_INSTALL_LIBRARY_DIR} - RENAME $<TARGET_PROPERTY:${file},OUTPUT_NAME> - COMPONENT libc - ) - endforeach() -endif() - if(NOT LIBC_TARGET_OS_IS_BAREMETAL) # For now we will disable libc-startup installation for baremetal. The # correct way to do it would be to make a hookable startup for baremetal -- GitLab