blob: 90264449de766443869f1ab139a4d78db4bfa8b6 [file]
# This file is 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
load("@rules_cc//cc:defs.bzl", "cc_library")
package(
default_visibility = ["//visibility:public"],
features = ["layering_check"],
)
licenses(["notice"])
cc_library(
name = "config",
defines = select({
"@platforms//os:linux": [
"COMPILER_RT_HAS_ATOMICS=1",
"COMPILER_RT_HAS_FCNTL_LCK=1",
"COMPILER_RT_HAS_UNAME=1",
],
# Will raise error unless supported platforms.
}),
target_compatible_with = select({
"@platforms//os:linux": [],
"//conditions:default": ["@platforms//:incompatible"],
}),
)
WIN32_ONLY_FILES = [
"lib/profile/WindowsMMap.c",
]
cc_library(
name = "profile",
srcs = glob(
[
"lib/profile/*.c",
"lib/profile/*.cpp",
"lib/profile/*.h",
],
exclude = WIN32_ONLY_FILES,
) + select({
"@platforms//os:windows": WIN32_ONLY_FILES,
"//conditions:default": [],
}),
hdrs = glob([
"include/profile/*.h",
"include/profile/*.inc",
]),
includes = [
"include",
],
linkstatic = True,
deps = [
":config",
],
)
cc_library(
name = "orc_rt_common_headers",
hdrs = [
"lib/orc/adt.h",
"lib/orc/bitmask_enum.h",
"lib/orc/common.h",
"lib/orc/compiler.h",
"lib/orc/debug.h",
"lib/orc/endianness.h",
"lib/orc/error.h",
"lib/orc/executor_address.h",
"lib/orc/executor_symbol_def.h",
"lib/orc/interval_map.h",
"lib/orc/interval_set.h",
"lib/orc/jit_dispatch.h",
"lib/orc/record_section_tracker.h",
"lib/orc/rtti.h",
"lib/orc/simple_packed_serialization.h",
"lib/orc/stl_extras.h",
"lib/orc/string_pool.h",
"lib/orc/unique_function.h",
"lib/orc/wrapper_function_utils.h",
],
strip_include_prefix = "lib/orc",
)
cc_library(
name = "orc_rt",
srcs = [
"lib/orc/debug.cpp",
"lib/orc/dlfcn_wrapper.cpp",
"lib/orc/log_error_to_stderr.cpp",
"lib/orc/rtti.cpp",
"lib/orc/run_program_wrapper.cpp",
] + select({
"@platforms//os:macos": [
"lib/orc/macho_platform.cpp",
"lib/orc/macho_platform.h",
"lib/orc/macho_tlv.arm64.S",
"lib/orc/macho_tlv.x86-64.S",
],
"@platforms//os:linux": [
"lib/orc/elfnix_platform.cpp",
"lib/orc/elfnix_platform.h",
"lib/orc/elfnix_tls.aarch64.S",
"lib/orc/elfnix_tls.ppc64.S",
"lib/orc/elfnix_tls.x86-64.S",
],
}),
hdrs = glob(["include/orc_rt/*.h"]),
includes = ["include"],
linkstatic = True,
deps = [
":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]
# Source files for the AArch64 architecture-specific builtins.
filegroup(
name = "builtins_aarch64_srcs",
srcs = [
"lib/builtins/cpu_model/aarch64.c",
"lib/builtins/cpu_model/aarch64.h",
] + [
AARCH64_OUTLINE_ATOMICS_FMT.format(pat, size, model)
for (pat, size, model) in AARCH64_OUTLINE_ATOMICS
] + glob(
[
"lib/builtins/cpu_model/AArch64*.inc",
"lib/builtins/cpu_model/aarch64/**/*.inc",
"lib/builtins/aarch64/*.S",
"lib/builtins/aarch64/*.c",
"lib/builtins/aarch64/*.cpp",
],
allow_empty = True,
exclude = [
# This file isn't intended to directly compile, and instead is used
# above to generate a collection of outline atomic helpers.
"lib/builtins/aarch64/lse.S",
# These files are provided by SME-specific file groups above.
"lib/builtins/aarch64/*sme*",
],
),
)
BUILTINS_ARM_VFP_SRCS_PATTERNS = [
"lib/builtins/arm/*vfp*.S",
"lib/builtins/arm/*vfp*.c",
"lib/builtins/arm/*vfp*.cpp",
]
# Source files for the ARM VFP-specific builtins.
filegroup(
name = "builtins_arm_vfp_srcs",
srcs = glob(
BUILTINS_ARM_VFP_SRCS_PATTERNS,
allow_empty = True,
),
)
# Source files for the ARM architecture-specific builtins.
filegroup(
name = "builtins_arm_srcs",
srcs = glob(
[
"lib/builtins/arm/*.S",
"lib/builtins/arm/*.c",
"lib/builtins/arm/*.cpp",
],
allow_empty = True,
exclude = BUILTINS_ARM_VFP_SRCS_PATTERNS,
),
)
# Source files for the PPC architecture-specific builtins.
filegroup(
name = "builtins_ppc_srcs",
srcs = glob(
[
"lib/builtins/ppc/*.S",
"lib/builtins/ppc/*.c",
"lib/builtins/ppc/*.cpp",
],
allow_empty = True,
),
)
# Source files for the RISC-V architecture-specific builtins.
filegroup(
name = "builtins_riscv_srcs",
srcs = glob(
[
"lib/builtins/riscv/*.S",
"lib/builtins/riscv/*.c",
"lib/builtins/riscv/*.cpp",
],
allow_empty = True,
),
)
# Source files for the x86 architecture specific builtins (both 32-bit and
# 64-bit).
filegroup(
name = "builtins_x86_arch_srcs",
srcs = [
"lib/builtins/cpu_model/x86.c",
"lib/builtins/i386/fp_mode.c",
],
)
# Source files for the x86-64 architecture specific builtins.
filegroup(
name = "builtins_x86_64_srcs",
srcs = glob(
[
"lib/builtins/x86_64/*.S",
"lib/builtins/x86_64/*.c",
"lib/builtins/x86_64/*.cpp",
],
allow_empty = True,
),
)
# Source files for the 32-bit-specific x86 architecture specific builtins.
filegroup(
name = "builtins_i386_srcs",
srcs = glob(
[
"lib/builtins/i386/*.S",
"lib/builtins/i386/*.c",
"lib/builtins/i386/*.cpp",
],
allow_empty = True,
exclude = [
# This file is used for both i386 and x86_64 and so included in the
# broader x86 sources.
"lib/builtins/i386/fp_mode.c",
],
),
)
# Source files for portable components of the compiler builtins library.
filegroup(
name = "builtins_generic_srcs",
srcs = ["lib/builtins/cpu_model/cpu_model.h"] + glob(
[
"lib/builtins/*.c",
"lib/builtins/*.cpp",
"lib/builtins/*.h",
"lib/builtins/*.inc",
],
allow_empty = True,
exclude = (
BUILTINS_CRTBEGIN_SRCS +
BUILTINS_CRTEND_SRCS +
BUILTINS_TF_EXCLUDES +
BUILTINS_TF_SRCS_PATTERNS +
BUILTNS_ATOMICS_SRCS +
BUILTINS_MACOS_ATOMIC_SRCS_PATTERNS
),
),
)