Skip to content

Commit 5c3e987

Browse files
PikachuHyAcopybara-github
authored andcommitted
[4/5] support C++20 Modules, support one phase compilation
I split the XXL PR bazelbuild/bazel#19940 into several small patches. This is the fourth patch of Support C++20 Modules, which supports one phase compilation. ## Changes of build graph First, files are scanned, resulting in the creation of `.ddi` files. If the compiler being used is Clang, the tool `clang-scan-deps` is employed. Next, the generated `.ddi` files are aggregated into a `.CXXModules.json` file using the `aggregate-ddi` tool. Following this, the `.CXXModules.json` file, along with the `.ddi` files, is used to generate `.modmap` files through the `generate-modmap` tool. Finally, the source files are compiled into object files. If a file is a module interface, a corresponding module file is produced as a byproduct. The following diagram illustrates the scanning process. ``` ┌────────┐ ┌────────┐ ┌────────┐ │foo.cppm│ │bar.cppm│ │main.cc │ └────┬───┘ └────┬───┘ └────┬───┘ │ c++-module-deps-scanning │ │ │ │ │ ┌────▼───┐ ┌────▼───┐ ┌────▼───┐ │foo.ddi │ │bar.ddi │ │main.ddi│ └────┬───┘ └────┬───┘ └────┬───┘ │ │ │ └───────────────────────────┼───────────────────────────┘ │aggregate-ddi ┌────────▼───────────┐ │demo.CXXModules.json│ └────────────────────┘ ``` The following diagram illustrates the compile process of `foo.cppm`. ``` ┌────────────────────┐ │demo.CXXModules.json│ └─────┬──────────────┘ │ │ ┌───────┐ │ ┌───────────┐ ┌─►│foo.ddi├─────────┤ │ bar.cppm │ │ └───────┘ │ └─────┬─────┘ │ │ │ │ │ │ │ │ │ c++-module-deps-scanning │ │ │ ┌────────┐ │ ┌───────┐ ┌─────▼────┐ ┌────▼─────┐ │foo.cppm├─────────────────────┴─►│foo.d │ │foo.modmap│ │ bar.pcm │ └───┬────┘ └──┬────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ │ │◄───────────────────────────────┴─────────────┴─────────────────┘ │ c++20-module-compile ┌────────▼─────────┐ │ foo.pcm && foo.o │ └──────────────────┘ ``` ## Changes of compile I modified the CppCompileAction to include the relevant context, inputs, and outputs. Context: Module files and `.CXXModules.json` files Inputs: Module files, `.modmap` file, and `.modmap.input` file Outputs: Module files and `.CXXModules.json` files The primary difference in CppCompileAction is the addition of the `computeUsedCpp20Modules` function. The restart mechanism is utilized; if the necessary C++20 Modules files are not ready during compilation, the current compilation will exit and wait for an appropriate time to recompile. Closes #22553. PiperOrigin-RevId: 826606472 Change-Id: I7548ebfbf71a1faaa5d08317429a1e77e2454b54
1 parent 9b9efed commit 5c3e987

File tree

3 files changed

+757
-6
lines changed

3 files changed

+757
-6
lines changed

cc/private/cc_info.bzl

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,55 @@ def create_compilation_context_with_extra_header_tokens(
538538
_header_info = cc_compilation_context._header_info,
539539
)
540540

