aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-06-25 02:36:02 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-06-25 08:57:15 +0200
commit91c69f025d4cf4380c37c878f1aa1120ef31abcc (patch)
tree2a6b16110ff2f5a3236b99aae5dde59cc1838e2b /src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
parent7ae29d2617e1039380df2b8fb3ee45286ba64dab (diff)
Setup FDO command-line options via feature configurations.
-- MOS_MIGRATED_REVID=96835732
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
index e597907015..66b2722e83 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.actions.CommandLine;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.collect.CollectionUtils;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
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.syntax.Label;
@@ -58,6 +59,9 @@ public final class LinkCommandLine extends CommandLine {
private final BuildConfiguration configuration;
private final CppConfiguration cppConfiguration;
private final ActionOwner owner;
+ private final CcToolchainFeatures.Variables variables;
+ // The feature config can be null for tests.
+ @Nullable private final FeatureConfiguration featureConfiguration;
@Nullable private final Artifact output;
@Nullable private final Artifact interfaceOutput;
@Nullable private final Artifact symbolCountsOutput;
@@ -77,6 +81,12 @@ public final class LinkCommandLine extends CommandLine {
@Nullable private final Artifact paramFile;
@Nullable private final Artifact interfaceSoBuilder;
+ /**
+ * A string constant for the c++ link action, used to access the feature
+ * configuration.
+ */
+ public static final String CPP_LINK = "c++-link";
+
private LinkCommandLine(
BuildConfiguration configuration,
ActionOwner owner,
@@ -97,7 +107,9 @@ public final class LinkCommandLine extends CommandLine {
boolean useTestOnlyFlags,
boolean needWholeArchive,
@Nullable Artifact paramFile,
- Artifact interfaceSoBuilder) {
+ Artifact interfaceSoBuilder,
+ CcToolchainFeatures.Variables variables,
+ @Nullable FeatureConfiguration featureConfiguration) {
Preconditions.checkArgument(linkTargetType != LinkTargetType.INTERFACE_DYNAMIC_LIBRARY,
"you can't link an interface dynamic library directly");
if (linkTargetType != LinkTargetType.DYNAMIC_LIBRARY) {
@@ -123,6 +135,8 @@ public final class LinkCommandLine extends CommandLine {
this.configuration = Preconditions.checkNotNull(configuration);
this.cppConfiguration = configuration.getFragment(CppConfiguration.class);
+ this.variables = variables;
+ this.featureConfiguration = featureConfiguration;
this.owner = Preconditions.checkNotNull(owner);
this.output = output;
this.interfaceOutput = interfaceOutput;
@@ -658,7 +672,10 @@ public final class LinkCommandLine extends CommandLine {
}
argv.addAll(cppConfiguration.getLinkOptions());
- argv.addAll(cppConfiguration.getFdoSupport().getLinkOptions());
+ // The feature config can be null for tests.
+ if (featureConfiguration != null) {
+ argv.addAll(featureConfiguration.getCommandLine(CPP_LINK, variables));
+ }
}
private static boolean isDynamicLibrary(LinkerInput linkInput) {
@@ -933,6 +950,7 @@ public final class LinkCommandLine extends CommandLine {
private final BuildConfiguration configuration;
private final ActionOwner owner;
+ @Nullable private final RuleContext ruleContext;
@Nullable private Artifact output;
@Nullable private Artifact interfaceOutput;
@@ -953,13 +971,18 @@ public final class LinkCommandLine extends CommandLine {
@Nullable private Artifact paramFile;
@Nullable private Artifact interfaceSoBuilder;
- public Builder(BuildConfiguration configuration, ActionOwner owner) {
+ // This interface is needed to support tests that don't create a
+ // ruleContext, in which case the configuration and action owner
+ // cannot be accessed off of the give ruleContext.
+ public Builder(BuildConfiguration configuration, ActionOwner owner,
+ @Nullable RuleContext ruleContext) {
this.configuration = configuration;
this.owner = owner;
+ this.ruleContext = ruleContext;
}
public Builder(RuleContext ruleContext) {
- this(ruleContext.getConfiguration(), ruleContext.getActionOwner());
+ this(ruleContext.getConfiguration(), ruleContext.getActionOwner(), ruleContext);
}
public LinkCommandLine build() {
@@ -970,6 +993,17 @@ public final class LinkCommandLine extends CommandLine {
actualLinkstampCompileOptions = ImmutableList.copyOf(
Iterables.concat(DEFAULT_LINKSTAMP_OPTIONS, linkstampCompileOptions));
}
+ CcToolchainFeatures.Variables variables = null;
+ FeatureConfiguration featureConfiguration = null;
+ // The ruleContext can be null for some tests.
+ if (ruleContext != null) {
+ featureConfiguration = CcCommon.configureFeatures(ruleContext);
+ CcToolchainFeatures.Variables.Builder buildVariables =
+ new CcToolchainFeatures.Variables.Builder();
+ CppConfiguration cppConfiguration = configuration.getFragment(CppConfiguration.class);
+ cppConfiguration.getFdoSupport().getLinkOptions(featureConfiguration, buildVariables);
+ variables = buildVariables.build();
+ }
return new LinkCommandLine(
configuration,
owner,
@@ -990,7 +1024,9 @@ public final class LinkCommandLine extends CommandLine {
useTestOnlyFlags,
needWholeArchive,
paramFile,
- interfaceSoBuilder);
+ interfaceSoBuilder,
+ variables,
+ featureConfiguration);
}
/**