- }
-
- return false;
-}
-
-/// 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.
-///
-static bool LinkInFile(Module *HeadModule,
- const std::string &Filename,
- std::string &ErrorMessage,
- bool Verbose)
-{
- std::auto_ptr<Module> M(LoadObject(Filename, ErrorMessage));
- if (M.get() == 0) return true;
- bool Result = LinkModules(HeadModule, M.get(), &ErrorMessage);
- if (Verbose) std::cerr << "Linked in bytecode file '" << Filename << "'\n";
- return Result;
-}
-
-/// 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:
-/// progname - The name of the program (infamous argv[0]).
-/// HeadModule - The module under which all files will be linked.
-/// 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.
-/// Verbose - Flags whether verbose output should be printed while linking.
-///
-/// Outputs:
-/// HeadModule - The module will have the specified LLVM bytecode files linked
-/// in.
-///
-/// Return value:
-/// FALSE - No errors.
-/// TRUE - Some error occurred.
-///
-bool llvm::LinkFiles(const char *progname, Module *HeadModule,
- const std::vector<std::string> &Files, bool Verbose) {
- // String in which to receive error messages.
- std::string ErrorMessage;
-
- // Full pathname of the file
- std::string Pathname;
-
- // Get the library search path from the environment
- char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH");
-
- for (unsigned i = 0; i < Files.size(); ++i) {
- // Determine where this file lives.
- if (FileOpenable(Files[i])) {
- Pathname = Files[i];
- } else {
- if (SearchPath == NULL) {
- std::cerr << progname << ": Cannot find linker input file '"
- << Files[i] << "'\n";
- std::cerr << progname
- << ": Warning: Your LLVM_LIB_SEARCH_PATH is unset.\n";
- return true;
- }
-
- Pathname = std::string(SearchPath)+"/"+Files[i];
- if (!FileOpenable(Pathname)) {
- std::cerr << progname << ": Cannot find linker input file '"
- << Files[i] << "'\n";
- return true;
- }
- }
-
- // 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 (IsArchive(Pathname)) {
- if (Verbose)
- std::cerr << "Trying to link archive '" << Pathname << "'\n";
-
- if (LinkInArchive(HeadModule, Pathname, &ErrorMessage, Verbose)) {
- std::cerr << progname << ": Error linking in archive '" << Pathname
- << "': " << ErrorMessage << "\n";
- return true;
- }
- } else if (IsBytecode(Pathname)) {
- if (Verbose)
- std::cerr << "Trying to link bytecode file '" << Pathname << "'\n";
-
- if (LinkInFile(HeadModule, Pathname, ErrorMessage, Verbose)) {
- std::cerr << progname << ": Error linking in bytecode file '"
- << Pathname << "': " << ErrorMessage << "\n";
- return true;
- }
- } else {
- std::cerr << progname << ": Warning: invalid file `" << Pathname
- << "' ignored.\n";
- }
- }