public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Defining a libobjc.so.2 ABI
@ 2010-02-24 15:10 Rainer Orth
  2010-02-24 16:09 ` Andreas Schwab
  0 siblings, 1 reply; 3+ messages in thread
From: Rainer Orth @ 2010-02-24 15:10 UTC (permalink / raw)
  To: gcc

After I'm done with supporting Sun symbol versioning in the currently
versioned GCC runtime libraries, I've started investigating versioning
the remaining unversioned ones.

One of them is libobjc.so.4.  To start, I've looked at the global symbols
in the library with

$ nm -Pgn libobjc.so.4 | awk '$2 !~ /U/ {print $1}'

on i386-pc-solaris2.11.  Here's what I found:

__bss_start 				generated by ld
__gnu_objc_personality_v0 		EH support (public)
__objc_add_class_to_hash 		runtime.h (internal)
__objc_class_links_resolved 		runtime.h (internal)
__objc_class_name_NXConstantString	objc-act.c (public)
__objc_class_name_Object 	     	objc-act.c? (public)
__objc_class_name_Protocol 		objc-act.c (public)
__objc_close_thread_system 		thr.h (internal)
					__objc_fini_thread_system
__objc_condition_allocate 		thr.h (internal)
__objc_condition_broadcast 		thr.h (internal)
__objc_condition_deallocate 		thr.h (internal)
__objc_condition_signal  		thr.h (internal)
__objc_condition_wait 			thr.h (internal)
__objc_dangling_categories 		init.c (unused?)
__objc_exec_class			objc-act.c (public?)
__objc_force_linking 			init.c (internal?)
__objc_generate_gc_type_description	runtime.h (internal)
__objc_get_forward_imp 	        	sendmsg.c (internal?)
__objc_init_class_tables		runtime.h (internal)
__objc_init_dispatch_tables 		runtime.h (internal)
__objc_init_selector_tables 		runtime.h (internal)
__objc_init_thread_system 		runtime.h (internal)
					thr.h (internal)
__objc_install_premature_dtable 	runtime.h (internal)
__objc_is_multi_threaded 	 	thr.c (internal)
__objc_linking 	   			linking.m (internal)
__objc_msg_forward			objc-api.h (public)
__objc_msg_forward2 			objc-api.h (public)
__objc_mutex_allocate			thr.h (internal)
__objc_mutex_deallocate 		thr.h (internal)
__objc_mutex_lock 	 		thr.h (internal)
__objc_mutex_trylock 			thr.h (internal)
__objc_mutex_unlock 			thr.h (internal)
__objc_object_alloc			objects.c (internal)
__objc_object_copy 			objects.c (internal)
__objc_object_dispose 			objects.c (internal)
__objc_print_dtable_stats 		runtime.h (internal)
__objc_read_nbyte_uint 			archive.c (internal)
__objc_read_nbyte_ulong 		archive.c (internal)
__objc_register_instance_methods_to_class runtime.h (internal)
__objc_register_selectors_from_class	runtime.h (internal)
__objc_register_selectors_from_list	runtime.h (internal)
__objc_resolve_class_links 	     	runtime.h (internal)
__objc_responds_to 	   		runtime.h (internal)
__objc_runtime_mutex 			runtime.h (internal)
__objc_runtime_threads_alive 		runtime.h (internal)
__objc_selector_max_index		runtime.h (internal)
__objc_sparse2_id 	    		sarray.h (internal)
__objc_thread_detach 			thr.h (internal)
__objc_thread_exit 			thr.h (internal)
__objc_thread_exit_status 		thr.h (internal)
__objc_thread_get_data			thr.h (internal)
__objc_thread_get_priority		thr.h (internal)
__objc_thread_id 	    		thr.h (internal)
__objc_thread_set_data 			thr.h (internal)
__objc_thread_set_priority		thr.h (internal)
__objc_thread_yield    			thr.h (internal)
__objc_uninstalled_dtable 		sendmsg.c (internal)
__objc_update_dispatch_table_for_class 	sendmsg.c (internal)
__objc_write_class 			archive.c (internal)
__objc_write_object 			archive.c (internal)
__objc_write_selector 			archive.c (internal)
__sel_register_typed_name 		selector.c (internal)
_edata  				generated by ld
_end  				        generated by ld
_etext  				generated by ld
_fini  					generated by ld
_init  					generated by ld
_lib_version                            imported from values-*.o
_objc_atomic_malloc			objc-api.h (public)
_objc_became_multi_threaded 		thr.c (public, but undeclared)
_objc_calloc				objc-api.h (public)
_objc_free 				objc-api.h (public)
_objc_load_callback			objc-api.h (public)
_objc_lookup_class 			objc-api.h (public)
_objc_malloc     			objc-api.h (public)
_objc_object_alloc			objc-api.h (public)
_objc_object_copy 			objc-api.h (public)
_objc_object_dispose 			objc-api.h (public)
_objc_realloc      			objc-api.h (public)
_objc_unexpected_exception 		objc-api.h (public)
_objc_valloc 	     			objc-api.h (public)
class_add_method_list 			runtime.h (internal)
class_create_instance 			objc-api.h (public)
class_get_class_method 			objc-api.h (public)
class_get_instance_method 		objc-api.h (public)
class_ivar_set_gcinvisible 		objc-api.h (public)
class_pose_as				objc-api.h (public)
get_imp 				objc-api.h (public)
idxsize 				sarray.c (internal)
method_get_first_argument		encoding.h (public)
method_get_next_argument 		encoding.h (public)
method_get_nth_argument 		encoding.h (public)
method_get_number_of_arguments 		encoding.h (public)
method_get_sizeof_arguments 		encoding.h (public)
narrays 	  	     		sarray.c (internal)
nbuckets 				sarray.c (internal)
nil_method				nil_method.c (internal?)
nindices 				sarray.c (internal)
objc_aligned_size			encoding.h (public)
objc_alignof_type 			encoding.h (public)
objc_atomic_malloc 			objc-api.h (public)
objc_calloc     			objc-api.h (public)
objc_close_typed_stream 		typedstream.h (public)
objc_condition_allocate 		thr.h (public)
objc_condition_broadcast 		thr.h (public)
objc_condition_deallocate		thr.h (public)
objc_condition_signal  			thr.h (public)
objc_condition_wait			thr.h (public)
objc_end_of_typed_stream		typedstream.h (public)
objc_error 		  		objc-api.h (public)
objc_exception_throw 			exception.c (public)
		 			objc-act.c (public?)
objc_flush_typed_stream			typedstream.h (public)
objc_free				objc-api.h (public)
objc_get_class 				objc-api.h (public)
objc_get_meta_class 			class.c (public?)
objc_get_stream_class_version 		typedstream.h (public)
objc_get_type_qualifiers   		encoding.h (public)
objc_get_uninstalled_dtable 		objc-api.h (public)
objc_hash_add 	     			hash.h (public)
objc_hash_delete 			hash.h (public)
objc_hash_is_key_in_hash 		hash.h (public)
objc_hash_new 	  			hash.h (public)
objc_hash_next 				hash.h (public)
objc_hash_remove 			hash.h (public)
objc_hash_value_for_key 		hash.h (public)
objc_layout_finish_structure 		encoding.h (public)
objc_layout_structure			encoding.h (public)
objc_layout_structure_get_info 		encoding.h (public)
objc_layout_structure_next_member	encoding.h (public)
objc_lookup_class 			objc-api.h (public)
objc_malloc    				objc-api.h (public)
objc_msg_lookup 			objc.h (public)
objc_msg_lookup_super 			objc-api.h (public)
objc_msg_sendv    			objc-api.h (public)
objc_mutex_allocate 			thr.h (public)
objc_mutex_deallocate 			thr.h (public)
objc_mutex_lock    			thr.h (public)
objc_mutex_trylock 			thr.h (public)
objc_mutex_unlock 			thr.h (public)
objc_next_class 			objc-api.h (public)
objc_open_typed_stream 			typedstream.h (public)
objc_open_typed_stream_for_file 	typedstream.h (public)
objc_promoted_size 		 	encoding.h (public)
objc_read_array  		 	typedstream.h (public)
objc_read_char  		 	archive.c (public?)
objc_read_int  		 		archive.c (public?)
objc_read_long  		 	archive.c (public?)
objc_read_object  		 	typedstream.h (public)
objc_read_selector  			archive.c (public?)
objc_read_short  		 	archive.c (public?)
objc_read_string  		 	archive.c (public?)
objc_read_type  		 	typedstream.h (public)
objc_read_types  		 	typedstream.h (public)
objc_read_unsigned_char  		archive.c (public?)
objc_read_unsigned_int  		archive.c (public?)
objc_read_unsigned_long  		archive.c (public?)
objc_read_unsigned_short  		archive.c (public?)
objc_realloc  		 		objc-api.h (public)
objc_set_error_handler 			objc-api.h (public)
objc_set_thread_callback		thr.h (public)
objc_sizeof_type  		 	encoding.h (public)
objc_skip_argspec  		 	encoding.h (public)
objc_skip_offset  		 	encoding.h (public)
objc_skip_type_qualifiers  		encoding.h (public)
objc_skip_typespec  			encoding.h (public)
objc_thread_add  		 	thr.h (public)
objc_thread_detach  			thr.h (public)
objc_thread_exit  		 	thr.h (public)
objc_thread_get_data  			thr.h (public)
objc_thread_get_priority  		thr.h (public)
objc_thread_id  		 	thr.h (public)
objc_thread_remove  			thr.h (public)
objc_thread_set_data  			thr.h (public)
objc_thread_set_priority  		thr.h (public)
objc_thread_yield  		 	thr.h (public)
objc_valloc  		 		objc-api.h (public)
objc_verror  		 		objc-api.h (public)
objc_write_array  		 	typedstream.h (public)
objc_write_char  		 	archive.c (public?)
objc_write_int  		 	archive.c (public?)
objc_write_long  		 	archive.c (public?)
objc_write_object  		 	typedstream.h (public)
objc_write_object_reference  		typedstream.h (public)
objc_write_root_object 			typedstream.h (public)
objc_write_selector 			archive.c (public?)
objc_write_short 			archive.c (public?)
objc_write_string 			archive.c (public?)
objc_write_string_atomic 		archive.c (public?)
objc_write_type 	  		typedstream.h (public)
objc_write_types 			typedstream.h (public)
objc_write_unsigned_char 		archive.c (public?)
objc_write_unsigned_int 		archive.c (public?)
objc_write_unsigned_long 		archive.c (public?)
objc_write_unsigned_short 		archive.c (public?)
object_copy 	   			objc-api.h (public)
object_dispose 				objc-api.h (public)
sarray_at_put 				sarray.h (public)
sarray_at_put_safe 			sarray.h (public)
sarray_free 				sarray.h (public)
sarray_lazy_copy 			sarray.h (public)
sarray_new 				sarray.h (public)
sarray_realloc 				sarray.h (public)
sarray_remove_garbage 			sarray.h (public)
search_for_method_in_list 		runtime.h (internal)
sel_get_any_typed_uid 			objc-api.h (public)
sel_get_any_uid 			objc-api.h (public)
sel_get_name 				objc-api.h (public)
sel_get_type 				objc-api.h (public)
sel_get_typed_uid 			objc-api.h (public)
sel_get_uid 				objc-api.h (public)
sel_is_mapped 				objc-api.h (public)
sel_register_name 			objc-api.h (public)
sel_register_typed_name 		objc-api.h (public)
sel_types_match 			selector.c (private?)

Apart from the compiler/linker generated stuff, we're left with several
groups of functions:

* Those documented in public/installed header files and not mentioned as
  internal/implementation details there.  They are marked as public in
  the list above.

* Those documented in public/installed header files, but marked as
  internal/implemention details there, or only documented in runtime.h,
  which isn't installed and thus not public.  Marked as internal above.

* Some implementation details which are not user-callable, but need to
  be exported nonetheless (like the stuff from gcc/objc/objc-act.c
  above, plus __gnu_objc_personality_v0, needed for exception handling
  support).  I'm not sure about __objc_exec_class, though: it would be
  best if someone knowledgable about the GNU Objective-C implementation
  could augment the draft mapfile below with an appropriate
  documentation.  I've moved those to a separate OBJCABI_1.0 (probably
  better named GOBCJABI_1.0) version, since they are not part of the
  public interface.

* Several global variables are obviously implementation details, and
  thus not part of the ABI (e.g. idxsize, narrays, nbuckets, nindices).

* A couple of unclear cases:

** _objc_became_multi_threaded is defined in thr.c.  From the comment,
   it is intended to be public, but is missing from thr.h.  Should
   probably just be added to the header.

** nil_method is defined in nil_method.c.  I cannot say for sure if this
   should be public.

** objc_get_meta_class is defined in class.c.  Again, I don't know if
   this should be part of the ABI.

** There are a number of objc_read_* and objc_write_* functions in
   archive.c, but they are missing from typedstream.h.  I suppose they
   are just implementation details of the public functions, but would
   like to get confirmation for that.

** sel_types_matches is defined in selector.c.  I've no idea if this
   should be public.

My current findings are documented in the draft mapfile below.  I've
used this to rebuild libobjc.so.2 and rerun make check-objc successfully
on i386-pc-solaris2.11, so it seems to be basically sound.  Before
proceeding with a proper implementation within a new GCC symbol
versioning `framework', I'd like to get confirmation that this is
sensible.  Especially, I need answers to my questions about unclear
functions above.

