Move all of the header files which are involved in modelling the LLVM IR
[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 is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains routines to handle linking together LLVM bitcode files,
11 // and to handle annoying things like static libraries.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Linker.h"
16 #include "llvm/Bitcode/ReaderWriter.h"
17 #include "llvm/IR/Module.h"
18 #include "llvm/Support/ErrorHandling.h"
19 #include "llvm/Support/MemoryBuffer.h"
20 #include "llvm/Support/Path.h"
21 #include "llvm/Support/system_error.h"
22 using namespace llvm;
23
24 // LinkItems - This function is the main entry point into linking. It takes a
25 // list of LinkItem which indicates the order the files should be linked and
26 // how each file should be treated (plain file or with library search). The
27 // function only links bitcode and produces a result list of items that are
28 // native objects. 
29 bool
30 Linker::LinkInItems(const ItemList& Items, ItemList& NativeItems) {
31   // Clear the NativeItems just in case
32   NativeItems.clear();
33
34   // For each linkage item ...
35   for (ItemList::const_iterator I = Items.begin(), E = Items.end();
36        I != E; ++I) {
37     if (I->second) {
38       // Link in the library suggested.
39       bool is_native = false;
40       if (LinkInLibrary(I->first, is_native))
41         return true;
42       if (is_native)
43         NativeItems.push_back(*I);
44     } else {
45       // Link in the file suggested
46       bool is_native = false;
47       if (LinkInFile(sys::Path(I->first), is_native))
48         return true;
49       if (is_native)
50         NativeItems.push_back(*I);
51     }
52   }
53
54   return false;
55 }
56
57
58 /// LinkInLibrary - links one library into the HeadModule.
59 ///
60 bool Linker::LinkInLibrary(StringRef Lib, bool& is_native) {
61   is_native = false;
62   // Determine where this library lives.
63   sys::Path Pathname = FindLib(Lib);
64   if (Pathname.isEmpty())
65     return error("Cannot find library '" + Lib.str() + "'");
66
67   // If its an archive, try to link it in
68   std::string Magic;
69   Pathname.getMagicNumber(Magic, 64);
70   switch (sys::IdentifyFileType(Magic.c_str(), 64)) {
71     default: llvm_unreachable("Bad file type identification");
72     case sys::Unknown_FileType:
73       return warning("Supposed library '" + Lib.str() + "' isn't a library.");
74
75     case sys::Bitcode_FileType:
76       // LLVM ".so" file.
77       if (LinkInFile(Pathname, is_native))
78         return true;
79       break;
80
81     case sys::Archive_FileType:
82       if (LinkInArchive(Pathname, is_native))
83         return error("Cannot link archive '" + Pathname.str() + "'");
84       break;
85
86     case sys::ELF_Relocatable_FileType:
87     case sys::ELF_SharedObject_FileType:
88     case sys::Mach_O_Object_FileType:
89     case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
90     case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
91     case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType:
92     case sys::COFF_FileType:
93       is_native = true;
94       break;
95   }
96   return false;
97 }
98
99 /// LinkLibraries - takes the specified library files and links them into the
100 /// main bitcode object file.
101 ///
102 /// Inputs:
103 ///  Libraries  - The list of libraries to link into the module.
104 ///
105 /// Return value:
106 ///  FALSE - No error.
107 ///  TRUE  - Error.
108 ///
109 bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
110
111   // Process the set of libraries we've been provided.
112   bool is_native = false;
113   for (unsigned i = 0; i < Libraries.size(); ++i)
114     if (LinkInLibrary(Libraries[i], is_native))
115       return true;
116
117   return false;
118 }
119
120 /// LinkInFile - opens a bitcode file and links in all objects which
121 /// provide symbols that are currently undefined.
122 ///
123 /// Inputs:
124 ///  File - The pathname of the bitcode file.
125 ///
126 /// Outputs:
127 ///  ErrorMessage - A C++ string detailing what error occurred, if any.
128 ///
129 /// Return Value:
130 ///  TRUE  - An error occurred.
131 ///  FALSE - No errors.
132 ///
133 bool Linker::LinkInFile(const sys::Path &File, bool &is_native) {
134   is_native = false;
135   
136   // Check for a file of name "-", which means "read standard input"
137   if (File.str() == "-") {
138     std::auto_ptr<Module> M;
139     OwningPtr<MemoryBuffer> Buffer;
140     error_code ec;
141     if (!(ec = MemoryBuffer::getSTDIN(Buffer))) {
142       if (!Buffer->getBufferSize()) {
143         Error = "standard input is empty";
144       } else {
145         M.reset(ParseBitcodeFile(Buffer.get(), Context, &Error));
146         if (M.get())
147           if (!LinkInModule(M.get(), &Error))
148             return false;
149       }
150     }
151     return error("Cannot link stdin: " + ec.message());
152   }
153
154   // Determine what variety of file it is.
155   std::string Magic;
156   if (!File.getMagicNumber(Magic, 64))
157     return error("Cannot find linker input '" + File.str() + "'");
158
159   switch (sys::IdentifyFileType(Magic.c_str(), 64)) {
160     default: llvm_unreachable("Bad file type identification");
161     case sys::Unknown_FileType:
162       return warning("Ignoring file '" + File.str() + 
163                    "' because does not contain bitcode.");
164
165     case sys::Archive_FileType:
166       // A user may specify an ar archive without -l, perhaps because it
167       // is not installed as a library. Detect that and link the archive.
168       if (LinkInArchive(File, is_native))
169         return true;
170       break;
171
172     case sys::Bitcode_FileType: {
173       verbose("Linking bitcode file '" + File.str() + "'");
174       std::auto_ptr<Module> M(LoadObject(File));
175       if (M.get() == 0)
176         return error("Cannot load file '" + File.str() + "': " + Error);
177       if (LinkInModule(M.get(), &Error))
178         return error("Cannot link file '" + File.str() + "': " + Error);
179
180       verbose("Linked in file '" + File.str() + "'");
181       break;
182     }
183
184     case sys::ELF_Relocatable_FileType:
185     case sys::ELF_SharedObject_FileType:
186     case sys::Mach_O_Object_FileType:
187     case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
188     case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
189     case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType:
190     case sys::COFF_FileType:
191       is_native = true;
192       break;
193   }
194   return false;
195 }
196
197 /// LinkFiles - takes a module and a list of files and links them all together.
198 /// It locates the file either in the current directory, as its absolute
199 /// or relative pathname, or as a file somewhere in LLVM_LIB_SEARCH_PATH.
200 ///
201 /// Inputs:
202 ///  Files      - A vector of sys::Path indicating the LLVM bitcode filenames
203 ///               to be linked.  The names can refer to a mixture of pure LLVM
204 ///               bitcode files and archive (ar) formatted files.
205 ///
206 /// Return value:
207 ///  FALSE - No errors.
208 ///  TRUE  - Some error occurred.
209 ///
210 bool Linker::LinkInFiles(const std::vector<sys::Path> &Files) {
211   bool is_native;
212   for (unsigned i = 0; i < Files.size(); ++i)
213     if (LinkInFile(Files[i], is_native))
214       return true;
215   return false;
216 }