From bc374771afe9b210105f97519f37d394633a4f70 Mon Sep 17 00:00:00 2001 From: Googler Date: Thu, 28 Jun 2018 10:42:29 -0700 Subject: Deduplicate loose paths much earlier so that they create smaller nested sets and avoid needlessly copying lists. PiperOrigin-RevId: 202504396 --- .../java/com/google/devtools/build/lib/rules/cpp/CcCommon.java | 10 +++++----- .../devtools/build/lib/rules/cpp/CcCompilationHelper.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src/main/java') 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 451d40020c..856ae0965f 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 @@ -64,6 +64,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -576,8 +577,8 @@ public final class CcCommon { * Determines a list of loose include directories that are only allowed to be referenced when * headers checking is {@link HeadersCheckingMode#LOOSE} or {@link HeadersCheckingMode#WARN}. */ - List getLooseIncludeDirs() { - List result = new ArrayList<>(); + Set getLooseIncludeDirs() { + ImmutableSet.Builder result = ImmutableSet.builder(); // The package directory of the rule contributes includes. Note that this also covers all // non-subpackage sub-directories. PathFragment rulePackage = ruleContext.getLabel().getPackageIdentifier() @@ -588,9 +589,8 @@ public final class CcCommon { if (hasAttribute("srcs", BuildType.LABEL_LIST)) { for (TransitiveInfoCollection src : ruleContext.getPrerequisitesIf("srcs", Mode.TARGET, FileProvider.class)) { - PathFragment packageDir = src.getLabel().getPackageIdentifier().getPathUnderExecRoot(); + result.add(src.getLabel().getPackageIdentifier().getPathUnderExecRoot()); for (Artifact a : src.getProvider(FileProvider.class).getFilesToBuild()) { - result.add(packageDir); // Attempt to gather subdirectories that might contain include files. result.add(a.getRootRelativePath().getParentDirectory()); } @@ -604,7 +604,7 @@ public final class CcCommon { // For now, anything with an 'includes' needs a blanket declaration result.add(packageFragment.getRelative("**")); } - return result; + return result.build(); } List getSystemIncludeDirs() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java index 7528d3c126..08ae86068f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java @@ -209,7 +209,7 @@ public final class CcCompilationHelper { private final Set defines = new LinkedHashSet<>(); private final List deps = new ArrayList<>(); private final List ccCompilationInfos = new ArrayList<>(); - private final List looseIncludeDirs = new ArrayList<>(); + private Set looseIncludeDirs = ImmutableSet.of(); private final List systemIncludeDirs = new ArrayList<>(); private final List includeDirs = new ArrayList<>(); @@ -324,7 +324,7 @@ public final class CcCompilationHelper { setCopts(Iterables.concat(common.getCopts(), additionalCopts)); addDefines(common.getDefines()); addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET)); - addLooseIncludeDirs(common.getLooseIncludeDirs()); + setLooseIncludeDirs(common.getLooseIncludeDirs()); addSystemIncludeDirs(common.getSystemIncludeDirs()); setCoptsFilter(common.getCoptsFilter()); setHeadersCheckingMode(semantics.determineHeadersCheckingMode(ruleContext)); @@ -583,12 +583,12 @@ public final class CcCompilationHelper { } /** - * Adds the given directories to the loose include directories that are only allowed to be + * Sets the given directories to by loose include directories that are only allowed to be * referenced when headers checking is {@link HeadersCheckingMode#LOOSE} or {@link * HeadersCheckingMode#WARN}. */ - private void addLooseIncludeDirs(Iterable looseIncludeDirs) { - Iterables.addAll(this.looseIncludeDirs, looseIncludeDirs); + private void setLooseIncludeDirs(Set looseIncludeDirs) { + this.looseIncludeDirs = looseIncludeDirs; } /** -- cgit v1.2.3