Add builtin include directories to action key for CppCompileAction

Since builtin include directories affect validation, they have to be part of the
action key.

RELNOTES: None.
PiperOrigin-RevId: 206960988
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
index a73edf0..fd9ac8e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java
@@ -195,7 +195,7 @@
    * @param actionName a string giving the name of this action for the purpose of toolchain
    *     evaluation
    * @param cppSemantics C++ compilation semantics
-   * @param cppProvider - CcToolchainProvider with configuration-dependent information.
+   * @param builtInIncludeDirectories - list of toolchain-defined builtin include directories.
    */
   CppCompileAction(
       ActionOwner owner,
@@ -225,7 +225,7 @@
       ImmutableMap<String, String> executionInfo,
       String actionName,
       CppSemantics cppSemantics,
-      CcToolchainProvider cppProvider,
+      ImmutableList<PathFragment> builtInIncludeDirectories,
       @Nullable Artifact grepIncludes) {
     super(
         owner,
@@ -270,8 +270,7 @@
     this.needsIncludeValidation = cppSemantics.needsIncludeValidation();
     this.includeProcessing = cppSemantics.getIncludeProcessing();
     this.actionClassId = actionClassId;
-    this.builtInIncludeDirectories =
-        ImmutableList.copyOf(cppProvider.getBuiltInIncludeDirectories());
+    this.builtInIncludeDirectories = builtInIncludeDirectories;
     this.additionalInputs = null;
     this.usedModules = null;
     this.topLevelModules = null;
@@ -984,6 +983,7 @@
      * warning have changed, otherwise we might miss some errors.
      */
     fp.addPaths(ccCompilationContext.getDeclaredIncludeDirs());
+    fp.addPaths(builtInIncludeDirectories);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index f5d4c27..6c07974 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -80,6 +80,7 @@
   private ImmutableList<Artifact> builtinIncludeFiles;
   private Iterable<Artifact> inputsForInvalidation = ImmutableList.of();
   private Iterable<Artifact> additionalPrunableHeaders = ImmutableList.of();
+  private ImmutableList<PathFragment> builtinIncludeDirectories;
   // New fields need to be added to the copy constructor.
 
   /**
@@ -118,6 +119,7 @@
     this.env = configuration.getActionEnvironment();
     this.codeCoverageEnabled = configuration.isCodeCoverageEnabled();
     this.ccToolchain = ccToolchain;
+    this.builtinIncludeDirectories = ccToolchain.getBuiltInIncludeDirectories();
     this.grepIncludes = grepIncludes;
   }
 
@@ -155,6 +157,7 @@
     this.ccToolchain = other.ccToolchain;
     this.actionName = other.actionName;
     this.grepIncludes = other.grepIncludes;
+    this.builtinIncludeDirectories = other.builtinIncludeDirectories;
   }
 
   public PathFragment getTempOutputFile() {
@@ -313,7 +316,7 @@
               ccCompilationContext,
               coptsFilter,
               cppSemantics,
-              ccToolchain,
+              builtinIncludeDirectories,
               ImmutableMap.copyOf(executionInfo),
               grepIncludes);
     } else {
@@ -346,7 +349,7 @@
               ImmutableMap.copyOf(executionInfo),
               getActionName(),
               cppSemantics,
-              ccToolchain,
+              builtinIncludeDirectories,
               grepIncludes);
     }
 
@@ -644,6 +647,13 @@
     return this;
   }
 
+  @VisibleForTesting
+  public CppCompileActionBuilder setBuiltinIncludeDirectories(
+      ImmutableList<PathFragment> builtinIncludeDirectories) {
+    this.builtinIncludeDirectories = builtinIncludeDirectories;
+    return this;
+  }
+
   public boolean shouldCompileHeaders() {
     Preconditions.checkNotNull(featureConfiguration);
     return ccToolchain.shouldProcessHeaders(featureConfiguration);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java
index 161083a..f281e1b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java
@@ -78,7 +78,7 @@
       CcCompilationContext ccCompilationContext,
       CoptsFilter nocopts,
       CppSemantics cppSemantics,
-      CcToolchainProvider cppProvider,
+      ImmutableList<PathFragment> builtInIncludeDirectories,
       ImmutableMap<String, String> executionInfo,
       Artifact grepIncludes) {
     super(
@@ -116,7 +116,7 @@
         executionInfo,
         CppActionNames.CPP_COMPILE,
         cppSemantics,
-        cppProvider,
+        builtInIncludeDirectories,
         grepIncludes);
     this.tempOutputFile = Preconditions.checkNotNull(tempOutputFile);
   }