summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Linker/LinkModules.cpp
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2008-03-05 15:27:21 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2008-03-05 15:27:21 +0000
commit2e13597f9dc2c1d75cfc105132edc9b3602eb2e4 (patch)
tree67273f9c017ecb14b36d73e5b8ad0eb925df20b8 /llvm/lib/Linker/LinkModules.cpp
parent12cee7195f6c68a89fe1df3cc84f1f4a4a325345 (diff)
downloadbcm5719-llvm-2e13597f9dc2c1d75cfc105132edc9b3602eb2e4.tar.gz
bcm5719-llvm-2e13597f9dc2c1d75cfc105132edc9b3602eb2e4.zip
Remember the source->dest mapping when copying aliases. This fixes PR2054
llvm-svn: 47945
Diffstat (limited to 'llvm/lib/Linker/LinkModules.cpp')
-rw-r--r--llvm/lib/Linker/LinkModules.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp
index 260bcb419fb..dd2b4f6ad41 100644
--- a/llvm/lib/Linker/LinkModules.cpp
+++ b/llvm/lib/Linker/LinkModules.cpp
@@ -567,7 +567,9 @@ static bool LinkGlobals(Module *Dest, Module *Src,
// 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) {
+static bool LinkAlias(Module *Dest, const Module *Src,
+ std::map<const Value*, Value*> &ValueMap,
+ std::string *Err) {
// FIXME: Desptie of the name, this function currently does not 'link' stuff,
// but only copies aliases from one Module to another.
@@ -588,6 +590,8 @@ static bool LinkAlias(Module *Dest, const Module *Src, std::string *Err) {
GlobalAlias *NewGA = new GlobalAlias(GA->getType(), GA->getLinkage(),
GA->getName(), NewAliasee, Dest);
CopyGVAttributes(NewGA, GA);
+
+ ValueMap.insert(std::make_pair(GA, NewGA));
}
return false;
}
@@ -1033,6 +1037,11 @@ Linker::LinkModules(Module *Dest, Module *Src, std::string *ErrorMsg) {
if (LinkFunctionProtos(Dest, Src, ValueMap, ErrorMsg))
return true;
+ // If there were any alias, link them now. We really need to do this now,
+ // because all of the aliases that may be referenced need to be available in
+ // ValueMap
+ if (LinkAlias(Dest, Src, ValueMap, ErrorMsg)) return true;
+
// Update the initializers in the Dest module now that all globals that may
// be referenced are in Dest.
if (LinkGlobalInits(Dest, Src, ValueMap, ErrorMsg)) return true;
@@ -1045,9 +1054,6 @@ 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;
OpenPOWER on IntegriCloud