2011-06-05 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/gnu-api-2-objc.m: Fixed testcase. Use log2 of the
alignment, not the alignment, when calling class_addIvar(). Add
an 'isa' instance variable to the test root class.
* obj-c++.dg/gnu-api-2-objc.mm: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174656
138bc75d-0d04-0410-961f-
82ee72b054a4
+2011-06-05 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * objc.dg/gnu-api-2-objc.m: Fixed testcase. Use log2 of the
+ alignment, not the alignment, when calling class_addIvar(). Add
+ an 'isa' instance variable to the test root class.
+ * obj-c++.dg/gnu-api-2-objc.mm: Likewise.
+
2011-06-04 Jan Hubicka <jh@suse.cz>
PR tree-optimization/48893
- (id) variable { return variable_ivar; }
@end
+/* Hack to calculate the log2 of a byte alignment. */
+unsigned char
+log_2_of (unsigned int x)
+{
+ unsigned char result = 0;
+
+ /* We count how many times we need to divide by 2 before we reach 1.
+ This algorithm is good enough for the small numbers (such as 8,
+ 16 or 64) that we have to deal with. */
+ while (x > 1)
+ {
+ x = x / 2;
+ result++;
+ }
+
+ return result;
+}
int main ()
{
Class new_class = objc_allocateClassPair (objc_getClass ("MyRootClass"), "MyNewSubClass", 0);
/* A new root class would obviously need at least an 'isa'
- instance variable. We don't add it so we never actually
- instantiate an instance of the class, which wouldn't work. */
+ instance variable. */
+ class_addIvar (new_root_class, "isa", sizeof (Class), log_2_of (__alignof__ (Class)),
+ @encode (Class));
objc_registerClassPair (new_root_class);
objc_registerClassPair (new_class);
/* Add a bit of everything to the class to exercise undoing all these changes. */
/* Instance variable. */
- class_addIvar (new_class, "my_variable", sizeof (float), __alignof__ (float), @encode (float));
+ class_addIvar (new_class, "my_variable", sizeof (float), log_2_of (__alignof__ (float)), @encode (float));
/* Instance method. */
class_addMethod (new_class, @selector (setVariable:), method_getImplementation (method),
- (id) variable { return variable_ivar; }
@end
+/* Hack to calculate the log2 of a byte alignment. */
+unsigned char
+log_2_of (unsigned int x)
+{
+ unsigned char result = 0;
+
+ /* We count how many times we need to divide by 2 before we reach 1.
+ This algorithm is good enough for the small numbers (such as 8,
+ 16 or 64) that we have to deal with. */
+ while (x > 1)
+ {
+ x = x / 2;
+ result++;
+ }
+
+ return result;
+}
int main(int argc, void **args)
{
Class new_class = objc_allocateClassPair (objc_getClass ("MyRootClass"), "MyNewSubClass", 0);
/* A new root class would obviously need at least an 'isa'
- instance variable. We don't add it so we never actually
- instantiate an instance of the class, which wouldn't work. */
+ instance variable. */
+ class_addIvar (new_root_class, "isa", sizeof (Class), log_2_of (__alignof__ (Class)),
+ @encode (Class));
objc_registerClassPair (new_root_class);
objc_registerClassPair (new_class);
/* Add a bit of everything to the class to exercise undoing all these changes. */
/* Instance variable. */
- class_addIvar (new_class, "my_variable", sizeof (float), __alignof__ (float), @encode (float));
+ class_addIvar (new_class, "my_variable", sizeof (float), log_2_of (__alignof__ (float)), @encode (float));
/* Instance method. */
class_addMethod (new_class, @selector (setVariable:), method_getImplementation (method),