diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Linker/LinkModules.cpp | 21 | ||||
-rw-r--r-- | lib/VMCore/Linker.cpp | 21 |
2 files changed, 42 insertions, 0 deletions
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 9e67593..f75729b 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -23,6 +23,7 @@ #include "llvm/SymbolTable.h" #include "llvm/Instructions.h" #include "llvm/Assembly/Writer.h" +#include "llvm/System/Path.h" #include <iostream> #include <sstream> using namespace llvm; @@ -835,6 +836,9 @@ static bool LinkAppendingVars(Module *M, // shouldn't be relied on to be consistent. // bool llvm::LinkModules(Module *Dest, const Module *Src, std::string *ErrorMsg) { + assert(Dest != 0 && "Invalid Destination module"); + assert(Src != 0 && "Invalid Source Module"); + if (Dest->getEndianness() == Module::AnyEndianness) Dest->setEndianness(Src->getEndianness()); if (Dest->getPointerSize() == Module::AnyPointerSize) @@ -847,6 +851,16 @@ bool llvm::LinkModules(Module *Dest, const Module *Src, std::string *ErrorMsg) { Dest->getPointerSize() != Src->getPointerSize()) std::cerr << "WARNING: Linking two modules of different pointer size!\n"; + // Update the destination module's dependent libraries list with the libraries + // from the source module. There's no opportunity for duplicates here as the + // Module ensures that duplicate insertions are discarded. + Module::lib_iterator SI = Src->lib_begin(); + Module::lib_iterator SE = Src->lib_end(); + while ( SI != SE ) { + Dest->addLibrary(*SI); + ++SI; + } + // LinkTypes - Go through the symbol table of the Src module and see if any // types are named in the src module that are not named in the Dst module. // Make sure there are no type name conflicts. @@ -915,6 +929,13 @@ bool llvm::LinkModules(Module *Dest, const Module *Src, std::string *ErrorMsg) { // if (LinkAppendingVars(Dest, AppendingVars, ErrorMsg)) return true; + // If the source library's module id is in the dependent library list of the + // destination library, remove it since that module is now linked in. + sys::Path modId; + modId.set_file(Src->getModuleIdentifier()); + if (!modId.is_empty()) + Dest->removeLibrary(modId.get_basename()); + return false; } diff --git a/lib/VMCore/Linker.cpp b/lib/VMCore/Linker.cpp index 9e67593..f75729b 100644 --- a/lib/VMCore/Linker.cpp +++ b/lib/VMCore/Linker.cpp @@ -23,6 +23,7 @@ #include "llvm/SymbolTable.h" #include "llvm/Instructions.h" #include "llvm/Assembly/Writer.h" +#include "llvm/System/Path.h" #include <iostream> #include <sstream> using namespace llvm; @@ -835,6 +836,9 @@ static bool LinkAppendingVars(Module *M, // shouldn't be relied on to be consistent. // bool llvm::LinkModules(Module *Dest, const Module *Src, std::string *ErrorMsg) { + assert(Dest != 0 && "Invalid Destination module"); + assert(Src != 0 && "Invalid Source Module"); + if (Dest->getEndianness() == Module::AnyEndianness) Dest->setEndianness(Src->getEndianness()); if (Dest->getPointerSize() == Module::AnyPointerSize) @@ -847,6 +851,16 @@ bool llvm::LinkModules(Module *Dest, const Module *Src, std::string *ErrorMsg) { Dest->getPointerSize() != Src->getPointerSize()) std::cerr << "WARNING: Linking two modules of different pointer size!\n"; + // Update the destination module's dependent libraries list with the libraries + // from the source module. There's no opportunity for duplicates here as the + // Module ensures that duplicate insertions are discarded. + Module::lib_iterator SI = Src->lib_begin(); + Module::lib_iterator SE = Src->lib_end(); + while ( SI != SE ) { + Dest->addLibrary(*SI); + ++SI; + } + // LinkTypes - Go through the symbol table of the Src module and see if any // types are named in the src module that are not named in the Dst module. // Make sure there are no type name conflicts. @@ -915,6 +929,13 @@ bool llvm::LinkModules(Module *Dest, const Module *Src, std::string *ErrorMsg) { // if (LinkAppendingVars(Dest, AppendingVars, ErrorMsg)) return true; + // If the source library's module id is in the dependent library list of the + // destination library, remove it since that module is now linked in. + sys::Path modId; + modId.set_file(Src->getModuleIdentifier()); + if (!modId.is_empty()) + Dest->removeLibrary(modId.get_basename()); + return false; } |