1 //===- lib/Linker/LinkItems.cpp - Link LLVM objects and libraries ---------===//
3 // The LLVM Compiler Infrastructure
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.
8 //===----------------------------------------------------------------------===//
10 // This file contains routines to handle linking together LLVM bytecode files,
11 // and to handle annoying things like static libraries.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/Linker.h"
16 #include "llvm/Module.h"
20 // LinkItems - preserve link order for an arbitrary set of linkage items.
22 Linker::LinkInItems(const ItemList& Items) {
23 // For each linkage item ...
24 for (ItemList::const_iterator I = Items.begin(), E = Items.end();
27 // Link in the library suggested.
28 if (LinkInLibrary(I->first))
31 if (LinkInFile(sys::Path(I->first)))
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
41 const Module::LibraryListType& DepLibs = Composite->getLibraries();
42 for (Module::LibraryListType::const_iterator I = DepLibs.begin(),
43 E = DepLibs.end(); I != E; ++I) {
52 /// LinkInLibrary - links one library into the HeadModule.
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 + "'");
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()) {
66 if (LinkInFile(Pathname))
67 return error("Cannot link file '" + Pathname.toString() + "'");
69 } else if (Pathname.isDynamicLibrary()) {
70 return warning("Library '" + Lib + "' is a native dynamic library.");
72 return warning("Supposed library '" + Lib + "' isn't a library.");
77 /// LinkLibraries - takes the specified library files and links them into the
78 /// main bytecode object file.
81 /// Libraries - The list of libraries to link into the module.
87 bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
89 // Process the set of libraries we've been provided.
90 for (unsigned i = 0; i < Libraries.size(); ++i)
91 if (LinkInLibrary(Libraries[i]))
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
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))