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