From c4052e2835e7a78b58ab6ca8c838141e31e9a6f9 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Tue, 31 May 2016 17:06:48 +0000 Subject: Remove DepsContext from CppCompilationContext. This simplifies the CppCompilationContext as well as preparing it for further refactorings. DepsContext was introduced before NestedSets were available and is superfluous in a NestedSet world. -- MOS_MIGRATED_REVID=123653478 --- .../build/lib/rules/cpp/CppCompilationContext.java | 417 ++++++++------------- 1 file changed, 152 insertions(+), 265 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java') diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java index 691deb8c12..b3b293bfb1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java @@ -33,7 +33,6 @@ import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -48,7 +47,41 @@ public final class CppCompilationContext implements TransitiveInfoProvider { public static final CppCompilationContext EMPTY = new Builder(null).build(); private final CommandLineContext commandLineContext; - private final ImmutableList depsContexts; + + private final NestedSet declaredIncludeDirs; + private final NestedSet declaredIncludeWarnDirs; + private final NestedSet declaredIncludeSrcs; + + /** + * Module maps from direct dependencies. + */ + private final NestedSet directModuleMaps; + + /** + * All declared headers of the current module, if compiled as a header module. + */ + private final NestedSet headerModuleSrcs; + + /** + * All header modules in the transitive closure of {@code topLevelHeaderModules}. + */ + private final NestedSet impliedHeaderModules; + private final NestedSet picImpliedHeaderModules; + + private final NestedSet> pregreppedHdrs; + + /** + * All header modules in our transitive closure that are not in the transitive closure of + * another header module in our transitive closure. + */ + private final NestedSet topLevelHeaderModules; + private final NestedSet picTopLevelHeaderModules; + + /** + * The module maps from all targets the current target depends on transitively. + */ + private final NestedSet transitiveModuleMaps; + private final CppModuleMap cppModuleMap; private final Artifact headerModule; private final Artifact picHeaderModule; @@ -64,37 +97,42 @@ public final class CppCompilationContext implements TransitiveInfoProvider { private CppCompilationContext( CommandLineContext commandLineContext, - List depsContexts, + ImmutableSet compilationPrerequisites, + NestedSet declaredIncludeDirs, + NestedSet declaredIncludeWarnDirs, + NestedSet declaredIncludeSrcs, + NestedSet> pregreppedHdrs, + NestedSet headerModuleSrcs, + NestedSet topLevelHeaderModules, + NestedSet picTopLevelHeaderModules, + NestedSet impliedHeaderModules, + NestedSet picImpliedHeaderModules, + NestedSet transitiveModuleMaps, + NestedSet directModuleMaps, CppModuleMap cppModuleMap, Artifact headerModule, Artifact picHeaderModule, boolean provideTransitiveModuleMaps, boolean useHeaderModules) { Preconditions.checkNotNull(commandLineContext); - Preconditions.checkArgument(!depsContexts.isEmpty()); this.commandLineContext = commandLineContext; - this.depsContexts = ImmutableList.copyOf(depsContexts); + this.declaredIncludeDirs = declaredIncludeDirs; + this.declaredIncludeWarnDirs = declaredIncludeWarnDirs; + this.declaredIncludeSrcs = declaredIncludeSrcs; + this.directModuleMaps = directModuleMaps; + this.headerModuleSrcs = headerModuleSrcs; + this.impliedHeaderModules = impliedHeaderModules; + this.picImpliedHeaderModules = picImpliedHeaderModules; + this.pregreppedHdrs = pregreppedHdrs; + this.topLevelHeaderModules = topLevelHeaderModules; + this.picTopLevelHeaderModules = picTopLevelHeaderModules; + this.transitiveModuleMaps = transitiveModuleMaps; this.cppModuleMap = cppModuleMap; this.headerModule = headerModule; this.picHeaderModule = picHeaderModule; this.provideTransitiveModuleMaps = provideTransitiveModuleMaps; this.useHeaderModules = useHeaderModules; - - if (depsContexts.size() == 1) { - // Only LIPO targets have more than one DepsContexts. This codepath avoids creating - // an ImmutableSet.Builder for the vast majority of the cases. - compilationPrerequisites = (depsContexts.get(0).compilationPrerequisiteStampFile != null) - ? ImmutableSet.of(depsContexts.get(0).compilationPrerequisiteStampFile) - : ImmutableSet.of(); - } else { - ImmutableSet.Builder prerequisites = ImmutableSet.builder(); - for (DepsContext depsContext : depsContexts) { - if (depsContext.compilationPrerequisiteStampFile != null) { - prerequisites.add(depsContext.compilationPrerequisiteStampFile); - } - } - compilationPrerequisites = prerequisites.build(); - } + this.compilationPrerequisites = compilationPrerequisites; } /** @@ -164,20 +202,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * used by consumers. */ public NestedSet getDeclaredIncludeDirs() { - if (depsContexts.isEmpty()) { - return NestedSetBuilder.emptySet(Order.STABLE_ORDER); - } - - if (depsContexts.size() == 1) { - return depsContexts.get(0).declaredIncludeDirs; - } - - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive(depsContext.declaredIncludeDirs); - } - - return builder.build(); + return declaredIncludeDirs; } /** @@ -191,20 +216,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * used by consumers. */ public NestedSet getDeclaredIncludeWarnDirs() { - if (depsContexts.isEmpty()) { - return NestedSetBuilder.emptySet(Order.STABLE_ORDER); - } - - if (depsContexts.size() == 1) { - return depsContexts.get(0).declaredIncludeWarnDirs; - } - - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive(depsContext.declaredIncludeWarnDirs); - } - - return builder.build(); + return declaredIncludeWarnDirs; } /** @@ -217,20 +229,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * used by consumers. */ public NestedSet getDeclaredIncludeSrcs() { - if (depsContexts.isEmpty()) { - return NestedSetBuilder.emptySet(Order.STABLE_ORDER); - } - - if (depsContexts.size() == 1) { - return depsContexts.get(0).declaredIncludeSrcs; - } - - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive(depsContext.declaredIncludeSrcs); - } - - return builder.build(); + return declaredIncludeSrcs; } /** @@ -238,20 +237,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * (pregrepped header file) are generated by {@link ExtractInclusionAction}. */ NestedSet> getPregreppedHeaders() { - if (depsContexts.isEmpty()) { - return NestedSetBuilder.emptySet(Order.STABLE_ORDER); - } - - if (depsContexts.size() == 1) { - return depsContexts.get(0).pregreppedHdrs; - } - - NestedSetBuilder> builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive(depsContext.pregreppedHdrs); - } - - return builder.build(); + return pregreppedHdrs; } /** @@ -259,26 +245,20 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * compilation, like C++ module map artifacts. */ public NestedSet getAdditionalInputs(boolean usePic) { - if (depsContexts.isEmpty()) { - return NestedSetBuilder.emptySet(Order.STABLE_ORDER); - } - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - if (useHeaderModules) { - if (usePic) { - builder.addTransitive(depsContext.picTopLevelHeaderModules); - builder.addTransitive(depsContext.picImpliedHeaderModules); - } else { - builder.addTransitive(depsContext.topLevelHeaderModules); - builder.addTransitive(depsContext.impliedHeaderModules); - } - } - builder.addTransitive(depsContext.directModuleMaps); - if (provideTransitiveModuleMaps) { - builder.addTransitive(depsContext.transitiveModuleMaps); + if (useHeaderModules) { + if (usePic) { + builder.addTransitive(picTopLevelHeaderModules); + builder.addTransitive(picImpliedHeaderModules); + } else { + builder.addTransitive(topLevelHeaderModules); + builder.addTransitive(impliedHeaderModules); } } + builder.addTransitive(directModuleMaps); + if (provideTransitiveModuleMaps) { + builder.addTransitive(transitiveModuleMaps); + } if (cppModuleMap != null) { builder.add(cppModuleMap.getArtifact()); } @@ -290,22 +270,14 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * @return modules maps from direct dependencies. */ public NestedSet getDirectModuleMaps() { - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive(depsContext.directModuleMaps); - } - return builder.build(); + return directModuleMaps; } /** * @return modules maps in the transitive closure that are not from direct dependencies. */ private NestedSet getTransitiveModuleMaps() { - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive(depsContext.transitiveModuleMaps); - } - return builder.build(); + return transitiveModuleMaps; } /** @@ -313,11 +285,7 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * is compiled as a module. */ protected NestedSet getHeaderModuleSrcs() { - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive(depsContext.headerModuleSrcs); - } - return builder.build(); + return headerModuleSrcs; } /** @@ -325,24 +293,14 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * of another header module in our transitive closure. */ protected NestedSet getTopLevelHeaderModules(boolean usePic) { - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive( - usePic ? depsContext.picTopLevelHeaderModules : depsContext.topLevelHeaderModules); - } - return builder.build(); + return usePic ? picTopLevelHeaderModules : topLevelHeaderModules; } /** * @return all header modules in the transitive closure of {@code getTopLevelHeaderModules()}. */ protected NestedSet getImpliedHeaderModules(boolean usePic) { - NestedSetBuilder builder = NestedSetBuilder.stableOrder(); - for (DepsContext depsContext : depsContexts) { - builder.addTransitive( - usePic ? depsContext.picImpliedHeaderModules : depsContext.impliedHeaderModules); - } - return builder.build(); + return usePic ? picImpliedHeaderModules : impliedHeaderModules; } /** @@ -367,7 +325,17 @@ public final class CppCompilationContext implements TransitiveInfoProvider { && Objects.equals(cppModuleMap, other.cppModuleMap) && Objects.equals(picHeaderModule, other.picHeaderModule) && commandLineContext.equals(other.commandLineContext) - && depsContexts.equals(other.depsContexts) + && Objects.equals(declaredIncludeDirs, other.declaredIncludeDirs) + && Objects.equals(declaredIncludeWarnDirs, other.declaredIncludeWarnDirs) + && Objects.equals(declaredIncludeSrcs, other.declaredIncludeSrcs) + && Objects.equals(directModuleMaps, other.directModuleMaps) + && Objects.equals(headerModuleSrcs, other.headerModuleSrcs) + && Objects.equals(impliedHeaderModules, other.impliedHeaderModules) + && Objects.equals(picImpliedHeaderModules, other.picImpliedHeaderModules) + && Objects.equals(topLevelHeaderModules, other.topLevelHeaderModules) + && Objects.equals(picTopLevelHeaderModules, other.picTopLevelHeaderModules) + && Objects.equals(transitiveModuleMaps, other.transitiveModuleMaps) + && Objects.equals(compilationPrerequisites, other.compilationPrerequisites) && (provideTransitiveModuleMaps == other.provideTransitiveModuleMaps) && (useHeaderModules == other.useHeaderModules); } @@ -378,7 +346,17 @@ public final class CppCompilationContext implements TransitiveInfoProvider { headerModule, picHeaderModule, commandLineContext, - depsContexts, + declaredIncludeDirs, + declaredIncludeWarnDirs, + declaredIncludeSrcs, + directModuleMaps, + headerModuleSrcs, + impliedHeaderModules, + picImpliedHeaderModules, + transitiveModuleMaps, + topLevelHeaderModules, + picTopLevelHeaderModules, + compilationPrerequisites, cppModuleMap, provideTransitiveModuleMaps, useHeaderModules); @@ -389,26 +367,20 @@ public final class CppCompilationContext implements TransitiveInfoProvider { * for {@link #getDeclaredIncludeDirs()} and {@link #getDeclaredIncludeWarnDirs()}. */ public static CppCompilationContext disallowUndeclaredHeaders(CppCompilationContext context) { - ImmutableList.Builder builder = ImmutableList.builder(); - for (DepsContext depsContext : context.depsContexts) { - builder.add( - new DepsContext( - depsContext.compilationPrerequisiteStampFile, - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - NestedSetBuilder.emptySet(Order.STABLE_ORDER), - depsContext.declaredIncludeSrcs, - depsContext.pregreppedHdrs, - depsContext.headerModuleSrcs, - depsContext.topLevelHeaderModules, - depsContext.picTopLevelHeaderModules, - depsContext.impliedHeaderModules, - depsContext.picImpliedHeaderModules, - depsContext.transitiveModuleMaps, - depsContext.directModuleMaps)); - } return new CppCompilationContext( context.commandLineContext, - builder.build(), + context.compilationPrerequisites, + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + context.declaredIncludeSrcs, + context.pregreppedHdrs, + context.headerModuleSrcs, + context.topLevelHeaderModules, + context.picTopLevelHeaderModules, + context.impliedHeaderModules, + context.picImpliedHeaderModules, + context.transitiveModuleMaps, + context.directModuleMaps, context.cppModuleMap, context.headerModule, context.picHeaderModule, @@ -443,15 +415,39 @@ public final class CppCompilationContext implements TransitiveInfoProvider { */ public static CppCompilationContext mergeForLipo(CppCompilationContext ownerContext, CppCompilationContext libContext) { + ImmutableSet.Builder prerequisites = ImmutableSet.builder(); + prerequisites.addAll(ownerContext.compilationPrerequisites); + prerequisites.addAll(libContext.compilationPrerequisites); return new CppCompilationContext( libContext.commandLineContext, - ImmutableList.copyOf(Iterables.concat(ownerContext.depsContexts, libContext.depsContexts)), + prerequisites.build(), + mergeSets(ownerContext.declaredIncludeDirs, libContext.declaredIncludeDirs), + mergeSets(ownerContext.declaredIncludeWarnDirs, libContext.declaredIncludeWarnDirs), + mergeSets(ownerContext.declaredIncludeSrcs, libContext.declaredIncludeSrcs), + mergeSets(ownerContext.pregreppedHdrs, libContext.pregreppedHdrs), + mergeSets(ownerContext.headerModuleSrcs, libContext.headerModuleSrcs), + mergeSets(ownerContext.topLevelHeaderModules, libContext.topLevelHeaderModules), + mergeSets(ownerContext.picTopLevelHeaderModules, libContext.picTopLevelHeaderModules), + mergeSets(ownerContext.impliedHeaderModules, libContext.impliedHeaderModules), + mergeSets(ownerContext.picImpliedHeaderModules, libContext.picImpliedHeaderModules), + mergeSets(ownerContext.transitiveModuleMaps, libContext.transitiveModuleMaps), + mergeSets(ownerContext.directModuleMaps, libContext.directModuleMaps), libContext.cppModuleMap, libContext.headerModule, libContext.picHeaderModule, libContext.provideTransitiveModuleMaps, libContext.useHeaderModules); } + + /** + * Return a nested set containing all elements from {@code s1} and {@code s2}. + */ + private static NestedSet mergeSets(NestedSet s1, NestedSet s2) { + NestedSetBuilder builder = NestedSetBuilder.stableOrder(); + builder.addTransitive(s1); + builder.addTransitive(s2); + return builder.build(); + } /** * @return the C++ module map of the owner. @@ -516,115 +512,6 @@ public final class CppCompilationContext implements TransitiveInfoProvider { } } - /** - * The parts of the compilation context that defined the dependencies of - * actions of scheduling and inclusion validity checking. - */ - @Immutable - private static class DepsContext { - private final Artifact compilationPrerequisiteStampFile; - private final NestedSet declaredIncludeDirs; - private final NestedSet declaredIncludeWarnDirs; - private final NestedSet declaredIncludeSrcs; - /** - * Module maps from direct dependencies. - */ - private final NestedSet directModuleMaps; - - /** - * All declared headers of the current module, if compiled as a header module. - */ - private final NestedSet headerModuleSrcs; - - /** - * All header modules in the transitive closure of {@code topLevelHeaderModules}. - */ - private final NestedSet impliedHeaderModules; - private final NestedSet picImpliedHeaderModules; - - private final NestedSet> pregreppedHdrs; - - /** - * All header modules in our transitive closure that are not in the transitive closure of - * another header module in our transitive closure. - */ - private final NestedSet topLevelHeaderModules; - private final NestedSet picTopLevelHeaderModules; - - /** - * The module maps from all targets the current target depends on transitively. - */ - private final NestedSet transitiveModuleMaps; - - DepsContext( - Artifact compilationPrerequisiteStampFile, - NestedSet declaredIncludeDirs, - NestedSet declaredIncludeWarnDirs, - NestedSet declaredIncludeSrcs, - NestedSet> pregreppedHdrs, - NestedSet headerModuleSrcs, - NestedSet topLevelHeaderModules, - NestedSet picTopLevelHeaderModules, - NestedSet impliedHeaderModules, - NestedSet picImpliedHeaderModules, - NestedSet transitiveModuleMaps, - NestedSet directModuleMaps) { - this.compilationPrerequisiteStampFile = compilationPrerequisiteStampFile; - this.declaredIncludeDirs = declaredIncludeDirs; - this.declaredIncludeWarnDirs = declaredIncludeWarnDirs; - this.declaredIncludeSrcs = declaredIncludeSrcs; - this.directModuleMaps = directModuleMaps; - this.headerModuleSrcs = headerModuleSrcs; - this.impliedHeaderModules = impliedHeaderModules; - this.picImpliedHeaderModules = picImpliedHeaderModules; - this.pregreppedHdrs = pregreppedHdrs; - this.topLevelHeaderModules = topLevelHeaderModules; - this.picTopLevelHeaderModules = picTopLevelHeaderModules; - this.transitiveModuleMaps = transitiveModuleMaps; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof DepsContext)) { - return false; - } - DepsContext other = (DepsContext) obj; - return Objects.equals( - compilationPrerequisiteStampFile, other.compilationPrerequisiteStampFile) - && Objects.equals(declaredIncludeDirs, other.declaredIncludeDirs) - && Objects.equals(declaredIncludeWarnDirs, other.declaredIncludeWarnDirs) - && Objects.equals(declaredIncludeSrcs, other.declaredIncludeSrcs) - && Objects.equals(directModuleMaps, other.directModuleMaps) - && Objects.equals(headerModuleSrcs, other.headerModuleSrcs) - && Objects.equals(impliedHeaderModules, other.impliedHeaderModules) - && Objects.equals(picImpliedHeaderModules, other.picImpliedHeaderModules) - // TODO(bazel-team): add pregreppedHdrs? - && Objects.equals(topLevelHeaderModules, other.topLevelHeaderModules) - && Objects.equals(picTopLevelHeaderModules, other.picTopLevelHeaderModules) - && Objects.equals(transitiveModuleMaps, other.transitiveModuleMaps); - } - - @Override - public int hashCode() { - return Objects.hash( - compilationPrerequisiteStampFile, - declaredIncludeDirs, - declaredIncludeWarnDirs, - declaredIncludeSrcs, - directModuleMaps, - headerModuleSrcs, - impliedHeaderModules, - picImpliedHeaderModules, - // pregreppedHdrs ? - transitiveModuleMaps, - topLevelHeaderModules, - picTopLevelHeaderModules); - } - } - /** * Builder class for {@link CppCompilationContext}. */ @@ -967,20 +854,20 @@ public final class CppCompilationContext implements TransitiveInfoProvider { ImmutableList.copyOf(quoteIncludeDirs), ImmutableList.copyOf(systemIncludeDirs), ImmutableList.copyOf(defines)), - ImmutableList.of( - new DepsContext( - prerequisiteStampFile, - declaredIncludeDirs.build(), - declaredIncludeWarnDirs.build(), - declaredIncludeSrcs.build(), - pregreppedHdrs.build(), - headerModuleSrcs.build(), - topLevelHeaderModules, - picTopLevelHeaderModules, - impliedHeaderModules, - picImpliedHeaderModules, - transitiveModuleMaps.build(), - directModuleMaps.build())), + prerequisiteStampFile == null + ? ImmutableSet.of() + : ImmutableSet.of(prerequisiteStampFile), + declaredIncludeDirs.build(), + declaredIncludeWarnDirs.build(), + declaredIncludeSrcs.build(), + pregreppedHdrs.build(), + headerModuleSrcs.build(), + topLevelHeaderModules, + picTopLevelHeaderModules, + impliedHeaderModules, + picImpliedHeaderModules, + transitiveModuleMaps.build(), + directModuleMaps.build(), cppModuleMap, headerModule, picHeaderModule, -- cgit v1.2.3