From c9a83e4f19519e19469efa0ed39d81ed60b94401 Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Mon, 30 Apr 2007 00:29:39 +0000 Subject: [PATCH] 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 --- include/llvm/Linker.h | 3 ++- lib/Linker/LinkArchives.cpp | 7 ++++++- lib/Linker/LinkItems.cpp | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/include/llvm/Linker.h b/include/llvm/Linker.h index 160a0695cdc..66a84833670 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 8186e7b4d18..95ac1ab1fd9 100644 --- a/lib/Linker/LinkArchives.cpp +++ b/lib/Linker/LinkArchives.cpp @@ -88,7 +88,7 @@ GetAllUndefinedSymbols(Module *M, std::set &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 87de4af89ae..ad7ae65209c 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;