[llvm-commits] [llvm-gcc-4.2] r52973 - /llvm-gcc-4.2/trunk/gcc/objc/objc-act.c

Dale Johannesen dalej at apple.com
Tue Jul 1 11:12:59 PDT 2008


Author: johannes
Date: Tue Jul  1 13:12:59 2008
New Revision: 52973

URL: http://llvm.org/viewvc/llvm-project?rev=52973&view=rev
Log:
Maintain size and layout of structs built by
ObjC FE as non-fragile ivars are added.  Fixes
objc.dg/newproperty-retain-3.m
obj-c++.dg/newproperty-retain-3.mm


Modified:
    llvm-gcc-4.2/trunk/gcc/objc/objc-act.c

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=52973&r1=52972&r2=52973&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/objc/objc-act.c (original)
+++ llvm-gcc-4.2/trunk/gcc/objc/objc-act.c Tue Jul  1 13:12:59 2008
@@ -1000,6 +1000,46 @@
     = objc_ivar_context
     = start_class (CLASS_IMPLEMENTATION_TYPE, class, super_class, NULL_TREE);
   objc_public_flag = 0;
+#ifdef ENABLE_LLVM
+  if (flag_objc_abi == 2) 
+    {
+      tree record = CLASS_STATIC_TEMPLATE(implementation_template);
+      if (record) 
+        {
+          bool changed = false;
+          tree field;
+          for (field = TYPE_FIELDS(record); field; field = TREE_CHAIN (field))
+            {
+#ifdef OBJCPLUS
+              /* Skip C++ static members, and things that are not fields at all. */
+              if (TREE_CODE (field) != FIELD_DECL || TREE_STATIC (field))
+                continue;
+#endif
+              /* If we have an embedded base class, and its size doesn't match the
+                 size in the field node, that's because ivars were added to the base
+                 class after the field node was built.  We need to update the field
+                 node and re-layout the outer record. */
+              if (DECL_ARTIFICIAL (field) && !DECL_NAME (field)
+                  && TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE
+                  && DECL_SIZE (field) && TYPE_SIZE(TREE_TYPE(field))
+                  && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST
+                  && TREE_CODE (TYPE_SIZE (TREE_TYPE (field))) == INTEGER_CST
+                  && TREE_INT_CST_LOW (DECL_SIZE (field))
+                     != TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (field))))
+                {
+                  DECL_SIZE (field) = TYPE_SIZE (TREE_TYPE (field));
+                  DECL_SIZE_UNIT (field) = TYPE_SIZE_UNIT (TREE_TYPE (field));
+                  changed = true;
+                }
+            }
+          if (changed) 
+            {
+              TYPE_SIZE (record) = 0;
+              layout_type (record);
+            }
+        }
+    }
+#endif
 }
 
 void





More information about the llvm-commits mailing list