541+
def create_cc_compilation_context_with_cpp20_modules(
542+
*,
543+
cc_compilation_context,
544+
cpp_module_files,
545+
pic_cpp_module_files,
546+
cpp_modules_info_file,
547+
pic_cpp_modules_info_file):
548+
"""
549+
Creates a CcCompilationContextInfo provider with C++20 Modules
550+
551+
Args:
552+
cc_compilation_context: The CcCompilationContextInfo provider to copy.
553+
cpp_module_files: C++20 Module files.
554+
pic_cpp_module_files: PIC C++20 Module files.
555+
cpp_modules_info_file: C++20 Modules info file.
556+
pic_cpp_modules_info_file: PIC C++20 Modules info file.
557+
558+
Returns:
559+
A CcCompilationContextInfo provider with the same data as the given one, but with the
560+
C++20 Modules info.
561+
"""
562+
return CcCompilationContextInfo(
563+
defines = cc_compilation_context.defines,
564+
local_defines = cc_compilation_context.local_defines,
565+
headers = cc_compilation_context.headers,
566+
direct_headers = cc_compilation_context.direct_headers,
567+
direct_public_headers = cc_compilation_context.direct_public_headers,
568+
direct_private_headers = cc_compilation_context.direct_private_headers,
569+
direct_textual_headers = cc_compilation_context.direct_textual_headers,
570+
includes = cc_compilation_context.includes,
571+
quote_includes = cc_compilation_context.quote_includes,
572+
system_includes = cc_compilation_context.system_includes,
573+
framework_includes = cc_compilation_context.framework_includes,
574+
external_includes = cc_compilation_context.external_includes,
575+
validation_artifacts = cc_compilation_context.validation_artifacts,
576+
_virtual_to_original_headers = cc_compilation_context._virtual_to_original_headers,
577+
_module_map = cc_compilation_context._module_map,
578+
_exporting_module_maps = cc_compilation_context._exporting_module_maps,
579+
_non_code_inputs = cc_compilation_context._non_code_inputs,
580+
_transitive_modules = cc_compilation_context._transitive_modules,
581+
_transitive_pic_modules = cc_compilation_context._transitive_pic_modules,
582+
_direct_module_maps = cc_compilation_context._direct_module_maps,
583+
_header_info = cc_compilation_context._header_info,
584+
_module_files = depset(cpp_module_files, transitive = [cc_compilation_context._module_files]),
585+
_pic_module_files = depset(pic_cpp_module_files, transitive = [cc_compilation_context._pic_module_files]),
586+
_module_info_files = depset(cpp_modules_info_file, transitive = [cc_compilation_context._module_info_files]),
587+
_pic_module_info_files = depset(pic_cpp_modules_info_file, transitive = [cc_compilation_context._pic_module_info_files]),
588+
)
589+
541590
def merge_cc_infos(*, direct_cc_infos = [], cc_infos = []):
542591
"""
543592
Merges multiple `CcInfo`s into one.

cc/private/compile/cc_compilation_outputs.bzl

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ CcCompilationOutputsInfo = provider(
3737
"temps": '(() -> depset[File]) All artifacts that are created if "--save_temps" is true.',
3838
"_header_tokens": "(list[File]) All token .h.processed files created when preprocessing or parsing headers.",
3939
"_module_files": "(list[File]) All .pcm files built by the target.",
40+
"cpp_module_files": "(list[File]) All .pcm files built by the target's C++20 Modules interface.",
41+
"pic_cpp_module_files": "(list[File]) All .pic.pcm files built by the target's C++20 Modules interface.",
42+
"cpp_modules_info_file": "(File) .CXXModules.json file created by the target.",
43+
"pic_cpp_modules_info_file": "(File) .CXXModules.json file created by the target.",
4044
},
4145
)
4246

@@ -51,7 +55,11 @@ def create_compilation_outputs_internal(
5155
pic_gcno_files = [],
5256
temps = [],
5357
header_tokens = [],
54-
module_files = []):
58+
module_files = [],
59+
cpp_module_files = [],
60+
pic_cpp_module_files = [],
61+
cpp_modules_info_file = None,
62+
pic_cpp_modules_info_file = None):
5563
"""Creates a CcCompilationOutputsInfo provider.
5664
5765
Args:
@@ -65,6 +73,10 @@ def create_compilation_outputs_internal(
6573
temps: A depset of temporary files.
6674
header_tokens: A list of header tokens.
6775
module_files: A list of module files.
76+
cpp_module_files: A list of C++ module files.
77+
pic_cpp_module_files: A list of PIC C++ module files.
78+
cpp_modules_info_file: A C++ modules info file.
79+
pic_cpp_modules_info_file: A PIC C++ modules info file.
6880
6981
Returns:
7082
A CcCompilationOutputsInfo provider.
@@ -82,6 +94,10 @@ def create_compilation_outputs_internal(
8294
_pic_gcno_files = _cc_internal.freeze(pic_gcno_files),
8395
_dwo_files = _cc_internal.freeze(dwo_files),
8496
_pic_dwo_files = _cc_internal.freeze(pic_dwo_files),
97+
cpp_module_files = _cc_internal.freeze(cpp_module_files),
98+
pic_cpp_module_files = _cc_internal.freeze(pic_cpp_module_files),
99+
cpp_modules_info_file = cpp_modules_info_file,
100+
pic_cpp_modules_info_file = pic_cpp_modules_info_file,
85101
)
86102

87103
EMPTY_COMPILATION_OUTPUTS = create_compilation_outputs_internal()

0 commit comments

Comments
 (0)