LinkItems.cpp revision fc82ef67971403c01f19e672b6af8d2a5caf8a30
1//===- lib/Linker/LinkItems.cpp - Link LLVM objects and libraries ---------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Reid Spencer and is distributed under the 6// University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains routines to handle linking together LLVM bytecode files, 11// and to handle annoying things like static libraries. 12// 13//===----------------------------------------------------------------------===// 14 15#include "llvm/Linker.h" 16#include "llvm/Module.h" 17 18using namespace llvm; 19 20// LinkItems - preserve link order for an arbitrary set of linkage items. 21bool 22Linker::LinkInItems(const ItemList& Items) { 23 // For each linkage item ... 24 for (ItemList::const_iterator I = Items.begin(), E = Items.end(); 25 I != E; ++I) { 26 if (I->second) { 27 // Link in the library suggested. 28 if (LinkInLibrary(I->first)) 29 return true; 30 } else { 31 if (LinkInFile(sys::Path(I->first))) 32 return true; 33 } 34 } 35 36 // At this point we have processed all the link items provided to us. Since 37 // we have an aggregated module at this point, the dependent libraries in 38 // that module should also be aggregated with duplicates eliminated. This is 39 // now the time to process the dependent libraries to resolve any remaining 40 // symbols. 41 for (Module::lib_iterator I = Composite->lib_begin(), 42 E = Composite->lib_end(); I != E; ++I) 43 if(LinkInLibrary(*I)) 44 return true; 45 46 return false; 47} 48 49 50/// LinkInLibrary - links one library into the HeadModule. 51/// 52bool Linker::LinkInLibrary(const std::string& Lib) { 53 // Determine where this library lives. 54 sys::Path Pathname = FindLib(Lib); 55 if (Pathname.isEmpty()) 56 return warning("Cannot find library '" + Lib + "'"); 57 58 // If its an archive, try to link it in 59 if (Pathname.isArchive()) { 60 if (LinkInArchive(Pathname)) 61 return error("Cannot link archive '" + Pathname.toString() + "'"); 62 } else if (Pathname.isBytecodeFile()) { 63 // LLVM ".so" file. 64 if (LinkInFile(Pathname)) 65 return error("Cannot link file '" + Pathname.toString() + "'"); 66 67 } else if (Pathname.isDynamicLibrary()) { 68 return warning("Library '" + Lib + "' is a native dynamic library."); 69 } else { 70 return warning("Supposed library '" + Lib + "' isn't a library."); 71 } 72 return false; 73} 74 75/// LinkLibraries - takes the specified library files and links them into the 76/// main bytecode object file. 77/// 78/// Inputs: 79/// Libraries - The list of libraries to link into the module. 80/// 81/// Return value: 82/// FALSE - No error. 83/// TRUE - Error. 84/// 85bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) { 86 87 // Process the set of libraries we've been provided. 88 for (unsigned i = 0; i < Libraries.size(); ++i) 89 if (LinkInLibrary(Libraries[i])) 90 return true; 91 92 // At this point we have processed all the libraries provided to us. Since 93 // we have an aggregated module at this point, the dependent libraries in 94 // that module should also be aggregated with duplicates eliminated. This is 95 // now the time to process the dependent libraries to resolve any remaining 96 // symbols. 97 const Module::LibraryListType& DepLibs = Composite->getLibraries(); 98 for (Module::LibraryListType::const_iterator I = DepLibs.begin(), 99 E = DepLibs.end(); I != E; ++I) 100 if (LinkInLibrary(*I)) 101 return true; 102 103 return false; 104} 105 106/// LinkInFile - opens a bytecode file and links in all objects which 107/// provide symbols that are currently undefined. 108/// 109/// Inputs: 110/// File - The pathname of the bytecode file. 111/// 112/// Outputs: 113/// ErrorMessage - A C++ string detailing what error occurred, if any. 114/// 115/// Return Value: 116/// TRUE - An error occurred. 117/// FALSE - No errors. 118/// 119bool Linker::LinkInFile(const sys::Path &File) { 120 // Make sure we can at least read the file 121 if (!File.readable()) 122 return error("Cannot find linker input '" + File.toString() + "'"); 123 124 // A user may specify an ar archive without -l, perhaps because it 125 // is not installed as a library. Detect that and link the library. 126 if (File.isArchive()) { 127 if (LinkInArchive(File)) 128 return error("Cannot link archive '" + File.toString() + "'"); 129 } else if (File.isBytecodeFile()) { 130 verbose("Linking bytecode file '" + File.toString() + "'"); 131 132 std::auto_ptr<Module> M(LoadObject(File)); 133 if (M.get() == 0) 134 return error("Cannot load file '" + File.toString() + "'" + Error); 135 if (LinkInModule(M.get())) 136 return error("Cannot link file '" + File.toString() + "'" + Error); 137 138 verbose("Linked in file '" + File.toString() + "'"); 139 } else { 140 return warning("File of unknown type '" + File.toString() + "' ignored."); 141 } 142 return false; 143} 144 145/// LinkFiles - takes a module and a list of files and links them all together. 146/// It locates the file either in the current directory, as its absolute 147/// or relative pathname, or as a file somewhere in LLVM_LIB_SEARCH_PATH. 148/// 149/// Inputs: 150/// Files - A vector of sys::Path indicating the LLVM bytecode filenames 151/// to be linked. The names can refer to a mixture of pure LLVM 152/// bytecode files and archive (ar) formatted files. 153/// 154/// Return value: 155/// FALSE - No errors. 156/// TRUE - Some error occurred. 157/// 158bool Linker::LinkInFiles(const std::vector<sys::Path> &Files) { 159 for (unsigned i = 0; i < Files.size(); ++i) 160 if (LinkInFile(Files[i])) 161 return true; 162 return false; 163} 164