aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-08-16 14:49:33 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2016-08-17 11:23:41 +0000
commit7c63f15e516f240b3ecc1642ae717e3b029dcfa6 (patch)
tree2c94b8bdc1f511ada111a4f17e2d7022a07f9cfe /src/main/java/com/google/devtools/build/lib/rules/cpp
parent35ae5e62a5fef2a3e38872ce58dd675faab98928 (diff)
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java17
6 files changed, 41 insertions, 18 deletions
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<LibraryToLink> staticLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink(
ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getStaticLibraries());
+ Iterable<LibraryToLink> alwayslinkLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink(
+ ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY,
+ precompiledFiles.getAlwayslinkStaticLibraries());
+ Iterable<LibraryToLink> picStaticLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink(
+ ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getPicStaticLibraries());
+ Iterable<LibraryToLink> 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<Artifact, LibraryToLink>() {
@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<Artifact> 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<Artifact> getStaticLibraries() {
- return FileType.filter(files, CppFileTypes.ARCHIVE, CppFileTypes.ALWAYS_LINK_LIBRARY);
+ return FileType.filter(files, CppFileTypes.ARCHIVE);
}
- public Iterable<LibraryToLink> getPicStaticLibraries() {
- return LinkerInputs.opaqueLibrariesToLink(ArtifactCategory.STATIC_LIBRARY,
- FileType.filter(files, CppFileTypes.PIC_ARCHIVE,
- CppFileTypes.ALWAYS_LINK_PIC_LIBRARY));
+ public Iterable<Artifact> getAlwayslinkStaticLibraries() {
+ return FileType.filter(files, CppFileTypes.ALWAYS_LINK_LIBRARY);
+ }
+
+ public Iterable<Artifact> getPicStaticLibraries() {
+ return FileType.filter(files, CppFileTypes.PIC_ARCHIVE);
+ }
+
+ public Iterable<Artifact> getPicAlwayslinkLibraries() {
+ return FileType.filter(files, CppFileTypes.ALWAYS_LINK_PIC_LIBRARY);
}
public Iterable<Artifact> getObjectFiles(final boolean usePic) {