[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