diff options
author | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2007-06-28 19:02:54 +0000 |
---|---|---|
committer | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2007-06-28 19:02:54 +0000 |
commit | b00c9c0d5072b4840dc482d394bd13159c6fcb5f (patch) | |
tree | 376ac2a549afd2bb3f36c5b2c76e0a6df2bb937e /llvm/lib/Linker/LinkModules.cpp | |
parent | 4857576f7522a30de4e3e06b9ad55f636315eee6 (diff) | |
download | bcm5719-llvm-b00c9c0d5072b4840dc482d394bd13159c6fcb5f.tar.gz bcm5719-llvm-b00c9c0d5072b4840dc482d394bd13159c6fcb5f.zip |
When linking two modules, we should copy the alias.
llvm-svn: 37776
Diffstat (limited to 'llvm/lib/Linker/LinkModules.cpp')
-rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp index 88bf62186fb..c69010a8196 100644 --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -561,6 +561,31 @@ static bool LinkGlobals(Module *Dest, Module *Src, return false; } +// LinkAlias - Loop through the alias in the src module and link them into the +// dest module. +static bool LinkAlias(Module *Dest, const Module *Src, std::string *Err) { + // Loop over all alias in the src module + for (Module::const_alias_iterator I = Src->alias_begin(), + E = Src->alias_end(); I != E; ++I) { + const GlobalAlias *GA = I; + + GlobalValue *NewAliased = NULL; + const GlobalValue *Aliased = GA->getAliasedGlobal(); + if (isa<GlobalVariable>(*Aliased)) + NewAliased = Dest->getGlobalVariable(Aliased->getName()); + else if (isa<Function>(*Aliased)) + NewAliased = Dest->getFunction(Aliased->getName()); + // FIXME: we should handle the bitcast alias. + assert(NewAliased && "Can't find the aliased GV."); + + GlobalAlias *NewGA = new GlobalAlias(GA->getType()->getElementType(), + GA->getLinkage(), GA->getName(), + NewAliased, Dest); + CopyGVAttributes(NewGA, GA); + } + return false; +} + // LinkGlobalInits - Update the initializers in the Dest module now that all // globals that may be referenced are in Dest. @@ -1005,6 +1030,9 @@ Linker::LinkModules(Module *Dest, Module *Src, std::string *ErrorMsg) { // If there were any appending global variables, link them together now. if (LinkAppendingVars(Dest, AppendingVars, ErrorMsg)) return true; + // If there were any alias, link them now. + if (LinkAlias(Dest, Src, 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; |