[llvm] [Bazel] Export compiler-rt builtins sources (PR #157200)
Aaron Siddhartha Mondal via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 6 08:58:32 PDT 2025
================
@@ -113,3 +113,305 @@ cc_library(
":orc_rt_common_headers",
],
)
+
+BUILTINS_CRTBEGIN_SRCS = ["lib/builtins/crtbegin.c"]
+
+filegroup(
+ name = "builtins_crtbegin_src",
+ srcs = BUILTINS_CRTBEGIN_SRCS,
+)
+
+BUILTINS_CRTEND_SRCS = ["lib/builtins/crtend.c"]
+
+filegroup(
+ name = "builtins_crtend_src",
+ srcs = BUILTINS_CRTEND_SRCS,
+)
+
+BUILTINS_HOSTED_SRCS = [
+ "lib/builtins/clear_cache.c",
+ "lib/builtins/emutls.c",
+ "lib/builtins/enable_execute_stack.c",
+ "lib/builtins/eprintf.c",
+]
+
+# Source files in the builtins library that build on top of libc and are only
+# appropriate in hosted environments.
+filegroup(
+ name = "builtins_hosted_srcs",
+ srcs = BUILTINS_HOSTED_SRCS,
+)
+
+BUILTINS_BF16_SRCS_PATTERNS = [
+ "lib/builtins/*bf*.c",
+]
+
+# Source files for the 16-bit Brain floating-point number builtins.
+filegroup(
+ name = "builtins_bf16_srcs",
+ srcs = glob(BUILTINS_BF16_SRCS_PATTERNS),
+)
+
+BUILTINS_X86_FP80_SRCS_PATTERNS = [
+ # `xc` marks 80-bit complex number builtins.
+ "lib/builtins/*xc*.c",
+
+ # `xf` marks 80-bit floating-point builtins.
+ "lib/builtins/*xf*.c",
+]
+
+# Source files for the 80-bit floating-point and complex number builtins.
+filegroup(
+ name = "builtins_x86_fp80_srcs",
+ srcs = glob(
+ BUILTINS_X86_FP80_SRCS_PATTERNS,
+ exclude = BUILTINS_BF16_SRCS_PATTERNS,
+ ),
+)
+
+BUILTINS_TF_SRCS_PATTERNS = [
+ # `tc` marks 128-bit complex number builtins.
+ "lib/builtins/*tc*.c",
+
+ # `tf` marks 128-bit floating-point builtins.
+ "lib/builtins/*tf*.c",
+]
+
+BUILTINS_TF_EXCLUDES = (
+ BUILTINS_HOSTED_SRCS +
+ BUILTINS_BF16_SRCS_PATTERNS +
+ BUILTINS_X86_FP80_SRCS_PATTERNS
+)
+
+# Source files for the 128-bit floating-point and complex number builtins.
+filegroup(
+ name = "builtins_tf_srcs",
+ srcs = glob(
+ BUILTINS_TF_SRCS_PATTERNS,
+ exclude = BUILTINS_TF_EXCLUDES,
+ ),
+)
+
+BUILTNS_ATOMICS_SRCS = ["lib/builtins/atomic.c"]
+
+filegroup(
+ name = "builtins_atomics_srcs",
+ srcs = BUILTNS_ATOMICS_SRCS + ["lib/builtins/assembly.h"],
+)
+
+BUILTINS_MACOS_ATOMIC_SRCS_PATTERNS = [
+ "lib/builtins/atomic_*.c",
+]
+
+# Source files for macOS atomic builtins.
+filegroup(
+ name = "builtins_macos_atomic_srcs",
+ srcs = glob(BUILTINS_MACOS_ATOMIC_SRCS_PATTERNS),
+)
+
+# Apple-platform specific SME source file.
+filegroup(
+ name = "builtins_aarch64_apple_sme_srcs",
+ srcs = ["lib/builtins/aarch64/arm_apple_sme_abi.s"],
+)
+
+# Non-Apple platform SME sources. These sources assume function
+# multi-versioning, `-fno-builtin`, `__ARM_UNALIGNED` feature support, and FP
+# availability. Other configurations will need to add a new filegroup if
+# desired.
+filegroup(
+ name = "builtins_aarch64_sme_srcs",
+ srcs = [
+ "lib/builtins/aarch64/sme-abi.S",
+ "lib/builtins/aarch64/sme-abi-assert.c",
+ ] + glob(["lib/builtins/aarch64/sme-libc-opt-*.S"]),
+)
+
+# A list of (pat, size, model) tuples for AArch64's outline atomics.
+AARCH64_OUTLINE_ATOMICS = [
+ (pat, size, model)
+ for pat in [
+ "cas",
+ "swp",
+ "ldadd",
+ "ldclr",
+ "ldeor",
+ "ldset",
+ ]
+ for size in [
+ "1",
+ "2",
+ "4",
+ "8",
+ "16",
+ ]
+ for model in [
+ "1",
+ "2",
+ "3",
+ "4",
+ ]
+ if pat == "cas" or size != "16"
+]
+
+AARCH64_OUTLINE_ATOMICS_FMT = "lib/builtins/aarch64/outline_atomic_{0}{1}_{2}.S"
+
+# lse.S is compiled multiple times with different macros as the input. Model
+# this as a genrule producing individual files with the macros at the start.
+[[genrule(
+ name = "builtins_aarch64_outline_atomic_" + pat + size + "_" + model,
+ srcs = ["lib/builtins/aarch64/lse.S"],
+ outs = [AARCH64_OUTLINE_ATOMICS_FMT.format(pat, size, model)],
+ cmd = (
+ "echo '#define L_" + pat + "' >> $(OUTS) && " +
+ "echo '#define SIZE " + size + "' >> $(OUTS) && " +
+ "echo '#define MODEL " + model + "' >> $(OUTS) && " +
+ "cat $(SRCS) >> $(OUTS)"
+ ),
+)] for (pat, size, model) in AARCH64_OUTLINE_ATOMICS]
----------------
aaronmondal wrote:
nit: It looks like cmake uses the preprocessor here to resolve these values directly for the outputs. IIUC, prepending them to the sources could leak these defines to consumers. The `builtins_aarch64_srcs` seems to be a final target, so it wouldn't be noticeable in the llvm build itself.
Since these are `.S` files, I'm not sure how relevant this actually is. If it could be of concern, an alternative might be something like this which initially might seem inefficient but it appears that (at least with the toolchain i tested this with) it actually breaks after one iteration as the compiler comes first in this list (and the list itself has consistent ordering).
```python
cmd = """
$$(for tool in $(locations @bazel_tools//tools/cpp:current_cc_toolchain); do
if [[ $$tool == *clang ]] || [[ $$tool == *gcc ]]; then
echo $$tool
break
fi
done) -E WHATEVER_COMMAND_ARGS > $@
""",
tools = ["@bazel_tools//tools/cpp:current_cc_toolchain"],
```
https://github.com/llvm/llvm-project/blob/86ac4a02aa2609521d87e603132c04e2eda78751/compiler-rt/lib/builtins/CMakeLists.txt#L656
https://github.com/llvm/llvm-project/pull/157200
More information about the llvm-commits
mailing list