aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-11-03 19:36:07 +0100
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-11-06 20:20:10 +0100
commit82af84e46418925840f0d590586cec75ec8394a1 (patch)
treef868d68a695bc08e7d108985d8f4e3c254da6989 /src/main/java/com/google/devtools/build/lib/rules/cpp
parent3806ca842b2c0f731b27e1665981b6a204a1ddb4 (diff)
Schedule LtoBackendAction when creating LtoBackendArtifact
There is no need to defer the action creation and scheduling, which happens shortly thereafter, and just requires saving a bunch of information on the LtoBackendArtifact. This is preliminary restructuring that will aid some larger changes for making tests that use static linking more efficient when built with ThinLTO (for b/67424063). RELNOTES: None PiperOrigin-RevId: 174490283
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java39
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java60
2 files changed, 60 insertions, 39 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 e5dd996fc2..091c9ac280 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
@@ -525,7 +525,9 @@ public class CppLinkActionBuilder {
}
private Iterable<LtoBackendArtifacts> createLtoArtifacts(
- PathFragment ltoOutputRootPrefix, NestedSet<LibraryToLink> uniqueLibraries) {
+ PathFragment ltoOutputRootPrefix,
+ NestedSet<LibraryToLink> uniqueLibraries,
+ ImmutableSet<String> features) {
Set<Artifact> compiled = new LinkedHashSet<>();
for (LibraryToLink lib : uniqueLibraries) {
compiled.addAll(lib.getLtoBitcodeFiles().keySet());
@@ -550,11 +552,25 @@ public class CppLinkActionBuilder {
}
}
+ List<String> argv = new ArrayList<>();
+ argv.addAll(toolchain.getLinkOptions());
+ argv.addAll(cppConfiguration.getCompilerOptions(features));
ImmutableList.Builder<LtoBackendArtifacts> ltoOutputs = ImmutableList.builder();
for (Artifact a : allBitcode.values()) {
LtoBackendArtifacts ltoArtifacts =
new LtoBackendArtifacts(
- ltoOutputRootPrefix, a, allBitcode, ruleContext, configuration, linkArtifactFactory);
+ ltoOutputRootPrefix,
+ a,
+ allBitcode,
+ ruleContext,
+ configuration,
+ linkArtifactFactory,
+ featureConfiguration,
+ toolchain,
+ fdoSupport,
+ usePicForLtoBackendActions,
+ cppConfiguration.useFission(),
+ argv);
ltoOutputs.add(ltoArtifacts);
}
return ltoOutputs.build();
@@ -672,7 +688,7 @@ public class CppLinkActionBuilder {
// Use the originalUniqueLibraries which contains the full bitcode files
// needed by the LTO backends (as opposed to the minimized bitcode files
// that can be used by the LTO indexing step).
- allLtoArtifacts = createLtoArtifacts(ltoOutputRootPrefix, originalUniqueLibraries);
+ allLtoArtifacts = createLtoArtifacts(ltoOutputRootPrefix, originalUniqueLibraries, features);
}
@Nullable Artifact thinltoParamFile = null;
@@ -864,23 +880,6 @@ public class CppLinkActionBuilder {
renamedNonLibraryInputs.add(renamed == null ? a : renamed);
}
expandedNonLibraryInputs = renamedNonLibraryInputs;
- } else if (isLtoIndexing && allLtoArtifacts != null) {
- for (LtoBackendArtifacts a : allLtoArtifacts) {
- List<String> argv = new ArrayList<>();
- argv.addAll(toolchain.getLinkOptions());
- argv.addAll(cppConfiguration.getCompilerOptions(features));
- a.setCommandLine(argv);
-
- a.scheduleLtoBackendAction(
- ruleContext,
- featureConfiguration,
- toolchain,
- fdoSupport,
- usePicForLtoBackendActions,
- cppConfiguration.useFission(),
- configuration,
- linkArtifactFactory);
- }
}
// getPrimaryInput returns the first element, and that is a public interface - therefore the
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 6c714c560a..a968ccbd8d 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
@@ -61,22 +61,19 @@ public final class LtoBackendArtifacts {
// The result of executing the above command line, an ELF object file.
private final Artifact objectFile;
- // A map of all of the bitcode files. This is the universe from which the .imports file
- // distills its lists. The map is the same across all LtoBackendArtifacts of a given
- // binary.
- private final Map<PathFragment, Artifact> bitcodeFiles;
-
- // Command line arguments to apply to back-end compile action, typically from
- // the feature configuration and user-provided linkopts.
- private List<String> commandLine;
-
LtoBackendArtifacts(
PathFragment ltoOutputRootPrefix,
Artifact bitcodeFile,
Map<PathFragment, Artifact> allBitCodeFiles,
RuleContext ruleContext,
BuildConfiguration configuration,
- CppLinkAction.LinkArtifactFactory linkArtifactFactory) {
+ CppLinkAction.LinkArtifactFactory linkArtifactFactory,
+ FeatureConfiguration featureConfiguration,
+ CcToolchainProvider ccToolchain,
+ FdoSupportProvider fdoSupport,
+ boolean usePic,
+ boolean generateDwo,
+ List<String> commandLine) {
this.bitcodeFile = bitcodeFile;
PathFragment obj = ltoOutputRootPrefix.getRelative(bitcodeFile.getRootRelativePath());
@@ -86,7 +83,17 @@ public final class LtoBackendArtifacts {
index = linkArtifactFactory.create(
ruleContext, configuration, FileSystemUtils.appendExtension(obj, ".thinlto.bc"));
- bitcodeFiles = allBitCodeFiles;
+ scheduleLtoBackendAction(
+ ruleContext,
+ featureConfiguration,
+ ccToolchain,
+ fdoSupport,
+ usePic,
+ generateDwo,
+ configuration,
+ linkArtifactFactory,
+ commandLine,
+ allBitCodeFiles);
}
// Interface to create an LTO backend that does not perform any cross-module optimization.
@@ -95,14 +102,31 @@ public final class LtoBackendArtifacts {
Artifact bitcodeFile,
RuleContext ruleContext,
BuildConfiguration configuration,
- CppLinkAction.LinkArtifactFactory linkArtifactFactory) {
+ CppLinkAction.LinkArtifactFactory linkArtifactFactory,
+ FeatureConfiguration featureConfiguration,
+ CcToolchainProvider ccToolchain,
+ FdoSupportProvider fdoSupport,
+ boolean usePic,
+ boolean generateDwo,
+ List<String> commandLine) {
this.bitcodeFile = bitcodeFile;
PathFragment obj = ltoOutputRootPrefix.getRelative(bitcodeFile.getRootRelativePath());
objectFile = linkArtifactFactory.create(ruleContext, configuration, obj);
imports = null;
index = null;
- bitcodeFiles = null;
+
+ scheduleLtoBackendAction(
+ ruleContext,
+ featureConfiguration,
+ ccToolchain,
+ fdoSupport,
+ usePic,
+ generateDwo,
+ configuration,
+ linkArtifactFactory,
+ commandLine,
+ null);
}
public Artifact getObjectFile() {
@@ -118,11 +142,7 @@ public final class LtoBackendArtifacts {
builder.add(index);
}
- public void setCommandLine(List<String> cmdLine) {
- commandLine = cmdLine;
- }
-
- public void scheduleLtoBackendAction(
+ private void scheduleLtoBackendAction(
RuleContext ruleContext,
FeatureConfiguration featureConfiguration,
CcToolchainProvider ccToolchain,
@@ -130,7 +150,9 @@ public final class LtoBackendArtifacts {
boolean usePic,
boolean generateDwo,
BuildConfiguration configuration,
- CppLinkAction.LinkArtifactFactory linkArtifactFactory) {
+ CppLinkAction.LinkArtifactFactory linkArtifactFactory,
+ List<String> commandLine,
+ Map<PathFragment, Artifact> bitcodeFiles) {
LtoBackendAction.Builder builder = new LtoBackendAction.Builder();
builder.addInput(bitcodeFile);