From patchwork Sun Oct 10 17:43:42 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicola Pero X-Patchwork-Id: 67358 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id C2A8EB6EFF for ; Mon, 11 Oct 2010 04:44:00 +1100 (EST) Received: (qmail 8623 invoked by alias); 10 Oct 2010 17:43:58 -0000 Received: (qmail 8612 invoked by uid 22791); 10 Oct 2010 17:43:54 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL, BAYES_00, SARE_SUB_ENC_UTF8, TW_BJ, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from fencepost.gnu.org (HELO fencepost.gnu.org) (140.186.70.10) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 10 Oct 2010 17:43:47 +0000 Received: from eggs.gnu.org ([140.186.70.92]:33804) by fencepost.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1P4zw1-0002a5-I7 for gcc-patches@gnu.org; Sun, 10 Oct 2010 13:43:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1P4zvz-0006fm-Aw for gcc-patches@gnu.org; Sun, 10 Oct 2010 13:43:45 -0400 Received: from smtp111.iad.emailsrvr.com ([207.97.245.111]:45520) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1P4zvz-0006fa-6v for gcc-patches@gnu.org; Sun, 10 Oct 2010 13:43:43 -0400 Received: from relay21.relay.iad.mlsrvr.com (localhost [127.0.0.1]) by relay21.relay.iad.mlsrvr.com (SMTP Server) with ESMTP id B1A4F1B4020 for ; Sun, 10 Oct 2010 13:43:42 -0400 (EDT) Received: from dynamic5.wm-web.iad.mlsrvr.com (dynamic5.wm-web.iad.mlsrvr.com [192.168.2.146]) by relay21.relay.iad.mlsrvr.com (SMTP Server) with ESMTP id ACA2B1B4007 for ; Sun, 10 Oct 2010 13:43:42 -0400 (EDT) Received: from meta-innovation.com (localhost [127.0.0.1]) by dynamic5.wm-web.iad.mlsrvr.com (Postfix) with ESMTP id 9C00A8D0505 for ; Sun, 10 Oct 2010 13:43:42 -0400 (EDT) Received: by www2.webmail.us (Authenticated sender: nicola.pero@meta-innovation.com, from: nicola.pero@meta-innovation.com) with HTTP; Sun, 10 Oct 2010 19:43:42 +0200 (CEST) Date: Sun, 10 Oct 2010 19:43:42 +0200 (CEST) Subject: =?UTF-8?Q?libobjc=20-=20more=20work=20on=20headers=20(2)?= From: "Nicola Pero" To: "gcc-patches@gnu.org" MIME-Version: 1.0 X-Type: plain Message-ID: <1286732622.636611434@192.168.2.229> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4-2.6 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Committed to trunk. Thanks 2010-10-10 Nicola Pero * objc/objc-api.h: Define Method, Method_t, Category and Category_t. Prevent including this file at the same time as objc/runtime.h. Updated comments. * objc/deprecated/struct_objc_method.h: Do not define Method, Method_t. * objc/deprecated/struct_objc_category.h: Do not define Category, Category_t. * objc-private/module-abi-8.h: New file containing a copy of all the structure definitions. Not used yet. * objc/encoding.h (objc_aligned_size): Removed duplicate declaration. Updated comments. * objc/runtime.h: Added Ivar, objc_property_t, Property, Method, Category, struct objc_method_description, _C_ID and similar, _C_CONST and similar and _F_CONST and similar. Added objc_sizeof_type, objc_alignof_type, objc_aligned_size, objc_promoted_size, objc_skip_type_qualifier, objc_skip_typespec, objc_skip_offset, objc_skip_argspec, objc_get_type_qualifiers, struct objc_struct_layout, objc_layout_structure, objc_layout_structure_next_member, objc_layout_finish_structure, objc_layout_structure_get_info. Prevent including this file at the same time as objc/objc-api.h. Index: objc-private/module-abi-8.h =================================================================== --- objc-private/module-abi-8.h (revision 0) +++ objc-private/module-abi-8.h (revision 0) @@ -0,0 +1,176 @@ +/* Definitions of Module Structures used by ABI version 8 + Copyright (C) 1993, 1995, 1996, 1997, 2001, 2002, 2003, 2004, 2005, + 2007, 2009, 2010 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 +. */ + +#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; /* Unknown. */ + SEL refs; /* Unknown. */ + 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. It + is a char*. The unique integer passed + to objc_msg_send is a char* too. It is + compared against method_name using + strcmp. */ + const char* method_types; /* Description of the method's parameter + list. Useful for debuggers. */ + 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. */ +}; + +struct objc_protocol_list +{ + struct objc_protocol_list *next; + size_t count; + Protocol *list[1]; +}; + +/* 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 */ Index: ChangeLog =================================================================== --- ChangeLog (revision 165249) +++ ChangeLog (working copy) @@ -1,5 +1,29 @@ 2010-10-10 Nicola Pero + * objc/objc-api.h: Define Method, Method_t, Category and + Category_t. Prevent including this file at the same time as + objc/runtime.h. Updated comments. + * objc/deprecated/struct_objc_method.h: Do not define Method, + Method_t. + * objc/deprecated/struct_objc_category.h: Do not define Category, + Category_t. + * objc-private/module-abi-8.h: New file containing a copy of all + the structure definitions. Not used yet. + * objc/encoding.h (objc_aligned_size): Removed duplicate + declaration. Updated comments. + * objc/runtime.h: Added Ivar, objc_property_t, Property, Method, + Category, struct objc_method_description, _C_ID and similar, + _C_CONST and similar and _F_CONST and similar. Added + objc_sizeof_type, objc_alignof_type, objc_aligned_size, + objc_promoted_size, objc_skip_type_qualifier, objc_skip_typespec, + objc_skip_offset, objc_skip_argspec, objc_get_type_qualifiers, + struct objc_struct_layout, objc_layout_structure, + objc_layout_structure_next_member, objc_layout_finish_structure, + objc_layout_structure_get_info. Prevent including this file at + the same time as objc/objc-api.h. + +2010-10-10 Nicola Pero + * Makefile.in (OBJC_DEPRECATED_H): Added struct_objc_category.h, struct_objc_ivar.h, struct_objc_ivar_list.h, struct_objc_method.h, struct_objc_method_list.h, struct_objc_module.h, Index: objc/deprecated/struct_objc_category.h =================================================================== --- objc/deprecated/struct_objc_category.h (revision 165253) +++ objc/deprecated/struct_objc_category.h (working copy) @@ -2,7 +2,7 @@ ** The compiler generates one of these structures for each category. A class ** may have many categories and contain both instance and factory methods. */ -typedef struct objc_category { +struct objc_category { const char* category_name; /* Name of the category. Name contained in the () of the category definition. */ @@ -18,4 +18,4 @@ class methods defined. */ struct objc_protocol_list *protocols; /* List of Protocols conformed to */ -} Category, *Category_t; +}; Index: objc/deprecated/struct_objc_method.h =================================================================== --- objc/deprecated/struct_objc_method.h (revision 165253) +++ objc/deprecated/struct_objc_method.h (working copy) @@ -6,7 +6,7 @@ ** and categories can break them across modules. To handle this problem is a ** singly linked list of methods. */ -typedef struct objc_method { +struct objc_method { SEL method_name; /* This variable is the method's name. It is a char*. The unique integer passed to @@ -18,4 +18,5 @@ debuggers. */ IMP method_imp; /* Address of the method in the executable. */ -} Method, *Method_t; +}; + Index: objc/runtime.h =================================================================== --- objc/runtime.h (revision 165249) +++ objc/runtime.h (working copy) @@ -41,16 +41,112 @@ see the files COPYING3 and COPYING.RUNTIME respect Objective-C Runtime API) or objc/runtime.h (to use the modern GNU Objective-C Runtime API), but not both. */ -/* #ifdef __objc_api_INCLUDE_GNU # error You can not include both objc/objc-api.h and objc/runtime.h. Include objc/objc-api.h for the traditional GNU Objective-C Runtime API and objc/runtime.h for the modern one. #endif -*/ /* TODO: This file is incomplete. */ #include "objc.h" +/* An 'Ivar' represents an instance variable. It holds information + about the name, type and offset of the instance variable. */ +typedef struct objc_ivar *Ivar; + +/* A 'Property' represents a property. It holds information about the + name of the property, and its attributes. + + Compatibility Note: the Apple/NeXT runtime defines this as + objc_property_t, so we define it that way as well, but obviously + Property is the right name. */ +typedef struct objc_property *Property; +typedef struct objc_property *objc_property_t; + +/* A 'Method' represents a method. It holds information about the + name, types and the IMP of the method. */ +typedef struct objc_method *Method; + +/* A 'Category' represents a category. It holds information about the + name of the category, the class it belongs to, and the methods, + protocols and such like provided by the category. */ +typedef struct objc_category *Category; + +/* 'Protocol' is defined in objc/objc.h (which is included by this + file). */ + +/* Method descriptor returned by introspective Object methods. At the + moment, this is really just the first part of the more complete + objc_method structure used internally by the runtime. (PS: In the + GNU Objective-C Runtime, selectors already include a type, so an + objc_method_description does not add much to a SEL. But in other + runtimes, that is not the case, which is why + objc_method_description exists). */ +struct objc_method_description +{ + SEL name; /* Selector (name and signature) */ + char *types; /* Type encoding */ +}; + +/* The following are used in encode strings to describe the type of + Ivars and Methods. */ +#define _C_ID '@' +#define _C_CLASS '#' +#define _C_SEL ':' +#define _C_CHR 'c' +#define _C_UCHR 'C' +#define _C_SHT 's' +#define _C_USHT 'S' +#define _C_INT 'i' +#define _C_UINT 'I' +#define _C_LNG 'l' +#define _C_ULNG 'L' +#define _C_LNG_LNG 'q' +#define _C_ULNG_LNG 'Q' +#define _C_FLT 'f' +#define _C_DBL 'd' +#define _C_LNG_DBL 'D' +#define _C_BFLD 'b' +#define _C_BOOL 'B' +#define _C_VOID 'v' +#define _C_UNDEF '?' +#define _C_PTR '^' +#define _C_CHARPTR '*' +#define _C_ARY_B '[' +#define _C_ARY_E ']' +#define _C_UNION_B '(' +#define _C_UNION_E ')' +#define _C_STRUCT_B '{' +#define _C_STRUCT_E '}' +#define _C_VECTOR '!' +#define _C_COMPLEX 'j' + +/* _C_ATOM is never generated by the compiler. You can treat it as + equivalent to "*". */ +#define _C_ATOM '%' + +/* The following are used in encode strings to describe some + qualifiers of method and ivar types. */ +#define _C_CONST 'r' +#define _C_IN 'n' +#define _C_INOUT 'N' +#define _C_OUT 'o' +#define _C_BYCOPY 'O' +#define _C_BYREF 'R' +#define _C_ONEWAY 'V' +#define _C_GCINVISIBLE '|' + +/* The same when used as flags. */ +#define _F_CONST 0x01 +#define _F_IN 0x01 +#define _F_OUT 0x02 +#define _F_INOUT 0x03 +#define _F_BYCOPY 0x04 +#define _F_BYREF 0x08 +#define _F_ONEWAY 0x10 +#define _F_GCINVISIBLE 0x20 + +/* TODO: Add all the functions in the API. */ + /* 'objc_enumerationMutation()' is called when a collection is mutated while being "fast enumerated". That is a hard error, and objc_enumerationMutation is called to deal with it. 'collection' @@ -102,4 +198,105 @@ struct __objcFastEnumerationState }; */ + +/* Traditional GNU Objective-C Runtime functions that are currently + used to implement method forwarding. +*/ + +/* Return the size of a variable which has the specified 'type' + encoding. */ +int objc_sizeof_type (const char *type); + +/* Return the align of a variable which has the specified 'type' + encoding. */ +int objc_alignof_type (const char *type); + +/* Return the aligned size of a variable which has the specified + 'type' encoding. The aligned size is the size rounded up to the + nearest alignment. */ +int objc_aligned_size (const char *type); + +/* Return the promoted size of a variable which has the specified + 'type' encoding. This is the size rounded up to the nearest + integral of the wordsize, taken to be the size of a void *. */ +int objc_promoted_size (const char *type); + + +/* The following functions are used when parsing the type encoding of + methods, to skip over parts that are ignored. They take as + argument a pointer to a location inside the type encoding of a + method (which is a string) and return a new pointer, pointing to a + new location inside the string after having skipped the unwanted + information. */ + +/* Skip some type qualifiers (_C_CONST, _C_IN, etc). These may + eventually precede typespecs occurring in method prototype + encodings. */ +const char *objc_skip_type_qualifiers (const char *type); + +/* Skip one typespec element (_C_CLASS, _C_SEL, etc). If the typespec + is prepended by type qualifiers, these are skipped as well. */ +const char *objc_skip_typespec (const char *type); + +/* Skip an offset. */ +const char *objc_skip_offset (const char *type); + +/* Skip an argument specification (ie, skipping a typespec, which may + include qualifiers, and an offset too). */ +const char *objc_skip_argspec (const char *type); + +/* Read type qualifiers (_C_CONST, _C_IN, etc) from string 'type' + (stopping at the first non-type qualifier found) and return an + unsigned int which is the logical OR of all the corresponding flags + (_F_CONST, _F_IN etc). */ +unsigned objc_get_type_qualifiers (const char *type); + + +/* Note that the following functions work for very simple structures, + but get easily confused by more complicated ones (for example, + containing vectors). A better solution is required. +*/ + +/* The following three functions can be used to determine how a + structure is laid out by the compiler. For example: + + struct objc_struct_layout layout; + int i; + + objc_layout_structure (type, &layout); + while (objc_layout_structure_next_member (&layout)) + { + int position, align; + const char *type; + + objc_layout_structure_get_info (&layout, &position, &align, &type); + printf ("element %d has offset %d, alignment %d\n", + i++, position, align); + } + + These functions are used by objc_sizeof_type and objc_alignof_type + functions to compute the size and alignment of structures. The + previous method of computing the size and alignment of a structure + was not working on some architectures, particulary on AIX, and in + the presence of bitfields inside the structure. */ +struct objc_struct_layout +{ + const char *original_type; + const char *type; + const char *prev_type; + unsigned int record_size; + unsigned int record_align; +}; + +void objc_layout_structure (const char *type, + struct objc_struct_layout *layout); +BOOL objc_layout_structure_next_member (struct objc_struct_layout *layout); +void objc_layout_finish_structure (struct objc_struct_layout *layout, + unsigned int *size, + unsigned int *align); +void objc_layout_structure_get_info (struct objc_struct_layout *layout, + unsigned int *offset, + unsigned int *align, + const char **type); + #endif Index: objc/objc-api.h =================================================================== --- objc/objc-api.h (revision 165249) +++ objc/objc-api.h (working copy) @@ -41,11 +41,9 @@ see the files COPYING3 and COPYING.RUNTIME respect Objective-C Runtime API) or objc/runtime.h (to use the modern GNU Objective-C Runtime API), but not both. */ -/* #ifdef __objc_runtime_INCLUDE_GNU # error You can not include both objc/objc-api.h and objc/runtime.h. Include objc/objc-api.h for the traditional GNU Objective-C Runtime API and objc/runtime.h for the modern one. #endif -*/ #include "objc.h" #ifndef GNU_LIBOBJC_COMPILING_LIBOBJC_ITSELF @@ -71,7 +69,8 @@ struct objc_method_description char *types; /* type encoding */ }; -/* Filer types used to describe Ivars and Methods. */ +/* The following are used in encode strings to describe the type of + Ivars and Methods. */ #define _C_ID '@' #define _C_CLASS '#' #define _C_SEL ':' @@ -103,12 +102,10 @@ struct objc_method_description #define _C_VECTOR '!' #define _C_COMPLEX 'j' -/* The following one is never generated by the compiler. You can - treat it as equivalent to "*". -*/ +/* _C_ATOM is never generated by the compiler. You can treat it as + equivalent to "*". */ #define _C_ATOM '%' - #include "deprecated/objc_error.h" #include "deprecated/struct_objc_static_instances.h" @@ -117,6 +114,8 @@ struct objc_method_description #include "deprecated/struct_objc_ivar.h" #include "deprecated/struct_objc_ivar_list.h" #include "deprecated/struct_objc_method.h" +typedef struct objc_method Method, *Method_t; + #include "deprecated/struct_objc_method_list.h" #include "deprecated/struct_objc_protocol_list.h" @@ -169,9 +168,11 @@ struct objc_method_description #include "deprecated/struct_objc_category.h" +typedef struct objc_category Category, *Category_t; + /* We include message.h for compatibility with the old objc-api.h which included the declarations currently in message.h. The - Apple/NeXT runtime does not do this and only include message.h in + Apple/NeXT runtime does not do this and only includes message.h in objc-runtime.h. It does not matter that much since most of the definitions in message.h are runtime-specific. */ #include "message.h" Index: objc/encoding.h =================================================================== --- objc/encoding.h (revision 165248) +++ objc/encoding.h (working copy) @@ -28,6 +28,12 @@ see the files COPYING3 and COPYING.RUNTIME respect #ifndef __encoding_INCLUDE_GNU #define __encoding_INCLUDE_GNU +/* This file is to be used with the "traditional" GNU Objective-C + Runtime API (the one declared in objc/objc-api.h). If you are + using the "modern" GNU Objective-C Runtime API, then the useful + functions from this file are declared in objc/runtime.h. +*/ + #include "objc-api.h" #include @@ -35,6 +41,8 @@ see the files COPYING3 and COPYING.RUNTIME respect extern "C" { #endif /* __cplusplus */ +/* The following are used in encode strings to describe some + qualifiers of method and ivar types. */ #define _C_CONST 'r' #define _C_IN 'n' #define _C_INOUT 'N' @@ -44,6 +52,7 @@ extern "C" { #define _C_ONEWAY 'V' #define _C_GCINVISIBLE '|' +/* The same when used as flags. */ #define _F_CONST 0x01 #define _F_IN 0x01 #define _F_OUT 0x02 @@ -53,7 +62,6 @@ extern "C" { #define _F_ONEWAY 0x10 #define _F_GCINVISIBLE 0x20 -int objc_aligned_size (const char *type); int objc_sizeof_type (const char *type); int objc_alignof_type (const char *type); int objc_aligned_size (const char *type);