Is there any public documentation of the libobjc API available anywhere?
libobjc/README mentions one that has never become available.

It would probably wise to check this against users of libobjc like
GNUStep.

	Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


# FIXME:
# * Naming, as always.
# * API documentation?
# * Check users like GNUStep.

# GNU libobjc.so public interface.
OBJC_2.0 {
  global:
    # <objc/encoding.h>
    method_get_first_argument;
    method_get_next_argument;
    method_get_nth_argument;
    method_get_number_of_arguments;
    method_get_sizeof_arguments;
    objc_aligned_size;
    objc_alignof_type;
    objc_get_type_qualifiers;
    objc_layout_finish_structure;
    objc_layout_structure;
    objc_layout_structure_get_info;
    objc_layout_structure_next_member;
    objc_promoted_size;
    objc_sizeof_type;
    objc_skip_argspec;
    objc_skip_offset;
    objc_skip_type_qualifiers;
    objc_skip_typespec;

    # <objc/hash.h>
    objc_hash_add;
    objc_hash_delete;
    objc_hash_is_key_in_hash;
    objc_hash_new;
    objc_hash_next;
    objc_hash_remove;
    objc_hash_value_for_key;

    # <objc/objc-api.h>
    __objc_msg_forward;
    __objc_msg_forward2;
    _objc_atomic_malloc;
    _objc_calloc;
    _objc_free;
    _objc_load_callback;
    _objc_lookup_class;
    _objc_malloc;
    _objc_object_alloc;
    _objc_object_copy;
    _objc_object_dispose;
    _objc_realloc;
    _objc_unexpected_exception;
    _objc_valloc;
    class_create_instance;
    class_get_class_method;
    class_get_instance_method;
    class_ivar_set_gcinvisible;
    class_pose_as;
    get_imp;
    objc_atomic_malloc;
    objc_calloc;
    objc_error;
    objc_free;
    objc_get_class;
    # FIXME: Currently undeclared.
    objc_get_meta_class;
    objc_get_uninstalled_dtable;
    objc_lookup_class;
    objc_malloc;
    objc_msg_lookup_super;
    objc_msg_sendv;
    objc_next_class;
    objc_realloc;
    objc_set_error_handler;
    objc_valloc;
    objc_verror;
    object_copy;
    object_dispose;
    sel_get_any_typed_uid;
    sel_get_any_uid;
    sel_get_name;
    sel_get_type;
    sel_get_typed_uid;
    sel_get_uid;
    sel_is_mapped;
    sel_register_name;
    sel_register_typed_name;
    # FIXME: Currently undeclared, private?
    sel_types_match;

    # <objc/objc.h>
    objc_hash_add;
    objc_hash_delete;
    objc_hash_is_key_in_hash;
    objc_hash_new;
    objc_hash_next;
    objc_hash_remove;
    objc_hash_value_for_key;
    objc_msg_lookup;

    # <objc/sarray.h>
    sarray_at_put;
    sarray_at_put_safe;
    sarray_free;
    sarray_lazy_copy;
    sarray_new;
    sarray_realloc;
    sarray_remove_garbage;

    # <objc/thr.h>
    # FIXME: Currently undeclared.
    _objc_became_multi_threaded;
    objc_condition_allocate;
    objc_condition_broadcast;
    objc_condition_deallocate;
    objc_condition_signal;
    objc_condition_wait;
    objc_mutex_allocate;
    objc_mutex_deallocate;
    objc_mutex_lock;
    objc_mutex_trylock;
    objc_mutex_unlock;
    objc_set_thread_callback;
    objc_thread_add;
    objc_thread_detach;
    objc_thread_exit;
    objc_thread_get_data;
    objc_thread_get_priority;
    objc_thread_id;
    objc_thread_remove;
    objc_thread_set_data;
    objc_thread_set_priority;
    objc_thread_yield;

    # <objc/typedstream.h>
    objc_close_typed_stream;
    objc_end_of_typed_stream;
    objc_flush_typed_stream;
    objc_get_stream_class_version;
    objc_open_typed_stream;
    objc_open_typed_stream_for_file;
    objc_read_array;
    objc_read_object;
    objc_read_type;
    objc_read_types;
    objc_write_array;
    objc_write_object;
    objc_write_object_reference;
    objc_write_root_object;
    objc_write_type;
    objc_write_types;
    # FIXME: Currently undeclared to end of block.
    # Perhaps rather private?
    objc_read_char;
    objc_read_int;
    objc_read_long;
    objc_read_selector;
    objc_read_short;
    objc_read_string;
    objc_read_unsigned_char;
    objc_read_unsigned_int;
    objc_read_unsigned_long;
    objc_read_unsigned_short;
    objc_write_char;
    objc_write_int;
    objc_write_long;
    objc_write_selector;
    objc_write_short;
    objc_write_string;
    objc_write_string_atomic;
    objc_write_unsigned_char;
    objc_write_unsigned_int;
    objc_write_unsigned_long;
    objc_write_unsigned_short;
  local:
    *;
};

