14bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer//===- lib/Linker/LinkItems.cpp - Link LLVM objects and libraries ---------===// 2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 34bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer// The LLVM Compiler Infrastructure 44bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 84bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer//===----------------------------------------------------------------------===// 94bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer// 10a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// This file contains routines to handle linking together LLVM bitcode 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" 1774382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner#include "llvm/Bitcode/ReaderWriter.h" 181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Path.h" 19c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 2053424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer#include "llvm/Support/MemoryBuffer.h" 21333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer#include "llvm/Support/system_error.h" 22e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencerusing namespace llvm; 234bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer 24f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// LinkItems - This function is the main entry point into linking. It takes a 25f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// list of LinkItem which indicates the order the files should be linked and 26f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// how each file should be treated (plain file or with library search). The 27a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// function only links bitcode and produces a result list of items that are 28f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// native objects. 29e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencerbool 30f4484f3e16e19377af27f062ca8a0450616d319aReid SpencerLinker::LinkInItems(const ItemList& Items, ItemList& NativeItems) { 31f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer // Clear the NativeItems just in case 32f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer NativeItems.clear(); 33f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer 344bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer // For each linkage item ... 35f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman for (ItemList::const_iterator I = Items.begin(), E = Items.end(); 364bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer I != E; ++I) { 374bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer if (I->second) { 384bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer // Link in the library suggested. 39c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer bool is_native = false; 40c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer if (LinkInLibrary(I->first, is_native)) 41e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer return true; 42c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer if (is_native) 43f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer NativeItems.push_back(*I); 444bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer } else { 45f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer // Link in the file suggested 46c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer bool is_native = false; 47c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer if (LinkInFile(sys::Path(I->first), is_native)) 48e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer return true; 49c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer if (is_native) 50c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer NativeItems.push_back(*I); 514bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer } 524bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer } 534bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer 544bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer // At this point we have processed all the link items provided to us. Since 554bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer // we have an aggregated module at this point, the dependent libraries in 564bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer // that module should also be aggregated with duplicates eliminated. This is 574bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer // now the time to process the dependent libraries to resolve any remaining 584bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer // symbols. 59c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer bool is_native; 60f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman for (Module::lib_iterator I = Composite->lib_begin(), 61126b1b868309659e124f7706bc8161943cfc0290Reid Spencer E = Composite->lib_end(); I != E; ++I) { 62c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer if(LinkInLibrary(*I, is_native)) 63e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer return true; 64126b1b868309659e124f7706bc8161943cfc0290Reid Spencer if (is_native) 65126b1b868309659e124f7706bc8161943cfc0290Reid Spencer NativeItems.push_back(std::make_pair(*I, true)); 66126b1b868309659e124f7706bc8161943cfc0290Reid Spencer } 674bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer 68e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer return false; 694bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer} 70ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner 71ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner 72ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// LinkInLibrary - links one library into the HeadModule. 73ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// 742928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbarbool Linker::LinkInLibrary(StringRef Lib, bool& is_native) { 75c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer is_native = false; 76ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // Determine where this library lives. 77ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner sys::Path Pathname = FindLib(Lib); 78ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner if (Pathname.isEmpty()) 7992ccf70ad448eb02f9f273d2c70ae4708b3bd0f2Daniel Dunbar return error("Cannot find library '" + Lib.str() + "'"); 80ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner 81ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // If its an archive, try to link it in 82f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer std::string Magic; 83f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer Pathname.getMagicNumber(Magic, 64); 84f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer switch (sys::IdentifyFileType(Magic.c_str(), 64)) { 85c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Bad file type identification"); 86c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer case sys::Unknown_FileType: 8792ccf70ad448eb02f9f273d2c70ae4708b3bd0f2Daniel Dunbar return warning("Supposed library '" + Lib.str() + "' isn't a library."); 88c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer 891a019e5ffd0d8643ddffc7ed5736eb78065c5f88Chris Lattner case sys::Bitcode_FileType: 90f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer // LLVM ".so" file. 91c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer if (LinkInFile(Pathname, is_native)) 9249068bf31113e9f048bac5eda372835ed63e4f84Reid Spencer return true; 93f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer break; 94c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer 95c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer case sys::Archive_FileType: 96c9a83e4f19519e19469efa0ed39d81ed60b94401Reid Spencer if (LinkInArchive(Pathname, is_native)) 9774382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner return error("Cannot link archive '" + Pathname.str() + "'"); 98f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer break; 99c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer 10018da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::ELF_Relocatable_FileType: 10118da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::ELF_SharedObject_FileType: 10218da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_Object_FileType: 10318da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: 10418da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: 10518da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: 106c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer case sys::COFF_FileType: 107c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer is_native = true; 108c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer break; 109ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner } 110ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner return false; 111ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner} 112ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner 113ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// LinkLibraries - takes the specified library files and links them into the 114a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// main bitcode object file. 115ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// 116ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// Inputs: 117ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// Libraries - The list of libraries to link into the module. 118ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// 119ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// Return value: 120ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// FALSE - No error. 121ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// TRUE - Error. 122ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// 123ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattnerbool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) { 124ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner 125ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // Process the set of libraries we've been provided. 126c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer bool is_native = false; 127ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner for (unsigned i = 0; i < Libraries.size(); ++i) 128c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer if (LinkInLibrary(Libraries[i], is_native)) 129ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner return true; 130ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner 131ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // At this point we have processed all the libraries provided to us. Since 132ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // we have an aggregated module at this point, the dependent libraries in 133ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // that module should also be aggregated with duplicates eliminated. This is 134ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // now the time to process the dependent libraries to resolve any remaining 135ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner // symbols. 136ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner const Module::LibraryListType& DepLibs = Composite->getLibraries(); 137f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman for (Module::LibraryListType::const_iterator I = DepLibs.begin(), 138f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman E = DepLibs.end(); I != E; ++I) 139c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer if (LinkInLibrary(*I, is_native)) 140ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner return true; 141ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner 142ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner return false; 143ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner} 144fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner 145a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// LinkInFile - opens a bitcode file and links in all objects which 146fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// provide symbols that are currently undefined. 147fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// 148fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Inputs: 149a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// File - The pathname of the bitcode file. 150fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// 151fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Outputs: 152fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// ErrorMessage - A C++ string detailing what error occurred, if any. 153fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// 154fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Return Value: 155fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// TRUE - An error occurred. 156fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// FALSE - No errors. 157fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// 158c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencerbool Linker::LinkInFile(const sys::Path &File, bool &is_native) { 159c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer is_native = false; 16053424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer 16153424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer // Check for a file of name "-", which means "read standard input" 16274382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner if (File.str() == "-") { 16353424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer std::auto_ptr<Module> M; 1643ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer OwningPtr<MemoryBuffer> Buffer; 165333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer error_code ec; 1663ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer if (!(ec = MemoryBuffer::getSTDIN(Buffer))) { 16730377e780918aacda1befa47054c61b0155c194cDan Gohman if (!Buffer->getBufferSize()) { 16830377e780918aacda1befa47054c61b0155c194cDan Gohman Error = "standard input is empty"; 16930377e780918aacda1befa47054c61b0155c194cDan Gohman } else { 1703ff9563c3e391954b2e224afcf8b2b0fcc3888aaMichael J. Spencer M.reset(ParseBitcodeFile(Buffer.get(), Context, &Error)); 17130377e780918aacda1befa47054c61b0155c194cDan Gohman if (M.get()) 17230377e780918aacda1befa47054c61b0155c194cDan Gohman if (!LinkInModule(M.get(), &Error)) 17330377e780918aacda1befa47054c61b0155c194cDan Gohman return false; 17430377e780918aacda1befa47054c61b0155c194cDan Gohman } 175d65267ee625bb9cf8dc655a0c0409760e2b76c71Daniel Dunbar } 176333fb04506233255f10d8095c9e2de5e5f0fdc6fMichael J. Spencer return error("Cannot link stdin: " + ec.message()); 17753424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer } 17853424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer 17995131fcb671f13b931ea3cbb6bbd3fd735f1c5dcDan Gohman // Determine what variety of file it is. 18095131fcb671f13b931ea3cbb6bbd3fd735f1c5dcDan Gohman std::string Magic; 18195131fcb671f13b931ea3cbb6bbd3fd735f1c5dcDan Gohman if (!File.getMagicNumber(Magic, 64)) 18274382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner return error("Cannot find linker input '" + File.str() + "'"); 183fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner 184c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer switch (sys::IdentifyFileType(Magic.c_str(), 64)) { 185c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Bad file type identification"); 186c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer case sys::Unknown_FileType: 18774382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner return warning("Ignoring file '" + File.str() + 18849068bf31113e9f048bac5eda372835ed63e4f84Reid Spencer "' because does not contain bitcode."); 189c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer 190c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer case sys::Archive_FileType: 191c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer // A user may specify an ar archive without -l, perhaps because it 192c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer // is not installed as a library. Detect that and link the archive. 193c9a83e4f19519e19469efa0ed39d81ed60b94401Reid Spencer if (LinkInArchive(File, is_native)) 19449068bf31113e9f048bac5eda372835ed63e4f84Reid Spencer return true; 195c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer break; 196c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer 197e75ca3d809ff17260efa320a949cb91ea2b3981eGabor Greif case sys::Bitcode_FileType: { 19874382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner verbose("Linking bitcode file '" + File.str() + "'"); 199c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer std::auto_ptr<Module> M(LoadObject(File)); 200c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer if (M.get() == 0) 20174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner return error("Cannot load file '" + File.str() + "': " + Error); 202af11dc00a0c70fde950f70bd13a43e7cbb98ef72Reid Spencer if (LinkInModule(M.get(), &Error)) 20374382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner return error("Cannot link file '" + File.str() + "': " + Error); 204c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer 20574382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner verbose("Linked in file '" + File.str() + "'"); 206c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer break; 207c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer } 208c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer 20918da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::ELF_Relocatable_FileType: 21018da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::ELF_SharedObject_FileType: 21118da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_Object_FileType: 21218da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: 21318da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: 21418da0720887527ed570e9703ae5f290beb491ee1Reid Spencer case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: 215c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer case sys::COFF_FileType: 216c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer is_native = true; 217c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer break; 218fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner } 219fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner return false; 220fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner} 221fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner 222fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// LinkFiles - takes a module and a list of files and links them all together. 223fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// It locates the file either in the current directory, as its absolute 224fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// or relative pathname, or as a file somewhere in LLVM_LIB_SEARCH_PATH. 225fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// 226fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Inputs: 227a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// Files - A vector of sys::Path indicating the LLVM bitcode filenames 228fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// to be linked. The names can refer to a mixture of pure LLVM 229a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// bitcode files and archive (ar) formatted files. 230fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// 231fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Return value: 232fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// FALSE - No errors. 233fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// TRUE - Some error occurred. 234fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// 235fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattnerbool Linker::LinkInFiles(const std::vector<sys::Path> &Files) { 236c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer bool is_native; 237fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner for (unsigned i = 0; i < Files.size(); ++i) 238c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer if (LinkInFile(Files[i], is_native)) 239fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner return true; 240fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner return false; 241fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner} 242