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

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

diff --git a/lib/Linker/LinkFiles.cpp b/lib/Linker/LinkFiles.cpp
new file mode 100644 (file)
index 0000000..7eba82d
--- /dev/null
@@ -0,0 +1,89 @@
+//===- lib/Linker/LinkArchives.cpp - Link LLVM objects and libraries ------===//
+// 
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// 
+//===----------------------------------------------------------------------===//
+//
+// This file contains routines to handle linking together LLVM bytecode files,
+// and to handle annoying things like static libraries.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Linker.h"
+#include "llvm/Module.h"
+//#include "llvm/Bytecode/Archive.h"
+
+using namespace llvm;
+
+/// LinkInFile - opens a bytecode file and links in all objects which
+/// provide symbols that are currently undefined.
+///
+/// Inputs:
+///  HeadModule - The module in which to link the bytecode file.
+///  Filename   - The pathname of the bytecode file.
+///  Verbose    - Flags whether verbose messages should be printed.
+///
+/// Outputs:
+///  ErrorMessage - A C++ string detailing what error occurred, if any.
+///
+/// Return Value:
+///  TRUE  - An error occurred.
+///  FALSE - No errors.
+///
+bool 
+Linker::LinkInFile(const sys::Path &File)
+{
+  // Make sure we can at least read the file
+  if (!File.readable())
+    return error("Cannot find linker input '" + File.toString() + "'");
+
+  // A user may specify an ar archive without -l, perhaps because it
+  // is not installed as a library. Detect that and link the library.
+  if (File.isArchive()) {
+    if (LinkInArchive(File))
+      return error("Cannot link archive '" + File.toString() + "'");
+  } else if (File.isBytecodeFile()) {
+    verbose("Linking bytecode file '" + File.toString() + "'");
+
+    std::auto_ptr<Module> M(LoadObject(File));
+    if (M.get() == 0) 
+      return error("Cannot load file '" + File.toString() + "'" + Error);
+    if (LinkInModule(M.get()))
+      return error("Cannot link file '" + File.toString() + "'" + Error);
+
+    verbose("Linked in file '" + File.toString() + "'");
+  } else {
+    return warning("File of unknown type '" + File.toString() + "' ignored.");
+  }
+  return false;
+}
+
+/// LinkFiles - takes a module and a list of files and links them all together.
+/// It locates the file either in the current directory, as its absolute
+/// or relative pathname, or as a file somewhere in LLVM_LIB_SEARCH_PATH.
+///
+/// Inputs:
+///  Files      - A vector of C++ strings indicating the LLVM bytecode filenames
+///               to be linked.  The names can refer to a mixture of pure LLVM
+///               bytecode files and archive (ar) formatted files.
+///
+/// Outputs:
+///  HeadModule - The module will have the specified LLVM bytecode files linked
+///               in.
+///
+/// Return value:
+///  FALSE - No errors.
+///  TRUE  - Some error occurred.
+///
+bool 
+Linker::LinkInFiles(const std::vector<sys::Path> &Files)
+{
+  for (unsigned i = 0; i < Files.size(); ++i) {
+    if (LinkInFile(Files[i]))
+      return true;
+  }
+  return false;
+}