From 31ed0fb804dd86fb15093e114701932119914400 Mon Sep 17 00:00:00 2001 From: Lauro Ramos Venancio Date: Thu, 28 Jun 2007 19:02:54 +0000 Subject: [PATCH] When linking two modules, we should copy the alias. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37776 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Linker/LinkModules.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 88bf62186fb..c69010a8196 100644 --- a/lib/Linker/LinkModules.cpp +++ b/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(*Aliased)) + NewAliased = Dest->getGlobalVariable(Aliased->getName()); + else if (isa(*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;