aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2007-04-30 00:29:39 +0000
committerReid Spencer <rspencer@reidspencer.com>2007-04-30 00:29:39 +0000
commitc9a83e4f19519e19469efa0ed39d81ed60b94401 (patch)
treed5b7f780b05a06327e4b4b6538506ce8713057fe
parent0a1817392d3ad7ec2681e6bf495f490c443ec0b7 (diff)
If an archive is not recognized as an LLVM bytecode archive then declare
that it is native so that the linker will pass it on downstream. This avoids a problem where the native link line fails because there is both a .so and a .a file. The .a file gets processed as bytecode and then dropped from the command line. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36584 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Linker.h3
-rw-r--r--lib/Linker/LinkArchives.cpp7
-rw-r--r--lib/Linker/LinkItems.cpp4
3 files changed, 10 insertions, 4 deletions
diff --git a/include/llvm/Linker.h b/include/llvm/Linker.h
index 160a0695cd..66a8483367 100644
--- a/include/llvm/Linker.h
+++ b/include/llvm/Linker.h
@@ -229,7 +229,8 @@ class Linker {
/// @returns true if an error occurs, otherwise false.
/// @brief Link in one archive.
bool LinkInArchive(
- const sys::Path& Filename ///< Filename of the archive to link
+ const sys::Path& Filename, ///< Filename of the archive to link
+ bool& is_native ///< Indicates if archive is a native archive
);
/// This method links the \p Src module into the Linker's Composite module
diff --git a/lib/Linker/LinkArchives.cpp b/lib/Linker/LinkArchives.cpp
index 8186e7b4d1..95ac1ab1fd 100644
--- a/lib/Linker/LinkArchives.cpp
+++ b/lib/Linker/LinkArchives.cpp
@@ -88,7 +88,7 @@ GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols) {
/// TRUE - An error occurred.
/// FALSE - No errors.
bool
-Linker::LinkInArchive(const sys::Path &Filename) {
+Linker::LinkInArchive(const sys::Path &Filename, bool &is_native) {
// Make sure this is an archive file we're dealing with
if (!Filename.isArchive())
@@ -118,6 +118,11 @@ Linker::LinkInArchive(const sys::Path &Filename) {
if (!arch)
return error("Cannot read archive '" + Filename.toString() +
"': " + ErrMsg);
+ if (!arch->isBytecodeArchive()) {
+ is_native = true;
+ return false;
+ }
+ is_native = false;
// Save a set of symbols that are not defined by the archive. Since we're
// entering a loop, there's no point searching for these multiple times. This
diff --git a/lib/Linker/LinkItems.cpp b/lib/Linker/LinkItems.cpp
index 87de4af89a..ad7ae65209 100644
--- a/lib/Linker/LinkItems.cpp
+++ b/lib/Linker/LinkItems.cpp
@@ -90,7 +90,7 @@ bool Linker::LinkInLibrary(const std::string& Lib, bool& is_native) {
break;
case sys::Archive_FileType:
- if (LinkInArchive(Pathname))
+ if (LinkInArchive(Pathname, is_native))
return error("Cannot link archive '" + Pathname.toString() + "'");
break;
@@ -171,7 +171,7 @@ bool Linker::LinkInFile(const sys::Path &File, bool &is_native) {
// A user may specify an ar archive without -l, perhaps because it
// is not installed as a library. Detect that and link the archive.
verbose("Linking archive file '" + File.toString() + "'");
- if (LinkInArchive(File))
+ if (LinkInArchive(File, is_native))
return error("Cannot link archive '" + File.toString() + "'");
break;