|  | # 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" | 
|  | "SRCS;COPTS" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | if(DEFINED _RULE_OUT) | 
|  | set(_OUT "${_RULE_OUT}") | 
|  | else() | 
|  | set(_OUT "${_RULE_NAME}.bc") | 
|  | 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}") | 
|  |  | 
|  | 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() |