blob: 697b6750d53845d814ae1434c03d7e42f3e4ba15 [file] [log] [blame]
load("@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", "feature", "flag_group", "flag_set", "tool", "tool_path", "with_feature_set")
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
all_compile_actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile,
ACTION_NAMES.linkstamp_compile,
ACTION_NAMES.assemble,
ACTION_NAMES.preprocess_assemble,
ACTION_NAMES.cpp_header_parsing,
ACTION_NAMES.cpp_module_compile,
ACTION_NAMES.cpp_module_codegen,
ACTION_NAMES.clif_match,
ACTION_NAMES.lto_backend,
]
all_cpp_compile_actions = [
ACTION_NAMES.cpp_compile,
ACTION_NAMES.linkstamp_compile,
ACTION_NAMES.cpp_header_parsing,
ACTION_NAMES.cpp_module_compile,
ACTION_NAMES.cpp_module_codegen,
ACTION_NAMES.clif_match,
]
preprocessor_compile_actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile,
ACTION_NAMES.linkstamp_compile,
ACTION_NAMES.preprocess_assemble,
ACTION_NAMES.cpp_header_parsing,
ACTION_NAMES.cpp_module_compile,
ACTION_NAMES.clif_match,
]
codegen_compile_actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile,
ACTION_NAMES.linkstamp_compile,
ACTION_NAMES.assemble,
ACTION_NAMES.preprocess_assemble,
ACTION_NAMES.cpp_module_codegen,
ACTION_NAMES.lto_backend,
]
all_link_actions = [
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]
lto_index_actions = [
ACTION_NAMES.lto_index_for_executable,
ACTION_NAMES.lto_index_for_dynamic_library,
ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
]
# This defines a relatively minimal EFI toolchain based on host LLVM and no standard library or headers.
def _efi_k8_cc_toolchain_impl(ctx):
default_compile_flags_feature = feature(
name = "default_compile_flags",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = ([
flag_group(
flags = ["-target", "x86_64-unknown-windows"],
),
]),
),
flag_set(
actions = all_compile_actions,
flag_groups = ([
flag_group(
flags = ["-g"],
),
]),
with_features = [with_feature_set(features = ["dbg"])],
),
flag_set(
actions = all_compile_actions,
flag_groups = ([
flag_group(
# Don't bother with O3, this is an EFI toolchain. It's unlikely to gain much performance here
# and increases the risk of dangerous optimizations.
flags = ["-O2", "-DNDEBUG"],
),
]),
with_features = [with_feature_set(features = ["opt"])],
),
],
)
# "Hybrid" mode disables some MSVC C extensions (but keeps its ABI), but still identifies as MSVC.
# This is useful if code requires GNU extensions to work which are silently ignored in full MSVC mode.
# As EFI does not include Windows headers which depend on nonstandard C behavior this should be fine for most code.
# If this feature is disabled, the toolchain runs with MSVC C extensions fully enabled.
hybrid_gnu_msvc_feature = feature(
name = "hybrid_gnu_msvc",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = ["-D_MSC_VER=1920", "-fno-ms-compatibility", "-fno-ms-extensions"],
),
],
),
],
)
default_link_flags_feature = feature(
name = "default_link_flags",
enabled = True,
flag_sets = [
flag_set(
actions = all_link_actions + lto_index_actions,
flag_groups = ([
flag_group(
flags = [
"-target",
"x86_64-unknown-windows",
"-fuse-ld=lld",
"-Wl,-entry:efi_main",
"-Wl,-subsystem:efi_application",
"-Wl,/BASE:0x0",
"-nostdlib",
"build/toolchain/llvm-efi/fltused.o",
],
),
]),
),
],
)
lto_feature = feature(
name = "lto",
enabled = False,
flag_sets = [
flag_set(
actions = all_compile_actions + all_link_actions,
flag_groups = ([
flag_group(
flags = [
"-flto",
],
),
]),
),
],
)
tool_paths = [
tool_path(
name = "gcc",
path = "/usr/bin/clang",
),
tool_path(
name = "ld",
path = "/usr/bin/lld-link",
),
tool_path(
name = "ar",
path = "/usr/bin/llvm-ar",
),
tool_path(
name = "cpp",
path = "/bin/false",
),
tool_path(
name = "gcov",
path = "/bin/false",
),
tool_path(
name = "nm",
path = "/usr/bin/llvm-nm",
),
tool_path(
name = "objcopy",
# We can't use LLVM's objcopy until we pick up https://reviews.llvm.org/D106942
path = "/usr/bin/objcopy",
),
tool_path(
name = "objdump",
path = "/usr/bin/llvm-objdump",
),
tool_path(
name = "strip",
path = "/usr/bin/llvm-strip",
),
]
return cc_common.create_cc_toolchain_config_info(
ctx = ctx,
features = [default_link_flags_feature, default_compile_flags_feature, hybrid_gnu_msvc_feature, lto_feature],
# Needed for various compiler built-in headers and auxiliary data. No system libraries are being used.
cxx_builtin_include_directories = [
"/usr/lib64/clang",
],
toolchain_identifier = "k8-toolchain",
host_system_name = "local",
target_system_name = "x86_64-efi",
target_cpu = "k8",
target_libc = "none",
compiler = "clang",
abi_version = "none",
abi_libc_version = "none",
tool_paths = tool_paths,
)
efi_k8_cc_toolchain_config = rule(
implementation = _efi_k8_cc_toolchain_impl,
attrs = {},
provides = [CcToolchainConfigInfo],
)