| # 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 |
| |
| include(CMakeParseArguments) |
| |
| # iree_bitcode_library() |
| # |
| # Builds an LLVM bitcode library from an input file via clang |
| # |
| # Parameters: |
| # NAME: Name of target (see Note). |
| # SRCS: Source files. Headers go here as well, as in iree_cc_library. There is |
| # no concept of public headers (HDRS) here. |
| # COPTS: additional flags to pass to clang. |
| # OUT: Output file name (defaults to NAME.bc). |
| function(iree_bitcode_library) |
| cmake_parse_arguments( |
| _RULE |
| "" |
| "NAME;OUT;ARCH" |
| "INTERNAL_HDRS;SRCS;COPTS" |
| ${ARGN} |
| ) |
| |
| if(DEFINED _RULE_OUT) |
| set(_OUT "${_RULE_OUT}") |
| else() |
| set(_OUT "${_RULE_NAME}.bc") |
| endif() |
| |
| # Produce an empty file if the compiler wouldn't use bitcode for this arch anyway. |
| iree_compiler_targeting_iree_arch(_IREE_COMPILER_TARGETING_THIS_ARCH "${_RULE_ARCH}") |
| if (NOT _IREE_COMPILER_TARGETING_THIS_ARCH) |
| iree_make_empty_file("${_OUT}") |
| return() |
| endif() |
| |
| iree_arch_to_llvm_arch(_LLVM_ARCH "${_RULE_ARCH}") |
| |
| set(_COPTS |
| # Target architecture. |
| "-target" "${_LLVM_ARCH}" |
| |
| # C17 with no system deps. |
| "-std=c17" |
| "-nostdinc" |
| "-ffreestanding" |
| |
| # Optimized and unstamped. |
| "-O3" |
| "-DNDEBUG" |
| "-fno-ident" |
| "-fdiscard-value-names" |
| |
| # Set the size of wchar_t to 4 bytes (instead of 2 bytes). |
| # This must match what the runtime is built with. |
| "-fno-short-wchar" |
| |
| # Enable inline asm. |
| "-fasm" |
| |
| # Object file only in bitcode format: |
| "-c" |
| "-emit-llvm" |
| |
| # Force the library into standalone mode (not depending on build-directory |
| # configuration). |
| "-DIREE_DEVICE_STANDALONE=1" |
| ) |
| |
| list(APPEND _COPTS "-isystem" "${IREE_CLANG_BUILTIN_HEADERS_PATH}") |
| list(APPEND _COPTS "-I" "${IREE_SOURCE_DIR}/runtime/src") |
| list(APPEND _COPTS "-I" "${IREE_BINARY_DIR}/runtime/src") |
| list(APPEND _COPTS "${_RULE_COPTS}") |
| |
| if (_RULE_ARCH STREQUAL "arm_32") |
| # Silence "warning: unknown platform, assuming -mfloat-abi=soft" |
| list(APPEND _COPTS "-mfloat-abi=soft") |
| elseif(_RULE_ARCH STREQUAL "riscv_32") |
| # On RISC-V, linking LLVM modules requires matching target-abi. |
| # https://lists.llvm.org/pipermail/llvm-dev/2020-January/138450.html |
| # The choice of ilp32d is simply what we have in existing riscv_32 tests. |
| # Open question - how do we scale to supporting all RISC-V ABIs? |
| list(APPEND _COPTS "-mabi=ilp32d") |
| elseif(_RULE_ARCH STREQUAL "riscv_64") |
| # Same comments as above riscv_32 case. |
| list(APPEND _COPTS "-mabi=lp64d") |
| endif() |
| |
| set(_BITCODE_FILES) |
| foreach(_SRC ${_RULE_SRCS}) |
| get_filename_component(_BITCODE_SRC_PATH "${_SRC}" REALPATH) |
| set(_BITCODE_FILE "${_RULE_NAME}_${_SRC}.bc") |
| list(APPEND _BITCODE_FILES ${_BITCODE_FILE}) |
| add_custom_command( |
| OUTPUT |
| "${_BITCODE_FILE}" |
| COMMAND |
| "${IREE_CLANG_BINARY}" |
| ${_COPTS} |
| "${_BITCODE_SRC_PATH}" |
| "-o" |
| "${_BITCODE_FILE}" |
| DEPENDS |
| "${IREE_CLANG_BINARY}" |
| "${_SRC}" |
| "${_RULE_INTERNAL_HDRS}" |
| COMMENT |
| "Compiling ${_SRC} to ${_BITCODE_FILE}" |
| VERBATIM |
| ) |
| endforeach() |
| |
| add_custom_command( |
| OUTPUT |
| ${_OUT} |
| COMMAND |
| ${IREE_LLVM_LINK_BINARY} |
| ${_BITCODE_FILES} |
| "-o" |
| "${_OUT}" |
| DEPENDS |
| ${IREE_LLVM_LINK_BINARY} |
| ${_BITCODE_FILES} |
| COMMENT |
| "Linking bitcode to ${_OUT}" |
| VERBATIM |
| ) |
| |
| # Only add iree_${NAME} as custom target doesn't support aliasing to |
| # iree::${NAME}. |
| iree_package_name(_PACKAGE_NAME) |
| add_custom_target("${_PACKAGE_NAME}_${_RULE_NAME}" |
| DEPENDS "${_OUT}" |
| ) |
| endfunction() |
| |
| function(iree_cuda_bitcode_library) |
| cmake_parse_arguments( |
| _RULE |
| "" |
| "NAME;OUT;CUDA_ARCH" |
| "SRCS;COPTS" |
| ${ARGN} |
| ) |
| |
| if(DEFINED _RULE_OUT) |
| set(_OUT "${_RULE_OUT}") |
| else() |
| set(_OUT "${_RULE_NAME}.bc") |
| endif() |
| |
| set(_CUDA_ARCH "${_RULE_CUDA_ARCH}") |
| |
| set(_COPTS |
| "-x" "cuda" |
| |
| # Target architecture. |
| "--cuda-gpu-arch=${_CUDA_ARCH}" |
| |
| "--cuda-path=${CUDAToolkit_ROOT}" |
| |
| # Suppress warnings about missing path to cuda lib, |
| # and benign warning about CUDA version. |
| "-Wno-unknown-cuda-version" |
| "-nocudalib" |
| "--cuda-device-only" |
| |
| # https://github.com/llvm/llvm-project/issues/54609 |
| "-D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH" |
| |
| # Optimized and unstamped. |
| "-O3" |
| |
| # Object file only in bitcode format: |
| "-c" |
| "-emit-llvm" |
| ) |
| |
| set(_BITCODE_FILES) |
| foreach(_SRC ${_RULE_SRCS}) |
| get_filename_component(_BITCODE_SRC_PATH "${_SRC}" REALPATH) |
| set(_BITCODE_FILE "${_RULE_NAME}_${_SRC}.bc") |
| list(APPEND _BITCODE_FILES ${_BITCODE_FILE}) |
| add_custom_command( |
| OUTPUT |
| "${_BITCODE_FILE}" |
| COMMAND |
| "${IREE_CLANG_BINARY}" |
| ${_COPTS} |
| "${_BITCODE_SRC_PATH}" |
| "-o" |
| "${_BITCODE_FILE}" |
| DEPENDS |
| "${IREE_CLANG_BINARY}" |
| "${_SRC}" |
| COMMENT |
| "Compiling ${_SRC} to ${_BITCODE_FILE}" |
| VERBATIM |
| ) |
| endforeach() |
| |
| add_custom_command( |
| OUTPUT |
| ${_OUT} |
| COMMAND |
| ${IREE_LLVM_LINK_BINARY} |
| ${_BITCODE_FILES} |
| "-o" |
| "${_OUT}" |
| DEPENDS |
| ${IREE_LLVM_LINK_BINARY} |
| ${_BITCODE_FILES} |
| COMMENT |
| "Linking bitcode to ${_OUT}" |
| VERBATIM |
| ) |
| |
| # Only add iree_${NAME} as custom target doesn't support aliasing to |
| # iree::${NAME}. |
| iree_package_name(_PACKAGE_NAME) |
| add_custom_target("${_PACKAGE_NAME}_${_RULE_NAME}" |
| DEPENDS "${_OUT}" |
| ) |
| endfunction() |
| |
| |
| # iree_link_bitcode() |
| # |
| # Builds an LLVM bitcode library from an input file via clang |
| # |
| # Parameters: |
| # NAME: Name of target (see Note). |
| # SRCS: Source files to pass to clang. |
| # OUT: Output file name (defaults to NAME.bc). |
| function(iree_link_bitcode) |
| cmake_parse_arguments( |
| _RULE |
| "" |
| "NAME;OUT" |
| "SRCS" |
| ${ARGN} |
| ) |
| |
| if(DEFINED _RULE_OUT) |
| set(_OUT "${_RULE_OUT}") |
| else() |
| set(_OUT "${_RULE_NAME}.bc") |
| endif() |
| |
| set(_BITCODE_FILES "${_RULE_SRCS}") |
| |
| add_custom_command( |
| OUTPUT |
| ${_OUT} |
| COMMAND |
| ${IREE_LLVM_LINK_BINARY} |
| ${_BITCODE_FILES} |
| "-o" |
| "${_OUT}" |
| DEPENDS |
| ${IREE_LLVM_LINK_BINARY} |
| ${_BITCODE_FILES} |
| COMMENT |
| "Linking bitcode to ${_OUT}" |
| VERBATIM |
| ) |
| |
| # Only add iree_${NAME} as custom target doesn't support aliasing to |
| # iree::${NAME}. |
| iree_package_name(_PACKAGE_NAME) |
| add_custom_target("${_PACKAGE_NAME}_${_RULE_NAME}" |
| DEPENDS "${_OUT}" |
| ) |
| endfunction() |