OSDN Git Service

In gcc/testsuite/:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Jun 2011 11:10:31 +0000 (11:10 +0000)
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Jun 2011 11:10:31 +0000 (11:10 +0000)
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

gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/gnu-api-2-objc.mm
gcc/testsuite/objc.dg/gnu-api-2-objc.m

index c4080ff..7194f87 100644 (file)
@@ -1,3 +1,10 @@
+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
index 90da96a..ce70c5e 100644 (file)
 - (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 ()
 {
@@ -56,8 +73,9 @@ 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);
@@ -114,7 +132,7 @@ int main ()
     /* 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),
index 59344ef..d1177d7 100644 (file)
 - (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)
 {
@@ -56,8 +73,9 @@ 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);
@@ -114,7 +132,7 @@ int main(int argc, void **args)
     /* 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),