Fix incorrect linker behaviour: we shouldn't resolve weak aliases.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55997 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp
index 3b319c2..f4ebe6b 100644
--- a/lib/Linker/LinkModules.cpp
+++ b/lib/Linker/LinkModules.cpp
@@ -1169,8 +1169,8 @@
 static bool ResolveAliases(Module *Dest) {
   for (Module::alias_iterator I = Dest->alias_begin(), E = Dest->alias_end();
        I != E; ++I)
-    if (const GlobalValue *GV = I->resolveAliasedGlobal())
-      if (!GV->isDeclaration())
+    if (const GlobalValue *GV = I->resolveAliasedGlobal(/*traverseWeak*/ false))
+      if (GV != I && !GV->isDeclaration())
         I->replaceAllUsesWith(const_cast<GlobalValue*>(GV));
 
   return false;
diff --git a/lib/VMCore/Globals.cpp b/lib/VMCore/Globals.cpp
index 7340f15..e55cb5a 100644
--- a/lib/VMCore/Globals.cpp
+++ b/lib/VMCore/Globals.cpp
@@ -248,13 +248,21 @@
   return 0;
 }
 
-const GlobalValue *GlobalAlias::resolveAliasedGlobal() const {
+const GlobalValue *GlobalAlias::resolveAliasedGlobal(bool traverseWeak) const {
   SmallPtrSet<const GlobalValue*, 3> Visited;
 
+  // Check if we need to stop early.
+  if (!traverseWeak && hasWeakLinkage())
+    return this;
+
   const GlobalValue *GV = getAliasedGlobal();
   Visited.insert(GV);
 
+  // Iterate over aliasing chain, stopping on weak alias if necessary.
   while (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV)) {
+    if (traverseWeak && GA->hasWeakLinkage())
+      break;
+
     GV = GA->getAliasedGlobal();
 
     if (!Visited.insert(GV))