From bc94c94be40d289948b4043fe4d973295061e484 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 15 Jul 2014 17:14:34 +0000 Subject: [PATCH] Objective-C IRGen. Fixes an inconsistant linkage of ObC's metaclass metadata with its class metadata which results in an assert. rdar://17633301 llvm-svn: 213076 --- clang/lib/CodeGen/CGObjCMac.cpp | 11 ++++------- clang/test/CodeGenObjC/weak-metaclass-visibility.m | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 45fb3b6..de760c8 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -5520,8 +5520,10 @@ void CGObjCNonFragileABIMac::FinishNonFragileABIModule() { assert(ID); if (ObjCImplementationDecl *IMP = ID->getImplementation()) // We are implementing a weak imported interface. Give it external linkage - if (ID->isWeakImported() && !IMP->isWeakImported()) + if (ID->isWeakImported() && !IMP->isWeakImported()) { DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); + DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); + } } AddModuleClassList(DefinedClasses, @@ -5821,11 +5823,6 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { ID->getClassInterface()->isWeakImported()); IsAGV = GetClassGlobal(ObjCMetaClassName + ClassName, ID->getClassInterface()->isWeakImported()); - - // We are implementing a weak imported interface. Give it external - // linkage. - if (!ID->isWeakImported() && ID->getClassInterface()->isWeakImported()) - IsAGV->setLinkage(llvm::GlobalVariable::ExternalLinkage); } else { // Has a root. Current class is not a root. const ObjCInterfaceDecl *Root = ID->getClassInterface(); @@ -5847,7 +5844,7 @@ void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { std::string TClassName = ObjCMetaClassName + ClassName; llvm::GlobalVariable *MetaTClass = BuildClassMetaData( TClassName, IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden, - ID->isWeakImported()); + ID->getClassInterface()->isWeakImported()); DefinedMetaClasses.push_back(MetaTClass); // Metadata for the class diff --git a/clang/test/CodeGenObjC/weak-metaclass-visibility.m b/clang/test/CodeGenObjC/weak-metaclass-visibility.m index 128f881..b20958a 100644 --- a/clang/test/CodeGenObjC/weak-metaclass-visibility.m +++ b/clang/test/CodeGenObjC/weak-metaclass-visibility.m @@ -1,4 +1,6 @@ // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple armv7-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple arm64-apple-ios -emit-llvm -o - %s | FileCheck %s // rdar://16206443 @interface NSObject @@ -43,3 +45,15 @@ __attribute__((weak_import)) // CHECK: @"OBJC_METACLASS_$_NSURLQueryItem" = extern_weak global // CHECK: @"OBJC_CLASS_$_NSURLQueryItem" = extern_weak global + +// rdar://17633301 +@interface AVScheduledAudioParameters @end // isWeakImported is true!! + +@interface XXXX : AVScheduledAudioParameters // is isWeakImported() true +@end + +@implementation AVScheduledAudioParameters @end +@implementation XXXX @end + +// CHECK: @"OBJC_CLASS_$_AVScheduledAudioParameters" = global %struct._class_t +// CHECK: @"OBJC_METACLASS_$_AVScheduledAudioParameters" = global %struct._class_t -- 2.7.4