From 7c63f15e516f240b3ecc1642ae717e3b029dcfa6 Mon Sep 17 00:00:00 2001 From: Lukacs Berki Date: Tue, 16 Aug 2016 14:49:33 +0000 Subject: Differentiate between regular and alwayslink static libraries in LinkerInput#getArtifactCategory() and use this information to remove one use of LINK_LIBRARY_FILETYPES. -- MOS_MIGRATED_REVID=130400793 --- .../google/devtools/build/lib/rules/cpp/CcBinary.java | 9 +++++++-- .../google/devtools/build/lib/rules/cpp/CcLibrary.java | 13 +++++++++++-- .../build/lib/rules/cpp/CppLinkActionBuilder.java | 4 +--- .../com/google/devtools/build/lib/rules/cpp/Link.java | 10 ++++++---- .../devtools/build/lib/rules/cpp/LinkerInputs.java | 6 +++++- .../devtools/build/lib/rules/cpp/PrecompiledFiles.java | 17 +++++++++++------ 6 files changed, 41 insertions(+), 18 deletions(-) (limited to 'src/main/java/com/google') diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index d49415f6a4..975d9d218c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -421,13 +421,18 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { // artifacts generated by getDynamicLibraryLink(). This is done to minimize number of -rpath // entries during linking process. for (Artifact library : precompiledFiles.getLibraries()) { - if (SHARED_LIBRARY_FILETYPES.matches(library.getFilename())) { + if (Link.SHARED_LIBRARY_FILETYPES.matches(library.getFilename())) { builder.addLibrary(LinkerInputs.solibLibraryToLink( common.getDynamicLibrarySymlink(library, true), library, CcLinkingOutputs.libraryIdentifierOf(library))); - } else { + } else if (Link.LINK_LIBRARY_FILETYPES.matches(library.getFilename())) { + builder.addLibrary(LinkerInputs.precompiledLibraryToLink( + library, ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY)); + } else if (Link.ARCHIVE_FILETYPES.matches(library.getFilename())) { builder.addLibrary(LinkerInputs.precompiledLibraryToLink( library, ArtifactCategory.STATIC_LIBRARY)); + } else { + throw new IllegalStateException(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java index 3dd3f96515..cc360f107b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java @@ -221,9 +221,18 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory { */ Iterable staticLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink( ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getStaticLibraries()); + Iterable alwayslinkLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink( + ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY, + precompiledFiles.getAlwayslinkStaticLibraries()); + Iterable picStaticLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink( + ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getPicStaticLibraries()); + Iterable picAlwayslinkLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink( + ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY, precompiledFiles.getPicAlwayslinkLibraries()); + helper.addStaticLibraries(staticLibrariesFromSrcs); - helper.addPicStaticLibraries(Iterables.filter(staticLibrariesFromSrcs, PIC_STATIC_FILTER)); - helper.addPicStaticLibraries(precompiledFiles.getPicStaticLibraries()); + helper.addStaticLibraries(alwayslinkLibrariesFromSrcs); + helper.addPicStaticLibraries(picStaticLibrariesFromSrcs); + helper.addPicStaticLibraries(picAlwayslinkLibrariesFromSrcs); helper.addDynamicLibraries(Iterables.transform(precompiledFiles.getSharedLibraries(), new Function() { @Override 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 62c874d3be..f5ae6fc6a1 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 @@ -472,9 +472,7 @@ public class CppLinkActionBuilder { final LibraryToLink outputLibrary = linkType == LinkTargetType.EXECUTABLE ? null : LinkerInputs.newInputLibrary(output, - linkType.staticness() == Staticness.STATIC - ? ArtifactCategory.STATIC_LIBRARY - : ArtifactCategory.DYNAMIC_LIBRARY, + linkType.getLinkerOutput(), libraryIdentifier, objectArtifacts, this.ltoBitcodeFiles); final LibraryToLink interfaceOutputLibrary = diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java index ece5cac44a..a6288e5eed 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java @@ -247,7 +247,8 @@ public abstract class Link { // TODO(bazel-team): Figure out if PicArchives are actually used. For it to be used, both // linkingStatically and linkShared must me true, we must be in opt mode and cpu has to be k8. return archiveType == ArchiveType.START_END_LIB - && linkerInput.getArtifactCategory() == ArtifactCategory.STATIC_LIBRARY + && (linkerInput.getArtifactCategory() == ArtifactCategory.STATIC_LIBRARY + || linkerInput.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY) && linkerInput.containsObjectFiles(); } @@ -327,12 +328,13 @@ public abstract class Link { // files - otherwise getObjectFiles returns null, which would lead to an NPE in // simpleLinkerInputs. boolean needMembersForLink = archiveType != ArchiveType.FAT - && inputLibrary.getArtifactCategory() == ArtifactCategory.STATIC_LIBRARY + && (inputLibrary.getArtifactCategory() == ArtifactCategory.STATIC_LIBRARY + || inputLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY) && inputLibrary.containsObjectFiles(); // True if we will pass the members instead of the original archive. - boolean passMembersToLinkCmd = needMembersForLink - && (globalNeedWholeArchive || LINK_LIBRARY_FILETYPES.matches(name)); + boolean passMembersToLinkCmd = needMembersForLink && (globalNeedWholeArchive + || inputLibrary.getArtifactCategory() == ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY); // If deps is false (when computing the inputs to be passed on the command line), then it's // an if-then-else, i.e., the passMembersToLinkCmd flag decides whether to pass the object diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java index 9f3e215dac..d4346a39e1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java @@ -251,8 +251,12 @@ public abstract class LinkerInputs { Iterable ltoBitcodeFiles) { String basename = libraryArtifact.getFilename(); switch (category) { + case ALWAYSLINK_STATIC_LIBRARY: + Preconditions.checkState(Link.LINK_LIBRARY_FILETYPES.matches(basename)); + break; + case STATIC_LIBRARY: - Preconditions.checkState(Link.ARCHIVE_LIBRARY_FILETYPES.matches(basename)); + Preconditions.checkState(Link.ARCHIVE_FILETYPES.matches(basename)); break; case DYNAMIC_LIBRARY: diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java index 798b531b57..ab1e143fe9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java @@ -19,7 +19,6 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink; import com.google.devtools.build.lib.util.FileType; /** @@ -55,13 +54,19 @@ public final class PrecompiledFiles { } public Iterable getStaticLibraries() { - return FileType.filter(files, CppFileTypes.ARCHIVE, CppFileTypes.ALWAYS_LINK_LIBRARY); + return FileType.filter(files, CppFileTypes.ARCHIVE); } - public Iterable getPicStaticLibraries() { - return LinkerInputs.opaqueLibrariesToLink(ArtifactCategory.STATIC_LIBRARY, - FileType.filter(files, CppFileTypes.PIC_ARCHIVE, - CppFileTypes.ALWAYS_LINK_PIC_LIBRARY)); + public Iterable getAlwayslinkStaticLibraries() { + return FileType.filter(files, CppFileTypes.ALWAYS_LINK_LIBRARY); + } + + public Iterable getPicStaticLibraries() { + return FileType.filter(files, CppFileTypes.PIC_ARCHIVE); + } + + public Iterable getPicAlwayslinkLibraries() { + return FileType.filter(files, CppFileTypes.ALWAYS_LINK_PIC_LIBRARY); } public Iterable getObjectFiles(final boolean usePic) { -- cgit v1.2.3