| /* Definitions of Module Structures used by ABI version 8 |
| Copyright (C) 1993-2018 Free Software Foundation, Inc. |
| |
| This file is part of GCC. |
| |
| GCC is free software; you can redistribute it and/or modify it under the |
| terms of the GNU General Public License as published by the Free Software |
| Foundation; either version 3, or (at your option) any later version. |
| |
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| details. |
| |
| Under Section 7 of GPL version 3, you are granted additional |
| permissions described in the GCC Runtime Library Exception, version |
| 3.1, as published by the Free Software Foundation. |
| |
| You should have received a copy of the GNU General Public License and |
| a copy of the GCC Runtime Library Exception along with this program; |
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef __objc_private_module_abi_8_INCLUDE_GNU |
| #define __objc_private_module_abi_8_INCLUDE_GNU |
| |
| /* For every class which happens to have statically allocated instances in |
| this module, one OBJC_STATIC_INSTANCES is allocated by the compiler. |
| INSTANCES is NULL terminated and points to all statically allocated |
| instances of this class. */ |
| struct objc_static_instances |
| { |
| char *class_name; |
| #ifdef __cplusplus |
| id instances[1]; |
| #else |
| id instances[0]; |
| #endif |
| }; |
| |
| /* Whereas a Module (defined further down) is the root (typically) of a file, |
| a Symtab is the root of the class and category definitions within the |
| module. |
| |
| A Symtab contains a variable length array of pointers to classes and |
| categories defined in the module. */ |
| struct objc_symtab |
| { |
| unsigned long sel_ref_cnt; /* Unused (always set to 0). */ |
| struct objc_selector *refs; /* The table of selectors referenced in |
| this module. This is terminated by a |
| selector with NULL sel_id and NULL |
| sel_types. Note that we use the type |
| 'struct objc_selector *' and not |
| 'SEL' (which is 'const struct |
| objc_selector *') because the sel_id |
| of these selectors is patched up by |
| the runtime when the module is |
| loaded. */ |
| unsigned short cls_def_cnt; /* Number of classes compiled (defined) |
| in the module. */ |
| unsigned short cat_def_cnt; /* Number of categories compiled |
| (defined) in the module. */ |
| void *defs[1]; /* Variable array of pointers. |
| cls_def_cnt of type Class followed by |
| cat_def_cnt of type Category_t, |
| followed by a NULL terminated array |
| of objc_static_instances. */ |
| }; |
| |
| /* The compiler generates one of these structures for each module that |
| composes the executable (eg main.m). |
| |
| This data structure is the root of the definition tree for the |
| module. |
| |
| A collect program runs between ld stages and creates a ObjC ctor |
| array. That array holds a pointer to each module structure of the |
| executable. */ |
| struct objc_module |
| { |
| unsigned long version; /* Version of the Module data |
| structure. */ |
| unsigned long size; /* sizeof(Module) according to the |
| compiler - only used to sanity check |
| that it matches sizeof(Module) |
| according to the runtime. */ |
| const char* name; /* Name of the file used to compile the |
| module - not set by modern compilers |
| for security reasons. */ |
| struct objc_symtab *symtab; /* Pointer to the Symtab of the module. |
| The Symtab holds an array of pointers |
| to the classes and categories defined |
| in the module. */ |
| }; |
| |
| /* The compiler generates one of these structures for a class that has |
| instance variables defined in its specification. */ |
| struct objc_ivar |
| { |
| const char* ivar_name; /* Name of the instance variable as entered |
| in the class definition. */ |
| const char* ivar_type; /* Description of the Ivar's type. Useful |
| for debuggers. */ |
| int ivar_offset; /* Byte offset from the base address of the |
| instance structure to the variable. */ |
| }; |
| |
| struct objc_ivar_list |
| { |
| int ivar_count; /* Number of structures (Ivar) |
| contained in the list. One |
| structure per instance variable |
| defined in the class. */ |
| struct objc_ivar ivar_list[1]; /* Variable length structure. */ |
| }; |
| |
| /* The compiler generates one (or more) of these structures for a |
| class that has methods defined in its specification. |
| |
| The implementation of a class can be broken into separate pieces in |
| a file and categories can break them across modules. To handle this |
| problem is a singly linked list of methods. */ |
| struct objc_method |
| { |
| SEL method_name; /* This variable is the method's name. |
| The compiler puts a char* here, and |
| it's replaced by a real SEL at runtime |
| when the method is registered. */ |
| const char* method_types; /* Description of the method's parameter |
| list. Used when registering the |
| selector with the runtime. When that |
| happens, method_name will contain the |
| method's parameter list. */ |
| IMP method_imp; /* Address of the method in the |
| executable. */ |
| }; |
| |
| struct objc_method_list |
| { |
| struct objc_method_list* method_next; /* This variable is used to |
| link a method list to |
| another. It is a singly |
| linked list. */ |
| int method_count; /* Number of methods defined |
| in this structure. */ |
| struct objc_method method_list[1]; /* Variable length |
| structure. */ |
| }; |
| |
| /* Note that a 'struct objc_method_description' as embedded inside a |
| Protocol uses the same trick as a 'struct objc_method': the |
| method_name is a 'char *' according to the compiler, who puts the |
| method name as a string in there. At runtime, the selectors need |
| to be registered, and the method_name then becomes a SEL. */ |
| struct objc_method_description_list |
| { |
| int count; |
| struct objc_method_description list[1]; |
| }; |
| |
| struct objc_protocol { |
| struct objc_class* class_pointer; |
| char *protocol_name; |
| struct objc_protocol_list *protocol_list; |
| struct objc_method_description_list *instance_methods, *class_methods; |
| }; |
| |
| |
| struct objc_protocol_list |
| { |
| struct objc_protocol_list *next; |
| size_t count; |
| struct objc_protocol *list[1]; |
| }; |
| |
| /* |
| The compiler generates one of these structures for each class. |
| |
| This structure is the definition for classes. |
| |
| This structure is generated by the compiler in the executable and |
| used by the run-time during normal messaging operations. Therefore |
| some members change type. The compiler generates "char* const" and |
| places a string in the following member variables: super_class. |
| */ |
| struct objc_class { |
| struct objc_class* class_pointer; /* Pointer to the class's meta |
| class. */ |
| struct objc_class* super_class; /* Pointer to the super |
| class. NULL for class |
| Object. */ |
| const char* name; /* Name of the class. */ |
| long version; /* Unknown. */ |
| unsigned long info; /* Bit mask. See class masks |
| defined below. */ |
| long instance_size; /* Size in bytes of the class. |
| The sum of the class |
| definition and all super |
| class definitions. */ |
| #ifdef _WIN64 |
| /* We pad the structure manually to prevent warning when -Wpadded is |
| used. The compiler automatically pads the structures that it |
| generates, so this manually padded structure still matches the |
| one generated by the compiler, but if we don't pad manually, |
| -Wpadded detects that padding is being added and generates |
| annoying warnings. This hack is necessary as on LLP64 targets |
| sizeof (long) isn't equal to sizeof (void *). */ |
| long pad; |
| #endif |
| struct objc_ivar_list* ivars; /* Pointer to a structure that |
| describes the instance |
| variables in the class |
| definition. NULL indicates |
| no instance variables. |
| Does not include super |
| class variables. */ |
| struct objc_method_list* methods; /* Linked list of instance |
| methods defined for the |
| class. */ |
| struct sarray * dtable; /* Pointer to instance method |
| dispatch table. */ |
| struct objc_class* subclass_list; /* Subclasses */ |
| struct objc_class* sibling_class; |
| |
| struct objc_protocol_list *protocols; /* Protocols conformed to */ |
| void* gc_object_type; |
| }; |
| |
| /* This is used to assure consistent access to the info field of |
| classes. */ |
| #ifndef HOST_BITS_PER_LONG |
| # define HOST_BITS_PER_LONG (sizeof(long)*8) |
| #endif |
| |
| #define __CLS_INFO(cls) ((cls)->info) |
| #define __CLS_ISINFO(cls, mask) ((__CLS_INFO(cls)&mask)==mask) |
| #define __CLS_SETINFO(cls, mask) (__CLS_INFO(cls) |= mask) |
| #define __CLS_SETNOTINFO(cls, mask) (__CLS_INFO(cls) &= ~mask) |
| |
| /* The structure is of type MetaClass */ |
| #define _CLS_META 0x2L |
| #define CLS_ISMETA(cls) ((cls)&&__CLS_ISINFO(cls, _CLS_META)) |
| |
| /* The structure is of type Class */ |
| #define _CLS_CLASS 0x1L |
| #define CLS_ISCLASS(cls) ((cls)&&__CLS_ISINFO(cls, _CLS_CLASS)) |
| |
| /* The class is initialized within the runtime. This means that it |
| has had correct super and sublinks assigned. */ |
| #define _CLS_RESOLV 0x8L |
| #define CLS_ISRESOLV(cls) __CLS_ISINFO(cls, _CLS_RESOLV) |
| #define CLS_SETRESOLV(cls) __CLS_SETINFO(cls, _CLS_RESOLV) |
| |
| /* The class has been send a +initialize message or a such is not |
| defined for this class. */ |
| #define _CLS_INITIALIZED 0x04L |
| #define CLS_ISINITIALIZED(cls) __CLS_ISINFO(cls, _CLS_INITIALIZED) |
| #define CLS_SETINITIALIZED(cls) __CLS_SETINFO(cls, _CLS_INITIALIZED) |
| |
| /* The class is being constructed; it has been allocated using |
| objc_allocateClassPair(), but has not been registered yet by using |
| objc_registerClassPair(). This means it is possible to freely add |
| instance variables to the class, but it can't be used for anything |
| yet. */ |
| #define _CLS_IN_CONSTRUCTION 0x10L |
| #define CLS_IS_IN_CONSTRUCTION(cls) __CLS_ISINFO(cls, _CLS_IN_CONSTRUCTION) |
| #define CLS_SET_IN_CONSTRUCTION(cls) __CLS_SETINFO(cls, _CLS_IN_CONSTRUCTION) |
| #define CLS_SET_NOT_IN_CONSTRUCTION(cls) __CLS_SETNOTINFO(cls, _CLS_IN_CONSTRUCTION) |
| |
| /* The class number of this class. This must be the same for both the |
| class and its meta class object. */ |
| #define CLS_GETNUMBER(cls) (__CLS_INFO(cls) >> (HOST_BITS_PER_LONG/2)) |
| #define CLS_SETNUMBER(cls, num) \ |
| ({ (cls)->info <<= (HOST_BITS_PER_LONG/2); \ |
| (cls)->info >>= (HOST_BITS_PER_LONG/2); \ |
| __CLS_SETINFO(cls, (((unsigned long)num) << (HOST_BITS_PER_LONG/2))); }) |
| |
| /* The compiler generates one of these structures for each category. |
| A class may have many categories and contain both instance and |
| factory methods. */ |
| struct objc_category |
| { |
| const char* category_name; /* Name of the category. |
| Name contained in the |
| () of the category |
| definition. */ |
| const char* class_name; /* Name of the class to |
| which the category |
| belongs. */ |
| struct objc_method_list *instance_methods; /* Linked list of |
| instance methods |
| defined in the |
| category. NULL |
| indicates no instance |
| methods defined. */ |
| struct objc_method_list *class_methods; /* Linked list of |
| factory methods |
| defined in the |
| category. NULL |
| indicates no class |
| methods defined. */ |
| struct objc_protocol_list *protocols; /* List of Protocols |
| conformed to. */ |
| }; |
| |
| #endif /* __objc_private_module_abi_8_INCLUDE_GNU */ |