From 77a056987b678674e3367309b8f7b7ac5aa60564 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 14 Sep 2020 18:05:48 -0700 Subject: [PATCH 1/5] Implement -coverage-prefix-map feature This should ship in Swift 5.3.x https://github.com/apple/swift/pull/32175 --- swift/internal/compiling.bzl | 13 +++++++++++++ swift/internal/feature_names.bzl | 5 +++++ tools/worker/swift_runner.cc | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 13fb43cb3..4805d69c7 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -293,6 +293,19 @@ def compile_action_configs(): [SWIFT_FEATURE_DEBUG_PREFIX_MAP, SWIFT_FEATURE_FULL_DEBUG_INFO], ], ), + + # Make paths written into coverage info workspace-relative. + swift_toolchain_config.action_config( + actions = [swift_action_names.COMPILE], + configurators = [ + swift_toolchain_config.add_arg( + "-Xwrapped-swift=-coverage-prefix-pwd-is-dot", + ), + ], + features = [ + [SWIFT_FEATURE_COVERAGE_PREFIX_MAP, SWIFT_FEATURE_COVERAGE], + ], + ), ] #### Coverage and sanitizer instrumentation flags diff --git a/swift/internal/feature_names.bzl b/swift/internal/feature_names.bzl index da282aeef..ad3ed8969 100644 --- a/swift/internal/feature_names.bzl +++ b/swift/internal/feature_names.bzl @@ -61,6 +61,11 @@ SWIFT_FEATURE_COMPILE_STATS = "swift.compile_stats" # builds. SWIFT_FEATURE_DEBUG_PREFIX_MAP = "swift.debug_prefix_map" +# If enabled, coverage builds will use the `-coverage-prefix-map` feature to +# remap the current working directory to `.`, which increases reproducibility +# of remote builds. +SWIFT_FEATURE_COVERAGE_PREFIX_MAP = "swift.coverage_prefix_map" + # If enabled, C and Objective-C libraries that are direct or transitive # dependencies of a Swift library will emit explicit precompiled modules that # are compatible with Swift's ClangImporter and propagate them up the build diff --git a/tools/worker/swift_runner.cc b/tools/worker/swift_runner.cc index eca0f2993..c1a387f66 100644 --- a/tools/worker/swift_runner.cc +++ b/tools/worker/swift_runner.cc @@ -187,6 +187,12 @@ bool SwiftRunner::ProcessArgument( consumer("-debug-prefix-map"); consumer(GetCurrentDirectory() + "=."); changed = true; + } else if (arg == "-Xwrapped-swift=-coverage-prefix-pwd-is-dot") { + // Get the actual current working directory (the workspace root), which we + // didn't know at analysis time. + consumer("-coverage-prefix-map"); + consumer(GetCurrentDirectory() + "=."); + changed = true; } else if (arg == "-Xwrapped-swift=-ephemeral-module-cache") { // Create a temporary directory to hold the module cache, which will be // deleted after compilation is finished. From 27fcd2f96679d11a8b7d5e685018f5af77ec4485 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 22 Sep 2020 09:33:29 -0700 Subject: [PATCH 2/5] Add missing import --- swift/internal/compiling.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/swift/internal/compiling.bzl b/swift/internal/compiling.bzl index 4805d69c7..a752d4147 100644 --- a/swift/internal/compiling.bzl +++ b/swift/internal/compiling.bzl @@ -32,6 +32,7 @@ load( "SWIFT_FEATURE_CACHEABLE_SWIFTMODULES", "SWIFT_FEATURE_COMPILE_STATS", "SWIFT_FEATURE_COVERAGE", + "SWIFT_FEATURE_COVERAGE_PREFIX_MAP", "SWIFT_FEATURE_DBG", "SWIFT_FEATURE_DEBUG_PREFIX_MAP", "SWIFT_FEATURE_EMIT_C_MODULE", From 3c8b35adc098ec892fc92c3efbf0043d3806a0d7 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 12 Oct 2020 17:41:32 -0700 Subject: [PATCH 3/5] Add test --- test/BUILD | 3 ++ test/coverage_settings_tests.bzl | 47 ++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 test/coverage_settings_tests.bzl diff --git a/test/BUILD b/test/BUILD index 38d7e1de4..ea685d048 100644 --- a/test/BUILD +++ b/test/BUILD @@ -1,5 +1,6 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load(":debug_settings_tests.bzl", "debug_settings_test_suite") +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") @@ -8,6 +9,8 @@ licenses(["notice"]) debug_settings_test_suite() +coverage_settings_test_suite() + generated_header_test_suite() private_deps_test_suite() diff --git a/test/coverage_settings_tests.bzl b/test/coverage_settings_tests.bzl new file mode 100644 index 000000000..794f0e881 --- /dev/null +++ b/test/coverage_settings_tests.bzl @@ -0,0 +1,47 @@ +load( + "@build_bazel_rules_swift//test/rules:action_command_line_test.bzl", + "make_action_command_line_test_rule", +) + +default_coverage_test = make_action_command_line_test_rule( + config_settings = { + "//command_line_option:features": [ + "swift.coverage", + ], + }, +) + +coverage_prefix_map_test = make_action_command_line_test_rule( + config_settings = { + "//command_line_option:features": [ + "swift.coverage", + "swift.coverage_prefix_map", + ], + }, +) + +def coverage_settings_test_suite(name = "coverage_settings"): + """Test suite for coverage options. + + Args: + name: The name prefix for all the nested tests + """ + default_coverage_test( + name = "{}_default_coverage".format(name), + tags = [name], + not_expected_argv = [ + "-Xwrapped-swift=-coverage-prefix-pwd-is-dot", + ], + mnemonic = "SwiftCompile", + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) + + coverage_prefix_map_test( + name = "{}_prefix_map".format(name), + tags = [name], + expected_argv = [ + "-Xwrapped-swift=-coverage-prefix-pwd-is-dot", + ], + mnemonic = "SwiftCompile", + target_under_test = "@build_bazel_rules_swift//test/fixtures/debug_settings:simple", + ) From aa72397e696c330a3ab38efe17440e68785714a0 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 12 Oct 2020 17:44:02 -0700 Subject: [PATCH 4/5] Add docstring --- test/coverage_settings_tests.bzl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/coverage_settings_tests.bzl b/test/coverage_settings_tests.bzl index 794f0e881..d84145002 100644 --- a/test/coverage_settings_tests.bzl +++ b/test/coverage_settings_tests.bzl @@ -1,3 +1,5 @@ +"""Tests for coverage-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", From 942e36510bbca0b2136fda2645546b6c60783898 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 12 Oct 2020 17:54:58 -0700 Subject: [PATCH 5/5] Improve tests --- test/coverage_settings_tests.bzl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/coverage_settings_tests.bzl b/test/coverage_settings_tests.bzl index d84145002..e16d7da10 100644 --- a/test/coverage_settings_tests.bzl +++ b/test/coverage_settings_tests.bzl @@ -7,16 +7,14 @@ load( default_coverage_test = make_action_command_line_test_rule( config_settings = { - "//command_line_option:features": [ - "swift.coverage", - ], + "//command_line_option:collect_code_coverage": "true", }, ) coverage_prefix_map_test = make_action_command_line_test_rule( config_settings = { + "//command_line_option:collect_code_coverage": "true", "//command_line_option:features": [ - "swift.coverage", "swift.coverage_prefix_map", ], }, @@ -31,6 +29,10 @@ def coverage_settings_test_suite(name = "coverage_settings"): default_coverage_test( name = "{}_default_coverage".format(name), tags = [name], + expected_argv = [ + "-profile-generate", + "-profile-coverage-mapping", + ], not_expected_argv = [ "-Xwrapped-swift=-coverage-prefix-pwd-is-dot", ], @@ -42,6 +44,8 @@ def coverage_settings_test_suite(name = "coverage_settings"): name = "{}_prefix_map".format(name), tags = [name], expected_argv = [ + "-profile-generate", + "-profile-coverage-mapping", "-Xwrapped-swift=-coverage-prefix-pwd-is-dot", ], mnemonic = "SwiftCompile",