# Private stuff for the GNU Objective-C implementation.
# FIXME: More than this?
# FIXME: Explain uses.
OBJCABI_1.0 {
  global:
    # Objective-C  personality function for exception handling.
    __gnu_objc_personality_v0;
    # FIXME: Cf. objc/objc-act.c.
    __objc_class_name_NXConstantString;
    __objc_class_name_Object;
    __objc_class_name_Protocol;
    # FIXME: Cf. objc/objc-act.c.
    __objc_exec_class;
    # FIXME: Cf. objc/objc-act.c.
    objc_exception_throw;
};

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Defining a libobjc.so.2 ABI
  2010-02-24 15:10 Defining a libobjc.so.2 ABI Rainer Orth
@ 2010-02-24 16:09 ` Andreas Schwab
  2010-03-01 20:31   ` Rainer Orth
  0 siblings, 1 reply; 3+ messages in thread
From: Andreas Schwab @ 2010-02-24 16:09 UTC (permalink / raw)
  To: Rainer Orth; +Cc: gcc

Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes:

> * Several global variables are obviously implementation details, and
>   thus not part of the ABI (e.g. idxsize, narrays, nbuckets, nindices).

They should probably be renamed to be namespace-clean.

Andreas.

-- 
Andreas Schwab, schwab@redhat.com
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84  5EC7 45C6 250E 6F00 984E
"And now for something completely different."

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Defining a libobjc.so.2 ABI
  2010-02-24 16:09 ` Andreas Schwab
@ 2010-03-01 20:31   ` Rainer Orth
  0 siblings, 0 replies; 3+ messages in thread
From: Rainer Orth @ 2010-03-01 20:31 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: gcc

Andreas Schwab <schwab@redhat.com> writes:

> Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes:
>
>> * Several global variables are obviously implementation details, and
>>   thus not part of the ABI (e.g. idxsize, narrays, nbuckets, nindices).
>
> They should probably be renamed to be namespace-clean.

Right, probably something like __objc_<var>.  This way, even targets
without symbol versioning can benefit.

Any other comments on the proposed ABI?

	Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-03-01 20:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-24 15:10 Defining a libobjc.so.2 ABI Rainer Orth
2010-02-24 16:09 ` Andreas Schwab
2010-03-01 20:31   ` Rainer Orth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).