[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