| # 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 | 
 |         ) |