Home | History | Annotate | Line # | Download | only in libobjc
      1 /* GNU Objective C Runtime initialization
      2    Copyright (C) 1993-2024 Free Software Foundation, Inc.
      3    Contributed by Kresten Krab Thorup
      4    +load support contributed by Ovidiu Predescu <ovidiu (at) net-community.com>
      5 
      6 This file is part of GCC.
      7 
      8 GCC is free software; you can redistribute it and/or modify it under the
      9 terms of the GNU General Public License as published by the Free Software
     10 Foundation; either version 3, or (at your option) any later version.
     11 
     12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
     14 FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
     15 details.
     16 
     17 Under Section 7 of GPL version 3, you are granted additional
     18 permissions described in the GCC Runtime Library Exception, version
     19 3.1, as published by the Free Software Foundation.
     20 
     21 You should have received a copy of the GNU General Public License and
     22 a copy of the GCC Runtime Library Exception along with this program;
     23 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24 <http://www.gnu.org/licenses/>.  */
     25 
     26 /* Uncommented the following line to enable debug logging.  Use this
     27    only while debugging the runtime.  */
     28 /* #define DEBUG 1 */
     29 
     30 #include "objc-private/common.h"
     31 #include "objc-private/error.h"
     32 #include "objc/runtime.h"
     33 #include "objc/thr.h"
     34 #include "objc-private/hash.h"
     35 #include "objc-private/objc-list.h"
     36 #include "objc-private/module-abi-8.h"
     37 #include "objc-private/runtime.h"   /* For __objc_resolve_class_links().  */
     38 #include "objc-private/selector.h"  /* For __sel_register_typed_name().  */
     39 #include "objc-private/objc-sync.h" /* For __objc_sync_init() */
     40 #include "objc-private/protocols.h" /* For __objc_protocols_init(),
     41 				       __objc_protocols_add_protocol()
     42 				       __objc_protocols_register_selectors() */
     43 #include "objc-private/accessors.h" /* For __objc_accessors_init() */
     44 
     45 /* The version number of this runtime.  This must match the number
     46    defined in gcc (objc-act.c).  */
     47 #define OBJC_VERSION 8
     48 #define PROTOCOL_VERSION 2
     49 
     50 /* This list contains modules currently loaded into the runtime and
     51    for which the +load method (and the load callback, if any) has not
     52    been called yet.  */
     53 static struct objc_list *__objc_module_list = 0; 	/* !T:MUTEX */
     54 
     55 /* This list contains all proto_list's not yet assigned class
     56    links.  */
     57 static struct objc_list *unclaimed_proto_list = 0; 	/* !T:MUTEX */
     58 
     59 /* List of unresolved static instances.  */
     60 static struct objc_list *uninitialized_statics = 0; 	/* !T:MUTEX */
     61 
     62 /* List of duplicated classes found while loading modules.  If we find
     63    a class twice, we ignore it the second time.  On some platforms,
     64    where the order in which modules are loaded is well defined, this
     65    allows you to replace a class in a shared library by linking in a
     66    new implementation which is loaded in the right order, and which
     67    overrides the existing one.
     68 
     69    Protected by __objc_runtime_mutex.  */
     70 static cache_ptr duplicate_classes = NULL;
     71 
     72 /* Global runtime "write" mutex.  Having a single mutex prevents
     73    deadlocks, but reduces concurrency.  To improve concurrency, some
     74    groups of functions in the runtime have their own separate mutex
     75    (eg, __class_table_lock in class.c); to avoid deadlocks, these
     76    routines must make sure that they never acquire any other lock
     77    while holding their own local lock.  Ie, they should lock, execute
     78    some C code that does not perform any calls to other runtime
     79    functions which may potentially lock different locks, then unlock.
     80    If they need to perform any calls to other runtime functions that
     81    may potentially lock other locks, then they should use the global
     82    __objc_runtime_mutex.  */
     83 objc_mutex_t __objc_runtime_mutex = 0;
     84 
     85 /* Number of threads that are alive.  */
     86 int __objc_runtime_threads_alive = 1;			/* !T:MUTEX */
     87 
     88 /* Check compiler vs runtime version.  */
     89 static void init_check_module_version (struct objc_module *);
     90 
     91 /* Assign isa links to protos.  */
     92 static void __objc_init_protocols (struct objc_protocol_list *protos);
     93 
     94 /* Assign isa link to a protocol, and register it.  */
     95 static void __objc_init_protocol (struct objc_protocol *protocol);
     96 
     97 /* Add protocol to class.  */
     98 static void __objc_class_add_protocols (Class, struct objc_protocol_list *);
     99 
    100 /* Load callback hook.  */
    101 void (*_objc_load_callback) (Class class, struct objc_category *category) = 0; /* !T:SAFE */
    102 
    103 /* Are all categories/classes resolved ?  */
    104 BOOL __objc_dangling_categories = NO;           /* !T:UNUSED */
    105 
    106 /* Sends +load to all classes and categories in certain
    107    situations.  */
    108 static void objc_send_load (void);
    109 
    110 /* Inserts all the classes defined in module in a tree of classes that
    111    resembles the class hierarchy.  This tree is traversed in preorder
    112    and the classes in its nodes receive the +load message if these
    113    methods were not executed before.  The algorithm ensures that when
    114    the +load method of a class is executed all the superclasses have
    115    been already received the +load message.  */
    116 static void __objc_create_classes_tree (struct objc_module *module);
    117 
    118 /* Calls the _objc_load_callback for each class and category in the
    119    module (if _objc_load_callback is not NULL).  */
    120 static void __objc_call_load_callback (struct objc_module *module);
    121 
    122 /* A special version that works only before the classes are completely
    123    installed in the runtime.  */
    124 static BOOL class_is_subclass_of_class (Class class, Class superclass);
    125 
    126 /* This is a node in the class tree hierarchy used to send +load
    127    messages.  */
    128 typedef struct objc_class_tree
    129 {
    130   /* The class corresponding to the node.  */
    131   Class class;
    132 
    133   /* This is a linked list of all the direct subclasses of this class.
    134      'head' points to a subclass node; 'tail' points to the next
    135      objc_list node (whose 'head' points to another subclass node,
    136      etc).  */
    137   struct objc_list *subclasses;
    138 } objc_class_tree;
    139 
    140 /* This is a linked list of objc_class_tree trees.  The head of these
    141    trees are root classes (their super class is Nil).  These different
    142    trees represent different class hierarchies.  */
    143 static struct objc_list *__objc_class_tree_list = NULL;
    144 
    145 /* Keeps the +load methods who have been already executed. This hash
    146    should not be destroyed during the execution of the program.  */
    147 static cache_ptr __objc_load_methods = NULL;
    148 
    149 /* This function is used when building the class tree used to send
    150    ordinately the +load message to all classes needing it.  The tree
    151    is really needed so that superclasses will get the message before
    152    subclasses.
    153 
    154    This tree may contain classes which are being loaded (or have just
    155    being loaded), and whose super_class pointers have not yet been
    156    resolved.  This implies that their super_class pointers point to a
    157    string with the name of the superclass; when the first message is
    158    sent to the class (/an object of that class) the class links will
    159    be resolved, which will replace the super_class pointers with
    160    pointers to the actual superclasses.
    161 
    162    Unfortunately, the tree might also contain classes which had been
    163    loaded previously, and whose class links have already been
    164    resolved.
    165 
    166    This function returns the superclass of a class in both cases, and
    167    can be used to build the determine the class relationships while
    168    building the tree.  */
    169 static Class  class_superclass_of_class (Class class)
    170 {
    171   char *super_class_name;
    172 
    173   /* If the class links have been resolved, use the resolved
    174      links.  */
    175   if (CLS_ISRESOLV (class))
    176     return class->super_class;
    177 
    178   /* Else, 'class' has not yet been resolved.  This means that its
    179      super_class pointer is really the name of the super class (rather
    180      than a pointer to the actual superclass).  */
    181   super_class_name = (char *)class->super_class;
    182 
    183   /* Return Nil for a root class.  */
    184   if (super_class_name == NULL)
    185     return Nil;
    186 
    187   /* Lookup the superclass of non-root classes.  */
    188   return objc_getClass (super_class_name);
    189 }
    190 
    191 
    192 /* Creates a tree of classes whose topmost class is directly inherited
    193    from `upper' and the bottom class in this tree is `bottom_class'.
    194    If `upper' is Nil, creates a class hierarchy up to a root class.
    195    The classes in this tree are super classes of `bottom_class'.  The
    196    `subclasses' member of each tree node point to the list of
    197    subclasses for the node.  */
    198 static objc_class_tree *
    199 create_tree_of_subclasses_inherited_from (Class bottom_class, Class upper)
    200 {
    201   Class superclass;
    202   objc_class_tree *tree, *prev;
    203 
    204   DEBUG_PRINTF ("create_tree_of_subclasses_inherited_from:");
    205   DEBUG_PRINTF (" bottom_class = %s, upper = %s\n",
    206 		(bottom_class ? bottom_class->name : NULL),
    207 		(upper ? upper->name : NULL));
    208 
    209   superclass = class_superclass_of_class (bottom_class);
    210 
    211   prev = objc_calloc (1, sizeof (objc_class_tree));
    212   prev->class = bottom_class;
    213 
    214   if (superclass == upper)
    215     return prev;
    216 
    217   while (superclass != upper)
    218     {
    219       tree = objc_calloc (1, sizeof (objc_class_tree));
    220       tree->class = superclass;
    221       tree->subclasses = list_cons (prev, tree->subclasses);
    222       superclass = class_superclass_of_class (superclass);
    223       prev = tree;
    224     }
    225 
    226   return tree;
    227 }
    228 
    229 /* Insert the `class' into the proper place in the `tree' class
    230    hierarchy.  This function returns a new tree if the class has been
    231    successfully inserted into the tree or NULL if the class is not
    232    part of the classes hierarchy described by `tree'.  This function
    233    is private to objc_tree_insert_class (), you should not call it
    234    directly.  */
    235 static objc_class_tree *
    236 __objc_tree_insert_class (objc_class_tree *tree, Class class)
    237 {
    238   DEBUG_PRINTF ("__objc_tree_insert_class: tree = %p (root: %s), class = %s\n",
    239 		tree, ((tree && tree->class) ? tree->class->name : "Nil"), class->name);
    240 
    241   if (tree == NULL)
    242     return create_tree_of_subclasses_inherited_from (class, NULL);
    243   else if (class == tree->class)
    244     {
    245       /* `class' has been already inserted.  */
    246       DEBUG_PRINTF (" 1. class %s was previously inserted\n", class->name);
    247       return tree;
    248     }
    249   else if (class_superclass_of_class (class) == tree->class)
    250     {
    251       /* If class is a direct subclass of tree->class then add class
    252 	 to the list of subclasses. First check to see if it wasn't
    253 	 already inserted.  */
    254       struct objc_list *list = tree->subclasses;
    255       objc_class_tree *node;
    256 
    257       while (list)
    258 	{
    259 	  /* Class has been already inserted; do nothing just return
    260 	     the tree.  */
    261 	  if (((objc_class_tree *) list->head)->class == class)
    262 	    {
    263 	      DEBUG_PRINTF (" 2. class %s was previously inserted\n",
    264 			    class->name);
    265 	      return tree;
    266 	    }
    267 	  list = list->tail;
    268 	}
    269 
    270       /* Create a new node class and insert it into the list of
    271 	 subclasses.  */
    272       node = objc_calloc (1, sizeof (objc_class_tree));
    273       node->class = class;
    274       tree->subclasses = list_cons (node, tree->subclasses);
    275       DEBUG_PRINTF (" 3. class %s inserted\n", class->name);
    276       return tree;
    277     }
    278   else
    279     {
    280       /* The class is not a direct subclass of tree->class.  Search
    281          for class's superclasses in the list of subclasses.  */
    282       struct objc_list *subclasses = tree->subclasses;
    283 
    284       /* Precondition: the class must be a subclass of tree->class;
    285          otherwise return NULL to indicate our caller that it must
    286          take the next tree.  */
    287       if (! class_is_subclass_of_class (class, tree->class))
    288 	return NULL;
    289 
    290       for (; subclasses != NULL; subclasses = subclasses->tail)
    291 	{
    292 	  Class aClass = ((objc_class_tree *) (subclasses->head))->class;
    293 
    294 	  if (class_is_subclass_of_class (class, aClass))
    295 	    {
    296 	      /* If we found one of class's superclasses we insert the
    297 	         class into its subtree and return the original tree
    298 	         since nothing has been changed.  */
    299 	      subclasses->head
    300 		  = __objc_tree_insert_class (subclasses->head, class);
    301  	      DEBUG_PRINTF (" 4. class %s inserted\n", class->name);
    302 	      return tree;
    303 	    }
    304 	}
    305 
    306       /* We haven't found a subclass of `class' in the `subclasses'
    307          list.  Create a new tree of classes whose topmost class is a
    308          direct subclass of tree->class.  */
    309       {
    310 	objc_class_tree *new_tree
    311 	  = create_tree_of_subclasses_inherited_from (class, tree->class);
    312 	tree->subclasses = list_cons (new_tree, tree->subclasses);
    313  	DEBUG_PRINTF (" 5. class %s inserted\n", class->name);
    314 	return tree;
    315       }
    316     }
    317 }
    318 
    319 /* This function inserts `class' in the right tree hierarchy classes.  */
    320 static void
    321 objc_tree_insert_class (Class class)
    322 {
    323   struct objc_list *list_node;
    324   objc_class_tree *tree;
    325 
    326   list_node = __objc_class_tree_list;
    327   while (list_node)
    328     {
    329       /* Try to insert the class in this class hierarchy.  */
    330       tree = __objc_tree_insert_class (list_node->head, class);
    331       if (tree)
    332 	{
    333 	  list_node->head = tree;
    334 	  return;
    335 	}
    336       else
    337 	list_node = list_node->tail;
    338     }
    339 
    340   /* If the list was finished but the class hasn't been inserted, we
    341      don't have an existing class hierarchy that can accommodate it.
    342      Create a new one.  */
    343   __objc_class_tree_list = list_cons (NULL, __objc_class_tree_list);
    344   __objc_class_tree_list->head = __objc_tree_insert_class (NULL, class);
    345 }
    346 
    347 /* Traverse tree in preorder. Used to send +load.  */
    348 static void
    349 objc_preorder_traverse (objc_class_tree *tree,
    350 			int level,
    351 			void (*function) (objc_class_tree *, int))
    352 {
    353   struct objc_list *node;
    354 
    355   (*function) (tree, level);
    356   for (node = tree->subclasses; node; node = node->tail)
    357     objc_preorder_traverse (node->head, level + 1, function);
    358 }
    359 
    360 /* Traverse tree in postorder. Used to destroy a tree.  */
    361 static void
    362 objc_postorder_traverse (objc_class_tree *tree,
    363 			 int level,
    364 			 void (*function) (objc_class_tree *, int))
    365 {
    366   struct objc_list *node;
    367 
    368   for (node = tree->subclasses; node; node = node->tail)
    369     objc_postorder_traverse (node->head, level + 1, function);
    370   (*function) (tree, level);
    371 }
    372 
    373 /* Used to print a tree class hierarchy.  */
    374 #ifdef DEBUG
    375 static void
    376 __objc_tree_print (objc_class_tree *tree, int level)
    377 {
    378   int i;
    379 
    380   for (i = 0; i < level; i++)
    381     printf ("  ");
    382   printf ("%s\n", tree->class->name);
    383 }
    384 #endif
    385 
    386 /* Walks on a linked list of methods in the reverse order and executes
    387    all the methods corresponding to the `+load' selector.  Walking in
    388    the reverse order assures the +load of class is executed first and
    389    then +load of categories because of the way in which categories are
    390    added to the class methods.  This function needs to be called with
    391    the objc_runtime_mutex locked.  */
    392 static void
    393 __objc_send_load_using_method_list (struct objc_method_list *method_list, Class class)
    394 {
    395   static SEL load_selector = 0;
    396   int i;
    397 
    398   if (!method_list)
    399     return;
    400 
    401   /* This needs no lock protection because we are called with the
    402      objc_runtime_mutex locked.  */
    403   if (!load_selector)
    404     load_selector = sel_registerName ("load");
    405 
    406   /* method_list is a linked list of method lists; since we're
    407      executing in reverse order, we need to do the next list before we
    408      do this one.  */
    409   __objc_send_load_using_method_list (method_list->method_next, class);
    410 
    411   /* Search the method list.  */
    412   for (i = 0; i < method_list->method_count; i++)
    413     {
    414       struct objc_method *mth = &method_list->method_list[i];
    415 
    416       /* We are searching for +load methods that we haven't executed
    417 	 yet.  */
    418       if (mth->method_name && sel_eq (mth->method_name, load_selector)
    419 	  && ! objc_hash_is_key_in_hash (__objc_load_methods, mth->method_imp))
    420 	{
    421 	  /* Add this method into the +load hash table, so we won't
    422 	     execute it again next time.  */
    423 	  objc_hash_add (&__objc_load_methods,
    424 			 mth->method_imp,
    425 			 mth->method_imp);
    426 
    427 	  /* Call +load.  */
    428 	  DEBUG_PRINTF (" begin of [%s +load]\n", class->name);
    429 	  (*mth->method_imp) ((id)class, mth->method_name);
    430 	  DEBUG_PRINTF (" end of [%s +load]\n", class->name);
    431 
    432 	  break;
    433 	}
    434     }
    435 }
    436 
    437 /* This function needs to be called with the objc_runtime_mutex
    438    locked.  */
    439 static void
    440 __objc_send_load (objc_class_tree *tree,
    441 		  int level __attribute__ ((__unused__)))
    442 {
    443   Class class = tree->class;
    444   struct objc_method_list *method_list = class->class_pointer->methods;
    445 
    446   DEBUG_PRINTF ("+load: need to send load to class '%s'\n", class->name);
    447   __objc_send_load_using_method_list (method_list, class);
    448 }
    449 
    450 static void
    451 __objc_destroy_class_tree_node (objc_class_tree *tree,
    452 				int level __attribute__ ((__unused__)))
    453 {
    454   objc_free (tree);
    455 }
    456 
    457 /* This is used to check if the relationship between two classes
    458    before the runtime completely installs the classes.  */
    459 static BOOL
    460 class_is_subclass_of_class (Class class, Class superclass)
    461 {
    462   for (; class != Nil;)
    463     {
    464       if (class == superclass)
    465 	return YES;
    466       class = class_superclass_of_class (class);
    467     }
    468 
    469   return NO;
    470 }
    471 
    472 /* This list contains all the classes in the runtime system for whom
    473    their superclasses are not yet known to the runtime.  */
    474 static struct objc_list *unresolved_classes = 0;
    475 
    476 /* Extern function used to reference the Object class.  */
    477 extern void __objc_force_linking (void);
    478 
    479 void
    480 __objc_force_linking (void)
    481 {
    482   extern void __objc_linking (void);
    483   __objc_linking ();
    484 }
    485 
    486 /* Run through the statics list, removing modules as soon as all its
    487    statics have been initialized.  */
    488 static void
    489 objc_init_statics (void)
    490 {
    491   struct objc_list **cell = &uninitialized_statics;
    492   struct objc_static_instances **statics_in_module;
    493 
    494   objc_mutex_lock (__objc_runtime_mutex);
    495 
    496   while (*cell)
    497     {
    498       int module_initialized = 1;
    499 
    500       for (statics_in_module = (*cell)->head;
    501 	   *statics_in_module; statics_in_module++)
    502 	{
    503 	  struct objc_static_instances *statics = *statics_in_module;
    504 	  Class class = objc_getClass (statics->class_name);
    505 
    506 	  if (! class)
    507 	    {
    508 	      /* It is unfortunate that this will cause all the
    509 		 statics initialization to be done again (eg, if we
    510 		 already initialized constant strings, and are now
    511 		 initializing protocols, setting module_initialized to
    512 		 0 would cause constant strings to be initialized
    513 		 again).  It would be good to be able to track if we
    514 		 have already initialized some of them.  */
    515 	      module_initialized = 0;
    516 	    }
    517 	  else
    518 	    {
    519 	      /* Note that if this is a list of Protocol objects, some
    520 		 of them may have been initialized already (because
    521 		 they were attached to classes or categories, and the
    522 		 class/category loading code automatically fixes them
    523 		 up), and some of them may not.  We really need to go
    524 		 through the whole list to be sure!  Protocols are
    525 		 also special because we want to register them and
    526 		 register all their selectors.  */
    527 	      id *inst;
    528 
    529 	      if (strcmp (statics->class_name, "Protocol") == 0)
    530 		{
    531 		  /* Protocols are special, because not only we want
    532 		     to fix up their class pointers, but we also want
    533 		     to register them and their selectors with the
    534 		     runtime.  */
    535 		  for (inst = &statics->instances[0]; *inst; inst++)
    536 		    __objc_init_protocol ((struct objc_protocol *)*inst);
    537 		}
    538 	      else
    539 		{
    540 		  /* Other static instances (typically constant
    541 		     strings) are easier as we just fix up their class
    542 		     pointers.  */
    543 		  for (inst = &statics->instances[0]; *inst; inst++)
    544 		    (*inst)->class_pointer = class;
    545 		}
    546 	    }
    547 	}
    548       if (module_initialized)
    549 	{
    550 	  /* Remove this module from the uninitialized list.  */
    551 	  struct objc_list *this = *cell;
    552 	  *cell = this->tail;
    553 	  objc_free (this);
    554 	}
    555       else
    556 	cell = &(*cell)->tail;
    557     }
    558 
    559   objc_mutex_unlock (__objc_runtime_mutex);
    560 }
    561 
    562 /* This function is called by constructor functions generated for each
    563    module compiled.  (_GLOBAL_$I$...) The purpose of this function is
    564    to gather the module pointers so that they may be processed by the
    565    initialization routines as soon as possible.  */
    566 void
    567 __objc_exec_class (struct objc_module *module)
    568 {
    569   /* Have we processed any constructors previously?  This flag is used
    570      to indicate that some global data structures need to be
    571      built.  */
    572   static BOOL previous_constructors = 0;
    573 
    574   static struct objc_list *unclaimed_categories = 0;
    575 
    576   /* The symbol table (defined in objc-private/module-abi-8.h)
    577      generated by gcc.  */
    578   struct objc_symtab *symtab = module->symtab;
    579 
    580   /* The statics in this module.  */
    581   struct objc_static_instances **statics
    582     = symtab->defs[symtab->cls_def_cnt + symtab->cat_def_cnt];
    583 
    584   /* Entry used to traverse hash lists.  */
    585   struct objc_list **cell;
    586 
    587   /* The table of selector references for this module.  */
    588   struct objc_selector *selectors = symtab->refs;
    589 
    590   int i;
    591 
    592   DEBUG_PRINTF ("\n__objc_exec_class (%p) - start processing module...\n", module);
    593 
    594   /* Check gcc version.  */
    595   init_check_module_version (module);
    596 
    597   /* On the first call of this routine, initialize some data
    598      structures.  */
    599   if (! previous_constructors)
    600     {
    601 	/* Initialize thread-safe system.  */
    602       __objc_init_thread_system ();
    603       __objc_runtime_threads_alive = 1;
    604       __objc_runtime_mutex = objc_mutex_allocate ();
    605 
    606       __objc_init_selector_tables ();
    607       __objc_init_class_tables ();
    608       __objc_init_dispatch_tables ();
    609       duplicate_classes = objc_hash_new (8,
    610 					 (hash_func_type)objc_hash_ptr,
    611 					 objc_compare_ptrs);
    612       __objc_load_methods = objc_hash_new (128,
    613 					   (hash_func_type)objc_hash_ptr,
    614 					   objc_compare_ptrs);
    615       __objc_protocols_init ();
    616       __objc_accessors_init ();
    617       __objc_sync_init ();
    618       previous_constructors = 1;
    619     }
    620 
    621   /* Save the module pointer so that later we remember to call +load
    622      on all classes and categories on it.  */
    623   objc_mutex_lock (__objc_runtime_mutex);
    624   __objc_module_list = list_cons (module, __objc_module_list);
    625 
    626   /* Replace referenced selectors from names to SELs.  */
    627   if (selectors)
    628     {
    629       DEBUG_PRINTF (" registering selectors\n");
    630       __objc_register_selectors_from_module (selectors);
    631     }
    632 
    633   /* Parse the classes in the load module and gather selector
    634      information.  */
    635   for (i = 0; i < symtab->cls_def_cnt; ++i)
    636     {
    637       Class class = (Class) symtab->defs[i];
    638       const char *superclass = (char *) class->super_class;
    639 
    640       /* Make sure we have what we think.  */
    641       assert (CLS_ISCLASS (class));
    642       assert (CLS_ISMETA (class->class_pointer));
    643       DEBUG_PRINTF (" installing class '%s'\n", class->name);
    644 
    645       /* Workaround for a bug in clang: Clang may set flags other than
    646 	 _CLS_CLASS and _CLS_META even when compiling for the
    647 	 traditional ABI (version 8), confusing our runtime.  Try to
    648 	 wipe these flags out.  */
    649       if (CLS_ISCLASS (class))
    650 	__CLS_INFO (class) = _CLS_CLASS;
    651       else
    652 	__CLS_INFO (class) = _CLS_META;
    653 
    654       /* Initialize the subclass list to be NULL.  In some cases it
    655 	 isn't and this crashes the program.  */
    656       class->subclass_list = NULL;
    657 
    658       if (__objc_init_class (class))
    659 	{
    660 	  /* Check to see if the superclass is known in this point. If
    661 	     it's not add the class to the unresolved_classes list.  */
    662 	  if (superclass && ! objc_getClass (superclass))
    663 	    unresolved_classes = list_cons (class, unresolved_classes);
    664 	}
    665     }
    666 
    667   /* Process category information from the module.  */
    668   for (i = 0; i < symtab->cat_def_cnt; ++i)
    669     {
    670       struct objc_category *category = symtab->defs[i + symtab->cls_def_cnt];
    671       Class class = objc_getClass (category->class_name);
    672 
    673       /* If the class for the category exists then append its
    674 	 methods.  */
    675       if (class)
    676 	{
    677 	  DEBUG_PRINTF (" installing category '%s (%s)'\n", category->class_name, category->category_name);
    678 	  /* Do instance methods.  */
    679 	  if (category->instance_methods)
    680 	    class_add_method_list (class, category->instance_methods);
    681 
    682 	  /* Do class methods.  */
    683 	  if (category->class_methods)
    684 	    class_add_method_list ((Class) class->class_pointer,
    685 				   category->class_methods);
    686 
    687 	  if (category->protocols)
    688 	    {
    689 	      __objc_init_protocols (category->protocols);
    690 	      __objc_class_add_protocols (class, category->protocols);
    691 	    }
    692 
    693           /* Register the instance methods as class methods, this is
    694              only done for root classes.  */
    695           __objc_register_instance_methods_to_class (class);
    696 	}
    697       else
    698 	{
    699 	  DEBUG_PRINTF (" delaying installation of category '%s (%s)'\n", category->class_name, category->category_name);
    700 	  /* The object to which the category methods belong can't be
    701 	     found.  Save the information.  */
    702 	  unclaimed_categories = list_cons (category, unclaimed_categories);
    703 	}
    704     }
    705 
    706   if (statics)
    707     uninitialized_statics = list_cons (statics, uninitialized_statics);
    708   if (uninitialized_statics)
    709     objc_init_statics ();
    710 
    711   /* Scan the unclaimed category hash.  Attempt to attach any
    712      unclaimed categories to objects.  */
    713   for (cell = &unclaimed_categories; *cell; )
    714     {
    715       struct objc_category *category = (*cell)->head;
    716       Class class = objc_getClass (category->class_name);
    717 
    718       if (class)
    719 	{
    720 	  DEBUG_PRINTF (" installing (delayed) category '%s (%s)'\n", category->class_name, category->category_name);
    721 	  list_remove_head (cell);
    722 
    723 	  if (category->instance_methods)
    724 	    class_add_method_list (class, category->instance_methods);
    725 
    726 	  if (category->class_methods)
    727 	    class_add_method_list ((Class) class->class_pointer,
    728 				   category->class_methods);
    729 
    730 	  if (category->protocols)
    731 	    {
    732 	      __objc_init_protocols (category->protocols);
    733 	      __objc_class_add_protocols (class, category->protocols);
    734 	    }
    735 
    736           /* Register the instance methods as class methods, this is
    737              only done for root classes.  */
    738           __objc_register_instance_methods_to_class (class);
    739 	}
    740       else
    741 	cell = &(*cell)->tail;
    742     }
    743 
    744   if (unclaimed_proto_list && objc_getClass ("Protocol"))
    745     {
    746       list_mapcar (unclaimed_proto_list,
    747 		   (void (*) (void *))__objc_init_protocols);
    748       list_free (unclaimed_proto_list);
    749       unclaimed_proto_list = 0;
    750     }
    751 
    752   objc_send_load ();
    753 
    754   /* Check if there are no unresolved classes (ie, classes whose
    755      superclass has not been loaded yet) and that the 'Object' class,
    756      used as the class of classes, exist.  If so, it is worth
    757      "resolving the class links" at this point, which will setup all
    758      the class/superclass pointers.  */
    759   if (!unresolved_classes && objc_getClass ("Object"))
    760     {
    761       DEBUG_PRINTF (" resolving class links\n");
    762       __objc_resolve_class_links ();
    763     }
    764 
    765   objc_mutex_unlock (__objc_runtime_mutex);
    766 
    767   DEBUG_PRINTF ("__objc_exec_class (%p) - finished processing module...\n\n", module);
    768 }
    769 
    770 /* This function needs to be called with the objc_runtime_mutex
    771    locked.  */
    772 static void
    773 objc_send_load (void)
    774 {
    775   if (!__objc_module_list)
    776     return;
    777 
    778   /* Try to find out if all the classes loaded so far also have their
    779      superclasses known to the runtime.  We suppose that the objects
    780      that are allocated in the +load method are in general of a class
    781      declared in the same module.  */
    782   if (unresolved_classes)
    783     {
    784       Class class = unresolved_classes->head;
    785 
    786       while (objc_getClass ((char *) class->super_class))
    787 	{
    788 	  list_remove_head (&unresolved_classes);
    789 	  if (unresolved_classes)
    790 	    class = unresolved_classes->head;
    791 	  else
    792 	    break;
    793 	}
    794 
    795       /* If we still have classes for whom we don't have yet their
    796          super classes known to the runtime we don't send the +load
    797          messages (and call the load callback) yet.  */
    798       if (unresolved_classes)
    799 	return;
    800     }
    801 
    802   /* Special check.  If 'Object', which is used by meta-classes, has
    803      not been loaded yet, delay sending of +load.  */
    804   if (! objc_getClass ("Object"))
    805     return;
    806 
    807   /* Iterate over all modules in the __objc_module_list and call on
    808      them the __objc_create_classes_tree function.  This function
    809      creates a tree of classes that resembles the class hierarchy.  */
    810   list_mapcar (__objc_module_list,
    811 	       (void (*) (void *)) __objc_create_classes_tree);
    812 
    813   while (__objc_class_tree_list)
    814     {
    815 #ifdef DEBUG
    816       objc_preorder_traverse (__objc_class_tree_list->head,
    817 			      0, __objc_tree_print);
    818 #endif
    819       objc_preorder_traverse (__objc_class_tree_list->head,
    820 			      0, __objc_send_load);
    821       objc_postorder_traverse (__objc_class_tree_list->head,
    822 			      0, __objc_destroy_class_tree_node);
    823       list_remove_head (&__objc_class_tree_list);
    824     }
    825 
    826   /* For each module, call the _objc_load_callback if any is
    827      defined.  */
    828   list_mapcar (__objc_module_list, (void (*) (void *)) __objc_call_load_callback);
    829 
    830   /* Empty the list of modules.  */
    831   list_free (__objc_module_list);
    832   __objc_module_list = NULL;
    833 }
    834 
    835 static void
    836 __objc_create_classes_tree (struct objc_module *module)
    837 {
    838   /* The runtime mutex is locked at this point */
    839   struct objc_symtab *symtab = module->symtab;
    840   int i;
    841 
    842   /* Iterate through classes defined in this module and insert them in
    843      the classes tree hierarchy.  */
    844   for (i = 0; i < symtab->cls_def_cnt; i++)
    845     {
    846       Class class = (Class) symtab->defs[i];
    847 
    848       if (!objc_hash_is_key_in_hash (duplicate_classes, class))
    849 	objc_tree_insert_class (class);
    850     }
    851 
    852   /* Now iterate over "claimed" categories too (ie, categories that
    853      extend a class that has already been loaded by the runtime), and
    854      insert them in the classes tree hiearchy too.  Otherwise, if you
    855      add a category, its +load method would not be called if the class
    856      is already loaded in the runtime.  It the category is
    857      "unclaimed", ie, we haven't loaded the main class yet, postpone
    858      sending +load as we want to execute +load from the class before
    859      we execute the one from the category.  */
    860   for (i = 0; i < symtab->cat_def_cnt; ++i)
    861     {
    862       struct objc_category *category = symtab->defs[i + symtab->cls_def_cnt];
    863       Class class = objc_getClass (category->class_name);
    864 
    865       /* If the class for the category exists then append its
    866 	 methods.  */
    867       if (class)
    868 	objc_tree_insert_class (class);
    869     }
    870 }
    871 
    872 static void
    873 __objc_call_load_callback (struct objc_module *module)
    874 {
    875   if (_objc_load_callback)
    876     {
    877       /* The runtime mutex is locked at this point.  */
    878       struct objc_symtab *symtab = module->symtab;
    879       int i;
    880 
    881       /* Iterate through classes defined in this module and call the callback
    882 	 for each one.  */
    883       for (i = 0; i < symtab->cls_def_cnt; i++)
    884 	{
    885 	  Class class = (Class) symtab->defs[i];
    886 
    887 	  if (!objc_hash_is_key_in_hash (duplicate_classes, class))
    888 	    {
    889 	      /* Call the _objc_load_callback for this class.  */
    890 	      DEBUG_PRINTF (" calling the load callback for class '%s'\n", class->name);
    891 	      _objc_load_callback (class, 0);
    892 	    }
    893 	}
    894 
    895       /* Call the _objc_load_callback for categories.  Don't register
    896 	 the instance methods as class methods for categories to root
    897 	 classes since they were already added in the class.  */
    898       for (i = 0; i < symtab->cat_def_cnt; i++)
    899 	{
    900 	  struct objc_category *category = symtab->defs[i + symtab->cls_def_cnt];
    901 	  Class class = objc_getClass (category->class_name);
    902 
    903 	  DEBUG_PRINTF (" calling the load callback for category '%s (%s)'\n",
    904 			category->class_name, category->category_name);
    905 	  _objc_load_callback (class, category);
    906 	}
    907     }
    908 }
    909 
    910 /* Sanity check the version of gcc used to compile `module'.  */
    911 static void
    912 init_check_module_version (struct objc_module *module)
    913 {
    914   if ((module->version != OBJC_VERSION) || (module->size != sizeof (struct objc_module)))
    915     {
    916       _objc_abort ("Module %s version %d doesn't match runtime %d\n",
    917 		   module->name, (int)module->version, OBJC_VERSION);
    918     }
    919 }
    920 
    921 /* __objc_init_class must be called with __objc_runtime_mutex already
    922    locked.  Return YES if the class could be setup; return NO if the
    923    class could not be setup because a class with the same name already
    924    exists.  */
    925 BOOL
    926 __objc_init_class (Class class)
    927 {
    928   /* Store the class in the class table and assign class numbers.  */
    929   if (__objc_add_class_to_hash (class))
    930     {
    931       /* Register all of the selectors in the class and meta class.  */
    932       __objc_register_selectors_from_class (class);
    933       __objc_register_selectors_from_class ((Class) class->class_pointer);
    934 
    935       /* Install the fake dispatch tables.  */
    936       __objc_install_premature_dtable (class);
    937       __objc_install_premature_dtable (class->class_pointer);
    938 
    939       /* Register the instance methods as class methods, this is only
    940 	 done for root classes.  */
    941       __objc_register_instance_methods_to_class (class);
    942 
    943       if (class->protocols)
    944 	__objc_init_protocols (class->protocols);
    945 
    946       return YES;
    947     }
    948   else
    949     {
    950       /* The module contains a duplicate class.  Remember it so that
    951 	 we will ignore it later.  */
    952       DEBUG_PRINTF (" duplicate class '%s' - will be ignored\n", class->name);
    953       objc_hash_add (&duplicate_classes, class, class);
    954       return NO;
    955     }
    956 }
    957 
    958 /* __objc_init_protocol must be called with __objc_runtime_mutex
    959    already locked, and the "Protocol" class already registered.  */
    960 static void
    961 __objc_init_protocol (struct objc_protocol *protocol)
    962 {
    963   static Class proto_class = 0;
    964 
    965   if (! proto_class)
    966     proto_class = objc_getClass ("Protocol");
    967 
    968   if (((size_t)protocol->class_pointer) == PROTOCOL_VERSION)
    969     {
    970       /* Assign class pointer.  */
    971       protocol->class_pointer = proto_class;
    972 
    973       /* Register all the selectors in the protocol with the runtime.
    974 	 This both registers the selectors with the right types, and
    975 	 it also fixes up the 'struct objc_method' structures inside
    976 	 the protocol so that each method_name (a char * as compiled
    977 	 by the compiler) is replaced with the appropriate runtime
    978 	 SEL.  */
    979       if (protocol->class_methods)
    980 	__objc_register_selectors_from_description_list (protocol->class_methods);
    981 
    982       if (protocol->instance_methods)
    983 	__objc_register_selectors_from_description_list (protocol->instance_methods);
    984 
    985       /* Register the protocol in the hashtable or protocols by
    986 	 name.  */
    987       __objc_protocols_add_protocol (protocol->protocol_name, protocol);
    988 
    989       /* Init super protocols.  */
    990       __objc_init_protocols (protocol->protocol_list);
    991     }
    992   else if (protocol->class_pointer != proto_class)
    993     {
    994       _objc_abort ("Version %d doesn't match runtime protocol version %d\n",
    995 		   (int) ((char *) protocol->class_pointer
    996 			  - (char *) 0),
    997 		   PROTOCOL_VERSION);
    998     }
    999 }
   1000 
   1001 static void
   1002 __objc_init_protocols (struct objc_protocol_list *protos)
   1003 {
   1004   size_t i;
   1005   static Class proto_class = 0;
   1006 
   1007   if (! protos)
   1008     return;
   1009 
   1010   objc_mutex_lock (__objc_runtime_mutex);
   1011 
   1012   if (! proto_class)
   1013     proto_class = objc_getClass ("Protocol");
   1014 
   1015   if (! proto_class)
   1016     {
   1017       unclaimed_proto_list = list_cons (protos, unclaimed_proto_list);
   1018       objc_mutex_unlock (__objc_runtime_mutex);
   1019       return;
   1020     }
   1021 
   1022 #if 0
   1023   assert (protos->next == 0); /* Only single ones allowed.  */
   1024 #endif
   1025 
   1026   for (i = 0; i < protos->count; i++)
   1027     {
   1028       struct objc_protocol *aProto = protos->list[i];
   1029       __objc_init_protocol (aProto);
   1030     }
   1031 
   1032   objc_mutex_unlock (__objc_runtime_mutex);
   1033 }
   1034 
   1035 static void
   1036 __objc_class_add_protocols (Class class, struct objc_protocol_list *protos)
   1037 {
   1038   if (! protos)
   1039     return;
   1040 
   1041   protos->next = class->protocols;
   1042   class->protocols = protos;
   1043 }
   1044