aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2018-02-20 09:32:48 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-20 09:36:11 -0800
commitae011947a89dc15ffa33322176ae8738c3894a7d (patch)
tree797cf10e871f0ab5619fd4b595cca7a0535ecdcd /src/main/java/com/google
parenta7b34a1591cfa1034dca9b2c4ff9743d81396a97 (diff)
@AutoCodec some c++ linking data structures.
PiperOrigin-RevId: 186314781
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppDebugPackageProvider.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java88
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibraries.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java2
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.