From 66b7abf9e7df9b7508639849b7a47ae30dd9ca3f Mon Sep 17 00:00:00 2001 From: Kanglei Fang Date: Sun, 11 Oct 2020 22:29:37 -0700 Subject: [PATCH 01/16] Introduce feature to register a separate action to generate swift derived files --- swift/internal/actions.bzl | 4 + swift/internal/compiling.bzl | 193 +++++++++++++++++++---- swift/internal/feature_names.bzl | 5 + swift/internal/xcode_swift_toolchain.bzl | 23 +-- 4 files changed, 182 insertions(+), 43 deletions(-) diff --git a/swift/internal/actions.bzl b/swift/internal/actions.bzl index 931d22f51..7cd76e599 100644 --- a/swift/internal/actions.bzl +++ b/swift/internal/actions.bzl @@ -37,6 +37,10 @@ swift_action_names = struct( # Precompiles an explicit module for a C/Objective-C module map and its # headers, emitting a `.pcm` file. PRECOMPILE_C_MODULE = "SwiftPrecompileCModule", + + # Produces files that are usually fallout of the compilation such as + # .swiftmodule, -Swift.h and more. + DERIVED_FILES = "SwiftDerivedFiles", ) def _apply_configurator(configurator, prerequisites, args): diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index a752d4147..078ec571f 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -58,6 +58,7 @@ load( "SWIFT_FEATURE_USE_C_MODULES", "SWIFT_FEATURE_USE_GLOBAL_MODULE_CACHE", "SWIFT_FEATURE_VFSOVERLAY", + "SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION", ) load(":features.bzl", "are_all_features_enabled", "is_feature_enabled") load(":providers.bzl", "SwiftInfo", "create_swift_info") @@ -106,6 +107,10 @@ def compile_action_configs(): actions = [swift_action_names.COMPILE], configurators = [_output_object_or_file_map_configurator], ), + swift_toolchain_config.action_config( + actions = [swift_action_names.DERIVED_FILES], + configurators = [_output_swiftmodule_or_file_map_configurator], + ), # Emit precompiled Clang modules, and embed all files that were read # during compilation into the PCM. @@ -131,11 +136,20 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [swift_action_names.COMPILE], configurators = [_emit_module_path_configurator], + not_features = [SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION], + ), + + swift_toolchain_config.action_config( + actions = [swift_action_names.DERIVED_FILES], + configurators = [_emit_module_path_configurator], ), # Configure library evolution and the path to the .swiftinterface file. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [ swift_toolchain_config.add_arg("-enable-library-evolution"), ], @@ -152,9 +166,19 @@ def compile_action_configs(): SWIFT_FEATURE_EMIT_SWIFTINTERFACE, ], ), + + # Configure the path to the emitted *-Swift.h file. swift_toolchain_config.action_config( actions = [swift_action_names.COMPILE], configurators = [_emit_objc_header_path_configurator], + not_features = [ + [SWIFT_FEATURE_NO_GENERATED_HEADER], + [SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION], + ], + ), + swift_toolchain_config.action_config( + actions = [swift_action_names.DERIVED_FILES], + configurators = [_emit_objc_header_path_configurator], not_features = [SWIFT_FEATURE_NO_GENERATED_HEADER], ), @@ -177,14 +201,20 @@ def compile_action_configs(): # Define appropriate conditional compilation symbols depending on the # build mode. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-DDEBUG"), ], features = [[SWIFT_FEATURE_DBG], [SWIFT_FEATURE_FASTBUILD]], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-DNDEBUG"), ], @@ -220,7 +250,10 @@ def compile_action_configs(): # If the `swift.opt_uses_wmo` feature is enabled, opt builds should also # automatically imply whole-module optimization. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-whole-module-optimization"), ], @@ -255,7 +288,10 @@ def compile_action_configs(): # Enable testability if requested. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-enable-testing"), ], @@ -346,6 +382,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -361,7 +398,10 @@ def compile_action_configs(): # Configure how implicit modules are handled--either using the module # cache, or disabled completely when using explicit modules. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_global_module_cache_configurator], features = [ SWIFT_FEATURE_IMPLICIT_MODULES, @@ -369,7 +409,10 @@ def compile_action_configs(): ], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg( "-Xwrapped-swift=-ephemeral-module-cache", @@ -449,12 +492,18 @@ def compile_action_configs(): #### Search paths for Swift module dependencies action_configs.extend([ swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [_dependencies_swiftmodules_configurator], not_features = [SWIFT_FEATURE_VFSOVERLAY], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [ _dependencies_swiftmodules_vfsoverlay_configurator, ], @@ -467,6 +516,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_framework_search_paths_configurator], @@ -479,6 +529,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -492,6 +543,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_dependencies_clang_modules_configurator], @@ -500,6 +552,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_dependencies_clang_modulemaps_configurator], @@ -514,6 +567,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -532,7 +586,10 @@ def compile_action_configs(): # flags themselves, since some Swift users enable it there as a build # performance hack. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [_batch_mode_configurator], features = [SWIFT_FEATURE_ENABLE_BATCH_MODE], not_features = [SWIFT_FEATURE_OPT, SWIFT_FEATURE_OPT_USES_WMO], @@ -540,7 +597,10 @@ def compile_action_configs(): # Set the number of threads to use for WMO. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [ partial.make( _wmo_thread_count_configurator, @@ -552,7 +612,10 @@ def compile_action_configs(): features = [SWIFT_FEATURE_OPT, SWIFT_FEATURE_OPT_USES_WMO], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [ partial.make( _wmo_thread_count_configurator, @@ -568,6 +631,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_module_name_configurator], @@ -583,7 +647,10 @@ def compile_action_configs(): # User-defined conditional compilation flags (defined for Swift; those # passed directly to ClangImporter are handled above). swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [_conditional_compilation_flag_configurator], ), @@ -600,7 +667,10 @@ def compile_action_configs(): # the rule implementations as a last resort. action_configs.append( swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [_user_compile_flags_configurator], ), ) @@ -609,6 +679,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_source_files_configurator], @@ -618,33 +689,50 @@ def compile_action_configs(): # Add additional input files to the sandbox (does not modify flags). action_configs.append( swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, + ], configurators = [_additional_inputs_configurator], ), ) return action_configs -def _output_object_or_file_map_configurator(prerequisites, args): - """Adds the output file map or single object file to the command line.""" - output_file_map = prerequisites.output_file_map +def _output_or_file_map(output_file_map, outputs, args): + """Adds the output file map or single file to the command line.""" if output_file_map: args.add("-output-file-map", output_file_map) return swift_toolchain_config.config_result( inputs = [output_file_map], ) - object_files = prerequisites.object_files - if len(object_files) != 1: + if len(outputs) != 1: fail( "Internal error: If not using an output file map, there should " + "only be a single object file expected as the output, but we " + - "found: {}".format(object_files), + "found: {}".format(outputs), ) - args.add("-o", object_files[0]) + args.add("-o", outputs[0]) return None +def _output_object_or_file_map_configurator(prerequisites, args): + """Adds the output file map or single object file to the command line.""" + return _output_or_file_map( + output_file_map = prerequisites.output_file_map, + outputs = prerequisites.object_files, + args = args, + ) + +def _output_swiftmodule_or_file_map_configurator(prerequisites, args): + """Adds the output file map or single object file to the command line.""" + return _output_or_file_map( + output_file_map = prerequisites.output_file_map, + outputs = [prerequisites.swiftmodule_file], + args = args, + ) + def _output_pcm_file_configurator(prerequisites, args): """Adds the `.pcm` output path to the command line.""" args.add("-o", prerequisites.pcm_file) @@ -1175,18 +1263,38 @@ def compile( target_name = target_name, user_compile_flags = copts + swift_toolchain.command_line_copts, ) - all_compile_outputs = compact([ - # The `.swiftmodule` file is explicitly listed as the first output - # because it will always exist and because Bazel uses it as a key for - # various things (such as the filename prefix for param files generated - # for that action). This guarantees some predictability. - compile_outputs.swiftmodule_file, - compile_outputs.swiftdoc_file, - compile_outputs.swiftinterface_file, - compile_outputs.generated_header_file, - compile_outputs.indexstore_directory, - compile_outputs.stats_directory, - ]) + compile_outputs.object_files + other_outputs + if is_feature_enabled( + feature_configuration = feature_configuration, + feature_name = SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION, + ): + all_compile_outputs = compact([ + # The `.swiftmodule` file is explicitly listed as the first output + # because it will always exist and because Bazel uses it as a key for + # various things (such as the filename prefix for param files generated + # for that action). This guarantees some predictability. + compile_outputs.swiftinterface_file, + compile_outputs.indexstore_directory, + compile_outputs.stats_directory, + ]) + compile_outputs.object_files + all_derived_outputs = compact([ + compile_outputs.swiftmodule_file, + compile_outputs.swiftdoc_file, + compile_outputs.generated_header_file, + ]) + other_outputs + else: + all_compile_outputs = compact([ + # The `.swiftmodule` file is explicitly listed as the first output + # because it will always exist and because Bazel uses it as a key for + # various things (such as the filename prefix for param files generated + # for that action). This guarantees some predictability. + compile_outputs.swiftmodule_file, + compile_outputs.swiftdoc_file, + compile_outputs.swiftinterface_file, + compile_outputs.generated_header_file, + compile_outputs.indexstore_directory, + compile_outputs.stats_directory, + ]) + compile_outputs.object_files + other_outputs + all_derived_outputs = [] # Merge the providers from our dependencies so that we have one each for # `SwiftInfo`, `CcInfo`, and `apple_common.Objc`. Then we can pass these @@ -1260,6 +1368,23 @@ def compile( **struct_fields(compile_outputs) ) + if is_feature_enabled( + feature_configuration = feature_configuration, + feature_name = SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION, + ): + run_toolchain_action( + actions = actions, + action_name = swift_action_names.DERIVED_FILES, + feature_configuration = feature_configuration, + outputs = all_derived_outputs, + prerequisites = prerequisites, + progress_message = ( + "Generating derived files for Swift module {}".format(module_name) + ), + swift_toolchain = swift_toolchain, + ) + + run_toolchain_action( actions = actions, action_name = swift_action_names.COMPILE, diff --git a/swift/internal/feature_names.bzl b/swift/internal/feature_names.bzl index ad3ed8969..f1cbf3548 100644 --- a/swift/internal/feature_names.bzl +++ b/swift/internal/feature_names.bzl @@ -227,3 +227,8 @@ SWIFT_FEATURE_NO_EMBED_DEBUG_MODULE = "swift.no_embed_debug_module" # files where the protoc command line might not be crafted correctly, so it # remains opt in. SWIFT_FEATURE_GENERATE_FROM_RAW_PROTO_FILES = "swift.generate_from_raw_proto_files" + +# If enabled and whole module optimisation is being used, the `*.swiftdoc`, +# `*.swiftmodule` and `*-Swift.h` are generated with a separate action +# rather than as part of the compilation. +SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION = "swift.split_derived_files_generation" diff --git a/swift/internal/xcode_swift_toolchain.bzl b/swift/internal/xcode_swift_toolchain.bzl index 4e0209835..e41016069 100644 --- a/swift/internal/xcode_swift_toolchain.bzl +++ b/swift/internal/xcode_swift_toolchain.bzl @@ -287,6 +287,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -342,6 +343,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -389,16 +391,19 @@ def _all_tool_configs( env = dict(env) env["TOOLCHAINS"] = custom_toolchain + tool_config = swift_toolchain_config.driver_tool_config( + driver_mode = "swiftc", + env = env, + execution_requirements = execution_requirements, + swift_executable = swift_executable, + toolchain_root = toolchain_root, + use_param_file = use_param_file, + worker_mode = "persistent", + ) + tool_configs = { - swift_action_names.COMPILE: swift_toolchain_config.driver_tool_config( - driver_mode = "swiftc", - env = env, - execution_requirements = execution_requirements, - swift_executable = swift_executable, - toolchain_root = toolchain_root, - use_param_file = use_param_file, - worker_mode = "persistent", - ), + swift_action_names.COMPILE: tool_config, + swift_action_names.DERIVED_FILES: tool_config, } # Xcode 12.0 implies Swift 5.3. From 7727b171a36700163f61ecae151cf5fac1662163 Mon Sep 17 00:00:00 2001 From: Kanglei Fang Date: Mon, 12 Oct 2020 10:30:00 -0700 Subject: [PATCH 02/16] Amend all compiling actions that's missing DERIVED_FILES --- swift/internal/compiling.bzl | 9 +++++---- swift/internal/xcode_swift_toolchain.bzl | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 078ec571f..62390d2da 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -424,6 +424,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -1268,15 +1269,15 @@ def compile( feature_name = SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION, ): all_compile_outputs = compact([ - # The `.swiftmodule` file is explicitly listed as the first output - # because it will always exist and because Bazel uses it as a key for - # various things (such as the filename prefix for param files generated - # for that action). This guarantees some predictability. compile_outputs.swiftinterface_file, compile_outputs.indexstore_directory, compile_outputs.stats_directory, ]) + compile_outputs.object_files all_derived_outputs = compact([ + # The `.swiftmodule` file is explicitly listed as the first output + # because it will always exist and because Bazel uses it as a key for + # various things (such as the filename prefix for param files generated + # for that action). This guarantees some predictability. compile_outputs.swiftmodule_file, compile_outputs.swiftdoc_file, compile_outputs.generated_header_file, diff --git a/swift/internal/xcode_swift_toolchain.bzl b/swift/internal/xcode_swift_toolchain.bzl index e41016069..8aa0a4ae8 100644 --- a/swift/internal/xcode_swift_toolchain.bzl +++ b/swift/internal/xcode_swift_toolchain.bzl @@ -318,6 +318,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [swift_toolchain_config.add_arg("-embed-bitcode")], @@ -326,6 +327,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ From 4be1c2c20121bb087e5b32c2a62f914089167182 Mon Sep 17 00:00:00 2001 From: Kanglei Fang Date: Tue, 20 Oct 2020 10:57:57 -0700 Subject: [PATCH 03/16] Amend derived file actions for all compiler actions --- swift/internal/compiling.bzl | 95 ++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 62390d2da..451f6b753 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -96,7 +96,10 @@ def compile_action_configs(): action_configs = [ # Emit object file(s). swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-emit-object"), ], @@ -104,7 +107,10 @@ def compile_action_configs(): # Add the single object file or object file map, whichever is needed. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_output_object_or_file_map_configurator], ), swift_toolchain_config.action_config( @@ -134,7 +140,10 @@ def compile_action_configs(): # Configure the path to the emitted .swiftmodule file. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_emit_module_path_configurator], not_features = [SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION], ), @@ -159,7 +168,10 @@ def compile_action_configs(): ], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_emit_module_interface_path_configurator], features = [ SWIFT_FEATURE_SUPPORTS_LIBRARY_EVOLUTION, @@ -169,7 +181,10 @@ def compile_action_configs(): # Configure the path to the emitted *-Swift.h file. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_emit_objc_header_path_configurator], not_features = [ [SWIFT_FEATURE_NO_GENERATED_HEADER], @@ -185,7 +200,10 @@ def compile_action_configs(): # Configure the location where compiler performance statistics are # dumped. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_stats_output_dir_configurator], features = [SWIFT_FEATURE_COMPILE_STATS], ), @@ -225,14 +243,20 @@ def compile_action_configs(): # `-O` unless the `swift.opt_uses_osize` feature is enabled, then use # `-Osize`. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-Onone"), ], features = [[SWIFT_FEATURE_DBG], [SWIFT_FEATURE_FASTBUILD]], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-O"), ], @@ -240,7 +264,10 @@ def compile_action_configs(): not_features = [SWIFT_FEATURE_OPT_USES_OSIZE], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-Osize"), ], @@ -263,7 +290,10 @@ def compile_action_configs(): # Enable or disable serialization of debugging options into # swiftmodules. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg( "-Xfrontend", @@ -273,7 +303,10 @@ def compile_action_configs(): features = [SWIFT_FEATURE_CACHEABLE_SWIFTMODULES], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg( "-Xfrontend", @@ -303,12 +336,18 @@ def compile_action_configs(): # `dsymutil` produces spurious warnings about symbols in the debug map # when run on DI emitted by `-gline-tables-only`. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [swift_toolchain_config.add_arg("-g")], features = [[SWIFT_FEATURE_DBG], [SWIFT_FEATURE_FULL_DEBUG_INFO]], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-gline-tables-only"), ], @@ -318,7 +357,10 @@ def compile_action_configs(): # Make paths written into debug info workspace-relative. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg( "-Xwrapped-swift=-debug-prefix-pwd-is-dot", @@ -352,7 +394,10 @@ def compile_action_configs(): # supporting them either. action_configs += [ swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-profile-generate"), swift_toolchain_config.add_arg("-profile-coverage-mapping"), @@ -360,14 +405,20 @@ def compile_action_configs(): features = [SWIFT_FEATURE_COVERAGE], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-sanitize=address"), ], features = ["asan"], ), swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg("-sanitize=thread"), ], @@ -640,7 +691,10 @@ def compile_action_configs(): # Configure index-while-building. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_index_while_building_configurator], features = [SWIFT_FEATURE_INDEX_WHILE_BUILDING], ), @@ -657,7 +711,10 @@ def compile_action_configs(): # Disable auto-linking for prebuilt static frameworks. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [_static_frameworks_disable_autolink_configurator], ), ] From 30c5767dfa823d672b1e0f2bb5cc7aa9c39cb975 Mon Sep 17 00:00:00 2001 From: Kanglei Fang Date: Tue, 20 Oct 2020 11:01:15 -0700 Subject: [PATCH 04/16] rebase --- swift/internal/compiling.bzl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 451f6b753..59298535a 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -375,7 +375,10 @@ def compile_action_configs(): # Make paths written into coverage info workspace-relative. swift_toolchain_config.action_config( - actions = [swift_action_names.COMPILE], + actions = [ + swift_action_names.COMPILE, + swift_action_names.DERIVED_FILES + ], configurators = [ swift_toolchain_config.add_arg( "-Xwrapped-swift=-coverage-prefix-pwd-is-dot", From c7a27a6b31d13709051a1190fe79667e49bcd56b Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 12:52:48 -0700 Subject: [PATCH 05/16] Format with buildifier --- swift/internal/compiling.bzl | 56 +++++++++++++++++------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 59298535a..0b0506a84 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -52,13 +52,13 @@ load( "SWIFT_FEATURE_OPT", "SWIFT_FEATURE_OPT_USES_OSIZE", "SWIFT_FEATURE_OPT_USES_WMO", + "SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION", "SWIFT_FEATURE_STRICT_MODULES", "SWIFT_FEATURE_SUPPORTS_LIBRARY_EVOLUTION", "SWIFT_FEATURE_SYSTEM_MODULE", "SWIFT_FEATURE_USE_C_MODULES", "SWIFT_FEATURE_USE_GLOBAL_MODULE_CACHE", "SWIFT_FEATURE_VFSOVERLAY", - "SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION", ) load(":features.bzl", "are_all_features_enabled", "is_feature_enabled") load(":providers.bzl", "SwiftInfo", "create_swift_info") @@ -98,7 +98,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-emit-object"), @@ -109,7 +109,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_output_object_or_file_map_configurator], ), @@ -142,12 +142,11 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_emit_module_path_configurator], not_features = [SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION], ), - swift_toolchain_config.action_config( actions = [swift_action_names.DERIVED_FILES], configurators = [_emit_module_path_configurator], @@ -170,7 +169,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_emit_module_interface_path_configurator], features = [ @@ -183,7 +182,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_emit_objc_header_path_configurator], not_features = [ @@ -202,7 +201,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_stats_output_dir_configurator], features = [SWIFT_FEATURE_COMPILE_STATS], @@ -221,7 +220,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-DDEBUG"), @@ -231,7 +230,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-DNDEBUG"), @@ -245,7 +244,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-Onone"), @@ -255,7 +254,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-O"), @@ -266,7 +265,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-Osize"), @@ -279,7 +278,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-whole-module-optimization"), @@ -292,7 +291,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -305,7 +304,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -323,7 +322,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-enable-testing"), @@ -338,7 +337,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [swift_toolchain_config.add_arg("-g")], features = [[SWIFT_FEATURE_DBG], [SWIFT_FEATURE_FULL_DEBUG_INFO]], @@ -346,7 +345,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-gline-tables-only"), @@ -359,7 +358,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -377,7 +376,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -399,7 +398,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-profile-generate"), @@ -410,7 +409,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-sanitize=address"), @@ -420,7 +419,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg("-sanitize=thread"), @@ -454,7 +453,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_global_module_cache_configurator], features = [ @@ -465,7 +464,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -696,7 +695,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_index_while_building_configurator], features = [SWIFT_FEATURE_INDEX_WHILE_BUILDING], @@ -716,7 +715,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES + swift_action_names.DERIVED_FILES, ], configurators = [_static_frameworks_disable_autolink_configurator], ), @@ -1445,7 +1444,6 @@ def compile( swift_toolchain = swift_toolchain, ) - run_toolchain_action( actions = actions, action_name = swift_action_names.COMPILE, From f59c7654cee3011672898cc3f3c6380cb63e0bbf Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:27:58 -0700 Subject: [PATCH 06/16] Remove from some actions --- swift/internal/compiling.bzl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 0b0506a84..aabf6febb 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -96,10 +96,7 @@ def compile_action_configs(): action_configs = [ # Emit object file(s). swift_toolchain_config.action_config( - actions = [ - swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, - ], + actions = [swift_action_names.COMPILE], configurators = [ swift_toolchain_config.add_arg("-emit-object"), ], @@ -107,10 +104,7 @@ def compile_action_configs(): # Add the single object file or object file map, whichever is needed. swift_toolchain_config.action_config( - actions = [ - swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, - ], + actions = [swift_action_names.COMPILE], configurators = [_output_object_or_file_map_configurator], ), swift_toolchain_config.action_config( From a6a9e1d23dd5b1e243ed9413fc00b7c7cd564613 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:28:37 -0700 Subject: [PATCH 07/16] Extract to var --- swift/internal/compiling.bzl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index aabf6febb..c96133729 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -1317,10 +1317,13 @@ def compile( target_name = target_name, user_compile_flags = copts + swift_toolchain.command_line_copts, ) - if is_feature_enabled( + + split_derived_file_generation = is_feature_enabled( feature_configuration = feature_configuration, feature_name = SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION, - ): + ) + + if split_derived_file_generation: all_compile_outputs = compact([ compile_outputs.swiftinterface_file, compile_outputs.indexstore_directory, @@ -1422,10 +1425,7 @@ def compile( **struct_fields(compile_outputs) ) - if is_feature_enabled( - feature_configuration = feature_configuration, - feature_name = SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION, - ): + if split_derived_file_generation: run_toolchain_action( actions = actions, action_name = swift_action_names.DERIVED_FILES, From 41feccf63d64ee684736c51d34dbd4f1574de234 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:28:45 -0700 Subject: [PATCH 08/16] Enable on linux --- swift/internal/swift_toolchain.bzl | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/swift/internal/swift_toolchain.bzl b/swift/internal/swift_toolchain.bzl index 40e0ee879..e181937b1 100644 --- a/swift/internal/swift_toolchain.bzl +++ b/swift/internal/swift_toolchain.bzl @@ -59,6 +59,15 @@ def _all_tool_configs( """ _swift_driver_tool_config = swift_toolchain_config.driver_tool_config + compile_tool_config = _swift_driver_tool_config( + driver_mode = "swiftc", + swift_executable = swift_executable, + toolchain_root = toolchain_root, + use_param_file = use_param_file, + worker_mode = "persistent", + additional_tools = additional_tools, + ) + return { swift_action_names.AUTOLINK_EXTRACT: _swift_driver_tool_config( driver_mode = "swift-autolink-extract", @@ -67,14 +76,8 @@ def _all_tool_configs( worker_mode = "wrap", additional_tools = additional_tools, ), - swift_action_names.COMPILE: _swift_driver_tool_config( - driver_mode = "swiftc", - swift_executable = swift_executable, - toolchain_root = toolchain_root, - use_param_file = use_param_file, - worker_mode = "persistent", - additional_tools = additional_tools, - ), + swift_action_names.COMPILE: compile_tool_config, + swift_action_names.DERIVED_FILES: compile_tool_config, swift_action_names.MODULEWRAP: _swift_driver_tool_config( # This must come first after the driver name. args = ["-modulewrap"], From cb6c67cf6e35441b8be17c7b3bb98bd1083d8a6e Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:28:52 -0700 Subject: [PATCH 09/16] Add initial tests --- test/BUILD | 3 + test/split_derived_files_tests.bzl | 176 +++++++++++++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 test/split_derived_files_tests.bzl diff --git a/test/BUILD b/test/BUILD index ea685d048..70dcb37e7 100644 --- a/test/BUILD +++ b/test/BUILD @@ -4,6 +4,7 @@ load(":coverage_settings_tests.bzl", "coverage_settings_test_suite") load(":generated_header_tests.bzl", "generated_header_test_suite") load(":private_deps_tests.bzl", "private_deps_test_suite") load(":swift_through_non_swift_tests.bzl", "swift_through_non_swift_test_suite") +load(":split_derived_files_tests.bzl", "split_derived_files_test_suite") licenses(["notice"]) @@ -17,6 +18,8 @@ private_deps_test_suite() swift_through_non_swift_test_suite() +split_derived_files_test_suite() + test_suite( name = "all_tests", ) diff --git a/test/split_derived_files_tests.bzl b/test/split_derived_files_tests.bzl new file mode 100644 index 000000000..3b2d0fe68 --- /dev/null +++ b/test/split_derived_files_tests.bzl @@ -0,0 +1,176 @@ +"""Tests for derived files related command line flags under various configs.""" + +load( + "@build_bazel_rules_swift//test/rules:action_command_line_test.bzl", + "make_action_command_line_test_rule", +) +load( + "@build_bazel_rules_swift//test/rules:provider_test.bzl", + "make_provider_test_rule", +) + +# Default outputs both .a and .swiftmodule +# Split outputs 2 actions one with .a one with .swiftmodule +# Split WMO works the same as split w/o WMO + +default_no_split_test = make_action_command_line_test_rule() + +default_no_split_provider_test = make_provider_test_rule() + +split_swiftmodule_test = make_action_command_line_test_rule( + config_settings = { + "//command_line_option:features": [ + "swift.split_derived_files_generation", + ], + }, +) + +split_swiftmodule_provider_test = make_provider_test_rule( + config_settings = { + "//command_line_option:features": [ + "swift.split_derived_files_generation", + ], + }, +) + +split_swiftmodule_wmo_test = make_action_command_line_test_rule( + config_settings = { + "//command_line_option:swiftcopt": [ + "-whole-module-optimization", + ], + "//command_line_option:features": [ + "swift.split_derived_files_generation", + ], + }, +) + +split_swiftmodule_wmo_provider_test = make_action_command_line_test_rule( + config_settings = { + "//command_line_option:swiftcopt": [ + "-whole-module-optimization", + ], + "//command_line_option:features": [ + "swift.split_derived_files_generation", + ], + }, +) + +def split_derived_files_test_suite(name = "split_derived_files"): + """Test suite for split derived files options. + + Args: + name: The name prefix for all the nested tests + """ + default_no_split_test( + name = "{}_default_no_split_args".format(name), + expected_argv = [ + "-emit-module-path", + "-emit-object", + ], + mnemonic = "SwiftCompile", + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + default_no_split_provider_test( + name = "{}_default_no_split_provider".format(name), + expected_files = [ + "test_fixtures_debug_settings_simple.swiftmodule", + ], + field = "direct_modules.swift.swiftmodule", + provider = "SwiftInfo", + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + default_no_split_provider_test( + name = "{}_default_no_split_provider_ccinfo".format(name), + expected_files = [ + "libsimple.a", + ], + field = "linking_context.libraries_to_link.pic_static_library!", + provider = "CcInfo", + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_test( + name = "{}_object_only".format(name), + expected_argv = [ + "-emit-object", + ], + mnemonic = "SwiftCompile", + not_expected_argv = [ + "-emit-module-path", + ], + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_test( + name = "{}_swiftmodule_only".format(name), + expected_argv = [ + "-emit-module-path", + ], + mnemonic = "SwiftDerivedFiles", + not_expected_argv = [ + "-emit-object", + ], + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_provider_test( + name = "{}_split_provider".format(name), + expected_files = [ + "test_fixtures_debug_settings_simple.swiftmodule", + ], + field = "direct_modules.swift.swiftmodule", + provider = "SwiftInfo", + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_provider_test( + name = "{}_split_provider_ccinfo".format(name), + expected_files = [ + "libsimple.a", + ], + field = "linking_context.libraries_to_link.pic_static_library!", + provider = "CcInfo", + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_wmo_test( + name = "{}_object_only_wmo".format(name), + expected_argv = [ + "-emit-object", + "-whole-module-optimization", + ], + mnemonic = "SwiftCompile", + not_expected_argv = [ + "-emit-module-path", + ], + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_wmo_test( + name = "{}_swiftmodule_only_wmo".format(name), + expected_argv = [ + "-emit-module-path", + "-whole-module-optimization", + ], + mnemonic = "SwiftDerivedFiles", + not_expected_argv = [ + "-emit-object", + ], + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + native.test_suite( + name = name, + tags = [name], + ) From e7edb39192bd84376398ea581b1b6914f649c500 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:33:04 -0700 Subject: [PATCH 10/16] Rename to "derive" --- swift/internal/actions.bzl | 2 +- swift/internal/compiling.bzl | 92 ++++++++++++------------ swift/internal/swift_toolchain.bzl | 2 +- swift/internal/xcode_swift_toolchain.bzl | 10 +-- test/split_derived_files_tests.bzl | 4 +- 5 files changed, 55 insertions(+), 55 deletions(-) diff --git a/swift/internal/actions.bzl b/swift/internal/actions.bzl index 7cd76e599..fd7773877 100644 --- a/swift/internal/actions.bzl +++ b/swift/internal/actions.bzl @@ -40,7 +40,7 @@ swift_action_names = struct( # Produces files that are usually fallout of the compilation such as # .swiftmodule, -Swift.h and more. - DERIVED_FILES = "SwiftDerivedFiles", + DERIVE_FILES = "SwiftDeriveFiles", ) def _apply_configurator(configurator, prerequisites, args): diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index c96133729..cae29b0e9 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -108,7 +108,7 @@ def compile_action_configs(): configurators = [_output_object_or_file_map_configurator], ), swift_toolchain_config.action_config( - actions = [swift_action_names.DERIVED_FILES], + actions = [swift_action_names.DERIVE_FILES], configurators = [_output_swiftmodule_or_file_map_configurator], ), @@ -136,13 +136,13 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_emit_module_path_configurator], not_features = [SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION], ), swift_toolchain_config.action_config( - actions = [swift_action_names.DERIVED_FILES], + actions = [swift_action_names.DERIVE_FILES], configurators = [_emit_module_path_configurator], ), @@ -150,7 +150,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-enable-library-evolution"), @@ -163,7 +163,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_emit_module_interface_path_configurator], features = [ @@ -176,7 +176,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_emit_objc_header_path_configurator], not_features = [ @@ -185,7 +185,7 @@ def compile_action_configs(): ], ), swift_toolchain_config.action_config( - actions = [swift_action_names.DERIVED_FILES], + actions = [swift_action_names.DERIVE_FILES], configurators = [_emit_objc_header_path_configurator], not_features = [SWIFT_FEATURE_NO_GENERATED_HEADER], ), @@ -195,7 +195,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_stats_output_dir_configurator], features = [SWIFT_FEATURE_COMPILE_STATS], @@ -214,7 +214,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-DDEBUG"), @@ -224,7 +224,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-DNDEBUG"), @@ -238,7 +238,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-Onone"), @@ -248,7 +248,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-O"), @@ -259,7 +259,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-Osize"), @@ -272,7 +272,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-whole-module-optimization"), @@ -285,7 +285,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -298,7 +298,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -316,7 +316,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-enable-testing"), @@ -331,7 +331,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [swift_toolchain_config.add_arg("-g")], features = [[SWIFT_FEATURE_DBG], [SWIFT_FEATURE_FULL_DEBUG_INFO]], @@ -339,7 +339,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-gline-tables-only"), @@ -352,7 +352,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -370,7 +370,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -392,7 +392,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-profile-generate"), @@ -403,7 +403,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-sanitize=address"), @@ -413,7 +413,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg("-sanitize=thread"), @@ -429,7 +429,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -447,7 +447,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_global_module_cache_configurator], features = [ @@ -458,7 +458,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ swift_toolchain_config.add_arg( @@ -471,7 +471,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -542,7 +542,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_dependencies_swiftmodules_configurator], not_features = [SWIFT_FEATURE_VFSOVERLAY], @@ -550,7 +550,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ _dependencies_swiftmodules_vfsoverlay_configurator, @@ -564,7 +564,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_framework_search_paths_configurator], @@ -577,7 +577,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -591,7 +591,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_dependencies_clang_modules_configurator], @@ -600,7 +600,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_dependencies_clang_modulemaps_configurator], @@ -615,7 +615,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -636,7 +636,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_batch_mode_configurator], features = [SWIFT_FEATURE_ENABLE_BATCH_MODE], @@ -647,7 +647,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ partial.make( @@ -662,7 +662,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [ partial.make( @@ -679,7 +679,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_module_name_configurator], @@ -689,7 +689,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_index_while_building_configurator], features = [SWIFT_FEATURE_INDEX_WHILE_BUILDING], @@ -700,7 +700,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_conditional_compilation_flag_configurator], ), @@ -709,7 +709,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_static_frameworks_disable_autolink_configurator], ), @@ -723,7 +723,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_user_compile_flags_configurator], ), @@ -733,7 +733,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [_source_files_configurator], @@ -745,7 +745,7 @@ def compile_action_configs(): swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, ], configurators = [_additional_inputs_configurator], ), @@ -1428,7 +1428,7 @@ def compile( if split_derived_file_generation: run_toolchain_action( actions = actions, - action_name = swift_action_names.DERIVED_FILES, + action_name = swift_action_names.DERIVE_FILES, feature_configuration = feature_configuration, outputs = all_derived_outputs, prerequisites = prerequisites, diff --git a/swift/internal/swift_toolchain.bzl b/swift/internal/swift_toolchain.bzl index e181937b1..c975787bc 100644 --- a/swift/internal/swift_toolchain.bzl +++ b/swift/internal/swift_toolchain.bzl @@ -77,7 +77,7 @@ def _all_tool_configs( additional_tools = additional_tools, ), swift_action_names.COMPILE: compile_tool_config, - swift_action_names.DERIVED_FILES: compile_tool_config, + swift_action_names.DERIVE_FILES: compile_tool_config, swift_action_names.MODULEWRAP: _swift_driver_tool_config( # This must come first after the driver name. args = ["-modulewrap"], diff --git a/swift/internal/xcode_swift_toolchain.bzl b/swift/internal/xcode_swift_toolchain.bzl index 8aa0a4ae8..89824f720 100644 --- a/swift/internal/xcode_swift_toolchain.bzl +++ b/swift/internal/xcode_swift_toolchain.bzl @@ -287,7 +287,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -318,7 +318,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [swift_toolchain_config.add_arg("-embed-bitcode")], @@ -327,7 +327,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -345,7 +345,7 @@ def _all_action_configs( swift_toolchain_config.action_config( actions = [ swift_action_names.COMPILE, - swift_action_names.DERIVED_FILES, + swift_action_names.DERIVE_FILES, swift_action_names.PRECOMPILE_C_MODULE, ], configurators = [ @@ -405,7 +405,7 @@ def _all_tool_configs( tool_configs = { swift_action_names.COMPILE: tool_config, - swift_action_names.DERIVED_FILES: tool_config, + swift_action_names.DERIVE_FILES: tool_config, } # Xcode 12.0 implies Swift 5.3. diff --git a/test/split_derived_files_tests.bzl b/test/split_derived_files_tests.bzl index 3b2d0fe68..3ac6705c7 100644 --- a/test/split_derived_files_tests.bzl +++ b/test/split_derived_files_tests.bzl @@ -112,7 +112,7 @@ def split_derived_files_test_suite(name = "split_derived_files"): expected_argv = [ "-emit-module-path", ], - mnemonic = "SwiftDerivedFiles", + mnemonic = "SwiftDeriveFiles", not_expected_argv = [ "-emit-object", ], @@ -162,7 +162,7 @@ def split_derived_files_test_suite(name = "split_derived_files"): "-emit-module-path", "-whole-module-optimization", ], - mnemonic = "SwiftDerivedFiles", + mnemonic = "SwiftDeriveFiles", not_expected_argv = [ "-emit-object", ], From edcabca93423afcb87c4f6078c3b952dc630ad95 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:38:14 -0700 Subject: [PATCH 11/16] Add missing tests --- test/split_derived_files_tests.bzl | 33 +++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/test/split_derived_files_tests.bzl b/test/split_derived_files_tests.bzl index 3ac6705c7..8cbddc79c 100644 --- a/test/split_derived_files_tests.bzl +++ b/test/split_derived_files_tests.bzl @@ -9,14 +9,8 @@ load( "make_provider_test_rule", ) -# Default outputs both .a and .swiftmodule -# Split outputs 2 actions one with .a one with .swiftmodule -# Split WMO works the same as split w/o WMO - default_no_split_test = make_action_command_line_test_rule() - default_no_split_provider_test = make_provider_test_rule() - split_swiftmodule_test = make_action_command_line_test_rule( config_settings = { "//command_line_option:features": [ @@ -24,7 +18,6 @@ split_swiftmodule_test = make_action_command_line_test_rule( ], }, ) - split_swiftmodule_provider_test = make_provider_test_rule( config_settings = { "//command_line_option:features": [ @@ -32,7 +25,6 @@ split_swiftmodule_provider_test = make_provider_test_rule( ], }, ) - split_swiftmodule_wmo_test = make_action_command_line_test_rule( config_settings = { "//command_line_option:swiftcopt": [ @@ -43,8 +35,7 @@ split_swiftmodule_wmo_test = make_action_command_line_test_rule( ], }, ) - -split_swiftmodule_wmo_provider_test = make_action_command_line_test_rule( +split_swiftmodule_wmo_provider_test = make_provider_test_rule( config_settings = { "//command_line_option:swiftcopt": [ "-whole-module-optimization", @@ -170,6 +161,28 @@ def split_derived_files_test_suite(name = "split_derived_files"): target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", ) + split_swiftmodule_wmo_provider_test( + name = "{}_split_wmo_provider".format(name), + expected_files = [ + "test_fixtures_debug_settings_simple.swiftmodule", + ], + field = "direct_modules.swift.swiftmodule", + provider = "SwiftInfo", + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_wmo_provider_test( + name = "{}_split_wmo_provider_ccinfo".format(name), + expected_files = [ + "libsimple.a", + ], + field = "linking_context.libraries_to_link.pic_static_library!", + provider = "CcInfo", + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + native.test_suite( name = name, tags = [name], From 485f6472b5f87eb634f387a582350185fe8f1467 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:44:32 -0700 Subject: [PATCH 12/16] Fix extra DERIVE_FILES actions --- swift/internal/compiling.bzl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index cae29b0e9..2c577911a 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -134,10 +134,7 @@ def compile_action_configs(): # Configure the path to the emitted .swiftmodule file. swift_toolchain_config.action_config( - actions = [ - swift_action_names.COMPILE, - swift_action_names.DERIVE_FILES, - ], + actions = [swift_action_names.COMPILE], configurators = [_emit_module_path_configurator], not_features = [SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION], ), @@ -174,10 +171,7 @@ def compile_action_configs(): # Configure the path to the emitted *-Swift.h file. swift_toolchain_config.action_config( - actions = [ - swift_action_names.COMPILE, - swift_action_names.DERIVE_FILES, - ], + actions = [swift_action_names.COMPILE], configurators = [_emit_objc_header_path_configurator], not_features = [ [SWIFT_FEATURE_NO_GENERATED_HEADER], From f8bb59dc9463ffbd1898871005e900592082f2b1 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:55:58 -0700 Subject: [PATCH 13/16] Add -experimental-skip-non-inlinable-function-bodies --- swift/internal/compiling.bzl | 12 +++++++ swift/internal/feature_names.bzl | 4 +++ swift/internal/swift_autoconfiguration.bzl | 11 +++++++ swift/internal/xcode_swift_toolchain.bzl | 5 +++ test/split_derived_files_tests.bzl | 37 ++++++++++++++++++++++ 5 files changed, 69 insertions(+) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 2c577911a..778a6ae04 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -39,6 +39,7 @@ load( "SWIFT_FEATURE_EMIT_SWIFTINTERFACE", "SWIFT_FEATURE_ENABLE_BATCH_MODE", "SWIFT_FEATURE_ENABLE_LIBRARY_EVOLUTION", + "SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES", "SWIFT_FEATURE_ENABLE_TESTING", "SWIFT_FEATURE_FASTBUILD", "SWIFT_FEATURE_FULL_DEBUG_INFO", @@ -679,6 +680,17 @@ def compile_action_configs(): configurators = [_module_name_configurator], ), + # Pass extra flags for swiftmodule only compilations + swift_toolchain_config.action_config( + actions = [swift_action_names.DERIVE_FILES], + configurators = [ + swift_toolchain_config.add_arg( + "-experimental-skip-non-inlinable-function-bodies", + ), + ], + features = [SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES], + ), + # Configure index-while-building. swift_toolchain_config.action_config( actions = [ diff --git a/swift/internal/feature_names.bzl b/swift/internal/feature_names.bzl index f1cbf3548..3c4e74ca5 100644 --- a/swift/internal/feature_names.bzl +++ b/swift/internal/feature_names.bzl @@ -232,3 +232,7 @@ SWIFT_FEATURE_GENERATE_FROM_RAW_PROTO_FILES = "swift.generate_from_raw_proto_fil # `*.swiftmodule` and `*-Swift.h` are generated with a separate action # rather than as part of the compilation. SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION = "swift.split_derived_files_generation" + +# If enabled the skip function bodies frontend flag is passed when using derived +# files generation. This requires Swift 5.2 +SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES = "swift.enable_skip_function_bodies" diff --git a/swift/internal/swift_autoconfiguration.bzl b/swift/internal/swift_autoconfiguration.bzl index 48b772acf..e41c404a8 100644 --- a/swift/internal/swift_autoconfiguration.bzl +++ b/swift/internal/swift_autoconfiguration.bzl @@ -28,6 +28,7 @@ load( "@build_bazel_rules_swift//swift/internal:feature_names.bzl", "SWIFT_FEATURE_DEBUG_PREFIX_MAP", "SWIFT_FEATURE_ENABLE_BATCH_MODE", + "SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES", "SWIFT_FEATURE_IMPLICIT_MODULES", "SWIFT_FEATURE_MODULE_MAP_NO_PRIVATE_HEADERS", "SWIFT_FEATURE_SUPPORTS_PRIVATE_DEPS", @@ -75,6 +76,15 @@ def _check_enable_batch_mode(repository_ctx, swiftc_path, temp_dir): "-enable-batch-mode", ) +def _check_skip_function_bodies(repository_ctx, swiftc_path, temp_dir): + """Returns True if `swiftc` supports skip function bodies.""" + return _swift_succeeds( + repository_ctx, + swiftc_path, + "-version", + "-experimental-skip-non-inlinable-function-bodies", + ) + def _check_debug_prefix_map(repository_ctx, swiftc_path, temp_dir): """Returns True if `swiftc` supports debug prefix mapping.""" return _swift_succeeds( @@ -189,6 +199,7 @@ _FEATURE_CHECKS = { SWIFT_FEATURE_ENABLE_BATCH_MODE: _check_enable_batch_mode, SWIFT_FEATURE_SUPPORTS_PRIVATE_DEPS: _check_supports_private_deps, SWIFT_FEATURE_USE_RESPONSE_FILES: _check_use_response_files, + SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES: _check_skip_function_bodies, } def _create_linux_toolchain(repository_ctx): diff --git a/swift/internal/xcode_swift_toolchain.bzl b/swift/internal/xcode_swift_toolchain.bzl index 89824f720..135d7f13d 100644 --- a/swift/internal/xcode_swift_toolchain.bzl +++ b/swift/internal/xcode_swift_toolchain.bzl @@ -34,6 +34,7 @@ load( "SWIFT_FEATURE_BUNDLED_XCTESTS", "SWIFT_FEATURE_DEBUG_PREFIX_MAP", "SWIFT_FEATURE_ENABLE_BATCH_MODE", + "SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES", "SWIFT_FEATURE_MODULE_MAP_HOME_IS_CWD", "SWIFT_FEATURE_MODULE_MAP_NO_PRIVATE_HEADERS", "SWIFT_FEATURE_SUPPORTS_LIBRARY_EVOLUTION", @@ -601,6 +602,10 @@ def _xcode_swift_toolchain_impl(ctx): requested_features.append(SWIFT_FEATURE_SUPPORTS_LIBRARY_EVOLUTION) requested_features.append(SWIFT_FEATURE_SUPPORTS_PRIVATE_DEPS) + # Xcode 11.4 implies Swift 5.1. + if _is_xcode_at_least_version(xcode_config, "11.4"): + requested_features.append(SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES) + command_line_copts = _command_line_objc_copts( ctx.var["COMPILATION_MODE"], ctx.fragments.objc, diff --git a/test/split_derived_files_tests.bzl b/test/split_derived_files_tests.bzl index 8cbddc79c..89baa9b47 100644 --- a/test/split_derived_files_tests.bzl +++ b/test/split_derived_files_tests.bzl @@ -45,6 +45,17 @@ split_swiftmodule_wmo_provider_test = make_provider_test_rule( ], }, ) +split_swiftmodule_skip_function_bodies_test = make_action_command_line_test_rule( + config_settings = { + "//command_line_option:swiftcopt": [ + "-whole-module-optimization", + ], + "//command_line_option:features": [ + "swift.split_derived_files_generation", + "swift.enable_skip_function_bodies", + ], + }, +) def split_derived_files_test_suite(name = "split_derived_files"): """Test suite for split derived files options. @@ -183,6 +194,32 @@ def split_derived_files_test_suite(name = "split_derived_files"): target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", ) + split_swiftmodule_skip_function_bodies_test( + name = "{}_no_skip_function_bodies".format(name), + expected_argv = [ + "-emit-object", + ], + mnemonic = "SwiftCompile", + not_expected_argv = [ + "-experimental-skip-non-inlinable-function-bodies", + ], + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + split_swiftmodule_skip_function_bodies_test( + name = "{}_skip_function_bodies".format(name), + expected_argv = [ + "-experimental-skip-non-inlinable-function-bodies", + ], + mnemonic = "SwiftDeriveFiles", + not_expected_argv = [ + "-emit-object", + ], + tags = [name], + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + native.test_suite( name = name, tags = [name], From b6587e9f5a1662b80ea9d971577f277d5660bd62 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 13:59:14 -0700 Subject: [PATCH 14/16] Alphabetize feature list --- swift/internal/swift_autoconfiguration.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift/internal/swift_autoconfiguration.bzl b/swift/internal/swift_autoconfiguration.bzl index e41c404a8..dbcf1af9b 100644 --- a/swift/internal/swift_autoconfiguration.bzl +++ b/swift/internal/swift_autoconfiguration.bzl @@ -197,9 +197,9 @@ def _compute_feature_values(repository_ctx, swiftc_path): _FEATURE_CHECKS = { SWIFT_FEATURE_DEBUG_PREFIX_MAP: _check_debug_prefix_map, SWIFT_FEATURE_ENABLE_BATCH_MODE: _check_enable_batch_mode, + SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES: _check_skip_function_bodies, SWIFT_FEATURE_SUPPORTS_PRIVATE_DEPS: _check_supports_private_deps, SWIFT_FEATURE_USE_RESPONSE_FILES: _check_use_response_files, - SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES: _check_skip_function_bodies, } def _create_linux_toolchain(repository_ctx): From f4df9218639a04d497d59e3e824e4e7ee4a92138 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 14:05:46 -0700 Subject: [PATCH 15/16] Rename feature --- swift/internal/feature_names.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift/internal/feature_names.bzl b/swift/internal/feature_names.bzl index 3c4e74ca5..21257554a 100644 --- a/swift/internal/feature_names.bzl +++ b/swift/internal/feature_names.bzl @@ -235,4 +235,4 @@ SWIFT_FEATURE_SPLIT_DERIVED_FILES_GENERATION = "swift.split_derived_files_genera # If enabled the skip function bodies frontend flag is passed when using derived # files generation. This requires Swift 5.2 -SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES = "swift.enable_skip_function_bodies" +SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES = "swift.skip_function_bodies_for_derived_files" From 781f37917d4bc3f20da1a0da2551e9fb0bb61591 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 20 Oct 2020 14:05:51 -0700 Subject: [PATCH 16/16] Fix version comment --- swift/internal/xcode_swift_toolchain.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift/internal/xcode_swift_toolchain.bzl b/swift/internal/xcode_swift_toolchain.bzl index 135d7f13d..5a0d2a6cf 100644 --- a/swift/internal/xcode_swift_toolchain.bzl +++ b/swift/internal/xcode_swift_toolchain.bzl @@ -602,7 +602,7 @@ def _xcode_swift_toolchain_impl(ctx): requested_features.append(SWIFT_FEATURE_SUPPORTS_LIBRARY_EVOLUTION) requested_features.append(SWIFT_FEATURE_SUPPORTS_PRIVATE_DEPS) - # Xcode 11.4 implies Swift 5.1. + # Xcode 11.4 implies Swift 5.2. if _is_xcode_at_least_version(xcode_config, "11.4"): requested_features.append(SWIFT_FEATURE_ENABLE_SKIP_FUNCTION_BODIES)