diff options
author | Googler <noreply@google.com> | 2017-08-01 16:38:49 +0200 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2017-08-01 17:45:16 +0200 |
commit | 2789c97149a1f253b659aa0f2401f44705a3258f (patch) | |
tree | 3cba2aa851cdba8eddaf7b09daa71ebddb05d171 /src/main/java/com/google/devtools/build | |
parent | 57d3e955f6d531a31ba955b8364990eadf4dda2c (diff) |
Enable ThinLTO for nativedeps links
Add support for setting up the LTO indexing step when the inputs
contain bitcode.
Added a python BuildViewTestCase that provokes this, as well as a
ThinLTO GoogleBuildIntegrationTestCase to the existing NativeDeps
testing.
PiperOrigin-RevId: 163827441
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java index f4f89af8a9..1ed477e97c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.nativedeps; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.RuleContext; @@ -31,6 +32,7 @@ import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.cpp.CppHelper; import com.google.devtools.build.lib.rules.cpp.CppLinkAction; import com.google.devtools.build.lib.rules.cpp.CppLinkActionBuilder; +import com.google.devtools.build.lib.rules.cpp.CppRuleClasses; import com.google.devtools.build.lib.rules.cpp.FdoSupportProvider; import com.google.devtools.build.lib.rules.cpp.Link; import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness; @@ -213,19 +215,36 @@ public abstract class NativeDepsHelper { builder.setRuntimeInputs(ArtifactCategory.STATIC_LIBRARY, toolchain.getStaticRuntimeLinkMiddleman(), toolchain.getStaticRuntimeLinkInputs()); } - CppLinkAction linkAction = - builder - .setLinkArtifactFactory(SHAREABLE_LINK_ARTIFACT_FACTORY) - .setCrosstoolInputs(toolchain.getLink()) - .addLibraries(linkerInputs) - .setLinkType(LinkTargetType.DYNAMIC_LIBRARY) - .setLinkStaticness(LinkStaticness.MOSTLY_STATIC) - .setLibraryIdentifier(libraryIdentifier) - .addLinkopts(linkopts) - .setNativeDeps(true) - .addLinkstamps(linkstamps) - .build(); + ImmutableMap.Builder<Artifact, Artifact> ltoBitcodeFilesMap = new ImmutableMap.Builder<>(); + for (LibraryToLink lib : linkerInputs) { + if (!lib.getLTOBitcodeFiles().isEmpty()) { + ltoBitcodeFilesMap.putAll(lib.getLTOBitcodeFiles()); + } + } + builder + .setLinkArtifactFactory(SHAREABLE_LINK_ARTIFACT_FACTORY) + .setCrosstoolInputs(toolchain.getLink()) + .addLibraries(linkerInputs) + .setLinkType(LinkTargetType.DYNAMIC_LIBRARY) + .setLinkStaticness(LinkStaticness.MOSTLY_STATIC) + .setLibraryIdentifier(libraryIdentifier) + .addLinkopts(linkopts) + .setNativeDeps(true) + .addLinkstamps(linkstamps) + .addLTOBitcodeFiles(ltoBitcodeFilesMap.build()); + + if (!builder.getLtoBitcodeFiles().isEmpty() + && featureConfiguration.isEnabled(CppRuleClasses.THIN_LTO)) { + builder.setLTOIndexing(true); + builder.setUsePicForLTOBackendActions(CppHelper.usePic(ruleContext, false)); + builder.setUseFissionForLTOBackendActions( + ruleContext.getFragment(CppConfiguration.class).useFission()); + CppLinkAction indexAction = builder.build(); + ruleContext.registerAction(indexAction); + builder.setLTOIndexing(false); + } + CppLinkAction linkAction = builder.build(); ruleContext.registerAction(linkAction); Artifact linkerOutput = linkAction.getPrimaryOutput(); |