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