aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java57
1 files changed, 34 insertions, 23 deletions
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());
}