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

Fariborz Jahanian fjahanian at apple.com
Tue Jun 10 10:08:04 PDT 2014


Author: fjahanian
Date: Tue Jun 10 12:08:04 2014
New Revision: 210547

URL: http://llvm.org/viewvc/llvm-project?rev=210547&view=rev
Log:
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

Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
    cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=210547&r1=210546&r2=210547&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Jun 10 12:08:04 2014
@@ -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::EmitSuperClassRe
 /// 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::GenerateMessageS
   // 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);
 

Modified: cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m?rev=210547&r1=210546&r2=210547&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m (original)
+++ cfe/trunk/test/CodeGenObjC/weak-metaclass-visibility.m Tue Jun 10 12:08:04 2014
@@ -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))
+ at interface NSURLQueryItem : NSObject
+ at end
+
+ at implementation NSURLQueryItem (hax)
++(void)classmethod { [super class]; }
+ at end
+
+// CHECK: @"OBJC_METACLASS_$_NSURLQueryItem" = extern_weak global
+// CHECK: @"OBJC_CLASS_$_NSURLQueryItem" = extern_weak global





More information about the cfe-commits mailing list