consolidate LinkLibraries into LinkItems
[oota-llvm.git] / lib / Linker / LinkItems.cpp
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
18 using namespace llvm;
19
20 // LinkItems - preserve link order for an arbitrary set of linkage items.
21 bool
22 Linker::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   const Module::LibraryListType& DepLibs = Composite->getLibraries();
42   for (Module::LibraryListType::const_iterator I = DepLibs.begin(), 
43       E = DepLibs.end(); I != E; ++I) {
44     if(LinkInLibrary(*I))
45       return true;
46   }
47
48   return false;
49 }
50
51
52 /// LinkInLibrary - links one library into the HeadModule.
53 ///
54 bool Linker::LinkInLibrary(const std::string& Lib) {
55   // Determine where this library lives.
56   sys::Path Pathname = FindLib(Lib);
57   if (Pathname.isEmpty())
58     return warning("Cannot find library '" + Lib + "'");
59
60   // If its an archive, try to link it in
61   if (Pathname.isArchive()) {
62     if (LinkInArchive(Pathname))
63       return error("Cannot link archive '" + Pathname.toString() + "'");
64   } else if (Pathname.isBytecodeFile()) {
65     // LLVM ".so" file.
66     if (LinkInFile(Pathname))
67       return error("Cannot link file '" + Pathname.toString() + "'");
68
69   } else if (Pathname.isDynamicLibrary()) {
70     return warning("Library '" + Lib + "' is a native dynamic library.");
71   } else {
72     return warning("Supposed library '" + Lib + "' isn't a library.");
73   }
74   return false;
75 }
76
77 /// LinkLibraries - takes the specified library files and links them into the
78 /// main bytecode object file.
79 ///
80 /// Inputs:
81 ///  Libraries  - The list of libraries to link into the module.
82 ///
83 /// Return value:
84 ///  FALSE - No error.
85 ///  TRUE  - Error.
86 ///
87 bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
88
89   // Process the set of libraries we've been provided.
90   for (unsigned i = 0; i < Libraries.size(); ++i)
91     if (LinkInLibrary(Libraries[i]))
92       return true;
93
94   // At this point we have processed all the libraries provided to us. Since
95   // we have an aggregated module at this point, the dependent libraries in
96   // that module should also be aggregated with duplicates eliminated. This is
97   // now the time to process the dependent libraries to resolve any remaining
98   // symbols.
99   const Module::LibraryListType& DepLibs = Composite->getLibraries();
100   for (Module::LibraryListType::const_iterator I = DepLibs.begin(), 
101       E = DepLibs.end(); I != E; ++I)
102     if (LinkInLibrary(*I)) 
103       return true;
104
105   return false;
106 }