|  | # Copyright 2019 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 | 
|  |  | 
|  | """Rules for compiling IREE executables, modules, and archives.""" | 
|  |  | 
|  | load("//build_tools/embed_data:build_defs.bzl", "c_embed_data") | 
|  |  | 
|  | # TODO(benvanik): port to a full starlark rule, document, etc. | 
|  |  | 
|  | def iree_bytecode_module( | 
|  | name, | 
|  | src, | 
|  | flags, | 
|  | module_name = None, | 
|  | compile_tool = "//tools:iree-compile", | 
|  | linker_tool = "@llvm-project//lld:lld", | 
|  | c_identifier = "", | 
|  | static_lib_path = "", | 
|  | deps = [], | 
|  | **kwargs): | 
|  | """Builds an IREE bytecode module. | 
|  |  | 
|  | Args: | 
|  | name: Name of the target | 
|  | src: mlir source file to be compiled to an IREE module. | 
|  | flags: additional flags to pass to the compiler. | 
|  | `--output-format=vm-bytecode` is included automatically. | 
|  | module_name: Optional name for the generated IREE module. | 
|  | Defaults to `name.vmfb`. | 
|  | compile_tool: the compiler to use to generate the module. | 
|  | Defaults to iree-compile. | 
|  | linker_tool: the linker to use. | 
|  | Defaults to the lld from the llvm-project directory. | 
|  | c_identifier: Optional. Enables embedding the module as C data. | 
|  | static_lib_path: When set, the module is compiled into a LLVM static | 
|  | library with the specified library path. | 
|  | deps: Optional. Dependencies to add to the generated library. | 
|  | **kwargs: any additional attributes to pass to the underlying rules. | 
|  | """ | 
|  |  | 
|  | if not module_name: | 
|  | module_name = "%s.vmfb" % (name) | 
|  |  | 
|  | out_files = [module_name] | 
|  | flags += [ | 
|  | "--output-format=vm-bytecode", | 
|  | "--mlir-print-op-on-diagnostic=false", | 
|  | ] | 
|  | if static_lib_path: | 
|  | static_header_path = static_lib_path.replace(".o", ".h") | 
|  | out_files.extend([static_lib_path, static_header_path]) | 
|  | flags += [ | 
|  | "--iree-llvmcpu-link-embedded=false", | 
|  | "--iree-llvmcpu-link-static", | 
|  | "--iree-llvmcpu-static-library-output-path=$(location %s)" % (static_lib_path), | 
|  | ] | 
|  |  | 
|  | native.genrule( | 
|  | name = name, | 
|  | srcs = [src], | 
|  | outs = out_files, | 
|  | cmd = " && ".join([ | 
|  | " ".join([ | 
|  | "$(location %s)" % (compile_tool), | 
|  | " ".join(flags), | 
|  | "--iree-llvmcpu-embedded-linker-path=$(location %s)" % (linker_tool), | 
|  | "--iree-llvmcpu-wasm-linker-path=$(location %s)" % (linker_tool), | 
|  | # Note: --iree-llvmcpu-system-linker-path is left unspecified. | 
|  | "-o $(location %s)" % (module_name), | 
|  | "$(location %s)" % (src), | 
|  | ]), | 
|  | ]), | 
|  | tools = [compile_tool, linker_tool], | 
|  | message = "Compiling IREE module %s..." % (name), | 
|  | output_to_bindir = 1, | 
|  | **kwargs | 
|  | ) | 
|  |  | 
|  | # Embed the module for use in C. | 
|  | if c_identifier: | 
|  | c_embed_data( | 
|  | name = "%s_c" % (name), | 
|  | identifier = c_identifier, | 
|  | srcs = [module_name], | 
|  | c_file_output = "%s_c.c" % (name), | 
|  | h_file_output = "%s_c.h" % (name), | 
|  | flatten = True, | 
|  | deps = deps, | 
|  | **kwargs | 
|  | ) |