[llvm-commits] [llvm-gcc-4.2] r101523 - in /llvm-gcc-4.2/trunk/gcc: config/darwin.c config/darwin.h objc/objc-act.c testsuite/objc.dg/weak_import_class.m

Stuart Hastings stuart at apple.com
Fri Apr 16 12:04:56 PDT 2010


Author: stuart
Date: Fri Apr 16 14:04:55 2010
New Revision: 101523

URL: http://llvm.org/viewvc/llvm-project?rev=101523&view=rev
Log:
Support weak_import for Objective-C classes.  Radar 7865106.  Patch by Fariborz Jahanian\!

Added:
    llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m
Modified:
    llvm-gcc-4.2/trunk/gcc/config/darwin.c
    llvm-gcc-4.2/trunk/gcc/config/darwin.h
    llvm-gcc-4.2/trunk/gcc/objc/objc-act.c

Modified: llvm-gcc-4.2/trunk/gcc/config/darwin.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/darwin.c?rev=101523&r1=101522&r2=101523&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/darwin.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/darwin.c Fri Apr 16 14:04:55 2010
@@ -2839,5 +2839,20 @@
   
   return 1;
 }
+
 /* LLVM LOCAL end radar 6230142 */
+/* APPLE LOCAL begin radar 7865106 */
+int objc_weak_import_class(tree decl)
+{
+  if (flag_objc_abi == 2 &&
+      TREE_CODE(decl) == VAR_DECL && 
+      lookup_attribute ("weak_import", DECL_ATTRIBUTES (decl)))
+    {
+      const char* name = IDENTIFIER_POINTER (DECL_NAME(decl)); 
+      return (!strncmp (name, "OBJC_CLASS_$_", 13)
+              || !strncmp (name, "OBJC_METACLASS_$_", 17));
+    }
+  return 0;
+}
+/* APPLE LOCAL end radar 7865106 */
 #include "gt-darwin.h"

Modified: llvm-gcc-4.2/trunk/gcc/config/darwin.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/darwin.h?rev=101523&r1=101522&r2=101523&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/darwin.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/darwin.h Fri Apr 16 14:04:55 2010
@@ -43,6 +43,8 @@
 /* APPLE LOCAL begin dynamic-no-pic */
 extern int machopic_symbol_defined_p (rtx);
 /* APPLE LOCAL end dynamic-no-pic */
+/* APPLE LOCAL radar 7865106 */
+extern int objc_weak_import_class(tree);
 
 /* APPLE LOCAL begin axe stubs 5571540 */
 extern int darwin_stubs;
@@ -661,7 +663,8 @@
  									\
     if (! DECL_EXTERNAL (DECL) && TREE_PUBLIC (DECL))			\
       targetm.asm_out.globalize_label (FILE, NAME);			\
-    if (DECL_EXTERNAL (DECL))						\
+    /* APPLE LOCAL radar 7865106 */					\
+    if (DECL_EXTERNAL (DECL) || objc_weak_import_class(DECL))		\
       fputs ("\t.weak_reference ", FILE);				\
     else if (! lookup_attribute ("weak", DECL_ATTRIBUTES (DECL))	\
 	&& lookup_attribute ("weak_import", DECL_ATTRIBUTES (DECL)))	\

Modified: llvm-gcc-4.2/trunk/gcc/objc/objc-act.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/objc/objc-act.c?rev=101523&r1=101522&r2=101523&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/objc/objc-act.c (original)
+++ llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Fri Apr 16 14:04:55 2010
@@ -11001,11 +11001,28 @@
   return NULL;
 }
 
+/* APPLE LOCAL begin radar 7865106 */
+static bool objc_class_weak_import(tree class)
+{
+  tree chain;
+  if (class && TREE_CODE (class) == CLASS_IMPLEMENTATION_TYPE)
+    return false;
+  gcc_assert (class && TREE_CODE (class) == CLASS_INTERFACE_TYPE);
+  for (chain = CLASS_ATTRIBUTES (class); chain; chain = TREE_CHAIN (chain))
+    if (is_attribute_p ("weak_import", TREE_PURPOSE (chain)))
+      return true;
+  return false;
+}
+/* APPLE LOCAL end radar 7865106 */
+
 /* Create a symbol whose visibility attribute matches that of 
    the given class. */
 
 static tree
