[llvm-commits] CVS: llvm/lib/Linker/LinkFiles.cpp
Reid Spencer
reid at x10sys.com
Sun Dec 12 18:59:52 PST 2004
Changes in directory llvm/lib/Linker:
LinkFiles.cpp added (r1.1)
---
Log message:
This file contains only the Linker's file linking support
---
Diffs of the changes: (+89 -0)
Index: llvm/lib/Linker/LinkFiles.cpp
diff -c /dev/null llvm/lib/Linker/LinkFiles.cpp:1.1
*** /dev/null Sun Dec 12 20:59:51 2004
--- llvm/lib/Linker/LinkFiles.cpp Sun Dec 12 20:59:41 2004
***************
*** 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;
+ }
More information about the llvm-commits
mailing list