# Path to LLVM source folder. if(DEFINED ENV{LLVM_SRC}) set(LLVM_SRC $ENV{LLVM_SRC}) if(EXISTS ${LLVM_SRC}) message(STATUS "LLVM_SRC " ${LLVM_SRC}) else() message(FATAL_ERROR "The path specified by LLVM_SRC does not exist: " ${LLVM_SRC}) endif() else() message(FATAL_ERROR "env variable LLVM_SRC not set") endif() # Path to LLVM build folder if(DEFINED ENV{LLVM_BUILD}) set(LLVM_BUILD $ENV{LLVM_BUILD}) if(EXISTS ${LLVM_BUILD}) message(STATUS "LLVM_BUILD " ${LLVM_BUILD}) else() message(FATAL_ERROR "The path specified by LLVM_BUILD does not exist: " ${LLVM_BUILD}) endif() else() message(FATAL_ERROR "env variable LLVM_BUILD not set") endif() # LLVM project lib folder set(LLVM_PROJECT_LIB ${LLVM_BUILD}/lib) # Include paths for MLIR set(LLVM_SRC_INCLUDE_PATH ${LLVM_SRC}/include) set(LLVM_BIN_INCLUDE_PATH ${LLVM_BUILD}/include) set(MLIR_SRC_INCLUDE_PATH ${LLVM_SRC}/projects/mlir/include) set(MLIR_BIN_INCLUDE_PATH ${LLVM_BUILD}/projects/mlir/include) set(MLIR_TOOLS_DIR ${LLVM_BUILD}/bin) set(ONNF_TOOLS_DIR ${ONNF_BIN_ROOT}/bin) set(ONNF_LIT_TEST_SRC_DIR ${CMAKE_SOURCE_DIR}/test/mlir) set(ONNF_LIT_TEST_BUILD_DIR ${CMAKE_BINARY_DIR}/test/mlir) set( MLIR_INCLUDE_PATHS ${LLVM_SRC_INCLUDE_PATH};${LLVM_BIN_INCLUDE_PATH};${MLIR_SRC_INCLUDE_PATH};${MLIR_BIN_INCLUDE_PATH} ) include_directories(${MLIR_INCLUDE_PATHS}) # Threading libraries required due to parallel pass execution. find_package(Threads REQUIRED) function(find_mlir_lib lib) find_library(${lib} NAMES ${lib} PATHS ${LLVM_PROJECT_LIB} NO_DEFAULT_PATH) endfunction(find_mlir_lib) find_mlir_lib(MLIRAffineOps) find_mlir_lib(MLIRAffineToStandard) find_mlir_lib(MLIRAnalysis) find_mlir_lib(MLIRDialect) find_mlir_lib(MLIRExecutionEngine) find_mlir_lib(MLIRIR) find_mlir_lib(MLIRLLVMIR) find_mlir_lib(MLIRLoopToStandard) find_mlir_lib(MLIRLoopOps) find_mlir_lib(MLIRParser) find_mlir_lib(MLIRPass) find_mlir_lib(MLIRStandardOps) find_mlir_lib(MLIRStandardToLLVM) find_mlir_lib(MLIRTargetLLVMIR) find_mlir_lib(MLIRTransforms) find_mlir_lib(MLIRTransformUtils) find_mlir_lib(MLIRSupport) find_mlir_lib(MLIROptMain) find_mlir_lib(MLIRTargetLLVMIRModuleTranslation) find_mlir_lib(MLIRTargetLLVMIR) find_mlir_lib(MLIRTransformUtils) find_mlir_lib(MLIRTranslation) find_mlir_lib(MLIRVectorOps) find_mlir_lib(LLVMCore) find_mlir_lib(LLVMSupport) find_mlir_lib(LLVMAsmParser) find_mlir_lib(LLVMBinaryFormat) find_mlir_lib(LLVMRemarks) find_mlir_lib(LLVMIRReader) find_mlir_lib(LLVMTransformUtils) find_mlir_lib(LLVMBitstreamReader) find_mlir_lib(LLVMAnalysis) find_mlir_lib(LLVMBitWriter) find_mlir_lib(LLVMBitReader) find_mlir_lib(LLVMMC) find_mlir_lib(LLVMMCParser) find_mlir_lib(LLVMObject) find_mlir_lib(LLVMProfileData) find_mlir_lib(LLVMDemangle) set(MLIRLibsOnce ${LLVMAnalysis} ${LLVMAsmParser} ${LLVMBinaryFormat} ${LLVMBitReader} ${LLVMBitstreamReader} ${LLVMBitWriter} ${LLVMCore} ${LLVMIRReader} ${LLVMMC} ${LLVMMCParser} ${LLVMObject} ${LLVMRemarks} ${LLVMSupport} ${LLVMTransformUtils} ${LLVMProfileData} ${LLVMDemangle} ${MLIRAffineOps} ${MLIRAffineToStandard} ${MLIRAnalysis} ${MLIRDialect} ${MLIRExecutionEngine} ${MLIRIR} ${MLIRLLVMIR} ${MLIRLoopToStandard} ${MLIRLoopOps} ${MLIROptMain} ${MLIRParser} ${MLIRPass} ${MLIRStandardOps} ${MLIRStandardToLLVM} ${MLIRSupport} ${MLIRTargetLLVMIR} ${MLIRTargetLLVMIRModuleTranslation} ${MLIRTransforms} ${MLIRTransformUtils} ${MLIRTranslation}) set(MLIRLibs ${MLIRLibsOnce} ${MLIRLibsOnce} Threads::Threads) set(MLIRWholeArchiveLibs MLIRAffineToStandard MLIRAffineOps MLIRLLVMIR MLIRStandardOps MLIRStandardToLLVM MLIRTransforms MLIRLoopToStandard MLIRVectorOps MLIRLoopOps) function(whole_archive_link target lib_dir) get_property(link_flags TARGET ${target} PROPERTY LINK_FLAGS) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") set(link_flags "${link_flags} -L${lib_dir} ") foreach(LIB ${ARGN}) string(CONCAT link_flags ${link_flags} "-Wl,-force_load ${lib_dir}/lib${LIB}.a ") endforeach(LIB) elseif(MSVC) foreach(LIB ${ARGN}) string(CONCAT link_flags ${link_flags} "/WHOLEARCHIVE:${LIB} ") endforeach(LIB) else() set(link_flags "${link_flags} -L${lib_dir} -Wl,--whole-archive,") foreach(LIB ${ARGN}) string(CONCAT link_flags ${link_flags} "-l${LIB},") endforeach(LIB) string(CONCAT link_flags ${link_flags} "--no-whole-archive") endif() set_target_properties(${target} PROPERTIES LINK_FLAGS ${link_flags}) endfunction(whole_archive_link) function(whole_archive_link_mlir target) whole_archive_link(${target} ${LLVM_BUILD}/lib ${ARGN}) endfunction(whole_archive_link_mlir) function(whole_archive_link_onnf target) foreach(LIB ${ARGN}) add_dependencies(${target} ${LIB}) endforeach(LIB) whole_archive_link(${target} ${CMAKE_BINARY_DIR}/lib ${ARGN}) endfunction(whole_archive_link_onnf) set(LLVM_CMAKE_DIR "${LLVM_BUILD}/lib/cmake/llvm" CACHE PATH "Path to LLVM cmake modules") list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") include(AddLLVM) include(TableGen) function(onnf_tablegen ofn) tablegen(MLIR ${ARGV} "-I${MLIR_SRC_INCLUDE_PATH}" "-I${MLIR_BIN_INCLUDE_PATH}") set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${ofn} PARENT_SCOPE) endfunction() # Import the pre-built mlir TableGen as an imported exetuable. It is required by # the LLVM TableGen command to have the TableGen target so that changes to the # table gen utility itself can be detected and cause re-compilation of .td file. add_executable(mlir-tblgen IMPORTED) set_property(TARGET mlir-tblgen PROPERTY IMPORTED_LOCATION ${LLVM_BUILD}/bin/mlir-tblgen) set(MLIR_TABLEGEN_EXE mlir-tblgen)