Make sure disabled FDO features are filtered out. Without this, the FDO features enabled under --fdo* blaze options are not removed when BUILD files contain "features = ['-fdo_instrument', '-fdo_optimize']". -- MOS_MIGRATED_REVID=103431508
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index 7ec5899..8c226b4 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -163,6 +163,12 @@ Set<String> globallyEnabled = new HashSet<>(); Set<String> globallyDisabled = new HashSet<>(); parseFeatures(getConfiguration().getDefaultFeatures(), globallyEnabled, globallyDisabled); + for (ImmutableMap.Entry<Class<? extends Fragment>, Fragment> entry : + getConfiguration().getAllFragments().entrySet()) { + if (rule.getRuleClassObject().isLegalConfigurationFragment(entry.getKey())) { + globallyEnabled.addAll(entry.getValue().configurationEnabledFeatures(this)); + } + } Set<String> packageEnabled = new HashSet<>(); Set<String> packageDisabled = new HashSet<>(); parseFeatures(getRule().getPackage().getFeatures(), packageEnabled, packageDisabled);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java index 4ea1509..2ae028b 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -36,6 +36,7 @@ import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.DependencyResolver; +import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.ViewCreationFailedException; import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection.Transitions; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; @@ -270,6 +271,13 @@ */ public void declareSkyframeDependencies(Environment env) { } + + /** + * Return set of features enabled by this configuration. + */ + public ImmutableSet<String> configurationEnabledFeatures(RuleContext ruleContext) { + return ImmutableSet.of(); + } } /** @@ -1013,6 +1021,12 @@ */ private final Map<String, OptionDetails> transitiveOptionsMap; + /** + * Returns map of all the fragments for this configuration. + */ + public ImmutableMap<Class<? extends Fragment>, Fragment> getAllFragments() { + return fragments; + } /** * Validates the options for this BuildConfiguration. Issues warnings for the
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 2f44210..479b0b5 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -1295,7 +1295,8 @@ } String name = fragmentNameResolver.resolveName(configurationFragment); - return (name != null && requiredConfigurationFragmentNames.get(config).contains(name)); + ImmutableSet<String> fragmentNames = requiredConfigurationFragmentNames.get(config); + return (name != null && fragmentNames != null && fragmentNames.contains(name)); } /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java index 9106fc8..167be63 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -533,26 +533,6 @@ } requestedFeatures.addAll(ruleSpecificRequestedFeatures); - // Enable FDO related features requested by options. - CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class); - FdoSupport fdoSupport = cppConfiguration.getFdoSupport(); - if (fdoSupport.getFdoInstrument() != null) { - requestedFeatures.add(CppRuleClasses.FDO_INSTRUMENT); - } - if (fdoSupport.getFdoOptimizeProfile() != null - && !fdoSupport.isAutoFdoEnabled()) { - requestedFeatures.add(CppRuleClasses.FDO_OPTIMIZE); - } - if (fdoSupport.isAutoFdoEnabled()) { - requestedFeatures.add(CppRuleClasses.AUTOFDO); - } - if (cppConfiguration.isLipoOptimizationOrInstrumentation()) { - requestedFeatures.add(CppRuleClasses.LIPO); - } - if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { - requestedFeatures.add(CppRuleClasses.COVERAGE); - } - FeatureConfiguration configuration = toolchain.getFeatures().getFeatureConfiguration(requestedFeatures.build()); for (String feature : unsupportedFeatures) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index 1b9f786..bff5cbe 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -32,6 +32,7 @@ import com.google.devtools.build.lib.actions.PackageRootResolutionException; import com.google.devtools.build.lib.actions.PackageRootResolver; import com.google.devtools.build.lib.actions.Root; +import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.ViewCreationFailedException; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildOptions; @@ -1915,4 +1916,31 @@ "compiler", getCompiler() ); } + + /** + * Return set of features enabled by the CppConfiguration, specifically + * the FDO and LIPO related features enabled by options. + */ + @Override + public ImmutableSet<String> configurationEnabledFeatures(RuleContext ruleContext) { + ImmutableSet.Builder<String> requestedFeatures = ImmutableSet.builder(); + FdoSupport fdoSupport = getFdoSupport(); + if (fdoSupport.getFdoInstrument() != null) { + requestedFeatures.add(CppRuleClasses.FDO_INSTRUMENT); + } + if (fdoSupport.getFdoOptimizeProfile() != null + && !fdoSupport.isAutoFdoEnabled()) { + requestedFeatures.add(CppRuleClasses.FDO_OPTIMIZE); + } + if (fdoSupport.isAutoFdoEnabled()) { + requestedFeatures.add(CppRuleClasses.AUTOFDO); + } + if (isLipoOptimizationOrInstrumentation()) { + requestedFeatures.add(CppRuleClasses.LIPO); + } + if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { + requestedFeatures.add(CppRuleClasses.COVERAGE); + } + return requestedFeatures.build(); + } }