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