diff options
author | Googler <noreply@google.com> | 2016-09-19 18:31:19 +0000 |
---|---|---|
committer | Laszlo Csomor <laszlocsomor@google.com> | 2016-09-20 06:45:53 +0000 |
commit | 41cf7809b5a95b9ed5fed25221cad073e1ec472d (patch) | |
tree | 7e485295b5d317eca4b527c7e215e9aefaec6d65 /src/main/java/com | |
parent | 82d43279f93d95e4c41b4bc598a3cc05ddd1ae1a (diff) |
Move ThinLTO indexing and backend options to Crosstool feature configuration
--
MOS_MIGRATED_REVID=133609638
Diffstat (limited to 'src/main/java/com')
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"); } |