//===- lib/Linker/LinkLibraries.cpp - Link LLVM libraries -----------------===// // // The LLVM Compiler Infrastructure // // This file was developed by Reid Spencer and 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 &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; }