Objective-C IRGen. Fixes an inconsistant linkage of
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 15 Jul 2014 17:14:34 +0000 (17:14 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 15 Jul 2014 17:14:34 +0000 (17:14 +0000)
ObC's metaclass metadata with its class metadata which
results in an assert. rdar://17633301

llvm-svn: 213076

clang/lib/CodeGen/CGObjCMac.cpp
clang/test/CodeGenObjC/weak-metaclass-visibility.m

index 45fb3b6..de760c8 100644 (file)
@@ -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
index 128f881..b20958a 100644 (file)
@@ -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