diff options
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.java | 57 |
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()); } |