Files
carbon-lang/toolchain/driver/BUILD
T
Chandler CarruthandDana Jansens 35fb000536 Use a thread pool when building runtimes (#6133)
This parallelizes the compilations and dramatically reduces the time to
build runtimes.

As part of this, teach the driver infrastructure to have an option to
control the use of threads and to build the relevant thread pool and
thread it into the various APIs.

However, it requires our `ClangRunner` to become thread-safe and to
invoke Clang in a way that is thread-safe. This is somewhat challenging
as the code in `clang_main` is distinctly _not_ thread-safe.

To address this, the relevant logic of `clang_main`, especially the CC1
execution, is extracted into our runner and cleaned up to be much more
appropriate in a multithreaded context. Much of this code should
eventually be factored back into Clang, but that will be a follow-up
patch to upstream.

Last but not least, this rearranges the `ClangRunner` API to make a bit
more sense out of the different options for building runtimes, and have
a clean model for which things need to be passed in at which points.

---------

Co-authored-by: Dana Jansens <danakj@orodu.net>
2025-09-30 12:54:51 +00:00

330 lines
9.0 KiB
Python

# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
load("@rules_shell//shell:sh_test.bzl", "sh_test")
load("//bazel/cc_rules:defs.bzl", "cc_binary", "cc_library", "cc_test")
load("//bazel/cc_toolchains:defs.bzl", "cc_env")
load("//testing/fuzzing:rules.bzl", "cc_fuzz_test")
package(default_visibility = ["//visibility:public"])
filegroup(
name = "testdata",
srcs = glob([
"testdata/**/*.carbon",
"testdata/**/*.cpp",
]),
)
cc_library(
name = "clang_runner",
srcs = ["clang_runner.cpp"],
hdrs = ["clang_runner.h"],
deps = [
":llvm_runner",
":runtimes_cache",
":tool_runner_base",
"//common:error",
"//common:filesystem",
"//common:ostream",
"//common:vlog",
"//toolchain/base:runtime_sources",
"//toolchain/install:install_paths",
"@llvm-project//clang:basic",
"@llvm-project//clang:clang-driver",
"@llvm-project//clang:codegen",
"@llvm-project//clang:driver",
"@llvm-project//clang:frontend",
"@llvm-project//clang:frontend_tool",
"@llvm-project//clang:serialization",
"@llvm-project//llvm:Core",
"@llvm-project//llvm:Object",
"@llvm-project//llvm:Support",
"@llvm-project//llvm:TargetParser",
],
)
cc_test(
name = "clang_runner_test",
size = "small",
srcs = ["clang_runner_test.cpp"],
data = ["//toolchain/install:install_data"],
deps = [
":clang_runner",
":llvm_runner",
"//common:all_llvm_targets",
"//common:check",
"//common:ostream",
"//common:raw_string_ostream",
"//testing/base:capture_std_streams",
"//testing/base:file_helpers",
"//testing/base:global_exe_path",
"//testing/base:gtest_main",
"@googletest//:gtest",
"@llvm-project//llvm:Object",
"@llvm-project//llvm:Support",
"@llvm-project//llvm:TargetParser",
],
)
cc_binary(
name = "compile_benchmark",
testonly = 1,
srcs = ["compile_benchmark.cpp"],
deps = [
":driver",
"//common:all_llvm_targets",
"//testing/base:benchmark_main",
"//testing/base:global_exe_path",
"//testing/base:source_gen_lib",
"//toolchain/install:install_paths_test_helpers",
"//toolchain/testing:compile_helper",
"@google_benchmark//:benchmark",
"@llvm-project//llvm:Support",
],
)
sh_test(
name = "compile_benchmark_test",
size = "small",
srcs = [":compile_benchmark"],
args = [
"--benchmark_min_time=1x",
# The `$$` is repeated for Bazel escaping of `$`.
"--benchmark_filter=/256$$",
],
env = cc_env(),
)
cc_library(
name = "driver",
srcs = [
"build_runtimes_subcommand.cpp",
"build_runtimes_subcommand.h",
"clang_subcommand.cpp",
"clang_subcommand.h",
"codegen_options.cpp",
"codegen_options.h",
"compile_subcommand.cpp",
"compile_subcommand.h",
"driver.cpp",
"driver_env.h",
"driver_subcommand.cpp",
"format_subcommand.cpp",
"format_subcommand.h",
"language_server_subcommand.cpp",
"language_server_subcommand.h",
"link_subcommand.cpp",
"link_subcommand.h",
"lld_subcommand.cpp",
"lld_subcommand.h",
"llvm_subcommand.cpp",
"llvm_subcommand.h",
],
hdrs = [
"driver.h",
"driver_subcommand.h",
],
data = [
"//toolchain/install:install_data.no_driver",
],
textual_hdrs = ["flags.def"],
deps = [
":clang_runner",
":lld_runner",
":llvm_runner",
":runtimes_cache",
"//common:command_line",
"//common:error",
"//common:ostream",
"//common:pretty_stack_trace_function",
"//common:raw_string_ostream",
"//common:version",
"//common:vlog",
"//toolchain/base:clang_invocation",
"//toolchain/base:llvm_tools",
"//toolchain/base:shared_value_stores",
"//toolchain/base:timings",
"//toolchain/check",
"//toolchain/codegen",
"//toolchain/diagnostics:diagnostic_emitter",
"//toolchain/diagnostics:sorting_diagnostic_consumer",
"//toolchain/format",
"//toolchain/install:install_paths",
"//toolchain/language_server",
"//toolchain/lex",
"//toolchain/lower",
"//toolchain/parse",
"//toolchain/parse:tree",
"//toolchain/sem_ir:file",
"//toolchain/sem_ir:typed_insts",
"//toolchain/source:source_buffer",
"@llvm-project//llvm:Core",
"@llvm-project//llvm:MC",
"@llvm-project//llvm:Support",
"@llvm-project//llvm:TargetParser",
],
)
cc_test(
name = "driver_test",
size = "small",
srcs = ["driver_test.cpp"],
deps = [
":driver",
"//common:all_llvm_targets",
"//common:raw_string_ostream",
"//testing/base:file_helpers",
"//testing/base:global_exe_path",
"//testing/base:gtest_main",
"//toolchain/diagnostics:diagnostic_emitter",
"//toolchain/install:install_paths",
"//toolchain/lex:tokenized_buffer_test_helpers",
"//toolchain/testing:yaml_test_helpers",
"@googletest//:gtest",
"@llvm-project//llvm:Object",
"@llvm-project//llvm:Support",
],
)
cc_fuzz_test(
name = "driver_fuzzer",
size = "small",
srcs = ["driver_fuzzer.cpp"],
corpus = glob(["fuzzer_corpus/*"]),
deps = [
":driver",
"//common:exe_path",
"//common:raw_string_ostream",
"//testing/fuzzing:libfuzzer_header",
"//toolchain/install:install_paths",
"@llvm-project//llvm:Support",
],
)
cc_library(
name = "lld_runner",
srcs = ["lld_runner.cpp"],
hdrs = ["lld_runner.h"],
deps = [
":tool_runner_base",
"//common:ostream",
"//common:vlog",
"//toolchain/install:install_paths",
"@llvm-project//lld:Common",
"@llvm-project//lld:ELF",
"@llvm-project//lld:MachO",
"@llvm-project//llvm:Support",
],
)
cc_test(
name = "lld_runner_test",
size = "small",
srcs = ["lld_runner_test.cpp"],
deps = [
":clang_runner",
":lld_runner",
"//common:all_llvm_targets",
"//common:check",
"//common:ostream",
"//common:raw_string_ostream",
"//testing/base:capture_std_streams",
"//testing/base:file_helpers",
"//testing/base:global_exe_path",
"//testing/base:gtest_main",
"@googletest//:gtest",
"@llvm-project//llvm:Object",
"@llvm-project//llvm:Support",
"@llvm-project//llvm:TargetParser",
],
)
cc_library(
name = "llvm_runner",
srcs = ["llvm_runner.cpp"],
hdrs = ["llvm_runner.h"],
deps = [
":tool_runner_base",
"//common:ostream",
"//common:vlog",
"//toolchain/base:llvm_tools",
"//toolchain/install:install_paths",
"@llvm-project//lld:Common",
"@llvm-project//lld:ELF",
"@llvm-project//lld:MachO",
"@llvm-project//llvm:Support",
],
)
cc_test(
name = "llvm_runner_test",
size = "small",
srcs = ["llvm_runner_test.cpp"],
deps = [
":llvm_runner",
"//common:all_llvm_targets",
"//common:ostream",
"//common:raw_string_ostream",
"//testing/base:capture_std_streams",
"//testing/base:global_exe_path",
"//testing/base:gtest_main",
"@googletest//:gtest",
"@llvm-project//llvm:Support",
],
)
cc_library(
name = "runtimes_cache",
srcs = ["runtimes_cache.cpp"],
hdrs = ["runtimes_cache.h"],
deps = [
"//common:check",
"//common:error",
"//common:filesystem",
"//common:ostream",
"//common:version",
"//common:vlog",
"//toolchain/install:install_paths",
"@llvm-project//llvm:Support",
],
)
cc_test(
name = "runtimes_cache_test",
size = "small",
srcs = ["runtimes_cache_test.cpp"],
data = ["//toolchain/install:install_data"],
deps = [
":runtimes_cache",
"//common:check",
"//common:error_test_helpers",
"//common:filesystem",
"//common:ostream",
"//common:raw_string_ostream",
"//common:version",
"//testing/base:capture_std_streams",
"//testing/base:file_helpers",
"//testing/base:global_exe_path",
"//testing/base:gtest_main",
"@googletest//:gtest",
"@llvm-project//llvm:Support",
],
)
cc_library(
name = "tool_runner_base",
srcs = ["tool_runner_base.cpp"],
hdrs = ["tool_runner_base.h"],
data = [
"//toolchain/install:install_data.no_driver",
],
deps = [
"//common:ostream",
"//common:vlog",
"//toolchain/install:install_paths",
"@llvm-project//llvm:Support",
],
)