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'. llvm-svn: 74008
This commit is contained in:
@@ -406,11 +406,12 @@ void CodeGenModule::AddUsedGlobal(llvm::GlobalValue *GV) {
|
||||
|
||||
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 @@ void CodeGenModule::EmitLLVMUsed() {
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user