-objc_create_global_decl_for_class (tree type, const char *name, tree class)
+/* APPLE LOCAL begin radar 7865106 */
+objc_create_global_decl_for_class (tree type, const char *name, tree class,
+				   int classSymbol)
+/* APPLE LOCAL end radar 7865106 */
 {
   tree decl = create_global_decl (type, name);
   const char *visibility = objc_class_visibility (class);
@@ -11021,6 +11038,12 @@
       DECL_VISIBILITY_SPECIFIED (decl) = 1;
     }
 
+  /* APPLE LOCAL begin radar 7865106 */
+  if (classSymbol && objc_class_weak_import(class)) {
+    tree attribute = build_tree_list (get_identifier ("weak_import"), NULL_TREE);
+    decl_attributes (&decl, attribute, 0);
+  }
+  /* APPLE LOCAL end radar 7865106 */
   return decl;
 }
 /* APPLE LOCAL end radar 4705298 , 4843145*/
@@ -11073,7 +11096,8 @@
   /* APPLE LOCAL begin radar 4705298, 4843145 */
   decl = global_var ? 
          objc_create_global_decl_for_class (
-	   TREE_TYPE (size_zero_node), buf, implementation_template) : 
+           /* APPLE LOCAL radar 7865106 */
+	   TREE_TYPE (size_zero_node), buf, implementation_template, 0) : 
 	 create_hidden_decl (TREE_TYPE (size_zero_node), buf);
   /* APPLE LOCAL end radar 4705298 , 4843145*/
   /* APPLE LOCAL end radar 4441049 */
@@ -12753,11 +12777,13 @@
   class_decl = objc_create_global_decl_for_class (
 		 objc_v2_class_template, 
 		 IDENTIFIER_POINTER (DECL_NAME (UOBJC_V2_CLASS_decl)), 
-		 implementation_template);
+                 /* APPLE LOCAL radar 7865106 */
+		 implementation_template, 1);
   metaclass_decl = objc_create_global_decl_for_class (
 		     objc_v2_class_template, 
 		     IDENTIFIER_POINTER (DECL_NAME (UOBJC_V2_METACLASS_decl)), 
-		     implementation_template);
+                     /* APPLE LOCAL radar 7865106 */
+		     implementation_template, 1);
 
   if (DECL_VISIBILITY (class_decl) == VISIBILITY_HIDDEN)
     flags |= OBJC2_CLS_HIDDEN; 
@@ -15175,6 +15201,10 @@
       else if (is_attribute_p ("objc_exception", TREE_PURPOSE (chain)))
         ;
       /* APPLE LOCAL end radar 5008110 */
+      /* APPLE LOCAL begin radar 7865106 */
+      else if (is_attribute_p ("weak_import", TREE_PURPOSE (chain)))
+        ;
+      /* APPLE LOCAL end radar 7865106 */
       else if (!use)
 	warning (0, "attribute %s is unknown - ignored",
 		  IDENTIFIER_POINTER (TREE_PURPOSE (chain)));

Added: llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m?rev=101523&view=auto
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/objc.dg/weak_import_class.m Fri Apr 16 14:04:55 2010
@@ -0,0 +1,27 @@
+/* APPLE LOCAL file radar 7865106 */
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-mmacosx-version-min=10.6 -fobjc-abi-version=2" { target i?86*-*-darwin* } } */
+
+__attribute__((weak_import)) @interface WeakRootClass @end
+ at implementation WeakRootClass @end
+
+
+__attribute__((weak_import)) @interface WeakClass : WeakRootClass @end
+ at implementation WeakClass @end
+
+ at interface MySubclass : WeakClass @end
+ at implementation MySubclass @end
+
+__attribute__((weak_import)) @interface CategoryNotWeak @end
+ at implementation CategoryNotWeak(MyCategory) @end
+ at implementation CategoryNotWeak(YourCategory) @end
+
+ at interface Super : WeakRootClass @end
+ at implementation Super @end
+
+ at interface Sub : Super @end
+ at implementation Sub @end
+/* { dg-final { scan-assembler ".weak_reference _OBJC_METACLASS_\\\$_WeakClass" } } */
+/* { dg-final { scan-assembler ".weak_reference _OBJC_CLASS_\\\$_WeakClass" } } */
+/* { dg-final { scan-assembler ".weak_reference _OBJC_METACLASS_\\\$_WeakRootClass" } } */
+/* { dg-final { scan-assembler ".weak_reference _OBJC_CLASS_\\\$_WeakRootClass" } } */





More information about the llvm-commits mailing list