LinkItems.cpp revision 74382b7c699120fbec5cb5603c9cf4212eb37f06
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"
1874382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner#include "llvm/System/Path.h"
19c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
2053424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer#include "llvm/Support/MemoryBuffer.h"
21e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencerusing namespace llvm;
224bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer
23f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// LinkItems - This function is the main entry point into linking. It takes a
24f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// list of LinkItem which indicates the order the files should be linked and
25f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// how each file should be treated (plain file or with library search). The
26a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// function only links bitcode and produces a result list of items that are
27f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer// native objects.
28e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencerbool
29f4484f3e16e19377af27f062ca8a0450616d319aReid SpencerLinker::LinkInItems(const ItemList& Items, ItemList& NativeItems) {
30f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer  // Clear the NativeItems just in case
31f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer  NativeItems.clear();
32f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer
334bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer  // For each linkage item ...
34f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman  for (ItemList::const_iterator I = Items.begin(), E = Items.end();
354bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer       I != E; ++I) {
364bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer    if (I->second) {
374bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer      // Link in the library suggested.
38c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer      bool is_native = false;
39c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer      if (LinkInLibrary(I->first, is_native))
40e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer        return true;
41c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer      if (is_native)
42f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer        NativeItems.push_back(*I);
434bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer    } else {
44f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer      // Link in the file suggested
45c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      bool is_native = false;
46c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      if (LinkInFile(sys::Path(I->first), is_native))
47e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer        return true;
48c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      if (is_native)
49c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer        NativeItems.push_back(*I);
504bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer    }
514bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer  }
524bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer
534bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer  // At this point we have processed all the link items provided to us. Since
544bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer  // we have an aggregated module at this point, the dependent libraries in
554bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer  // that module should also be aggregated with duplicates eliminated. This is
564bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer  // now the time to process the dependent libraries to resolve any remaining
574bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer  // symbols.
58c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer  bool is_native;
59f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman  for (Module::lib_iterator I = Composite->lib_begin(),
60126b1b868309659e124f7706bc8161943cfc0290Reid Spencer         E = Composite->lib_end(); I != E; ++I) {
61c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer    if(LinkInLibrary(*I, is_native))
62e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer      return true;
63126b1b868309659e124f7706bc8161943cfc0290Reid Spencer    if (is_native)
64126b1b868309659e124f7706bc8161943cfc0290Reid Spencer      NativeItems.push_back(std::make_pair(*I, true));
65126b1b868309659e124f7706bc8161943cfc0290Reid Spencer  }
664bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer
67e84de29663f4b8fc0540218540b93b74ca145e1bReid Spencer  return false;
684bdf1c9855f3755aae927c390df61b5bf507aa60Reid Spencer}
69ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner
70ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner
71ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// LinkInLibrary - links one library into the HeadModule.
72ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner///
7392ccf70ad448eb02f9f273d2c70ae4708b3bd0f2Daniel Dunbarbool Linker::LinkInLibrary(const StringRef &Lib, bool& is_native) {
74c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer  is_native = false;
75ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // Determine where this library lives.
76ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  sys::Path Pathname = FindLib(Lib);
77ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  if (Pathname.isEmpty())
7892ccf70ad448eb02f9f273d2c70ae4708b3bd0f2Daniel Dunbar    return error("Cannot find library '" + Lib.str() + "'");
79ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner
80ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // If its an archive, try to link it in
81f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer  std::string Magic;
82f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer  Pathname.getMagicNumber(Magic, 64);
83f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer  switch (sys::IdentifyFileType(Magic.c_str(), 64)) {
84c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Bad file type identification");
85c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    case sys::Unknown_FileType:
8692ccf70ad448eb02f9f273d2c70ae4708b3bd0f2Daniel Dunbar      return warning("Supposed library '" + Lib.str() + "' isn't a library.");
87c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer
881a019e5ffd0d8643ddffc7ed5736eb78065c5f88Chris Lattner    case sys::Bitcode_FileType:
89f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer      // LLVM ".so" file.
90c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      if (LinkInFile(Pathname, is_native))
9149068bf31113e9f048bac5eda372835ed63e4f84Reid Spencer        return true;
92f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer      break;
93c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer
94c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    case sys::Archive_FileType:
95c9a83e4f19519e19469efa0ed39d81ed60b94401Reid Spencer      if (LinkInArchive(Pathname, is_native))
9674382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner        return error("Cannot link archive '" + Pathname.str() + "'");
97f4484f3e16e19377af27f062ca8a0450616d319aReid Spencer      break;
98c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer
9918da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::ELF_Relocatable_FileType:
10018da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::ELF_SharedObject_FileType:
10118da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_Object_FileType:
10218da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
10318da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
10418da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType:
105c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    case sys::COFF_FileType:
106c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      is_native = true;
107c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      break;
108ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  }
109ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  return false;
110ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner}
111ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner
112ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// LinkLibraries - takes the specified library files and links them into the
113a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// main bitcode object file.
114ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner///
115ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// Inputs:
116ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner///  Libraries  - The list of libraries to link into the module.
117ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner///
118ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner/// Return value:
119ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner///  FALSE - No error.
120ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner///  TRUE  - Error.
121ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner///
122ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattnerbool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
123ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner
124ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // Process the set of libraries we've been provided.
125c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer  bool is_native = false;
126ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  for (unsigned i = 0; i < Libraries.size(); ++i)
127c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer    if (LinkInLibrary(Libraries[i], is_native))
128ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner      return true;
129ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner
130ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // At this point we have processed all the libraries provided to us. Since
131ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // we have an aggregated module at this point, the dependent libraries in
132ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // that module should also be aggregated with duplicates eliminated. This is
133ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // now the time to process the dependent libraries to resolve any remaining
134ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  // symbols.
135ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  const Module::LibraryListType& DepLibs = Composite->getLibraries();
136f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman  for (Module::LibraryListType::const_iterator I = DepLibs.begin(),
137f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman         E = DepLibs.end(); I != E; ++I)
138c07cfdda023b168c085f0b5c9a78a90b22fa98ebReid Spencer    if (LinkInLibrary(*I, is_native))
139ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner      return true;
140ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner
141ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner  return false;
142ad988f397d63c99cf141eee0f9e6743f53543842Chris Lattner}
143fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner
144a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// LinkInFile - opens a bitcode file and links in all objects which
145fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// provide symbols that are currently undefined.
146fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///
147fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Inputs:
148a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif///  File - The pathname of the bitcode file.
149fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///
150fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Outputs:
151fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///  ErrorMessage - A C++ string detailing what error occurred, if any.
152fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///
153fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Return Value:
154fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///  TRUE  - An error occurred.
155fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///  FALSE - No errors.
156fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///
157c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencerbool Linker::LinkInFile(const sys::Path &File, bool &is_native) {
158c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer  is_native = false;
15953424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer
16053424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer  // Check for a file of name "-", which means "read standard input"
16174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner  if (File.str() == "-") {
16253424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer    std::auto_ptr<Module> M;
16353424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer    if (MemoryBuffer *Buffer = MemoryBuffer::getSTDIN()) {
1648b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson      M.reset(ParseBitcodeFile(Buffer, Context, &Error));
16553424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer      delete Buffer;
166af11dc00a0c70fde950f70bd13a43e7cbb98ef72Reid Spencer      if (M.get())
167af11dc00a0c70fde950f70bd13a43e7cbb98ef72Reid Spencer        if (!LinkInModule(M.get(), &Error))
168af11dc00a0c70fde950f70bd13a43e7cbb98ef72Reid Spencer          return false;
16953424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer    } else
17053424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer      Error = "standard input is empty";
17153424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer    return error("Cannot link stdin: " + Error);
17253424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer  }
17353424ad141bc1298c3d1cbd28d5c823950541788Reid Spencer
174fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner  // Make sure we can at least read the file
175c7f083297cd796c2fadb534307e4ef406fd68945Reid Spencer  if (!File.canRead())
17674382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner    return error("Cannot find linker input '" + File.str() + "'");
177fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner
178c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer  // If its an archive, try to link it in
179c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer  std::string Magic;
180c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer  File.getMagicNumber(Magic, 64);
181c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer  switch (sys::IdentifyFileType(Magic.c_str(), 64)) {
182c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Bad file type identification");
183c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    case sys::Unknown_FileType:
18474382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner      return warning("Ignoring file '" + File.str() +
18549068bf31113e9f048bac5eda372835ed63e4f84Reid Spencer                   "' because does not contain bitcode.");
186c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer
187c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    case sys::Archive_FileType:
188c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      // A user may specify an ar archive without -l, perhaps because it
189c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      // is not installed as a library. Detect that and link the archive.
19074382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner      verbose("Linking archive file '" + File.str() + "'");
191c9a83e4f19519e19469efa0ed39d81ed60b94401Reid Spencer      if (LinkInArchive(File, is_native))
19249068bf31113e9f048bac5eda372835ed63e4f84Reid Spencer        return true;
193c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      break;
194c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer
195e75ca3d809ff17260efa320a949cb91ea2b3981eGabor Greif    case sys::Bitcode_FileType: {
19674382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner      verbose("Linking bitcode file '" + File.str() + "'");
197c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      std::auto_ptr<Module> M(LoadObject(File));
198c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      if (M.get() == 0)
19974382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner        return error("Cannot load file '" + File.str() + "': " + Error);
200af11dc00a0c70fde950f70bd13a43e7cbb98ef72Reid Spencer      if (LinkInModule(M.get(), &Error))
20174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner        return error("Cannot link file '" + File.str() + "': " + Error);
202c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer
20374382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner      verbose("Linked in file '" + File.str() + "'");
204c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      break;
205c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    }
206c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer
20718da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::ELF_Relocatable_FileType:
20818da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::ELF_SharedObject_FileType:
20918da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_Object_FileType:
21018da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
21118da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
21218da0720887527ed570e9703ae5f290beb491ee1Reid Spencer    case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType:
213c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    case sys::COFF_FileType:
214c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      is_native = true;
215c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer      break;
216fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner  }
217fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner  return false;
218fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner}
219fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner
220fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// LinkFiles - takes a module and a list of files and links them all together.
221fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// It locates the file either in the current directory, as its absolute
222fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// or relative pathname, or as a file somewhere in LLVM_LIB_SEARCH_PATH.
223fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///
224fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Inputs:
225a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif///  Files      - A vector of sys::Path indicating the LLVM bitcode filenames
226fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///               to be linked.  The names can refer to a mixture of pure LLVM
227a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif///               bitcode files and archive (ar) formatted files.
228fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///
229fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner/// Return value:
230fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///  FALSE - No errors.
231fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///  TRUE  - Some error occurred.
232fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner///
233fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattnerbool Linker::LinkInFiles(const std::vector<sys::Path> &Files) {
234c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer  bool is_native;
235fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner  for (unsigned i = 0; i < Files.size(); ++i)
236c8539731bd7ef7dae1dfc267446f734380f929c9Reid Spencer    if (LinkInFile(Files[i], is_native))
237fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner      return true;
238fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner  return false;
239fc82ef67971403c01f19e672b6af8d2a5caf8a30Chris Lattner}
240