diff options
Diffstat (limited to 'src/main/java')
8 files changed, 142 insertions, 70 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java index 444669a97b..c425970237 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java @@ -27,6 +27,9 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import java.util.Collection; import java.util.Objects; import javax.annotation.Nullable; @@ -40,7 +43,9 @@ import javax.annotation.Nullable; * <p>Items in the collections are stored in nested sets. Link options and libraries are stored in * link order (preorder) and linkstamps are sorted. */ +@AutoCodec public final class CcLinkParams { + public static final ObjectCodec<CcLinkParams> CODEC = new CcLinkParams_AutoCodec(); /** * A list of link options contributed by a single configured target. @@ -73,7 +78,9 @@ public final class CcLinkParams { private final ExtraLinkTimeLibraries extraLinkTimeLibraries; private final NestedSet<Artifact> nonCodeInputs; - private CcLinkParams( + @AutoCodec.Instantiator + @VisibleForSerialization + CcLinkParams( NestedSet<LinkOptions> linkOpts, NestedSet<Linkstamp> linkstamps, NestedSet<LibraryToLink> libraries, @@ -387,14 +394,18 @@ public final class CcLinkParams { /** * A linkstamp that also knows about its declared includes. * - * <p>This object is required because linkstamp files may include other headers which - * will have to be provided during compilation. + * <p>This object is required because linkstamp files may include other headers which will have to + * be provided during compilation. */ + @AutoCodec public static final class Linkstamp { + public static final ObjectCodec<Linkstamp> CODEC = new CcLinkParams_Linkstamp_AutoCodec(); + private final Artifact artifact; private final NestedSet<Artifact> declaredIncludeSrcs; - private Linkstamp(Artifact artifact, NestedSet<Artifact> declaredIncludeSrcs) { + @VisibleForSerialization + Linkstamp(Artifact artifact, NestedSet<Artifact> declaredIncludeSrcs) { this.artifact = Preconditions.checkNotNull(artifact); this.declaredIncludeSrcs = Preconditions.checkNotNull(declaredIncludeSrcs); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java index 5aa25f6f16..71f9464ee6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java @@ -126,16 +126,31 @@ public abstract class CcLinkParamsStore { /** An empty CcLinkParamStore. */ public static final CcLinkParamsStore EMPTY = new EmptyCcLinkParamsStore(); - /** - * An implementation class for the CcLinkParamsStore. - */ + /** An implementation class for the CcLinkParamsStore. */ + @AutoCodec public static final class CcLinkParamsStoreImpl extends CcLinkParamsStore { + public static final ObjectCodec<CcLinkParamsStoreImpl> CODEC = + new CcLinkParamsStore_CcLinkParamsStoreImpl_AutoCodec(); public CcLinkParamsStoreImpl(CcLinkParamsStore store) { - super.staticSharedParams = store.get(true, true); - super.staticNoSharedParams = store.get(true, false); - super.noStaticSharedParams = store.get(false, true); - super.noStaticNoSharedParams = store.get(false, false); + this( + store.get(true, true), + store.get(true, false), + store.get(false, true), + store.get(false, false)); + } + + @VisibleForSerialization + @AutoCodec.Instantiator + CcLinkParamsStoreImpl( + CcLinkParams staticSharedParams, + CcLinkParams staticNoSharedParams, + CcLinkParams noStaticSharedParams, + CcLinkParams noStaticNoSharedParams) { + super.staticSharedParams = staticSharedParams; + super.staticNoSharedParams = staticNoSharedParams; + super.noStaticSharedParams = noStaticSharedParams; + super.noStaticNoSharedParams = noStaticNoSharedParams; } @Override 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 22ee5acfa6..c4424d8ba1 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 @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.LicensesProvider; 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.PlatformConfiguration; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -598,24 +599,8 @@ public class CcToolchain implements RuleConfiguredTargetFactory { if (outputLicense != null && !outputLicense.equals(License.NO_LICENSE)) { final NestedSet<TargetLicense> license = NestedSetBuilder.create(Order.STABLE_ORDER, new TargetLicense(ruleContext.getLabel(), outputLicense)); - LicensesProvider licensesProvider = new LicensesProvider() { - @Override - public NestedSet<TargetLicense> getTransitiveLicenses() { - return license; - } - - @Override - public TargetLicense getOutputLicenses() { - return new TargetLicense(label, outputLicense); - } - - @Override - public boolean hasOutputLicenses() { - return true; - } - - }; - + LicensesProvider licensesProvider = + new LicensesProviderImpl(license, new TargetLicense(label, outputLicense)); builder.add(LicensesProvider.class, licensesProvider); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppDebugPackageProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppDebugPackageProvider.java index 5ba8e77235..03f666e48b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppDebugPackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppDebugPackageProvider.java @@ -19,21 +19,26 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import javax.annotation.Nullable; /** - * Provides the binary artifact and its associated .dwp files, if fission is enabled. - * If Fission ({@url https://gcc.gnu.org/wiki/DebugFission}) is not enabled, the - * dwp file will be null. + * Provides the binary artifact and its associated .dwp files, if fission is enabled. If Fission + * ({@url https://gcc.gnu.org/wiki/DebugFission}) is not enabled, the dwp file will be null. */ @Immutable +@AutoCodec public final class CppDebugPackageProvider implements TransitiveInfoProvider { + public static final ObjectCodec<CppDebugPackageProvider> CODEC = + new CppDebugPackageProvider_AutoCodec(); private final Label targetLabel; private final Artifact strippedArtifact; private final Artifact unstrippedArtifact; @Nullable private final Artifact dwpArtifact; + @AutoCodec.Instantiator public CppDebugPackageProvider( Label targetLabel, Artifact strippedArtifact, diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java index 932b5d8d93..f1336f7fb5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java @@ -53,6 +53,9 @@ import com.google.devtools.build.lib.rules.cpp.CppConfiguration.Tool; import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.ShellEscaper; import com.google.devtools.build.lib.vfs.FileSystemUtils; @@ -542,11 +545,13 @@ public final class CppLinkAction extends AbstractAction return binaryName.replaceName(binaryName.getBaseName() + ".sc"); } - /** - * TransitiveInfoProvider for ELF link actions. - */ - @Immutable @ThreadSafe + /** TransitiveInfoProvider for ELF link actions. */ + @Immutable + @ThreadSafe + @AutoCodec public static final class Context implements TransitiveInfoProvider { + public static final ObjectCodec<Context> CODEC = new CppLinkAction_Context_AutoCodec(); + // Morally equivalent with {@link Builder}, except these are immutable. // Keep these in sync with {@link Builder}. final ImmutableSet<LinkerInput> objectFiles; @@ -572,24 +577,63 @@ public final class CppLinkAction extends AbstractAction * @param builder a mutable {@link CppLinkActionBuilder} to clone from */ public Context(CppLinkActionBuilder builder) { - this.objectFiles = ImmutableSet.copyOf(builder.getObjectFiles()); - this.nonCodeInputs = ImmutableSet.copyOf(builder.getNonCodeInputs()); - this.libraries = NestedSetBuilder.<LibraryToLink>linkOrder() - .addTransitive(builder.getLibraries().build()).build(); - this.crosstoolInputs = - NestedSetBuilder.<Artifact>stableOrder().addTransitive(builder.getCrosstoolInputs()).build(); - this.ltoBitcodeFiles = ImmutableMap.copyOf(builder.getLtoBitcodeFiles()); - this.runtimeMiddleman = builder.getRuntimeMiddleman(); - this.runtimeInputs = - NestedSetBuilder.<Artifact>stableOrder().addTransitive(builder.getRuntimeInputs()).build(); - this.runtimeType = builder.getRuntimeType(); - this.linkstamps = builder.getLinkstamps(); - this.linkopts = ImmutableList.copyOf(builder.getLinkopts()); - this.linkType = builder.getLinkType(); - this.linkStaticness = builder.getLinkStaticness(); - this.fake = builder.isFake(); - this.isNativeDeps = builder.isNativeDeps(); - this.useTestOnlyFlags = builder.useTestOnlyFlags(); + this( + ImmutableSet.copyOf(builder.getObjectFiles()), + ImmutableSet.copyOf(builder.getNonCodeInputs()), + NestedSetBuilder.<LibraryToLink>linkOrder() + .addTransitive(builder.getLibraries().build()) + .build(), + NestedSetBuilder.<Artifact>stableOrder() + .addTransitive(builder.getCrosstoolInputs()) + .build(), + ImmutableMap.copyOf(builder.getLtoBitcodeFiles()), + builder.getRuntimeMiddleman(), + NestedSetBuilder.<Artifact>stableOrder() + .addTransitive(builder.getRuntimeInputs()) + .build(), + builder.getRuntimeType(), + builder.getLinkstamps(), + ImmutableList.copyOf(builder.getLinkopts()), + builder.getLinkType(), + builder.getLinkStaticness(), + builder.isFake(), + builder.isNativeDeps(), + builder.useTestOnlyFlags()); + } + + @AutoCodec.Instantiator + @VisibleForSerialization + Context( + ImmutableSet<LinkerInput> objectFiles, + ImmutableSet<Artifact> nonCodeInputs, + NestedSet<LibraryToLink> libraries, + NestedSet<Artifact> crosstoolInputs, + ImmutableMap<Artifact, Artifact> ltoBitcodeFiles, + Artifact runtimeMiddleman, + NestedSet<Artifact> runtimeInputs, + ArtifactCategory runtimeType, + ImmutableSet<Linkstamp> linkstamps, + ImmutableList<String> linkopts, + LinkTargetType linkType, + LinkStaticness linkStaticness, + boolean fake, + boolean isNativeDeps, + boolean useTestOnlyFlags) { + this.objectFiles = objectFiles; + this.nonCodeInputs = nonCodeInputs; + this.libraries = libraries; + this.crosstoolInputs = crosstoolInputs; + this.ltoBitcodeFiles = ltoBitcodeFiles; + this.runtimeMiddleman = runtimeMiddleman; + this.runtimeInputs = runtimeInputs; + this.runtimeType = runtimeType; + this.linkstamps = linkstamps; + this.linkopts = linkopts; + this.linkType = linkType; + this.linkStaticness = linkStaticness; + this.fake = fake; + this.isNativeDeps = isNativeDeps; + this.useTestOnlyFlags = useTestOnlyFlags; } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java index 4a5c725fa5..4684a7d6e7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java @@ -15,27 +15,34 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.common.collect.Lists; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** - * A list of extra libraries to include in a link. These are non-C++ - * libraries that are built from inputs gathered from all the dependencies. - * The dependencies have no way to coordinate, so each one will add an - * ExtraLinkTimeLibrary to its CcLinkParams. ExtraLinkTimeLibrary is an - * interface, and all ExtraLinkTimeLibrary objects of the same class will - * be gathered together. + * A list of extra libraries to include in a link. These are non-C++ libraries that are built from + * inputs gathered from all the dependencies. The dependencies have no way to coordinate, so each + * one will add an ExtraLinkTimeLibrary to its CcLinkParams. ExtraLinkTimeLibrary is an interface, + * and all ExtraLinkTimeLibrary objects of the same class will be gathered together. */ +@AutoCodec public final class ExtraLinkTimeLibraries { + public static final ObjectCodec<ExtraLinkTimeLibraries> CODEC = + new ExtraLinkTimeLibraries_AutoCodec(); + /** * We can have multiple different kinds of lists of libraries to include * at link time. We map from the class type to an actual instance. */ private final Collection<ExtraLinkTimeLibrary> extraLibraries; - private ExtraLinkTimeLibraries(Collection<ExtraLinkTimeLibrary> extraLibraries) { + @AutoCodec.Instantiator + @VisibleForSerialization + ExtraLinkTimeLibraries(Collection<ExtraLinkTimeLibrary> extraLibraries) { this.extraLibraries = extraLibraries; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java index 5daeb2deaa..7b7238d9bc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java @@ -17,21 +17,24 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; /** - * An extra library to include in a link. The actual library is built - * at link time. + * An extra library to include in a link. The actual library is built at link time. * - * <p>This can be used for non-C++ inputs to a C++ link. A class that - * implements this interface will support transitively gathering all - * inputs from link dependencies, and then combine them all together - * into a set of C++ libraries. + * <p>This can be used for non-C++ inputs to a C++ link. A class that implements this interface will + * support transitively gathering all inputs from link dependencies, and then combine them all + * together into a set of C++ libraries. * - * <p>Any implementations must be immutable (and therefore thread-safe), - * because this is passed between rules and accessed in a multi-threaded - * context. + * <p>Any implementations must be immutable (and therefore thread-safe), because this is passed + * between rules and accessed in a multi-threaded context. */ +@AutoCodec(strategy = Strategy.POLYMORPHIC) public interface ExtraLinkTimeLibrary { + ObjectCodec<ExtraLinkTimeLibrary> CODEC = new ExtraLinkTimeLibrary_AutoCodec(); + /** Build the LibraryToLink inputs to pass to the C++ linker. */ NestedSet<LibraryToLink> buildLibraries(RuleContext context) throws InterruptedException; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java index 5df286db32..818b9f94de 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; @@ -25,6 +26,7 @@ import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec. */ @AutoCodec(strategy = Strategy.POLYMORPHIC) public interface LinkerInput { + ObjectCodec<LinkerInput> CODEC = new LinkerInput_AutoCodec(); /** * Returns the type of the linker input. |