Adds mcov tool label to IosTest.

Adds source files to IosTest runfiles so that mcov/clang has access to them during coverage run.

--
MOS_MIGRATED_REVID=117572134
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index b9ad57b..76b72b0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -63,6 +63,7 @@
   static final String TEST_TARGET_DEVICE_ATTR = "ios_test_target_device";
   static final String TEST_TEMPLATE_ATTR = "$test_template";
   static final String XCTEST_APP_ATTR = "xctest_app";
+  static final String MCOV_TOOL_ATTR = ":mcov";
 
   @VisibleForTesting
   public static final String REQUIRES_SOURCE_ERROR =
@@ -168,10 +169,13 @@
     NestedSetBuilder<Artifact> filesToBuildBuilder =
         NestedSetBuilder.<Artifact>stableOrder().addTransitive(filesToBuildSet);
 
+    InstrumentedFilesProvider instrumentedFilesProvider =
+        new CompilationSupport(ruleContext).getInstrumentedFilesProvider(common);
+
     TestSupport testSupport =
         new TestSupport(ruleContext)
             .registerTestRunnerActions()
-            .addRunfiles(runfilesBuilder)
+            .addRunfiles(runfilesBuilder, instrumentedFilesProvider)
             .addFilesToBuild(filesToBuildBuilder);
 
     Artifact executable = testSupport.generatedTestScript();
@@ -187,9 +191,7 @@
         .add(
             ExecutionInfoProvider.class,
             new ExecutionInfoProvider(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, "")))
-        .addProvider(
-            InstrumentedFilesProvider.class,
-            new CompilationSupport(ruleContext).getInstrumentedFilesProvider(common))
+        .addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider)
         .addProviders(testSupport.getExtraProviders())
         .setRunfilesSupport(runfilesSupport, executable)
         .build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
index b758e52..448c4be 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
@@ -29,6 +29,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Attribute.ComputedDefault;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundLabelList;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
@@ -50,6 +51,7 @@
   public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) {
     final ImmutableList<Label> gcov =
         ImmutableList.of(env.getToolsLabel("//tools/objc:gcov"));
+    final Label mcov = env.getToolsLabel("//tools/objc:mcov");
     return builder
         .requiresConfigurationFragments(
             ObjcConfiguration.class, J2ObjcConfiguration.class, AppleConfiguration.class)
@@ -70,8 +72,7 @@
             attr(IosTest.TARGET_DEVICE, LABEL)
                 .allowedFileTypes()
                 .allowedRuleClasses("ios_device")
-                .value(
-                    env.getToolsLabel("//tools/objc/sim_devices:default")))
+                .value(env.getToolsLabel("//tools/objc/sim_devices:default")))
         /* <!-- #BLAZE_RULE(ios_test).ATTRIBUTE(xctest) -->
         Whether this target contains tests using the XCTest testing framework.
         <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
@@ -147,14 +148,29 @@
                 .value(
                     new LateBoundLabelList<BuildConfiguration>(gcov) {
                       @Override
-                      public List<Label> getDefault(Rule rule, AttributeMap attributes,
-                          BuildConfiguration configuration) {
+                      public List<Label> getDefault(
+                          Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
                         if (!configuration.isCodeCoverageEnabled()) {
                           return ImmutableList.of();
                         }
                         return gcov;
                       }
                     }))
+        .add(
+            attr(IosTest.MCOV_TOOL_ATTR, LABEL)
+                .cfg(HOST)
+                .value(
+                    new LateBoundLabel<BuildConfiguration>(mcov) {
+                      @Override
+                      public Label getDefault(
+                          Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
+                        if (!configuration.isCodeCoverageEnabled()) {
+                          return null;
+                        }
+
+                        return mcov;
+                      }
+                    }))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
index 265c637..b1c5050 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java
@@ -34,6 +34,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
+import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
 import com.google.devtools.build.lib.rules.test.TestEnvironmentProvider;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileType;
@@ -219,7 +220,9 @@
   /**
    * Adds all files needed to run this test to the passed Runfiles builder.
    */
-  public TestSupport addRunfiles(Builder runfilesBuilder) throws InterruptedException {
+  public TestSupport addRunfiles(
+      Builder runfilesBuilder, InstrumentedFilesProvider instrumentedFilesProvider)
+      throws InterruptedException {
     runfilesBuilder
         .addArtifact(testBundleIpa())
         .addArtifacts(testHarnessIpa().asSet())
@@ -235,6 +238,11 @@
       runfilesBuilder.addTransitiveArtifacts(labDeviceRunfiles());
     }
 
+    if (ruleContext.getConfiguration().isCodeCoverageEnabled()) {
+      runfilesBuilder.addArtifact(ruleContext.getHostPrerequisiteArtifact(IosTest.MCOV_TOOL_ATTR));
+      runfilesBuilder.addTransitiveArtifacts(instrumentedFilesProvider.getInstrumentedFiles());
+    }
+
     return this;
   }
 
diff --git a/tools/objc/BUILD b/tools/objc/BUILD
index 3b690d3..1fa4628 100644
--- a/tools/objc/BUILD
+++ b/tools/objc/BUILD
@@ -110,6 +110,11 @@
     srcs = [":gcov_stub"],
 )
 
+filegroup(
+    name = "mcov",
+    srcs = [":mcov_stub"],
+)
+
 xcode_config(
     name = "host_xcodes",
 )
diff --git a/tools/objc/mcov_stub b/tools/objc/mcov_stub
new file mode 100644
index 0000000..5764e83
--- /dev/null
+++ b/tools/objc/mcov_stub
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+(
+  printf 'Bazel does not yet support coverage.\n'
+) >&2
+
+exit 1