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)