Fix layering check whitelist - internal change

PiperOrigin-RevId: 303318401
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
index 2dad150..e886059 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppSemantics.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.bazel.rules.cpp;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -109,5 +110,8 @@
   }
 
   @Override
-  public void validateLayeringCheckFeatures(RuleContext ruleContext) {}
+  public void validateLayeringCheckFeatures(
+      RuleContext ruleContext,
+      CcToolchainProvider ccToolchain,
+      ImmutableSet<String> unsupportedFeatures) {}
 }
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 76e209c..dc9b317 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
@@ -833,7 +833,7 @@
       ImmutableSet<String> unsupportedFeatures,
       CcToolchainProvider toolchain,
       CppSemantics cppSemantics) {
-    cppSemantics.validateLayeringCheckFeatures(ruleContext);
+    cppSemantics.validateLayeringCheckFeatures(ruleContext, toolchain, ImmutableSet.of());
     try {
       return configureFeaturesOrThrowEvalException(
           requestedFeatures,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 1f1a3055..bd21553 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -159,12 +159,15 @@
     // flipped.
     BuildOptions buildOptions =
         ruleContext == null ? null : ruleContext.getConfiguration().getOptions();
-    getSemantics().validateLayeringCheckFeatures(ruleContext.getRuleContext());
+    ImmutableSet<String> unsupportedFeaturesSet =
+        ImmutableSet.copyOf(unsupportedFeatures.getContents(String.class, "unsupported_features"));
+    getSemantics()
+        .validateLayeringCheckFeatures(
+            ruleContext.getRuleContext(), toolchain, unsupportedFeaturesSet);
     return FeatureConfigurationForStarlark.from(
         CcCommon.configureFeaturesOrThrowEvalException(
             ImmutableSet.copyOf(requestedFeatures.getContents(String.class, "requested_features")),
-            ImmutableSet.copyOf(
-                unsupportedFeatures.getContents(String.class, "unsupported_features")),
+            unsupportedFeaturesSet,
             toolchain,
             cppConfiguration),
         cppConfiguration,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index cb06563..a9ad796 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Location;
 import java.io.Serializable;
 import java.util.HashMap;
@@ -42,6 +43,14 @@
   /** Default attribute name for the c++ toolchain type */
   public static final String CC_TOOLCHAIN_TYPE_ATTRIBUTE_NAME = "$cc_toolchain_type";
 
+  public static final String ALLOWED_LAYERING_CHECK_FEATURES_WHITELIST =
+      "disabling_parse_headers_and_layering_check_allowed";
+  public static final String ALLOWED_LAYERING_CHECK_FEATURES_TARGET =
+      "@bazel_tools//tools/build_defs/cc/whitelists/parse_headers_and_layering_check:"
+          + ALLOWED_LAYERING_CHECK_FEATURES_WHITELIST;
+  public static final Label ALLOWED_LAYERING_CHECK_FEATURES_LABEL =
+      Label.parseAbsoluteUnchecked(ALLOWED_LAYERING_CHECK_FEATURES_TARGET);
+
   @Override
   public ConfiguredTarget create(RuleContext ruleContext)
       throws InterruptedException, RuleErrorException, ActionConflictException {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
index 5a5d8b1..b32a168 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAttributesProvider.java
@@ -26,8 +26,10 @@
 import com.google.devtools.build.lib.analysis.LicensesProvider.TargetLicense;
 import com.google.devtools.build.lib.analysis.LicensesProviderImpl;
 import com.google.devtools.build.lib.analysis.MiddlemanProvider;
+import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.Whitelist;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -97,6 +99,7 @@
   private final Label ccToolchainLabel;
   private final TransitiveInfoCollection staticRuntimeLib;
   private final TransitiveInfoCollection dynamicRuntimeLib;
+  private final PackageSpecificationProvider whitelistForLayeringCheck;
 
   public CcToolchainAttributesProvider(
       RuleContext ruleContext,
@@ -219,6 +222,9 @@
       this.toolchainType = null;
     }
     this.additionalBuildVariablesComputer = additionalBuildVariablesComputer;
+    this.whitelistForLayeringCheck =
+        Whitelist.fetchPackageSpecificationProvider(
+            ruleContext, CcToolchain.ALLOWED_LAYERING_CHECK_FEATURES_WHITELIST);
   }
 
   public String getCpu() {
@@ -406,6 +412,10 @@
     return ifsoBuilder;
   }
 
+  public PackageSpecificationProvider getWhitelistForLayeringCheck() {
+    return whitelistForLayeringCheck;
+  }
+
   private static NestedSet<Artifact> getMiddlemanOrFiles(RuleContext context, String attribute) {
     return getMiddlemanOrFiles(context, attribute, Mode.HOST);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index 168c647..cbb52b9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -19,6 +19,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.LicensesProvider;
+import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
@@ -101,7 +102,8 @@
           /* abi= */ "",
           /* targetSystemName= */ "",
           /* additionalMakeVariables= */ ImmutableMap.of(),
-          /* legacyCcFlagsMakeVariable= */ "");
+          /* legacyCcFlagsMakeVariable= */ "",
+          /* whitelistForLayeringCheck= */ null);
 
   @Nullable private final CppConfiguration cppConfiguration;
   private final PathFragment crosstoolTopPathFragment;
@@ -163,6 +165,7 @@
   private final FdoContext fdoContext;
 
   private final LicensesProvider licensesProvider;
+  private final PackageSpecificationProvider whitelistForLayeringCheck;
 
   public CcToolchainProvider(
       ImmutableMap<String, Object> values,
@@ -217,7 +220,8 @@
       String abi,
       String targetSystemName,
       ImmutableMap<String, String> additionalMakeVariables,
-      String legacyCcFlagsMakeVariable) {
+      String legacyCcFlagsMakeVariable,
+      PackageSpecificationProvider whitelistForLayeringCheck) {
     super(values, Location.BUILTIN);
     this.cppConfiguration = cppConfiguration;
     this.crosstoolTopPathFragment = crosstoolTopPathFragment;
@@ -274,6 +278,7 @@
     this.targetSystemName = targetSystemName;
     this.additionalMakeVariables = additionalMakeVariables;
     this.legacyCcFlagsMakeVariable = legacyCcFlagsMakeVariable;
+    this.whitelistForLayeringCheck = whitelistForLayeringCheck;
   }
 
   /**
@@ -904,5 +909,9 @@
   NestedSet<Artifact> getDynamicRuntimeLibForTesting() {
     return dynamicRuntimeLinkInputs;
   }
+
+  public PackageSpecificationProvider getWhitelistForLayeringCheck() {
+    return whitelistForLayeringCheck;
+  }
 }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
index c0713a6..ae0f1d7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderHelper.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.CompilationHelper;
 import com.google.devtools.build.lib.analysis.FileProvider;
+import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -183,6 +184,9 @@
     ImmutableList<PathFragment> builtInIncludeDirectories =
         builtInIncludeDirectoriesBuilder.build();
 
+    PackageSpecificationProvider whitelistForLayeringCheck =
+        attributes.getWhitelistForLayeringCheck();
+
     return new CcToolchainProvider(
         getToolchainForSkylark(toolPaths),
         cppConfiguration,
@@ -244,7 +248,8 @@
         toolchainConfigInfo.getAbiVersion(),
         toolchainConfigInfo.getTargetSystemName(),
         computeAdditionalMakeVariables(toolchainConfigInfo),
-        computeLegacyCcFlagsMakeVariable(toolchainConfigInfo));
+        computeLegacyCcFlagsMakeVariable(toolchainConfigInfo),
+        whitelistForLayeringCheck);
   }
 
   @Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
index c63f4f2..1452a37 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainRule.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
+import com.google.devtools.build.lib.analysis.Whitelist;
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
@@ -355,6 +356,10 @@
                 .allowedFileTypes()
                 .mandatoryProviders(CcToolchainConfigInfo.PROVIDER.id())
                 .mandatory())
+        .add(
+            Whitelist.getAttributeFromWhitelistName(
+                    CcToolchain.ALLOWED_LAYERING_CHECK_FEATURES_WHITELIST)
+                .value(CcToolchain.ALLOWED_LAYERING_CHECK_FEATURES_LABEL))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
index a8f4e87..49f8563 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.rules.cpp;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -54,5 +55,8 @@
   StructImpl getCcSharedLibraryInfo(TransitiveInfoCollection dep);
 
   /** No-op in Bazel */
-  void validateLayeringCheckFeatures(RuleContext ruleContext);
+  void validateLayeringCheckFeatures(
+      RuleContext ruleContext,
+      CcToolchainProvider ccToolchain,
+      ImmutableSet<String> unsupportedFeatures);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
index bc0b939..09645b0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
@@ -16,12 +16,14 @@
 
 import static com.google.devtools.build.lib.rules.objc.CompilationSupport.IncludeProcessingType.INCLUDE_SCANNING;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
 import com.google.devtools.build.lib.rules.cpp.CppCompileActionBuilder;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.HeadersCheckingMode;
 import com.google.devtools.build.lib.rules.cpp.CppSemantics;
@@ -130,5 +132,8 @@
   }
 
   @Override
-  public void validateLayeringCheckFeatures(RuleContext ruleContext) {}
+  public void validateLayeringCheckFeatures(
+      RuleContext ruleContext,
+      CcToolchainProvider ccToolchain,
+      ImmutableSet<String> unsupportedFeatures) {}
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index f7a4c79..cbae0fa 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -54,6 +54,7 @@
     writeMacroFile(config);
     setupRulesCc(config);
     setupCcToolchainConfig(config);
+    createParseHeadersAndLayeringCheckWhitelist(config);
   }
 
   @Override
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index d898d23..b9d088b 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -251,6 +251,17 @@
     config.append(TestConstants.TOOLS_REPOSITORY_SCRATCH + "tools/cpp/BUILD", "");
   }
 
