Objective-C IRGen. Patch to generate a weak symbol reference when

'super' dispatches a class method in category for OBJC_METACLASS.
This is when class is a weak_import class.
// rdar://16529125

llvm-svn: 210547
This commit is contained in:
Fariborz Jahanian 2014-06-10 17:08:04 +00:00
parent 063d4fba36
commit 0b3bc24e39
2 changed files with 19 additions and 4 deletions

View File

@ -1389,7 +1389,7 @@ private:
/// EmitMetaClassRef - Return a Value * of the address of _class_t
/// meta-data
llvm::Value *EmitMetaClassRef(CodeGenFunction &CGF,
const ObjCInterfaceDecl *ID);
const ObjCInterfaceDecl *ID, bool Weak);
/// ObjCIvarOffsetVariable - Returns the ivar offset variable for
/// the given ivar.
@ -6702,13 +6702,15 @@ CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF,
/// meta-data
///
llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF,
const ObjCInterfaceDecl *ID) {
const ObjCInterfaceDecl *ID,
bool Weak) {
llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()];
if (!Entry) {
std::string MetaClassName(getMetaclassSymbolPrefix() +
ID->getNameAsString());
llvm::GlobalVariable *MetaClassGV = GetClassGlobal(MetaClassName);
llvm::GlobalVariable *MetaClassGV =
GetClassGlobal(MetaClassName, Weak);
Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
false, llvm::GlobalValue::PrivateLinkage,
MetaClassGV,
@ -6766,7 +6768,8 @@ CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
// If this is a class message the metaclass is passed as the target.
llvm::Value *Target;
if (IsClassMessage)
Target = EmitMetaClassRef(CGF, Class);
Target = EmitMetaClassRef(CGF, Class,
(isCategoryImpl && Class->isWeakImported()));
else
Target = EmitSuperClassRef(CGF, Class);

View File

@ -3,6 +3,7 @@
@interface NSObject
- (void) finalize;
+ (void) class;
@end
__attribute__((availability(macosx,introduced=9876.5)))
@ -31,3 +32,14 @@ void kit()
// CHECK: @"OBJC_METACLASS_$_MyClass" = global %struct._class_t
// CHECK: @"OBJC_CLASS_$_NSObject" = external global %struct._class_t
// rdar://16529125
__attribute__((weak_import))
@interface NSURLQueryItem : NSObject
@end
@implementation NSURLQueryItem (hax)
+(void)classmethod { [super class]; }
@end
// CHECK: @"OBJC_METACLASS_$_NSURLQueryItem" = extern_weak global
// CHECK: @"OBJC_CLASS_$_NSURLQueryItem" = extern_weak global