This file contains only the Linker's library linking support
authorReid Spencer <rspencer@reidspencer.com>
Mon, 13 Dec 2004 03:00:04 +0000 (03:00 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 13 Dec 2004 03:00:04 +0000 (03:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18858 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Linker/LinkLibraries.cpp [new file with mode: 0644]

diff --git a/lib/Linker/LinkLibraries.cpp b/lib/Linker/LinkLibraries.cpp
new file mode 100644 (file)
index 0000000..bae5e51
--- /dev/null
@@ -0,0 +1,70 @@
+//===- lib/Linker/LinkLibraries.cpp - Link LLVM libraries -----------------===//
+// 
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by Reid Spencerand is distributed under the 
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+// 
+//===----------------------------------------------------------------------===//
+//
+// This file contains routines to handle finding libraries and linking them in. 
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Linker.h"
+#include "llvm/Module.h"
+
+using namespace llvm;
+
+/// LinkInLibrary - links one library into the HeadModule
+bool 
+Linker::LinkInLibrary(const std::string& Lib) 
+{
+  // Determine where this library lives.
+  sys::Path Pathname = FindLib(Lib);
+  if (Pathname.isEmpty())
+    return warning("Cannot find library '" + Lib + "'");
+
+  // If its an archive, try to link it in
+  if (Pathname.isArchive()) {
+    if (LinkInArchive(Pathname)) {
+      return error("Cannot link archive '" + Pathname.toString() + "'");
+    }
+  } else {
+    return warning("Supposed library '" + Lib + "' isn't a library.");
+  }
+  return false;
+}
+
+/// LinkLibraries - takes the specified library files and links them into the
+/// main bytecode object file.
+///
+/// Inputs:
+///  Libraries  - The list of libraries to link into the module.
+///
+/// Return value:
+///  FALSE - No error.
+///  TRUE  - Error.
+///
+bool 
+Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
+
+  // Process the set of libraries we've been provided
+  for (unsigned i = 0; i < Libraries.size(); ++i) {
+    if (LinkInLibrary(Libraries[i]))
+      return true;
+  }
+
+  // At this point we have processed all the libraries provided to us. Since
+  // we have an aggregated module at this point, the dependent libraries in
+  // that module should also be aggregated with duplicates eliminated. This is
+  // now the time to process the dependent libraries to resolve any remaining
+  // symbols.
+  const Module::LibraryListType& DepLibs = Composite->getLibraries();
+  for (Module::LibraryListType::const_iterator I = DepLibs.begin(), 
+      E = DepLibs.end(); I != E; ++I) {
+    if (LinkInLibrary(*I)) 
+      return true;
+  }
+  return false;
+}