diff --git a/.gitignore b/.gitignore index 204c8c47ac9a..494dfa97d309 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ /*/CMakeUserPresets.json # Nested build directory -/build* +/build*/ /install* #==============================================================================# diff --git a/build-ventus.sh b/build-ventus.sh new file mode 100755 index 000000000000..be0d208f221a --- /dev/null +++ b/build-ventus.sh @@ -0,0 +1,180 @@ +#!/usr/bin/bash + +DIR=$(cd "$(dirname "${0}")" &> /dev/null && (pwd -W 2> /dev/null || pwd)) +VENTUS_BUILD_DIR=${DIR}/build +LIBCLC_BUILD_DIR=${DIR}/build-libclc +VENTUS_INSTALL_PREFIX=${DIR}/install +PROGRAMS_TOBUILD=(llvm-ventus pocl ocl-icd libclc) + +# Helper function +help() { + cat <] + [--help | -h] + +Options: + --build + Chosen programs to build : llvm-ventus, pocl, ocl-icd, libclc + Option format : "llvm-ventus;pocl", string are seperated by semicolon + Default : "llvm-ventus;pocl;ocl-icd;libclc" + + --help | -h + Print this help message and exit. + +END +} + +# Parse command line options +while [ $# -gt 0 ]; do + case $1 in + -h | --help) + help + exit 0 + ;; + + --build) + shift + if [ ! -z "${1}" ];then + PROGRAMS_TOBUILD=(${1//;/ }) + fi + ;; + + ?*) + echo "Invalid options: \"$1\" , try ${DIR}/$(basename ${0}) --help for help" + exit -1 + ;; + esac + # Process next command-line option + shift +done + +# Need to get the pocl folder from enviroment variables +if [ -z "${POCL_DIR}" ]; then + POCL_DIR=${DIR}/../pocl +fi +if [ ! -d "${POCL_DIR}" ]; then + echo "pocl folder not found, please set or check!" + echo "Default folder is set to be $(realpath ${POCL_DIR})" + exit 1 +fi +POCL_BUILD_DIR=${POCL_DIR}/build + +# Need to get the icd_loader folder from enviroment variables +if [ -z "${OCL_ICD_DIR}" ]; then + OCL_ICD_DIR=${DIR}/../ocl-icd +fi +if [ ! -d "${OCL_ICD_DIR}" ]; then + echo "ocl icd folder not found, please set or check" + echo "Default folder is set to be $(realpath ${OCL_ICD_DIR})" + exit 1 +fi +OCL_ICD_BUILD_DIR=${OCL_ICD_DIR}/build + +# Build llvm-ventus +build_ventus() { + if [ ! -d "${VENTUS_BUILD_DIR}" ]; then + mkdir ${VENTUS_BUILD_DIR} + fi + cd ${VENTUS_BUILD_DIR} + cmake -G Ninja -B ${VENTUS_BUILD_DIR} ${DIR}/llvm \ + -DLLVM_CCACHE_BUILD=ON \ + -DLLVM_OPTIMIZED_TABLEGEN=ON \ + -DLLVM_PARALLEL_LINK_JOBS=12 \ + -DCMAKE_BUILD_TYPE=Debug \ + -DLLVM_ENABLE_PROJECTS="clang;lld;libclc" \ + -DLLVM_TARGETS_TO_BUILD="AMDGPU;X86;RISCV" \ + -DLLVM_TARGET_ARCH=riscv32 \ + -DBUILD_SHARED_LIBS=ON \ + -DLLVM_BUILD_LLVM_DYLIB=ON \ + -DCMAKE_INSTALL_PREFIX=${VENTUS_INSTALL_PREFIX} + ninja + ninja install +} + +# Build pocl from THU +build_pocl() { + if [ ! -d "${POCL_BUILD_DIR}" ]; then + mkdir ${POCL_BUILD_DIR} + fi + cd ${POCL_BUILD_DIR} + cmake -G Ninja -B ${POCL_BUILD_DIR} ${POCL_DIR} \ + -DENABLE_HOST_CPU_DEVICES=OFF \ + -DENABLE_VENTUS=ON \ + -DENABLE_ICD=ON \ + -DDEFAULT_ENABLE_ICD=ON \ + -DENABLE_TESTS=OFF \ + -DSTATIC_LLVM=OFF \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_INSTALL_PREFIX=${VENTUS_INSTALL_PREFIX} + ninja + ninja install +} + +# Build libclc for pocl +build_libclc() { + if [ ! -d "${LIBCLC_BUILD_DIR}" ]; then + mkdir ${LIBCLC_BUILD_DIR} + fi + cd ${LIBCLC_BUILD_DIR} + cmake -G Ninja -B ${LIBCLC_BUILD_DIR} ${DIR}/libclc \ + -DCMAKE_LLAsm_COMPILER_WORKS=ON \ + -DCMAKE_CLC_COMPILER_WORKS=ON \ + -DCMAKE_CLC_COMPILER_FORCED=ON \ + -DCMAKE_LLAsm_FLAGS="-target riscv32 -mcpu=ventus-gpgpu" \ + -DLIBCLC_TARGETS_TO_BUILD="riscv32--" \ + -DCMAKE_CXX_FLAGS="-I ${DIR}/llvm/include/ -std=c++17" \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_INSTALL_PREFIX=${VENTUS_INSTALL_PREFIX} + ninja + ninja install + DstDir=${VENTUS_INSTALL_PREFIX}/share/pocl + if [ ! -d "${DstDir}" ]; then + mkdir -p ${DstDir} + fi + # TODO: make this copy process done during libclc build process? + cp ${LIBCLC_BUILD_DIR}/riscv32--.bc ${DstDir}/kernel-riscv32.bc +} + +# Build icd_loader +build_icd_loader() { + cd ${OCL_ICD_DIR} + ./bootstrap + ./configure --prefix=${VENTUS_INSTALL_PREFIX} + make && make install +} + +# Export needed path and enviroment variables +export_elements() { + export PATH=${VENTUS_INSTALL_PREFIX}/bin:$PATH + export LD_LIBRARY_PATH=${VENTUS_INSTALL_PREFIX}/lib +} + +# When no need to build llvm-ventus, export needed elements +if [[ ! "${PROGRAMS_TOBUILD[*]}" =~ "llvm-ventus" ]];then + export_elements +fi + +# Process build options +for program in "${PROGRAMS_TOBUILD[@]}" +do + if [ "${program}" == "llvm-ventus" ];then + build_ventus + export_elements + elif [ "${program}" == "pocl" ]; then + build_pocl + elif [ "${program}" == "ocl-icd" ];then + build_icd_loader + elif [ "${program}" == "libclc" ];then + build_libclc + else + echo "Invalid build options: \"${program}\" , try $0 --help for help" + exit 1 + fi +done \ No newline at end of file diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt index a2b25a07b9c1..7210b4f72549 100644 --- a/libclc/CMakeLists.txt +++ b/libclc/CMakeLists.txt @@ -43,6 +43,10 @@ set( LIBCLC_TARGETS_TO_BUILD "all" option( ENABLE_RUNTIME_SUBNORMAL "Enable runtime linking of subnormal support." OFF ) +# This will make built library put in lib directory +set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) +install(DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR} DESTINATION ${CMAKE_INSTALL_PREFIX}) + find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}") include(AddLLVM) diff --git a/libclc/riscv32/lib/CMakeLists.txt b/libclc/riscv32/lib/CMakeLists.txt index fae638167acc..d568faaa23f8 100644 --- a/libclc/riscv32/lib/CMakeLists.txt +++ b/libclc/riscv32/lib/CMakeLists.txt @@ -6,9 +6,20 @@ set(CMAKE_ASM_COMPILER clang) set(CMAKE_ASM_FLAGS ${CMAKE_LLAsm_FLAGS}) # workitem builtins -add_library(workitem STATIC workitem/workitem.S) -target_include_directories(workitem PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - +llvm_add_library(workitem STATIC workitem/workitem.S) # crts -add_library(crt0 OBJECT crt0.S) +set(LIBNAME "ctr0") +set(LIBNAME_OBJ "${LIBNAME}_obj") +add_library(${LIBNAME_OBJ} OBJECT crt0.S) +add_library(${LIBNAME} SHARED $) + +target_include_directories(workitem PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +# Copy crt0 object library to lib folder to be automatically installed +add_custom_command(TARGET ${LIBNAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + ${LLVM_LIBRARY_OUTPUT_INTDIR}/crt0.o +) \ No newline at end of file