Fix C++20 module compilation

The merge of C++20 module support in 5c3e987e81a1331714014fc133664e1f7a7582f9 wasn't covered by tests and requires a number of fixes so that the test case in Bazel's `cc_integration_test` can pass.

Closes #511

COPYBARA_INTEGRATE_REVIEW=https://github.com/bazelbuild/rules_cc/pull/511 from fmeum:c++20-modules 716b9bea37fc6aead69cb6fb812826f192611d71
PiperOrigin-RevId: 827424640
Change-Id: Iff433f2a9ec0b8ad9585805f7df7a86297731b92
diff --git a/cc/common/cc_helper_internal.bzl b/cc/common/cc_helper_internal.bzl
index 968aac0..946b160 100644
--- a/cc/common/cc_helper_internal.bzl
+++ b/cc/common/cc_helper_internal.bzl
@@ -180,9 +180,7 @@
     _ArtifactCategoryInfo("SERIALIZED_DIAGNOSTICS_FILE", "", ".dia"),
     _ArtifactCategoryInfo("OBJECT_FILE", "", ".o", ".obj"),
     _ArtifactCategoryInfo("PIC_OBJECT_FILE", "", ".pic.o"),
-    _ArtifactCategoryInfo("CPP_MODULE", "", ".pcm"),
-    _ArtifactCategoryInfo("CPP_MODULE_GCM", "", ".gcm"),
-    _ArtifactCategoryInfo("CPP_MODULE_IFC", "", ".ifc"),
+    _ArtifactCategoryInfo("CPP_MODULE", "", ".pcm", ".gcm", ".ifc"),
     _ArtifactCategoryInfo("CPP_MODULES_INFO", "", ".CXXModules.json"),
     _ArtifactCategoryInfo("CPP_MODULES_DDI", "", ".ddi"),
     _ArtifactCategoryInfo("CPP_MODULES_MODMAP", "", ".modmap"),
diff --git a/cc/private/cc_info.bzl b/cc/private/cc_info.bzl
index 1703406..5ab8d73 100644
--- a/cc/private/cc_info.bzl
+++ b/cc/private/cc_info.bzl
@@ -54,6 +54,10 @@
         "_transitive_pic_modules": "Internal",
         "_module_map": "Internal",
         "_virtual_to_original_headers": "Internal",
+        "_modules_info_files": "Internal",
+        "_pic_modules_info_files": "Internal",
+        "_module_files": "Internal",
+        "_pic_module_files": "Internal",
         # duplicated HeaderInfo fields
         "direct_headers": "Returns the list of modular headers that are declared by this target. " +
                           "This includes both public headers (such as those listed in \"hdrs\") " +
@@ -122,6 +126,10 @@
     _transitive_modules = depset(),
     _transitive_pic_modules = depset(),
     _direct_module_maps = depset(),
+    _modules_info_files = depset(),
+    _pic_modules_info_files = depset(),
+    _module_files = depset(),
+    _pic_module_files = depset(),
     _header_info = _cc_internal.create_header_info(),
 )
 
@@ -366,6 +374,10 @@
         _transitive_pic_modules = depset(),
         _direct_module_maps = depset(),
         _header_info = header_info,
+        _modules_info_files = depset(),
+        _pic_modules_info_files = depset(),
+        _module_files = depset(),
+        _pic_module_files = depset(),
     )
 
     return _merge_compilation_contexts(
@@ -485,6 +497,18 @@
             transitive_pic_modules_artifacts,
             transitive = [dep._transitive_pic_modules for dep in all_deps],
         ),
+        _modules_info_files = depset(
+            transitive = [compilation_context._modules_info_files] + [dep._modules_info_files for dep in all_deps],
+        ),
+        _pic_modules_info_files = depset(
+            transitive = [compilation_context._pic_modules_info_files] + [dep._pic_modules_info_files for dep in all_deps],
+        ),
+        _module_files = depset(
+            transitive = [compilation_context._module_files] + [dep._module_files for dep in all_deps],
+        ),
+        _pic_module_files = depset(
+            transitive = [compilation_context._pic_module_files] + [dep._pic_module_files for dep in all_deps],
+        ),
     )
 
 def merge_compilation_contexts(*, compilation_contexts = []):
