Allow unnamed_addr on declarations.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123529 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp
index f0fb310..04e2e60 100644
--- a/lib/AsmParser/LLParser.cpp
+++ b/lib/AsmParser/LLParser.cpp
@@ -716,9 +716,6 @@
       return true;
   }
 
-  if (!Init && UnnamedAddr)
-    return Error(UnnamedAddrLoc, "only definitions can have unnamed_addr");
-
   if (Ty->isFunctionTy() || Ty->isLabelTy())
     return Error(TyLoc, "invalid type for global variable");
 
@@ -2687,9 +2684,6 @@
       ParseType(RetType, RetTypeLoc, true /*void allowed*/))
     return true;
 
-  if (!isDefine && UnnamedAddr)
-    return Error(UnnamedAddrLoc, "only definitions can have unnamed_addr");
-
   // Verify that the linkage is ok.
   switch ((GlobalValue::LinkageTypes)Linkage) {
   case GlobalValue::ExternalLinkage:
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp
index 4b4c72b..ec39c93 100644
--- a/lib/Linker/LinkModules.cpp
+++ b/lib/Linker/LinkModules.cpp
@@ -352,8 +352,6 @@
   unsigned Alignment = std::max(DestGV->getAlignment(), SrcGV->getAlignment());
   DestGV->copyAttributesFrom(SrcGV);
   DestGV->setAlignment(Alignment);
-  if (SrcGV->hasUnnamedAddr())
-    DestGV->setUnnamedAddr(true);
 }
 
 /// GetLinkageResult - This analyzes the two global values and determines what
@@ -521,6 +519,8 @@
       continue;
     }
 
+    bool HasUnnamedAddr = SGV->hasUnnamedAddr() && DGV->hasUnnamedAddr();
+
     // If the visibilities of the symbols disagree and the destination is a
     // prototype, take the visibility of its input.
     if (DGV->isDeclaration())
@@ -565,6 +565,9 @@
                            DGV->getName(), 0, false,
                            SGV->getType()->getAddressSpace());
 
+      // Set the unnamed_addr.
+      NewDGV->setUnnamedAddr(HasUnnamedAddr);
+
       // Propagate alignment, section, and visibility info.
       CopyGVAttributes(NewDGV, SGV);
       DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDGV,
@@ -609,8 +612,9 @@
                      "': symbol multiple defined");
     }
 
-    // Set calculated linkage
+    // Set calculated linkage and unnamed_addr
     DGV->setLinkage(NewLinkage);
+    DGV->setUnnamedAddr(HasUnnamedAddr);
 
     // Make sure to remember this mapping...
     ValueMap[SGV] = ConstantExpr::getBitCast(DGV, SGV->getType());
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index ee62a29..58ec6fe 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -469,8 +469,6 @@
     Assert1(GV.hasExternalLinkage() || GV.hasDLLImportLinkage() ||
             GV.hasExternalWeakLinkage(),
             "invalid linkage type for global declaration", &GV);
-    Assert1(!GV.hasUnnamedAddr(), "only definitions can have unnamed_addr",
-            &GV);
   }
 
   visitGlobalValue(GV);
@@ -727,7 +725,6 @@
     Assert1(F.hasExternalLinkage() || F.hasDLLImportLinkage() ||
             F.hasExternalWeakLinkage(),
             "invalid linkage type for function declaration", &F);
-    Assert1(!F.hasUnnamedAddr(), "only definitions can have unnamed_addr", &F);
   } else {
     // Verify that this function (which has a body) is not named "llvm.*".  It
     // is not legal to define intrinsics.