xref: /llvm-project/utils/bazel/llvm-project-overlay/llvm/tblgen.bzl (revision cb53febe3d2f9b8e648d12b50915086d5774bcec)
1# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
2# See https://llvm.org/LICENSE.txt for license information.
3# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4
5"""This file contains BUILD extensions for generating source code from LLVM's
6table definition files using the TableGen tool.
7
8See http://llvm.org/cmds/tblgen.html for more information on the TableGen
9tool.
10TODO(chandlerc): Currently this expresses include-based dependencies as
11"sources", and has no transitive understanding due to these files not being
12correctly understood by the build system.
13"""
14
15def gentbl(
16        name,
17        tblgen,
18        td_file,
19        td_srcs,
20        tbl_outs,
21        library = True,
22        tblgen_args = "",
23        **kwargs):
24    """gentbl() generates tabular code from a table definition file.
25
26    Args:
27      name: The name of the build rule for use in dependencies.
28      tblgen: The binary used to produce the output.
29      td_file: The primary table definitions file.
30      td_srcs: A list of table definition files included transitively.
31      tbl_outs: A list of tuples (opts, out), where each opts is a string of
32        options passed to tblgen, and the out is the corresponding output file
33        produced.
34      library: Whether to bundle the generated files into a library.
35      tblgen_args: Extra arguments string to pass to the tblgen binary.
36      **kwargs: Keyword arguments to pass to subsidiary cc_library() rule.
37    """
38    llvm_project_execroot_path = Label("//llvm:tblgen.bzl").workspace_root
39
40    if td_file not in td_srcs:
41        td_srcs += [td_file]
42    for (opts, out) in tbl_outs:
43        rule_suffix = "_".join(opts.replace("-", "_").replace("=", "_").split(" "))
44        native.genrule(
45            name = "%s_%s_genrule" % (name, rule_suffix),
46            srcs = td_srcs,
47            outs = [out],
48            tools = [tblgen],
49            message = "Generating code from table: %s" % td_file,
50            cmd = (("$(location %s) -I %s/llvm/include " +
51                    "-I %s/clang/include " +
52                    "-I $$(dirname $(location %s)) " +
53                    "%s $(location %s) %s -o $@") % (
54                tblgen,
55                llvm_project_execroot_path,
56                llvm_project_execroot_path,
57                td_file,
58                opts,
59                td_file,
60                tblgen_args,
61            )),
62        )
63
64    # For now, all generated files can be assumed to comprise public interfaces.
65    # If this is not true, you should specify library = False
66    # and list the generated '.inc' files in "srcs".
67    if library:
68        native.cc_library(
69            name = name,
70            # FIXME: This should be `textual_hdrs` instead of `hdrs`, but
71            # unfortunately that doesn't work with `strip_include_prefix`:
72            # https://github.com/bazelbuild/bazel/issues/12424
73            #
74            # Once that issue is fixed and released, we can switch this to
75            # `textual_hdrs` and remove the feature disabling the various Bazel
76            # features (both current and under-development) that motivated the
77            # distinction between these two.
78            hdrs = [f for (_, f) in tbl_outs],
79            features = ["-parse_headers", "-header_modules"],
80            **kwargs
81        )
82