Skip to content

Commit

Permalink
Enable ThinLTO for nativedeps links
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Googler authored and dslomov committed Aug 1, 2017
1 parent 57d3e95 commit 2789c97
Showing 1 changed file with 31 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -31,6 +32,7 @@
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;
Expand Down Expand Up @@ -213,19 +215,36 @@ public static NativeDepsRunfiles createNativeDepsAction(
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();

Expand Down

0 comments on commit 2789c97

Please sign in to comment.