@@ -536,6 +560,10 @@
         _transitive_pic_modules = cc_compilation_context._transitive_pic_modules,
         _direct_module_maps = cc_compilation_context._direct_module_maps,
         _header_info = cc_compilation_context._header_info,
+        _modules_info_files = cc_compilation_context._modules_info_files,
+        _pic_modules_info_files = cc_compilation_context._pic_modules_info_files,
+        _module_files = cc_compilation_context._module_files,
+        _pic_module_files = cc_compilation_context._pic_module_files,
     )
 
 def create_cc_compilation_context_with_cpp20_modules(
@@ -583,8 +611,8 @@
         _header_info = cc_compilation_context._header_info,
         _module_files = depset(cpp_module_files, transitive = [cc_compilation_context._module_files]),
         _pic_module_files = depset(pic_cpp_module_files, transitive = [cc_compilation_context._pic_module_files]),
-        _module_info_files = depset(cpp_modules_info_file, transitive = [cc_compilation_context._module_info_files]),
-        _pic_module_info_files = depset(pic_cpp_modules_info_file, transitive = [cc_compilation_context._pic_module_info_files]),
+        _modules_info_files = depset([cpp_modules_info_file], transitive = [cc_compilation_context._modules_info_files]),
+        _pic_modules_info_files = depset([pic_cpp_modules_info_file], transitive = [cc_compilation_context._pic_modules_info_files]),
     )
 
 def merge_cc_infos(*, direct_cc_infos = [], cc_infos = []):
diff --git a/cc/private/compile/compile.bzl b/cc/private/compile/compile.bzl
index 6ff5524..95ecb13 100644
--- a/cc/private/compile/compile.bzl
+++ b/cc/private/compile/compile.bzl
@@ -30,7 +30,12 @@
     artifact_category = "artifact_category_names",
 )
 load("//cc/common:semantics.bzl", _starlark_cc_semantics = "semantics")
-load("//cc/private:cc_info.bzl", "create_compilation_context_with_extra_header_tokens", "create_separate_module_map")
+load(
+    "//cc/private:cc_info.bzl",
+    "create_cc_compilation_context_with_cpp20_modules",
+    "create_compilation_context_with_extra_header_tokens",
+    "create_separate_module_map",
+)
 load("//cc/private:cc_internal.bzl", _cc_internal = "cc_internal")
 load("//cc/private/compile:cc_compilation_helper.bzl", "cc_compilation_helper", "dotd_files_enabled", "serialized_diagnostics_file_enabled")
 load("//cc/private/compile:cc_compilation_outputs.bzl", "create_compilation_outputs_internal")
@@ -43,7 +48,6 @@
     "setup_common_compile_build_variables",
 )
 load("//cc/private/compile:lto_compilation_context.bzl", "create_lto_compilation_context")
-load("//cc/private/rules_impl:native.bzl", _cc_common_internal = "native_cc_common")
 
 _VALID_CPP_SOURCE_TYPES = set([CPP_SOURCE_TYPE_SOURCE, CPP_SOURCE_TYPE_HEADER, CPP_SOURCE_TYPE_CLIF_INPUT_PROTO])
 
@@ -390,7 +394,7 @@
     )
     compilation_outputs = create_compilation_outputs_internal(**compilation_outputs_dict)
     if feature_configuration.is_enabled("cpp_modules"):