+  protected static void createParseHeadersAndLayeringCheckWhitelist(MockToolsConfig config)
+      throws IOException {
+    config.create(
+        TestConstants.TOOLS_REPOSITORY_SCRATCH
+            + "tools/build_defs/cc/whitelists/parse_headers_and_layering_check/BUILD",
+        "package_group(",
+        "    name = 'disabling_parse_headers_and_layering_check_allowed',",
+        "    packages = ['//...']",
+        ")");
+  }
+
   protected String getCrosstoolTopPathForConfig(MockToolsConfig config) {
     if (config.isRealFileSystem()) {
       return getRealFilesystemCrosstoolTopPath();
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java
index dce70d9..48f5754 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/MockCppSemantics.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.rules.cpp;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -68,6 +69,9 @@
   }
 
   @Override
-  public void validateLayeringCheckFeatures(RuleContext ruleContext) {}
+  public void validateLayeringCheckFeatures(
+      RuleContext ruleContext,
+      CcToolchainProvider ccToolchain,
+      ImmutableSet<String> unsupportedFeatures) {}
   ;
 }
diff --git a/tools/build_defs/BUILD b/tools/build_defs/BUILD
index ef350c9..e726001 100644
--- a/tools/build_defs/BUILD
+++ b/tools/build_defs/BUILD
@@ -2,6 +2,7 @@
     name = "srcs",
     srcs = glob(["**"]) + [
         "//tools/build_defs/cc:srcs",
+        "//tools/build_defs/cc/whitelists/parse_headers_and_layering_check:srcs",
         "//tools/build_defs/hash:srcs",
         "//tools/build_defs/pkg:srcs",
         "//tools/build_defs/repo:srcs",
@@ -13,6 +14,7 @@
     name = "embedded_tools",
     srcs = glob(["**"]) + [
         "//tools/build_defs/cc:srcs",
+        "//tools/build_defs/cc/whitelists/parse_headers_and_layering_check:srcs",
         "//tools/build_defs/hash:srcs",
         "//tools/build_defs/pkg:srcs",
         "//tools/build_defs/repo:embedded_tools",
diff --git a/tools/build_defs/cc/whitelists/parse_headers_and_layering_check/BUILD b/tools/build_defs/cc/whitelists/parse_headers_and_layering_check/BUILD
new file mode 100644
index 0000000..b078e2d
--- /dev/null
+++ b/tools/build_defs/cc/whitelists/parse_headers_and_layering_check/BUILD
@@ -0,0 +1,12 @@
+licenses(["notice"])  # Apache 2.0
+
+package_group(
+    name = "disabling_parse_headers_and_layering_check_allowed",
+    packages = [],
+)
+
+filegroup(
+    name = "srcs",
+    srcs = ["BUILD"],
+    visibility = ["//tools/build_defs:__pkg__"],
+)