blob: b5b7910d86beba924be8c3d20386fe840a8e94cb [file] [log] [blame]
# 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)