-        public_compilation_context = _cc_internal.create_cc_compilation_context_with_cpp20_modules(
+        public_compilation_context = create_cc_compilation_context_with_cpp20_modules(
             cc_compilation_context = public_compilation_context,
             cpp_module_files = compilation_outputs.cpp_module_files,
             pic_cpp_module_files = compilation_outputs.pic_cpp_module_files,
@@ -520,7 +524,6 @@
         label,
         common_toolchain_variables,
         language,
-        native_cc_semantics,
         source_artifact,
         source_label,
         use_pic,
@@ -528,7 +531,7 @@
         ddi_output_name):
     dotd_file = None
     if (
-        dotd_files_enabled(native_cc_semantics, configuration, feature_configuration) and
+        dotd_files_enabled(language, cpp_configuration, feature_configuration) and
         _use_dotd_file(feature_configuration, source_artifact)
     ):
         dotd_file = _get_compile_output_file(
@@ -563,20 +566,20 @@
         common_toolchain_variables,
         specific_compile_build_variables,
     )
-    _cc_internal.create_cpp_compile_action(
+    _cc_internal.create_cc_compile_action(
         action_construction_context = action_construction_context,
         cc_compilation_context = cc_compilation_context,
         cc_toolchain = cc_toolchain,
         configuration = configuration,
         copts_filter = copts_filter,
         feature_configuration = feature_configuration,
-        cpp_semantics = native_cc_semantics,
-        source_artifact = source_artifact,
+        source = source_artifact,
         additional_compilation_inputs = additional_compilation_inputs,
         output_file = ddi_file,
         dotd_file = dotd_file,
         compile_build_variables = compile_variables,
         action_name = ACTION_NAMES.cpp_module_deps_scanning,
+        toolchain_type = _starlark_cc_semantics.toolchain,
     )
 
 def _create_aggregate_ddi_action(
@@ -683,7 +686,6 @@
     else:
         outputs["cpp_modules_info_file"] = modules_info_file
 
-    native_cc_semantics = _cc_common_internal.get_cpp_semantics(language = language)
     for cpp_source in module_interfaces_sources.values():
         source_artifact = cpp_source.file
         output_name = output_name_map[source_artifact]
@@ -741,7 +743,6 @@
             label = label,
             common_toolchain_variables = common_compile_build_variables,
             language = language,
-            native_cc_semantics = native_cc_semantics,
             source_artifact = source_artifact,
             source_label = source_label,
             use_pic = use_pic,
@@ -825,7 +826,6 @@
             feature_configuration = feature_configuration,
             configuration = configuration,
             cpp_configuration = cpp_configuration,
-            cpp_semantics = native_cc_semantics,
             language = language,
             conlyopts = conlyopts,
             copts = copts,
@@ -925,7 +925,6 @@
                 label = label,
                 common_toolchain_variables = common_compile_build_variables,
                 language = language,
-                native_cc_semantics = native_cc_semantics,
                 source_artifact = source_artifact,
                 source_label = source_label,
                 use_pic = use_pic,
@@ -974,7 +973,6 @@
             feature_configuration = feature_configuration,
             configuration = configuration,
             cpp_configuration = cpp_configuration,
-            cpp_semantics = native_cc_semantics,
             language = language,
             conlyopts = conlyopts,
             copts = copts,
@@ -1541,25 +1539,8 @@
             category = artifact_category.PIC_FILE,
             output_name = output_name,
         )
-    cpp20_module_compile_enabled = False
-    if not action_name:
-        if output_category == artifact_category.CPP_MODULE:
-            action_name = "c++-module-compile"
-            cpp20_module_compile_enabled = True
-        else:
-            ext = "." + source_artifact.extension
-            if ext in extensions.C_SOURCE:
-                action_name = "c-compile"
-            elif ext in extensions.OBJC_SOURCE:
-                action_name = "objc-compile"
-            elif ext in extensions.OBJCPP_SOURCE:
-                action_name = "objc++-compile"
-            elif ext in extensions.ASSESMBLER_WITH_C_PREPROCESSOR:
-                action_name = "preprocess-assemble"
-            elif ext in extensions.ASSEMBLER:
-                action_name = "assemble"
-            else:
-                action_name = "c++-compile"
+    if not action_name and output_category == artifact_category.CPP_MODULE:
+        action_name = "c++-module-compile"
 
     object_file = _get_compile_output_file(
         ctx = action_construction_context,
@@ -1685,8 +1666,8 @@
     if add_object and fdo_context_has_artifacts:
         additional_inputs = additional_compilation_inputs + auxiliary_fdo_inputs.to_list()
 
-    # Until a new enough Bazel supports C++20 Modules, these argument names are invalid.
-    if cpp20_module_compile_enabled:
+    # Provide these args conditionally as they require a recent version of Bazel.
+    if modmap_file:
         module_args = {
             "additional_outputs": additional_outputs,
             "module_files": module_files,