ObjectiveC IRGen. Replace _objc_empty_vtable pointer in Objective-C

class metadata for certain deployment targets. // rdar://14802916

llvm-svn: 193359
This commit is contained in:
Fariborz Jahanian 2013-10-24 17:40:28 +00:00
parent e568225fc3
commit 42d495539a
2 changed files with 28 additions and 8 deletions

View File

@ -5757,6 +5757,9 @@ llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassMetaData(
}; };
if (!Values[1]) if (!Values[1])
Values[1] = llvm::Constant::getNullValue(ObjCTypes.ClassnfABIPtrTy); Values[1] = llvm::Constant::getNullValue(ObjCTypes.ClassnfABIPtrTy);
if (!Values[3])
Values[3] = llvm::Constant::getNullValue(
llvm::PointerType::getUnqual(ObjCTypes.ImpnfABITy));
llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassnfABITy, llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassnfABITy,
Values); Values);
llvm::GlobalVariable *GV = GetClassGlobal(ClassName); llvm::GlobalVariable *GV = GetClassGlobal(ClassName);
@ -5800,14 +5803,21 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
llvm::GlobalValue::ExternalLinkage, llvm::GlobalValue::ExternalLinkage,
0, 0,
"_objc_empty_cache"); "_objc_empty_cache");
ObjCEmptyVtableVar = new llvm::GlobalVariable( // Make this entry NULL for any iOS device target, any iOS simulator target,
CGM.getModule(), // OS X with deployment target 10.9 or later.
ObjCTypes.ImpnfABITy, const llvm::Triple &Triple = CGM.getTarget().getTriple();
false, if (Triple.isiOS() || (Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 9)))
llvm::GlobalValue::ExternalLinkage, // This entry will be null.
0, ObjCEmptyVtableVar = 0;
"_objc_empty_vtable"); else
ObjCEmptyVtableVar = new llvm::GlobalVariable(
CGM.getModule(),
ObjCTypes.ImpnfABITy,
false,
llvm::GlobalValue::ExternalLinkage,
0,
"_objc_empty_vtable");
} }
assert(ID->getClassInterface() && assert(ID->getClassInterface() &&
"CGObjCNonFragileABIMac::GenerateClass - class is 0"); "CGObjCNonFragileABIMac::GenerateClass - class is 0");

View File

@ -0,0 +1,10 @@
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -emit-llvm -o - %s | FileCheck -check-prefix CHECK-OSX %s
// RUN: %clang_cc1 -triple thumbv7-apple-ios3.0.0 -emit-llvm -o - %s | FileCheck -check-prefix CHECK-IOS %s
// rdar://14802916
@interface I
@end
@implementation I @end
// CHECK-OSX: %struct._class_t* null, %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null
// CHECK-IOS: %struct._class_t* null, %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null