From 2789c97149a1f253b659aa0f2401f44705a3258f Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 1 Aug 2017 16:38:49 +0200 Subject: [PATCH] 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 --- .../rules/nativedeps/NativeDepsHelper.java | 43 +++++++++++++------ 1 file 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 f4f89af8a98088..1ed477e97ced07 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.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 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 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();