diff options
author | 2017-11-03 19:36:07 +0100 | |
---|---|---|
committer | 2017-11-06 20:20:10 +0100 | |
commit | 82af84e46418925840f0d590586cec75ec8394a1 (patch) | |
tree | f868d68a695bc08e7d108985d8f4e3c254da6989 /src/main/java/com/google/devtools/build/lib/rules/cpp | |
parent | 3806ca842b2c0f731b27e1665981b6a204a1ddb4 (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.java | 39 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java | 60 |
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); |