From 82af84e46418925840f0d590586cec75ec8394a1 Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 3 Nov 2017 19:36:07 +0100 Subject: 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 --- .../build/lib/rules/cpp/CppLinkActionBuilder.java | 39 +++++++------- .../build/lib/rules/cpp/LtoBackendArtifacts.java | 60 +++++++++++++++------- 2 files changed, 60 insertions(+), 39 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp') 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 createLtoArtifacts( - PathFragment ltoOutputRootPrefix, NestedSet uniqueLibraries) { + PathFragment ltoOutputRootPrefix, + NestedSet uniqueLibraries, + ImmutableSet features) { Set compiled = new LinkedHashSet<>(); for (LibraryToLink lib : uniqueLibraries) { compiled.addAll(lib.getLtoBitcodeFiles().keySet()); @@ -550,11 +552,25 @@ public class CppLinkActionBuilder { } } + List argv = new ArrayList<>(); + argv.addAll(toolchain.getLinkOptions()); + argv.addAll(cppConfiguration.getCompilerOptions(features)); ImmutableList.Builder 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 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 bitcodeFiles; - - // Command line arguments to apply to back-end compile action, typically from - // the feature configuration and user-provided linkopts. - private List commandLine; - LtoBackendArtifacts( PathFragment ltoOutputRootPrefix, Artifact bitcodeFile, Map allBitCodeFiles, RuleContext ruleContext, BuildConfiguration configuration, - CppLinkAction.LinkArtifactFactory linkArtifactFactory) { + CppLinkAction.LinkArtifactFactory linkArtifactFactory, + FeatureConfiguration featureConfiguration, + CcToolchainProvider ccToolchain, + FdoSupportProvider fdoSupport, + boolean usePic, + boolean generateDwo, + List 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 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 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 commandLine, + Map bitcodeFiles) { LtoBackendAction.Builder builder = new LtoBackendAction.Builder(); builder.addInput(bitcodeFile); -- cgit v1.2.3