If an archive is not recognized as an LLVM bytecode archive then declare
authorReid Spencer <rspencer@reidspencer.com>
Mon, 30 Apr 2007 00:29:39 +0000 (00:29 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 30 Apr 2007 00:29:39 +0000 (00:29 +0000)
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
lib/Linker/LinkArchives.cpp
lib/Linker/LinkItems.cpp

index 160a0695cdc2ff2172f227940f581c373d80a1be..66a848336709fe54b1718f35310e278b69528fcf 100644 (file)
@@ -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
index 8186e7b4d18514486d8be7f1766aaa21250bbc93..95ac1ab1fd9d6de45cb033f6f8ba53cc524ba60a 100644 (file)
@@ -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
index 87de4af89ae0d292b6c3ba61d52dec2fab9cfd03..ad7ae65209c8e7876b55bace967f1054e5985e23 100644 (file)
@@ -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;