| # Copyright 2023 The IREE Authors | |
| # | |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| if(NOT IREE_TARGET_BACKEND_LLVM_CPU OR | |
| NOT IREE_HAL_DRIVER_LOCAL_SYNC OR | |
| NOT IREE_HAL_EXECUTABLE_LOADER_EMBEDDED_ELF) | |
| return() | |
| endif() | |
| # system-library plugin mechanism using the system dynamic library loader. | |
| if(IREE_HAL_EXECUTABLE_PLUGIN_SYSTEM_LIBRARY) | |
| add_library(iree_samples_custom_dispatch_cpu_system_plugin SHARED | |
| system_plugin.c | |
| ) | |
| target_include_directories(iree_samples_custom_dispatch_cpu_system_plugin | |
| PRIVATE | |
| ${IREE_SOURCE_DIR}/runtime/src/ | |
| ) | |
| # NOTE: this is only required because we want this sample to run on all | |
| # platforms without needing to change the library name (libfoo.so/foo.dll). | |
| set_target_properties(iree_samples_custom_dispatch_cpu_system_plugin | |
| PROPERTIES | |
| WINDOWS_EXPORT_ALL_SYMBOLS ON | |
| PREFIX "" | |
| OUTPUT_NAME "system_plugin" | |
| ) | |
| add_dependencies(iree-sample-deps | |
| iree_samples_custom_dispatch_cpu_system_plugin) | |
| iree_lit_test_suite( | |
| NAME | |
| system_example | |
| SRCS | |
| "system_example.mlir" | |
| TOOLS | |
| FileCheck | |
| iree-compile | |
| iree-run-module | |
| iree_samples_custom_dispatch_cpu_system_plugin | |
| LABELS | |
| "driver=local-sync" | |
| "hostonly" | |
| ) | |
| iree_lit_test_suite( | |
| NAME | |
| system_ukernel | |
| SRCS | |
| "system_ukernel.mlir" | |
| TOOLS | |
| FileCheck | |
| iree-compile | |
| iree-run-module | |
| iree_samples_custom_dispatch_cpu_system_plugin | |
| LABELS | |
| "driver=local-sync" | |
| "hostonly" | |
| ) | |
| endif(IREE_HAL_EXECUTABLE_PLUGIN_SYSTEM_LIBRARY) | |
| # embedded-elf plugin mechanism for standalone portable ELFs. | |
| # We use the same flags we do in the compiler for our embedded elfs found under | |
| # compiler/plugins/target/LLVMCPU/internal/EmbeddedLinkerTool.cpp | |
| if(IREE_HAL_EXECUTABLE_PLUGIN_EMBEDDED_ELF) | |
| # This only builds for x86-64/arm_64/riscv_64 because that's all we have coded in here. | |
| if(NOT IREE_ARCH STREQUAL "arm_64" AND NOT IREE_ARCH STREQUAL "x86_64" AND NOT IREE_ARCH STREQUAL "riscv_64") | |
| message(STATUS "IREE custom_dispatch/cpu/plugin standalone example ignored -- only builds for x86_64/arm_64/riscv_64 (today)") | |
| return() | |
| endif() | |
| # TODO(#12801): fix MSVC embedded elf -> embedded elf calling. | |
| if(MSVC) | |
| message(STATUS "IREE custom_dispatch/cpu/plugin standalone example ignored -- #12801 required to make MSVC work") | |
| return() | |
| endif() | |
| # standalone_plugin_library() | |
| # | |
| # Creates the architecture-specific part of the standalone plugin, for the given | |
| # architecture (as in IREE_ARCH), and appends the generated library filename to | |
| # the output-variable _DST_VAR_ARCH_LIBRARIES. Skips if the compiler does not | |
| # support the specified architecture. | |
| function(standalone_plugin_library _DST_VAR_ARCH_LIBRARIES _ARCH _CFLAGS) | |
| iree_compiler_targeting_iree_arch(_ENABLED "${_ARCH}") | |
| if(NOT _ENABLED) | |
| return() | |
| endif() | |
| set(_NAME iree_samples_custom_dispatch_cpu_standalone_plugin_${_ARCH}) | |
| iree_arch_to_llvm_arch(LLVM_ARCH "${_ARCH}") | |
| add_custom_command( | |
| OUTPUT | |
| standalone_plugin_${_ARCH}.o | |
| DEPENDS | |
| standalone_plugin.c | |
| ${IREE_CLANG_TARGET} | |
| COMMAND ${IREE_CLANG_BINARY} | |
| -target ${LLVM_ARCH}-none-elf | |
| -isystem ${IREE_CLANG_BUILTIN_HEADERS_PATH} | |
| -std=c17 | |
| -fPIC | |
| -ffreestanding | |
| -fvisibility=hidden | |
| -fno-plt | |
| -fno-rtti | |
| -fno-exceptions | |
| -fdata-sections | |
| -ffunction-sections | |
| -funique-section-names | |
| ${_CFLAGS} | |
| -I ${IREE_SOURCE_DIR}/runtime/src/ | |
| -c ${CMAKE_CURRENT_SOURCE_DIR}/standalone_plugin.c | |
| -o ${CMAKE_CURRENT_BINARY_DIR}/standalone_plugin_${_ARCH}.o | |
| VERBATIM | |
| ) | |
| set(_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/standalone_plugin_${_ARCH}.so") | |
| add_custom_command( | |
| OUTPUT | |
| standalone_plugin_${_ARCH}.so | |
| DEPENDS | |
| standalone_plugin_${_ARCH}.o | |
| ${IREE_LLD_TARGET} | |
| COMMAND ${IREE_LLD_BINARY} | |
| -flavor gnu | |
| --build-id=none | |
| -nostdlib | |
| -static | |
| -shared | |
| --no-undefined | |
| --no-allow-shlib-undefined | |
| --allow-multiple-definition | |
| --gc-sections | |
| -z now | |
| -z relro | |
| --discard-all | |
| --icf=all | |
| --ignore-data-address-equality | |
| --ignore-function-address-equality | |
| --hash-style=sysv | |
| --strip-debug | |
| ${CMAKE_CURRENT_BINARY_DIR}/standalone_plugin_${_ARCH}.o | |
| -o "${_LIBRARY}" | |
| VERBATIM | |
| ) | |
| add_custom_target(${_NAME} DEPENDS | |
| "${_LIBRARY}" | |
| ) | |
| set(_LOCAL_ARCH_LIBRARIES "${${_DST_VAR_ARCH_LIBRARIES}}") | |
| list(APPEND _LOCAL_ARCH_LIBRARIES "${_LIBRARY}") | |
| set("${_DST_VAR_ARCH_LIBRARIES}" "${_LOCAL_ARCH_LIBRARIES}" PARENT_SCOPE) | |
| endfunction() | |
| # Build the standalone_plugin_*.so files for each architecture we target. | |
| set(_STANDALONE_PLUGIN_ARCH_LIBRARIES "") | |
| set(RISCV_STANDALONE_PLUGIN_ARCH_C_FLAGS -march=rv64i2p1ma2p1f2p2d2p2c2p0) | |
| standalone_plugin_library(_STANDALONE_PLUGIN_ARCH_LIBRARIES arm_64 "") | |
| standalone_plugin_library(_STANDALONE_PLUGIN_ARCH_LIBRARIES x86_64 "") | |
| standalone_plugin_library(_STANDALONE_PLUGIN_ARCH_LIBRARIES riscv_64 "${RISCV_STANDALONE_PLUGIN_ARCH_C_FLAGS}") | |
| add_custom_command( | |
| OUTPUT | |
| standalone_plugin.sos | |
| DEPENDS | |
| ${_STANDALONE_PLUGIN_ARCH_LIBRARIES} | |
| iree-fatelf | |
| COMMAND iree-fatelf join | |
| ${_STANDALONE_PLUGIN_ARCH_LIBRARIES} | |
| > ${CMAKE_CURRENT_BINARY_DIR}/standalone_plugin.sos | |
| VERBATIM | |
| ) | |
| add_custom_target(iree_samples_custom_dispatch_cpu_standalone_plugin DEPENDS | |
| ${CMAKE_CURRENT_BINARY_DIR}/standalone_plugin.sos | |
| ) | |
| add_dependencies(iree-sample-deps iree_samples_custom_dispatch_cpu_standalone_plugin) | |
| iree_lit_test_suite( | |
| NAME | |
| standalone_example | |
| SRCS | |
| "standalone_example.mlir" | |
| DATA | |
| standalone_plugin.sos | |
| TOOLS | |
| FileCheck | |
| iree-compile | |
| iree-run-module | |
| LABELS | |
| "driver=local-sync" | |
| "hostonly" | |
| ) | |
| iree_lit_test_suite( | |
| NAME | |
| standalone_ukernel | |
| SRCS | |
| "standalone_ukernel.mlir" | |
| DATA | |
| standalone_plugin.sos | |
| TOOLS | |
| FileCheck | |
| iree-compile | |
| iree-run-module | |
| LABELS | |
| "driver=local-sync" | |
| "hostonly" | |
| ) | |
| endif(IREE_HAL_EXECUTABLE_PLUGIN_EMBEDDED_ELF) |