418 lines · plain
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-exception4 5load("@rules_cc//cc:defs.bzl", "cc_library")6 7package(8 default_visibility = ["//visibility:public"],9 features = ["layering_check"],10)11 12licenses(["notice"])13 14cc_library(15 name = "config",16 defines = select({17 "@platforms//os:linux": [18 "COMPILER_RT_HAS_ATOMICS=1",19 "COMPILER_RT_HAS_FCNTL_LCK=1",20 "COMPILER_RT_HAS_UNAME=1",21 ],22 # Will raise error unless supported platforms.23 }),24 target_compatible_with = select({25 "@platforms//os:linux": [],26 "//conditions:default": ["@platforms//:incompatible"],27 }),28)29 30WIN32_ONLY_FILES = [31 "lib/profile/WindowsMMap.c",32]33 34cc_library(35 name = "profile",36 srcs = glob(37 [38 "lib/profile/*.c",39 "lib/profile/*.cpp",40 "lib/profile/*.h",41 ],42 exclude = WIN32_ONLY_FILES,43 ) + select({44 "@platforms//os:windows": WIN32_ONLY_FILES,45 "//conditions:default": [],46 }),47 hdrs = glob([48 "include/profile/*.h",49 "include/profile/*.inc",50 ]),51 includes = [52 "include",53 ],54 linkstatic = True,55 deps = [56 ":config",57 ],58)59 60cc_library(61 name = "orc_rt_common_headers",62 hdrs = [63 "lib/orc/adt.h",64 "lib/orc/bitmask_enum.h",65 "lib/orc/common.h",66 "lib/orc/compiler.h",67 "lib/orc/debug.h",68 "lib/orc/endianness.h",69 "lib/orc/error.h",70 "lib/orc/executor_address.h",71 "lib/orc/executor_symbol_def.h",72 "lib/orc/interval_map.h",73 "lib/orc/interval_set.h",74 "lib/orc/jit_dispatch.h",75 "lib/orc/record_section_tracker.h",76 "lib/orc/rtti.h",77 "lib/orc/simple_packed_serialization.h",78 "lib/orc/stl_extras.h",79 "lib/orc/string_pool.h",80 "lib/orc/unique_function.h",81 "lib/orc/wrapper_function_utils.h",82 ],83 strip_include_prefix = "lib/orc",84)85 86cc_library(87 name = "orc_rt",88 srcs = [89 "lib/orc/debug.cpp",90 "lib/orc/dlfcn_wrapper.cpp",91 "lib/orc/log_error_to_stderr.cpp",92 "lib/orc/rtti.cpp",93 "lib/orc/run_program_wrapper.cpp",94 ] + select({95 "@platforms//os:macos": [96 "lib/orc/macho_platform.cpp",97 "lib/orc/macho_platform.h",98 "lib/orc/macho_tlv.arm64.S",99 "lib/orc/macho_tlv.x86-64.S",100 ],101 "@platforms//os:linux": [102 "lib/orc/elfnix_platform.cpp",103 "lib/orc/elfnix_platform.h",104 "lib/orc/elfnix_tls.aarch64.S",105 "lib/orc/elfnix_tls.ppc64.S",106 "lib/orc/elfnix_tls.x86-64.S",107 ],108 }),109 hdrs = glob(["include/orc_rt/*.h"]),110 includes = ["include"],111 linkstatic = True,112 deps = [113 ":orc_rt_common_headers",114 ],115)116 117BUILTINS_CRTBEGIN_SRCS = ["lib/builtins/crtbegin.c"]118 119filegroup(120 name = "builtins_crtbegin_src",121 srcs = BUILTINS_CRTBEGIN_SRCS,122)123 124BUILTINS_CRTEND_SRCS = ["lib/builtins/crtend.c"]125 126filegroup(127 name = "builtins_crtend_src",128 srcs = BUILTINS_CRTEND_SRCS,129)130 131BUILTINS_HOSTED_SRCS = [132 "lib/builtins/clear_cache.c",133 "lib/builtins/emutls.c",134 "lib/builtins/enable_execute_stack.c",135 "lib/builtins/eprintf.c",136]137 138# Source files in the builtins library that build on top of libc and are only139# appropriate in hosted environments.140filegroup(141 name = "builtins_hosted_srcs",142 srcs = BUILTINS_HOSTED_SRCS,143)144 145BUILTINS_BF16_SRCS_PATTERNS = [146 "lib/builtins/*bf*.c",147]148 149# Source files for the 16-bit Brain floating-point number builtins.150filegroup(151 name = "builtins_bf16_srcs",152 srcs = glob(BUILTINS_BF16_SRCS_PATTERNS),153)154 155BUILTINS_X86_FP80_SRCS_PATTERNS = [156 # `xc` marks 80-bit complex number builtins.157 "lib/builtins/*xc*.c",158 159 # `xf` marks 80-bit floating-point builtins.160 "lib/builtins/*xf*.c",161]162 163# Source files for the 80-bit floating-point and complex number builtins.164filegroup(165 name = "builtins_x86_fp80_srcs",166 srcs = glob(167 BUILTINS_X86_FP80_SRCS_PATTERNS,168 exclude = BUILTINS_BF16_SRCS_PATTERNS,169 ),170)171 172BUILTINS_TF_SRCS_PATTERNS = [173 # `tc` marks 128-bit complex number builtins.174 "lib/builtins/*tc*.c",175 176 # `tf` marks 128-bit floating-point builtins.177 "lib/builtins/*tf*.c",178]179 180BUILTINS_TF_EXCLUDES = (181 BUILTINS_HOSTED_SRCS +182 BUILTINS_BF16_SRCS_PATTERNS +183 BUILTINS_X86_FP80_SRCS_PATTERNS184)185 186# Source files for the 128-bit floating-point and complex number builtins.187filegroup(188 name = "builtins_tf_srcs",189 srcs = glob(190 BUILTINS_TF_SRCS_PATTERNS,191 exclude = BUILTINS_TF_EXCLUDES,192 ),193)194 195BUILTNS_ATOMICS_SRCS = ["lib/builtins/atomic.c"]196 197filegroup(198 name = "builtins_atomics_srcs",199 srcs = BUILTNS_ATOMICS_SRCS + ["lib/builtins/assembly.h"],200)201 202BUILTINS_MACOS_ATOMIC_SRCS_PATTERNS = [203 "lib/builtins/atomic_*.c",204]205 206# Source files for macOS atomic builtins.207filegroup(208 name = "builtins_macos_atomic_srcs",209 srcs = glob(BUILTINS_MACOS_ATOMIC_SRCS_PATTERNS),210)211 212# Apple-platform specific SME source file.213filegroup(214 name = "builtins_aarch64_apple_sme_srcs",215 srcs = ["lib/builtins/aarch64/arm_apple_sme_abi.s"],216)217 218# Non-Apple platform SME sources. These sources assume function219# multi-versioning, `-fno-builtin`, `__ARM_UNALIGNED` feature support, and FP220# availability. Other configurations will need to add a new filegroup if221# desired.222filegroup(223 name = "builtins_aarch64_sme_srcs",224 srcs = [225 "lib/builtins/aarch64/sme-abi.S",226 "lib/builtins/aarch64/sme-abi-assert.c",227 ] + glob(["lib/builtins/aarch64/sme-libc-opt-*.S"]),228)229 230# A list of (pat, size, model) tuples for AArch64's outline atomics.231AARCH64_OUTLINE_ATOMICS = [232 (pat, size, model)233 for pat in [234 "cas",235 "swp",236 "ldadd",237 "ldclr",238 "ldeor",239 "ldset",240 ]241 for size in [242 "1",243 "2",244 "4",245 "8",246 "16",247 ]248 for model in [249 "1",250 "2",251 "3",252 "4",253 ]254 if pat == "cas" or size != "16"255]256 257AARCH64_OUTLINE_ATOMICS_FMT = "lib/builtins/aarch64/outline_atomic_{0}{1}_{2}.S"258 259# lse.S is compiled multiple times with different macros as the input. Model260# this as a genrule producing individual files with the macros at the start.261[[genrule(262 name = "builtins_aarch64_outline_atomic_" + pat + size + "_" + model,263 srcs = ["lib/builtins/aarch64/lse.S"],264 outs = [AARCH64_OUTLINE_ATOMICS_FMT.format(pat, size, model)],265 cmd = (266 "echo '#define L_" + pat + "' >> $(OUTS) && " +267 "echo '#define SIZE " + size + "' >> $(OUTS) && " +268 "echo '#define MODEL " + model + "' >> $(OUTS) && " +269 "cat $(SRCS) >> $(OUTS)"270 ),271)] for (pat, size, model) in AARCH64_OUTLINE_ATOMICS]272 273# Source files for the AArch64 architecture-specific builtins.274filegroup(275 name = "builtins_aarch64_srcs",276 srcs = [277 "lib/builtins/cpu_model/aarch64.c",278 "lib/builtins/cpu_model/aarch64.h",279 ] + [280 AARCH64_OUTLINE_ATOMICS_FMT.format(pat, size, model)281 for (pat, size, model) in AARCH64_OUTLINE_ATOMICS282 ] + glob(283 [284 "lib/builtins/cpu_model/AArch64*.inc",285 "lib/builtins/cpu_model/aarch64/**/*.inc",286 "lib/builtins/aarch64/*.S",287 "lib/builtins/aarch64/*.c",288 "lib/builtins/aarch64/*.cpp",289 ],290 allow_empty = True,291 exclude = [292 # This file isn't intended to directly compile, and instead is used293 # above to generate a collection of outline atomic helpers.294 "lib/builtins/aarch64/lse.S",295 # These files are provided by SME-specific file groups above.296 "lib/builtins/aarch64/*sme*",297 ],298 ),299)300 301BUILTINS_ARM_VFP_SRCS_PATTERNS = [302 "lib/builtins/arm/*vfp*.S",303 "lib/builtins/arm/*vfp*.c",304 "lib/builtins/arm/*vfp*.cpp",305]306 307# Source files for the ARM VFP-specific builtins.308filegroup(309 name = "builtins_arm_vfp_srcs",310 srcs = glob(311 BUILTINS_ARM_VFP_SRCS_PATTERNS,312 allow_empty = True,313 ),314)315 316# Source files for the ARM architecture-specific builtins.317filegroup(318 name = "builtins_arm_srcs",319 srcs = glob(320 [321 "lib/builtins/arm/*.S",322 "lib/builtins/arm/*.c",323 "lib/builtins/arm/*.cpp",324 ],325 allow_empty = True,326 exclude = BUILTINS_ARM_VFP_SRCS_PATTERNS,327 ),328)329 330# Source files for the PPC architecture-specific builtins.331filegroup(332 name = "builtins_ppc_srcs",333 srcs = glob(334 [335 "lib/builtins/ppc/*.S",336 "lib/builtins/ppc/*.c",337 "lib/builtins/ppc/*.cpp",338 ],339 allow_empty = True,340 ),341)342 343# Source files for the RISC-V architecture-specific builtins.344filegroup(345 name = "builtins_riscv_srcs",346 srcs = glob(347 [348 "lib/builtins/riscv/*.S",349 "lib/builtins/riscv/*.c",350 "lib/builtins/riscv/*.cpp",351 ],352 allow_empty = True,353 ),354)355 356# Source files for the x86 architecture specific builtins (both 32-bit and357# 64-bit).358filegroup(359 name = "builtins_x86_arch_srcs",360 srcs = [361 "lib/builtins/cpu_model/x86.c",362 "lib/builtins/i386/fp_mode.c",363 ],364)365 366# Source files for the x86-64 architecture specific builtins.367filegroup(368 name = "builtins_x86_64_srcs",369 srcs = glob(370 [371 "lib/builtins/x86_64/*.S",372 "lib/builtins/x86_64/*.c",373 "lib/builtins/x86_64/*.cpp",374 ],375 allow_empty = True,376 ),377)378 379# Source files for the 32-bit-specific x86 architecture specific builtins.380filegroup(381 name = "builtins_i386_srcs",382 srcs = glob(383 [384 "lib/builtins/i386/*.S",385 "lib/builtins/i386/*.c",386 "lib/builtins/i386/*.cpp",387 ],388 allow_empty = True,389 exclude = [390 # This file is used for both i386 and x86_64 and so included in the391 # broader x86 sources.392 "lib/builtins/i386/fp_mode.c",393 ],394 ),395)396 397# Source files for portable components of the compiler builtins library.398filegroup(399 name = "builtins_generic_srcs",400 srcs = ["lib/builtins/cpu_model/cpu_model.h"] + glob(401 [402 "lib/builtins/*.c",403 "lib/builtins/*.cpp",404 "lib/builtins/*.h",405 "lib/builtins/*.inc",406 ],407 allow_empty = True,408 exclude = (409 BUILTINS_CRTBEGIN_SRCS +410 BUILTINS_CRTEND_SRCS +411 BUILTINS_TF_EXCLUDES +412 BUILTINS_TF_SRCS_PATTERNS +413 BUILTNS_ATOMICS_SRCS +414 BUILTINS_MACOS_ATOMIC_SRCS_PATTERNS415 ),416 ),417)418