Don't use range-based for loops when iterating over the headers of a specific
target. In most cases, there is exactly one and creating all the iterators for
SingletonImmutableList shows to create a huge amount of garbage.

RELNOTES: None.
PiperOrigin-RevId: 240336016
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
index 9b4accf..965c9cb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
@@ -259,7 +259,10 @@
     Set<Artifact> modularHeaders = new HashSet<>();
     for (HeaderInfo transitiveHeaderInfo : transitiveHeaderInfos) {
       boolean isModule = createModularHeaders && transitiveHeaderInfo.getModule(usePic) != null;
-      for (Artifact a : transitiveHeaderInfo.modularHeaders) {
+      // Not using range-based for loops here as often there is exactly one element in this list
+      // and the amount of garbage created by SingletonImmutableList.iterator() is significant.
+      for (int i = 0; i < transitiveHeaderInfo.modularHeaders.size(); i++) {
+        Artifact a = transitiveHeaderInfo.modularHeaders.get(i);
         if (!a.isSourceArtifact()) {
           pathToLegalOutputArtifact.put(a.getExecPath(), a);
         }
@@ -267,7 +270,8 @@
           modularHeaders.add(a);
         }
       }
-      for (Artifact a : transitiveHeaderInfo.textualHeaders) {
+      for (int i = 0; i < transitiveHeaderInfo.textualHeaders.size(); i++) {
+        Artifact a = transitiveHeaderInfo.textualHeaders.get(i);
         if (!a.isSourceArtifact()) {
           pathToLegalOutputArtifact.put(a.getExecPath(), a);
         }
@@ -300,7 +304,10 @@
     HeadersAndModules result = new HeadersAndModules(includes.size());
     for (HeaderInfo transitiveHeaderInfo : transitiveHeaderInfos) {
       Artifact module = transitiveHeaderInfo.getModule(usePic);
-      for (Artifact header : transitiveHeaderInfo.modularHeaders) {
+      // Not using range-based for loops here as often there is exactly one element in this list
+      // and the amount of garbage created by SingletonImmutableList.iterator() is significant.
+      for (int i = 0; i < transitiveHeaderInfo.modularHeaders.size(); i++) {
+        Artifact header = transitiveHeaderInfo.modularHeaders.get(i);
         if (includes.contains(header)) {
           if (module != null) {
             result.modules.add(module);
@@ -308,7 +315,8 @@
           result.headers.add(header);
         }
       }
-      for (Artifact header : transitiveHeaderInfo.textualHeaders) {
+      for (int i = 0; i < transitiveHeaderInfo.textualHeaders.size(); i++) {
+        Artifact header = transitiveHeaderInfo.textualHeaders.get(i);
         if (includes.contains(header)) {
           result.headers.add(header);
         }