Initial check-in

* Move riscv_iree.cmake from build/.
* Move the cmake flag/definition settings from riscv_iree.cmake to the top-level
CMakeLists.txt.
* Apply
https://spacebeaker-review.git.corp.google.com/c/shodan/3p/google/iree/+/8080
to the top-level CMakeLists.txt.

Change-Id: Ie855e540374b69041e959e989a23342aa82f0080
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..62a54f3
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required(VERSION 3.13.4)
+
+#-------------------------------------------------------------------------------
+# Project configuration
+#-------------------------------------------------------------------------------
+
+project(iree-riscv32)
+
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+
+set(BUILD_RV64_LINUX OFF CACHE BOOL "Build RISC-V 64-bit Linux target (default: OFF)")
+set(ITCM_LENGTH "256K" CACHE STRING "ITCM (I-mem) Length (default: 256K)")
+add_link_options("LINKER:--defsym=__itcm_length__=${ITCM_LENGTH}")
+set(STACK_SIZE "10K" CACHE STRING "Stack size (default: 10K)")
+add_link_options("LINKER:--defsym=__stack_size__=${STACK_SIZE}")
+
+#-------------------------------------------------------------------------------
+# IREE-specific settings
+#-------------------------------------------------------------------------------
+set(IREE_BUILD_COMPILER OFF)
+set(IREE_ENABLE_MLIR OFF)
+set(IREE_BUILD_SAMPLES ON)
+set(IREE_ENABLE_THREADING OFF)
+set(IREE_BUILD_TESTS OFF)
+set(IREE_BUILD_BINDINGS_TFLITE OFF)
+set(IREE_HAL_DRIVERS_TO_BUILD "Dylib;VMVX")
+
+#-------------------------------------------------------------------------------
+# IREE-specific definitions
+#-------------------------------------------------------------------------------
+set(SPRINGBOK_CONFIG_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/springbok_config.h")
+add_definitions(-DFLATCC_USE_GENERIC_ALIGNED_ALLOC)
+if(NOT ${BUILD_RV64_LINUX})
+  add_definitions(-DIREE_PLATFORM_GENERIC)
+  add_definitions(-DIREE_SYNCHRONIZATION_DISABLE_UNSAFE=1)
+  add_definitions(-DIREE_FILE_IO_ENABLE=0)
+  add_definitions(-DIREE_USER_CONFIG_H="${SPRINGBOK_CONFIG_HEADER}")
+endif()
+
+add_subdirectory($ENV{ROOTDIR}/toolchain/iree iree)
diff --git a/cmake/riscv_iree.cmake b/cmake/riscv_iree.cmake
new file mode 100644
index 0000000..634ae51
--- /dev/null
+++ b/cmake/riscv_iree.cmake
@@ -0,0 +1,65 @@
+cmake_minimum_required (VERSION 3.13)
+
+# CMake invokes the toolchain file twice during the first build, but only once
+# during subsequent rebuilds. This was causing the various flags to be added
+# twice on the first build, and on a rebuild ninja would see only one set of the
+# flags and rebuild the world.
+# https://github.com/android-ndk/ndk/issues/323
+if(RISCV_TOOLCHAIN_INCLUDED)
+  return()
+endif(RISCV_TOOLCHAIN_INCLUDED)
+set(RISCV_TOOLCHAIN_INCLUDED true)
+
+set(CMAKE_SYSTEM_PROCESSOR riscv)
+set(CMAKE_CROSSCOMPILING ON CACHE BOOL "")
+
+if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
+  set(RISCV_HOST_TAG linux)
+elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
+  set(RISCV_HOST_TAG darwin)
+endif()
+
+set(RISCV_TOOLCHAIN_NAME clang)
+
+set(RISCV_TOOLCHAIN_ROOT "$ENV{CACHE}/toolchain_iree" CACHE PATH "RISC-V compiler path")
+set(CMAKE_FIND_ROOT_PATH ${RISCV_TOOLCHAIN_ROOT})
+list(APPEND CMAKE_PREFIX_PATH "${RISCV_TOOLCHAIN_ROOT}")
+
+set(CMAKE_C_COMPILER "${RISCV_TOOLCHAIN_ROOT}/bin/clang")
+set(CMAKE_CXX_COMPILER "${RISCV_TOOLCHAIN_ROOT}/bin/clang++")
+set(CMAKE_AR "${RISCV_TOOLCHAIN_ROOT}/bin/llvm-ar")
+set(CMAKE_RANLIB "${RISCV_TOOLCHAIN_ROOT}/bin/llvm-ranlib")
+set(CMAKE_STRIP "${RISCV_TOOLCHAIN_ROOT}/bin/llvm-strip")
+
+set(RISCV_COMPILER_FLAGS "" CACHE STRING "RISC-V compiler flags for C, CXX, and ASM")
+set(RISCV_COMPILER_FLAGS_CXX)
+set(RISCV_COMPILER_FLAGS_DEBUG)
+set(RISCV_COMPILER_FLAGS_RELEASE)
+set(RISCV_LINKER_FLAGS)
+set(RISCV_LINKER_FLAGS_EXE)
+
+if(${BUILD_RV64_LINUX})
+  set(CMAKE_SYSTEM_NAME Linux)
+  set(CMAKE_SYSTEM_LIBRARY_PATH "${RISCV_TOOLCHAIN_ROOT}/sysroot/usr/lib")
+  set(RISCV_COMPILER_FLAGS "${RISCV_COMPILER_FLAGS} -march=rv64gc -mabi=lp64d")
+  set(RISCV_LINKER_FLAGS "${RISCV_LINKER_FLAGS} -lstdc++ -lpthread -lm -ldl")
+else()
+  set(CMAKE_SYSTEM_NAME Generic)
+  set(CMAKE_C_STANDARD 11)
+  set(CMAKE_C_EXTENSIONS OFF)     # Force the usage of _ISOC11_SOURCE
+  set(CMAKE_SYSTEM_LIBRARY_PATH "${RISCV_TOOLCHAIN_ROOT}/riscv32-unknown-elf/lib")
+  set(RISCV_COMPILER_FLAGS "${RISCV_COMPILER_FLAGS} -menable-experimental-extensions -march=rv32imfv0p10 -mabi=ilp32")
+endif()
+
+set(CMAKE_C_FLAGS             "${RISCV_COMPILER_FLAGS} ${CMAKE_C_FLAGS}")
+set(CMAKE_CXX_FLAGS           "${RISCV_COMPILER_FLAGS} ${RISCV_COMPILER_FLAGS_CXX} ${CMAKE_CXX_FLAGS}")
+set(CMAKE_ASM_FLAGS           "${RISCV_COMPILER_FLAGS} ${CMAKE_ASM_FLAGS}")
+set(CMAKE_C_FLAGS_DEBUG       "${RISCV_COMPILER_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}")
+set(CMAKE_CXX_FLAGS_DEBUG     "${RISCV_COMPILER_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}")
+set(CMAKE_ASM_FLAGS_DEBUG     "${RISCV_COMPILER_FLAGS_DEBUG} ${CMAKE_ASM_FLAGS_DEBUG}")
+set(CMAKE_C_FLAGS_RELEASE     "${RISCV_COMPILER_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}")
+set(CMAKE_CXX_FLAGS_RELEASE   "${RISCV_COMPILER_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}")
+set(CMAKE_ASM_FLAGS_RELEASE   "${RISCV_COMPILER_FLAGS_RELEASE} ${CMAKE_ASM_FLAGS_RELEASE}")
+set(CMAKE_SHARED_LINKER_FLAGS "${RISCV_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
+set(CMAKE_MODULE_LINKER_FLAGS "${RISCV_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
+set(CMAKE_EXE_LINKER_FLAGS    "${RISCV_LINKER_FLAGS} ${RISCV_LINKER_FLAGS_EXE} ${CMAKE_EXE_LINKER_FLAGS}")
diff --git a/springbok_config.h b/springbok_config.h
new file mode 100644
index 0000000..c2a3c8f
--- /dev/null
+++ b/springbok_config.h
@@ -0,0 +1,13 @@
+// Springbok-specific implementation for some IREE functions.
+
+#ifndef SPRINGBOK_CONFIG_H
+#define SPRINGBOK_CONFIG_H
+
+// IREE_TIME_NOW_FN is required and used to fetch the current RTC time and to be
+// used for wait handling. A thread-less system can just return 0.
+#define IREE_TIME_NOW_FN \
+  {                      \
+    return 0;            \
+  }
+
+#endif // SPRINGBOK_CONFIG_H