aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/llvm/llvm.bzl
diff options
context:
space:
mode:
authorGravatar Peter Hawkins <phawkins@google.com>2016-11-22 12:05:41 -0800
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2016-11-22 12:26:17 -0800
commitb523c97794e7adfa835921b36af0b5b9edf16a39 (patch)
treee3e78ba11ed98064d5859c9cb0cb6e9c0822b6c0 /third_party/llvm/llvm.bzl
parente30933420a010fc05fdf97a406a4b4b8a1bf75ff (diff)
Adds a Bazel BUILD for LLVM.
Change: 139938302
Diffstat (limited to 'third_party/llvm/llvm.bzl')
-rw-r--r--third_party/llvm/llvm.bzl149
1 files changed, 149 insertions, 0 deletions
diff --git a/third_party/llvm/llvm.bzl b/third_party/llvm/llvm.bzl
new file mode 100644
index 0000000000..1d6bf1c706
--- /dev/null
+++ b/third_party/llvm/llvm.bzl
@@ -0,0 +1,149 @@
+"""This file contains BUILD extensions for generating source code from LLVM's table definition files using the TableGen tool.
+
+See http://llvm.org/cmds/tblgen.html for more information on the TableGen
+tool.
+TODO(chandlerc): Currently this expresses include-based dependencies as
+"sources", and has no transitive understanding due to these files not being
+correctly understood by the build system.
+"""
+
+def gentbl(name, tblgen, td_file, td_srcs, tbl_outs, library = True, **kwargs):
+ """gentbl() generates tabular code from a table definition file.
+
+ Args:
+ name: The name of the build rule for use in dependencies.
+ tblgen: The binary used to produce the output.
+ td_file: The primary table definitions file.
+ td_srcs: A list of table definition files included transitively.
+ tbl_outs: A list of tuples (opts, out), where each opts is a string of
+ options passed to tblgen, and the out is the corresponding output file
+ produced.
+ library: Whether to bundle the generated files into a library.
+ **kwargs: Keyword arguments to pass to subsidiary cc_library() rule.
+ """
+ if td_file not in td_srcs:
+ td_srcs += [td_file]
+ includes = []
+ for (opts, out) in tbl_outs:
+ outdir = out[:out.rindex("/")]
+ if outdir not in includes:
+ includes.append(outdir)
+ rule_suffix = "_".join(opts.replace("-", "_").replace("=", "_").split(" "))
+ native.genrule(
+ name="%s_%s_genrule" % (name, rule_suffix),
+ srcs=td_srcs,
+ outs=[out],
+ tools=[tblgen],
+ message="Generating code from table: %s" % td_file,
+ cmd=(("$(location %s) " + "-I external/llvm/include " +
+ "-I external/llvm/tools/clang/include " +
+ "-I $$(dirname $(location %s)) " + "%s $(location %s) -o $@") % (
+ tblgen, td_file, opts, td_file)))
+ # For now, all generated files can be assumed to comprise public interfaces.
+ # If this is not true, you should specify library = False
+ # and list the generated '.inc' files in "srcs".
+ if library:
+ native.cc_library(name=name, textual_hdrs=[f for (_, f) in tbl_outs],
+ includes=includes, **kwargs)
+
+
+# Rule for simple expansion of template files. This performs a simple
+# search over the template file for the keys in substitutions,
+# and replaces them with the corresponding values.
+#
+# Typical usage:
+# load("/tools/build_rules/expand_header_template", "expand_header_template")
+# expand_header_template(
+# name = "ExpandMyTemplate",
+# template = "my.template",
+# out = "my.txt",
+# substitutions = {
+# "$VAR1": "foo",
+# "$VAR2": "bar",
+# }
+# )
+#
+# Args:
+# name: The name of the rule.
+# template: The template file to expand
+# out: The destination of the expanded file
+# substitutions: A dictionary mapping strings to their substitutions
+
+def expand_header_template_impl(ctx):
+ ctx.template_action(
+ template = ctx.file.template,
+ output = ctx.outputs.out,
+ substitutions = ctx.attr.substitutions,
+ )
+
+expand_header_template = rule(
+ implementation = expand_header_template_impl,
+ attrs = {
+ "template": attr.label(mandatory=True, allow_files=True, single_file=True),
+ "substitutions": attr.string_dict(mandatory=True),
+ "out": attr.output(mandatory=True),
+ },
+ # output_to_genfiles is required for header files.
+ output_to_genfiles = True,
+)
+
+
+def llvm_target_cmake_vars(native_arch, target_triple):
+ return {
+ "LLVM_HOST_TRIPLE": target_triple,
+ "LLVM_DEFAULT_TARGET_TRIPLE": target_triple,
+ "LLVM_NATIVE_ARCH": native_arch,
+ }
+
+def _quote(s):
+ """Quotes the given string for use in a shell command.
+
+ This function double-quotes the given string (in case it contains spaces or
+ other special characters) and escapes any special characters (dollar signs,
+ double-quotes, and backslashes) that may be present.
+
+ Args:
+ s: The string to quote.
+ Returns:
+ An escaped and quoted version of the string that can be passed to a shell
+ command.
+ """
+ return ('"' +
+ s.replace("\\", "\\\\").replace("$", "\\$").replace('"', '\\"') +
+ '"')
+
+def cmake_var_string(cmake_vars):
+ """Converts a dictionary to an input suitable for expand_cmake_vars.
+
+ Ideally we would jist stringify in the expand_cmake_vars() rule, but select()
+ interacts badly with genrules.
+
+ TODO(phawkins): replace the genrule() with native rule and delete this rule.
+
+ Args:
+ cmake_vars: a dictionary with string keys and values that are convertable to
+ strings.
+ """
+ return " ".join([_quote("{}={}".format(k, str(v)))
+ for (k, v) in cmake_vars.items()])
+
+def expand_cmake_vars(name, src, dst, cmake_vars):
+ """Expands #cmakedefine, #cmakedefine01, and CMake variables in a text file.
+
+ Args:
+ name: the name of the rule
+ src: the input of the rule
+ dst: the output of the rule
+ cmake_vars: a string containing the CMake variables, as generated by
+ cmake_var_string.
+ """
+ expand_cmake_vars_tool = "@//third_party/llvm:expand_cmake_vars"
+ native.genrule(
+ name = name,
+ srcs = [src],
+ tools = [expand_cmake_vars_tool],
+ outs = [dst],
+ cmd = ("$(location {}) ".format(expand_cmake_vars_tool) + cmake_vars +
+ "< $< > $@")
+ )
+