Create rv32 clang build target for springbok. The IREE executables need to link to libspringbok_instrinsic, which means it needs to be built using the rv32 toolchain. This CL adds a BUILD_IREE flag that switches to that toolchain. Change-Id: I5d16633f4ca3a8023066bc67ad336bc620fd02a0
diff --git a/cmake/riscv_baremetal.cmake b/cmake/riscv_baremetal.cmake index 9c8b93b..74d6e7c 100644 --- a/cmake/riscv_baremetal.cmake +++ b/cmake/riscv_baremetal.cmake
@@ -1,55 +1,82 @@ -set(SHODAN_TOOLCHAIN_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cache/toolchain_vp/bin CACHE STRING "Shodan toolchain path") -message (STATUS "Shodan toolchain path is ${SHODAN_TOOLCHAIN_PATH}") -find_file( RISCV_GCC_COMPILER "riscv32-unknown-elf-gcc" HINTS ${SHODAN_TOOLCHAIN_PATH} PATHS ENV INCLUDE) +# If set to true, build for IREE using clang. If false, build for gcc. +set(BUILD_IREE OFF CACHE BOOL "") -# Check compiler found -if (EXISTS ${RISCV_GCC_COMPILER}) -message(STATUS "RISC-V GCC found. Using ${RISCV_GCC_COMPILER}") +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_ABI ilp32) +set(CMAKE_EXECUTABLE_SUFFIX ".elf") + +# TODO: -Werror fails for clang due to un-used flags. Track down where those flags get added. +set(VEC_DEFAULT_COPTS + "-Wall" + "-O0" + "-g3" + "-ggdb") + +if( ${BUILD_IREE} ) + set(CMAKE_SYSTEM_PROCESSOR rv32imfv0p10) + + set(RISCV_TOOLCHAIN_ROOT "$ENV{CACHE}/toolchain_iree_rv32imf/bin/" CACHE PATH "RISC-V toolchain root path") + message (STATUS "RISC-V toolchain path is ${RISCV_TOOLCHAIN_ROOT}") + find_file(RISCV_COMPILER "clang" HINTS ${RISCV_TOOLCHAIN_ROOT} PATHS ENV INCLUDE) + + set(CMAKE_FIND_ROOT_PATH ${RISCV_TOOLCHAIN_ROOT}) + list(APPEND CMAKE_PREFIX_PATH "${RISCV_TOOLCHAIN_ROOT}") + + set(CMAKE_C_COMPILER "${RISCV_TOOLCHAIN_ROOT}/clang") + set(CMAKE_CXX_COMPILER "${RISCV_TOOLCHAIN_ROOT}/clang++") + set(CMAKE_AR "${RISCV_TOOLCHAIN_ROOT}/llvm-ar") + set(CMAKE_RANLIB "${RISCV_TOOLCHAIN_ROOT}/llvm-ranlib") + set(CMAKE_STRIP "${RISCV_TOOLCHAIN_ROOT}/llvm-strip") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -menable-experimental-extensions -march=${CMAKE_SYSTEM_PROCESSOR} -mabi=${CMAKE_SYSTEM_ABI}") else() -message(FATAL_ERROR "RISC-V GCC not found. ${RISCV_GCC_COMPILER}") + set(CMAKE_SYSTEM_PROCESSOR rv32imv) + + set(RISCV_TOOLCHAIN_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../cache/toolchain_vp/bin CACHE STRING "RISC-V toolchain path") + message (STATUS "RISC-V toolchain path is ${RISCV_TOOLCHAIN_ROOT}") + find_file( RISCV_COMPILER "riscv32-unknown-elf-gcc" HINTS ${RISCV_TOOLCHAIN_ROOT} PATHS ENV INCLUDE) + + get_filename_component(RISCV_TOOLCHAIN_BIN_PATH ${RISCV_COMPILER} DIRECTORY) + get_filename_component(RISCV_TOOLCHAIN_BIN_GCC ${RISCV_COMPILER} NAME_WE) + get_filename_component(RISCV_TOOLCHAIN_BIN_EXT ${RISCV_COMPILER} EXT) + + message( "RISC-V GCC Path: ${RISCV_TOOLCHAIN_BIN_PATH}" ) + + STRING(REGEX REPLACE "\-gcc" "-" CROSS_COMPILE ${RISCV_COMPILER}) + message( "RISC-V Cross Compile Prefix: ${CROSS_COMPILE}" ) + + set(CMAKE_AR ${CROSS_COMPILE}ar) + set(CMAKE_ASM_COMPILER ${RISCV_COMPILER}) + set(CMAKE_C_COMPILER ${RISCV_COMPILER}) + set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}g++) + + set( CMAKE_OBJCOPY ${RISCV_TOOLCHAIN_BIN_PATH}/${CROSS_COMPILE}objcopy + CACHE FILEPATH "The toolchain objcopy command " FORCE ) + + set( CMAKE_OBJDUMP ${RISCV_TOOLCHAIN_BIN_PATH}/${CROSS_COMPILE}objdump + CACHE FILEPATH "The toolchain objdump command " FORCE ) + + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=${CMAKE_SYSTEM_PROCESSOR} -mabi=${CMAKE_SYSTEM_ABI}") + + set(VEC_DEFAULT_COPTS "${VEC_DEFAULT_COPTS}" + "-Werror" + "-ffreestanding" + "-ffunction-sections" + "-fstack-usage" + "-mstrict-align" + ) endif() -get_filename_component(RISCV_TOOLCHAIN_BIN_PATH ${RISCV_GCC_COMPILER} DIRECTORY) -get_filename_component(RISCV_TOOLCHAIN_BIN_GCC ${RISCV_GCC_COMPILER} NAME_WE) -get_filename_component(RISCV_TOOLCHAIN_BIN_EXT ${RISCV_GCC_COMPILER} EXT) - -message( "RISC-V GCC Path: ${RISCV_TOOLCHAIN_BIN_PATH}" ) - -STRING(REGEX REPLACE "\-gcc" "-" CROSS_COMPILE ${RISCV_GCC_COMPILER}) -message( "RISC-V Cross Compile Prefix: ${CROSS_COMPILE}" ) - -set( CMAKE_SYSTEM_NAME Generic ) -set( CMAKE_SYSTEM_PROCESSOR rv32imv ) -set( CMAKE_SYSTEM_ABI ilp32 ) -set( CMAKE_EXECUTABLE_SUFFIX ".elf") - -set(CMAKE_AR ${CROSS_COMPILE}ar) -set(CMAKE_ASM_COMPILER ${RISCV_GCC_COMPILER}) -set(CMAKE_C_COMPILER ${RISCV_GCC_COMPILER}) -set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}g++) - -set( CMAKE_OBJCOPY ${RISCV_TOOLCHAIN_BIN_PATH}/${CROSS_COMPILE}objcopy - CACHE FILEPATH "The toolchain objcopy command " FORCE ) - -set( CMAKE_OBJDUMP ${RISCV_TOOLCHAIN_BIN_PATH}/${CROSS_COMPILE}objdump - CACHE FILEPATH "The toolchain objdump command " FORCE ) - -set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=${CMAKE_SYSTEM_PROCESSOR} -mabi=${CMAKE_SYSTEM_ABI}") +# Check compiler found +if (EXISTS ${RISCV_COMPILER}) + message(STATUS "RISC-V compiler found. Using ${RISCV_COMPILER}") +else() + message(FATAL_ERROR "RISC-V compiler not found. ${RISCV_OMPILER}") +endif() set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "" ) set( CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "" ) set( CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "" ) set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostartfiles " ) -set( VEC_DEFAULT_COPTS - "-Wall" - "-Werror" - "-O0" - "-g3" - "-ggdb" - "-ffreestanding" - "-ffunction-sections" - "-fstack-usage" - "-mstrict-align" -) -set( VEC_DEFAULT_LINKOPTS -specs=nano.specs -Wl,--gc-sections -Wl,--print-memory-usage -Wl,-Map=${PROJECT_NAME}.map) \ No newline at end of file +set( VEC_DEFAULT_LINKOPTS -specs=nano.specs -Wl,--gc-sections -Wl,--print-memory-usage -Wl,-Map=${PROJECT_NAME}.map)