Patch fixes an obscure bug when 'used' attribute is applied to
variables in ObjC's Next runtime mode. Next runtime also implicitly applies
'used' attribute on some of its meta-data. This results in two 
'llvm.used' arrays to be generated, and one of them is renamed to
'llvm.used1'.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74008 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index f926c05..0a531e9 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -406,11 +406,12 @@
 
 void CodeGenModule::EmitLLVMUsed() {
   // Don't create llvm.used if there is no need.
-  if (LLVMUsed.empty())
+  // FIXME. Runtime indicates that there might be more 'used' symbols; but not
+  // necessariy. So, this test is not accurate for emptiness.
+  if (LLVMUsed.empty() && !Runtime)
     return;
 
   llvm::Type *i8PTy = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
-  llvm::ArrayType *ATy = llvm::ArrayType::get(i8PTy, LLVMUsed.size());
   
   // Convert LLVMUsed to what ConstantArray needs.
   std::vector<llvm::Constant*> UsedArray;
@@ -420,6 +421,12 @@
      llvm::ConstantExpr::getBitCast(cast<llvm::Constant>(&*LLVMUsed[i]), i8PTy);
   }
   
+  if (Runtime)
+    Runtime->MergeMetadataGlobals(UsedArray);
+  if (UsedArray.empty())
+    return;
+  llvm::ArrayType *ATy = llvm::ArrayType::get(i8PTy, UsedArray.size());
+  
   llvm::GlobalVariable *GV = 
     new llvm::GlobalVariable(ATy, false, 
                              llvm::GlobalValue::AppendingLinkage,