aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-09-19 18:31:19 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-09-20 06:45:53 +0000
commit41cf7809b5a95b9ed5fed25221cad073e1ec472d (patch)
tree7e485295b5d317eca4b527c7e215e9aefaec6d65 /src/main/java/com
parent82d43279f93d95e4c41b4bc598a3cc05ddd1ae1a (diff)
Move ThinLTO indexing and backend options to Crosstool feature configuration
-- MOS_MIGRATED_REVID=133609638
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java57
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java23
4 files changed, 51 insertions, 34 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index db3839eadb..a1fa0a807b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -254,7 +254,7 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
for (LTOBackendArtifacts ltoArtifacts : indexAction.getAllLTOBackendArtifacts()) {
boolean usePic = CppHelper.usePic(ruleContext, !isLinkShared(ruleContext));
- ltoArtifacts.scheduleLTOBackendAction(ruleContext, usePic);
+ ltoArtifacts.scheduleLTOBackendAction(ruleContext, featureConfiguration, usePic);
}
linkActionBuilder.setLTOIndexing(false);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
index 0e2f15463d..ad34044e68 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
@@ -537,14 +537,23 @@ public class CppLinkActionBuilder {
CppLinkVariablesExtension variablesExtension =
isLTOIndexing
? new CppLinkVariablesExtension(
- linkstampMap, needWholeArchive, linkerInputs, runtimeLinkerInputs, null, null)
+ configuration,
+ linkstampMap,
+ needWholeArchive,
+ linkerInputs,
+ runtimeLinkerInputs,
+ null,
+ linkerParamsFile,
+ ltoOutputRootPrefix)
: new CppLinkVariablesExtension(
+ configuration,
linkstampMap,
needWholeArchive,
linkerInputs,
runtimeLinkerInputs,
output,
- linkerParamsFile);
+ linkerParamsFile,
+ PathFragment.EMPTY_FRAGMENT);
variablesExtension.addVariables(buildVariablesBuilder);
for (VariablesExtension extraVariablesExtension : variablesExtensions) {
extraVariablesExtension.addVariables(buildVariablesBuilder);
@@ -612,26 +621,8 @@ public class CppLinkActionBuilder {
.setLinkopts(ImmutableList.copyOf(linkopts))
.addLinkstampCompileOptions(linkstampOptions);
} else {
- // TODO(bazel-team): once the LLVM compiler patches have been finalized, this should
- // be converted to a crosstool feature configuration instead.
List<String> opts = new ArrayList<>(linkopts);
- opts.add("-flto=thin");
- if (linkerParamsFile != null) {
- opts.add("-Wl,-plugin-opt,thinlto-index-only=" + linkerParamsFile.getExecPathString());
- } else {
- opts.add("-Wl,-plugin-opt,thinlto-index-only");
- }
- opts.add("-Wl,-plugin-opt,thinlto-emit-imports-files");
- opts.add(
- "-Wl,-plugin-opt,thinlto-prefix-replace="
- + configuration.getBinDirectory(ruleContext.getRule().getRepository())
- .getExecPathString()
- + ";"
- + configuration
- .getBinDirectory(ruleContext.getRule().getRepository())
- .getExecPath()
- .getRelative(ltoOutputRootPrefix)
- .toString());
+ opts.addAll(featureConfiguration.getCommandLine("lto-indexing", buildVariables));
linkCommandLineBuilder.setLinkopts(ImmutableList.copyOf(opts));
}
@@ -1183,28 +1174,34 @@ public class CppLinkActionBuilder {
private class CppLinkVariablesExtension implements VariablesExtension {
+ private final BuildConfiguration configuration;
private final ImmutableMap<Artifact, Artifact> linkstampMap;
private final boolean needWholeArchive;
private final Iterable<LinkerInput> linkerInputs;
private final ImmutableList<LinkerInput> runtimeLinkerInputs;
private final Artifact outputArtifact;
private final Artifact linkerParamsFile;
+ private final PathFragment ltoOutputRootPrefix;
private final LinkArgCollector linkArgCollector = new LinkArgCollector();
public CppLinkVariablesExtension(
+ BuildConfiguration configuration,
ImmutableMap<Artifact, Artifact> linkstampMap,
boolean needWholeArchive,
Iterable<LinkerInput> linkerInputs,
ImmutableList<LinkerInput> runtimeLinkerInputs,
Artifact output,
- Artifact linkerParamsFile) {
+ Artifact linkerParamsFile,
+ PathFragment ltoOutputRootPrefix) {
+ this.configuration = configuration;
this.linkstampMap = linkstampMap;
this.needWholeArchive = needWholeArchive;
this.linkerInputs = linkerInputs;
this.runtimeLinkerInputs = runtimeLinkerInputs;
this.outputArtifact = output;
this.linkerParamsFile = linkerParamsFile;
+ this.ltoOutputRootPrefix = ltoOutputRootPrefix;
addInputFileLinkOptions(linkArgCollector);
}
@@ -1274,6 +1271,20 @@ public class CppLinkActionBuilder {
OUTPUT_EXECPATH_VARIABLE, this.outputArtifact.getExecPathString());
}
+ if (!ltoOutputRootPrefix.equals(PathFragment.EMPTY_FRAGMENT)) {
+ if (linkerParamsFile != null) {
+ buildVariables.addVariable(
+ "thinlto_optional_params_file", "=" + linkerParamsFile.getExecPathString());
+ } else {
+ buildVariables.addVariable("thinlto_optional_params_file", "");
+ }
+ buildVariables.addVariable(
+ "thinlto_prefix_replace",
+ configuration.getBinDirectory().getExecPathString()
+ + ";"
+ + configuration.getBinDirectory().getExecPath().getRelative(ltoOutputRootPrefix));
+ }
+
// Variables arising from the toolchain
buildVariables
.addAllVariables(CppHelper.getToolchain(ruleContext).getBuildVariables())
@@ -1450,7 +1461,7 @@ public class CppLinkActionBuilder {
ltoMap);
}
}
- if (linkerParamsFile != null) {
+ if (linkerParamsFile != null && ltoOutputRootPrefix.equals(PathFragment.EMPTY_FRAGMENT)) {
standardArchiveInputParams.add("-Wl,@" + linkerParamsFile.getExecPathString());
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
index 1ed238374b..426089cd93 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java
@@ -961,7 +961,8 @@ public final class CppModel {
env.registerAction(indexAction);
for (LTOBackendArtifacts ltoArtifacts : indexAction.getAllLTOBackendArtifacts()) {
- ltoArtifacts.scheduleLTOBackendAction(ruleContext, usePicForSharedLibs);
+ ltoArtifacts.scheduleLTOBackendAction(
+ ruleContext, featureConfiguration, usePicForSharedLibs);
}
linkActionBuilder.setLTOIndexing(false);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java
index 6eeadae89c..d04c187d6c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LTOBackendArtifacts.java
@@ -19,9 +19,10 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.LTOBackendAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.PathFragment;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -105,7 +106,8 @@ public final class LTOBackendArtifacts {
commandLine = cmdLine;
}
- public void scheduleLTOBackendAction(RuleContext ruleContext, boolean usePic) {
+ public void scheduleLTOBackendAction(
+ RuleContext ruleContext, FeatureConfiguration featureConfiguration, boolean usePic) {
LTOBackendAction.Builder builder = new LTOBackendAction.Builder();
builder.addImportsInfo(bitcodeFiles, imports);
@@ -125,14 +127,17 @@ public final class LTOBackendArtifacts {
PathFragment compiler = cppConfiguration.getCppExecutable();
builder.setExecutable(compiler);
+ Variables.Builder buildVariablesBuilder = new Variables.Builder();
+ buildVariablesBuilder.addVariable("thinlto_index", index.getExecPath().toString());
+ // The output from the LTO backend step is a native object file.
+ buildVariablesBuilder.addVariable(
+ "thinlto_output_object_file", objectFile.getExecPath().toString());
+ // The input to the LTO backend step is the bitcode file.
+ buildVariablesBuilder.addVariable(
+ "thinlto_input_bitcode_file", bitcodeFile.getExecPath().toString());
+ Variables buildVariables = buildVariablesBuilder.build();
List<String> execArgs = new ArrayList<>();
- execArgs.add("-c");
- execArgs.add("-fthinlto-index=" + index.getExecPath());
- execArgs.add("-o");
- execArgs.add(objectFile.getExecPath().getPathString());
- execArgs.add("-x");
- execArgs.add("ir");
- execArgs.add(bitcodeFile.getExecPath().getPathString());
+ execArgs.addAll(featureConfiguration.getCommandLine("lto-backend", buildVariables));
if (usePic) {
execArgs.add("-fPIC");
}