summaryrefslogtreecommitdiffstats
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
commit8d4ff90680b433cca653e03e16be1274ae92554e (patch)
treec5ff2db90d7b52ec89cf76ef2fa1c5deb126d55a
parent2c673ad7ef7ae49389f292b75febe8b36c0f1c07 (diff)
downloadbcm5719-llvm-8d4ff90680b433cca653e03e16be1274ae92554e.tar.gz
bcm5719-llvm-8d4ff90680b433cca653e03e16be1274ae92554e.zip
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. llvm-svn: 36584
-rw-r--r--llvm/include/llvm/Linker.h3
-rw-r--r--llvm/lib/Linker/LinkArchives.cpp7
-rw-r--r--llvm/lib/Linker/LinkItems.cpp4
3 files changed, 10 insertions, 4 deletions
diff --git a/llvm/include/llvm/Linker.h b/llvm/include/llvm/Linker.h
index 160a0695cdc..66a84833670 100644
--- a/llvm/include/llvm/Linker.h
+++ b/llvm/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/llvm/lib/Linker/LinkArchives.cpp b/llvm/lib/Linker/LinkArchives.cpp
index 8186e7b4d18..95ac1ab1fd9 100644
--- a/llvm/lib/Linker/LinkArchives.cpp
+++ b/llvm/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/llvm/lib/Linker/LinkItems.cpp b/llvm/lib/Linker/LinkItems.cpp
index 87de4af89ae..ad7ae65209c 100644
--- a/llvm/lib/Linker/LinkItems.cpp
+++ b/llvm/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;
OpenPOWER on IntegriCloud