coarray_43.f90: Add "-latomic" option if libatomic_available.
[gcc.git] / libobjc / ivars.c
index 8d5f4abdd393bb2f4436b00df46a10594df08afe..6a41087ba5e0325ac09a10c2fc3132c73a2c5c2c 100644 (file)
@@ -1,5 +1,5 @@
 /* GNU Objective C Runtime ivar related functions.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010-2017 Free Software Foundation, Inc.
    Contributed by Nicola Pero
 
 This file is part of GCC.
@@ -27,7 +27,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "objc-private/module-abi-8.h" /* For runtime structures  */
 #include "objc/thr.h"
 #include "objc-private/runtime.h"      /* the kitchen sink */
-#include <string.h>                    /* For strcmp */
+#include <string.h>                    /* For strcmp.  */
+#include <stdlib.h>                    /* For malloc.  */
 
 struct objc_ivar *
 class_getInstanceVariable (Class class_, const char *name)
@@ -46,9 +47,7 @@ class_getInstanceVariable (Class class_, const char *name)
                  struct objc_ivar *ivar = &(ivars->ivar_list[i]);
                  
                  if (!strcmp (ivar->ivar_name, name))
-                   {
-                     return ivar;
-                   }
+                   return ivar;
                }
            }
          class_ = class_getSuperclass (class_);
@@ -82,10 +81,8 @@ object_getIndexedIvars (id object)
   if (object == nil)
     return NULL;
   else
-    {
-      return (void *)(((char *)object) 
-                     + object->class_pointer->instance_size);
-    }
+    return (void *)(((char *)object) 
+                   + object->class_pointer->instance_size);
 }
 
 struct objc_ivar *
@@ -182,7 +179,7 @@ struct objc_ivar ** class_copyIvarList (Class class_, unsigned int *numberOfRetu
   struct objc_ivar **returnValue = NULL;
   struct objc_ivar_list* ivar_list;
 
-  if (class_ == Nil  ||  CLS_IS_IN_CONSTRUCTION (class_))
+  if (class_ == Nil  ||  CLS_IS_IN_CONSTRUCTION (class_) || !class_->ivars)
     {
       if (numberOfReturnedIvars)
        *numberOfReturnedIvars = 0;
@@ -202,9 +199,7 @@ struct objc_ivar ** class_copyIvarList (Class class_, unsigned int *numberOfRetu
       
       /* Copy the ivars.  */
       for (i = 0; i < count; i++)
-       {
-         returnValue[i] = &(ivar_list->ivar_list[i]);
-       }
+       returnValue[i] = &(ivar_list->ivar_list[i]);
       
       returnValue[i] = NULL;
     }
@@ -217,7 +212,7 @@ struct objc_ivar ** class_copyIvarList (Class class_, unsigned int *numberOfRetu
 
 BOOL
 class_addIvar (Class class_, const char * ivar_name, size_t size,
-              unsigned char alignment, const char *type)
+              unsigned char log_2_of_alignment, const char *type)
 {
   struct objc_ivar_list *ivars;
 
@@ -242,9 +237,7 @@ class_addIvar (Class class_, const char * ivar_name, size_t size,
          struct objc_ivar *ivar = &(ivars->ivar_list[i]);
          
          if (strcmp (ivar->ivar_name, ivar_name) == 0)
-           {
-             return NO;
-           }
+           return NO;
        }
     }
 
@@ -277,6 +270,7 @@ class_addIvar (Class class_, const char * ivar_name, size_t size,
      size. */
   {
     struct objc_ivar *ivar = &(ivars->ivar_list[ivars->ivar_count - 1]);
+    unsigned int alignment = 1 << log_2_of_alignment;
     int misalignment;
     
     ivar->ivar_name = objc_malloc (strlen (ivar_name) + 1);
@@ -295,7 +289,7 @@ class_addIvar (Class class_, const char * ivar_name, size_t size,
     else
       ivar->ivar_offset = class_->instance_size - misalignment + alignment;
     
-    class_->instance_size = ivar->ivar_offset + objc_sizeof_type (ivar->ivar_type);
+    class_->instance_size = ivar->ivar_offset + size;
   }
   
   return YES;