+2005-03-14 Matthias Clasen <mclasen@redhat.com>
+
+ Make PLT-reduction work with gcc4, and don't include
+ everything in gobjectalias.h:
+
+ * gobject.symbols: Group symbols by header and source
+ file.
+ * makegobjectalias.pl: Protect definitions by the same
+ preprocessor symbols used to guard the headers. Move
+ the alias declarations to a separate file which is
+ produced when calling makegalias.pl -def
+ * Makefile.am (gobjectaliasdef.c): Add a rule to
+ build this file.
+ * *.c: Include gobjectalias.h after the other i
+ GLib headers, include gobjectaliasdef.c at the bottom.
+
2005-03-08 Matthias Clasen <mclasen@redhat.com>
* gobject.symbols: Add the new attributes here, too.
-DG_DISABLE_CONST_RETURNS
gobject.def: gobject.symbols
- (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 - <$(srcdir)/gobject.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g' | sort) > gobject.def
+ (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/gobject.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g' | sort) > gobject.def
gobjectalias.h: gobject.symbols
$(PERL) $(srcdir)/makegobjectalias.pl < $(srcdir)/gobject.symbols > gobjectalias.h
+gobjectaliasdef.c: gobject.symbols
+ $(PERL) $(srcdir)/makegobjectalias.pl -def < $(srcdir)/gobject.symbols > gobjectaliasdef.c
+
if OS_LINUX
if HAVE_GNUC_VISIBILITY
TESTS = abicheck.sh
gvaluetypes.c
# these sources (also mentioned above) are generated.
-BUILT_SOURCES = gmarshal.h gmarshal.c gobjectalias.h
+BUILT_SOURCES = gmarshal.h gmarshal.c gobjectalias.h gobjectaliasdef.c
# non-header sources (headers should be specified in the above variables)
# that don't serve as direct make target sources, i.e. they don't have
INCLUDES="-include ${top_builddir:-..}/config.h"
INCLUDES="$INCLUDES -include glibconfig.cpp"
-cpp -P $INCLUDES ${srcdir:-.}/gobject.symbols | sed -e '/^$/d' -e 's/ G_GNUC.*$//' -e 's/ PRIVATE$//' | sort > expected-abi
+cpp -P $INCLUDES -DALL_FILES ${srcdir:-.}/gobject.symbols | sed -e '/^$/d' -e 's/ G_GNUC.*$//' -e 's/ PRIVATE$//' | sort > expected-abi
rm glibconfig.cpp
nm -D .libs/libgobject-2.0.so | grep " T " | cut -d ' ' -f 3 | sort > actual-abi
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#include "gobjectalias.h"
#include "gboxed.h"
#include "gbsearcharray.h"
#include "gclosure.h"
#include "gvaluecollector.h"
+#include "gobjectalias.h"
+
#include <string.h>
/* --- typedefs & structures --- */
value_set_boxed_internal (value, boxed, FALSE, TRUE);
}
+
+#define __G_BOXED_C__
+#include "gobjectaliasdef.c"
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#include "gobjectalias.h"
#include "gclosure.h"
#include "gvalue.h"
+#include "gobjectalias.h"
#include <string.h>
return closure;
}
+
+#define __G_CLOSURE_C__
+#include "gobjectaliasdef.c"
#include <string.h>
-#include "gobjectalias.h"
#include "genums.h"
#include "gvalue.h"
#include "gvaluecollector.h"
+#include "gobjectalias.h"
+
/* --- prototypes --- */
static void g_enum_class_init (GEnumClass *class,
return value->data[0].v_ulong;
}
+
+#define __G_ENUMS_C__
+#include "gobjectaliasdef.c"
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#include "gobjectalias.h"
#include "gobject.h"
+#include "gobjectalias.h"
/*
* MT safe
return closure;
}
+
+#define __G_OBJECT_C__
+#include "gobjectaliasdef.c"
+/* This file lists all exported symbols. It is used to generate
+ * the gobject.def file used to control exports on Windows and the
+ * gobjectalias.h/gobjectaliasdef.c files used to avoid PLT entries for
+ * internal uses of exported functions (see makegobjectalias.pl).
+ *
+ * Every symbol must be included in the right
+ * #ifdef IN_HEADER(sym) #endif and
+ * #ifdef IN_FILE(sym) #endif sections.
+ */
+#ifdef ALL_FILES
+#define IN_FILE(x) 1
+#define IN_HEADER(x) 1
+#endif
+#if IN_HEADER(__G_BOXED_H__)
+#if IN_FILE(__G_BOXED_C__)
g_boxed_copy
g_boxed_free
g_boxed_type_register_static
+g_gstring_get_type G_GNUC_CONST
+g_strv_get_type G_GNUC_CONST
+g_closure_get_type G_GNUC_CONST
+g_value_get_type G_GNUC_CONST
+g_value_array_get_type G_GNUC_CONST
+g_value_set_boxed
+g_value_take_boxed
+g_value_dup_boxed
+g_value_get_boxed
+g_value_set_static_boxed
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_boxed_take_ownership
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_MARSHAL_H__)
+#if IN_FILE(__G_SIGNAL_C__)
g_cclosure_marshal_BOOLEAN__FLAGS
g_cclosure_marshal_STRING__OBJECT_POINTER
g_cclosure_marshal_VOID__BOOLEAN
g_cclosure_marshal_VOID__UINT_POINTER
g_cclosure_marshal_VOID__ULONG
g_cclosure_marshal_VOID__VOID
+#endif
+#endif
+
+#if IN_HEADER(__G_CLOSURE_H__)
+#if IN_FILE(__G_CLOSURE_C__)
g_cclosure_new
-g_cclosure_new_object
-g_cclosure_new_object_swap
g_cclosure_new_swap
g_closure_add_finalize_notifier
g_closure_add_invalidate_notifier
g_closure_add_marshal_guards
-g_closure_get_type G_GNUC_CONST
g_closure_invalidate
g_closure_invoke
-g_closure_new_object
g_closure_new_simple
g_closure_ref
g_closure_remove_finalize_notifier
g_closure_set_meta_marshal
g_closure_sink
g_closure_unref
+g_signal_type_cclosure_new
+#endif
+#endif
+
+#if IN_HEADER(__G_ENUMS_H__)
+#if IN_FILE(__G_ENUMS_C__)
g_enum_complete_type_info
g_enum_get_value
g_enum_get_value_by_name
g_flags_get_value_by_name
g_flags_get_value_by_nick
g_flags_register_static
-g_gstring_get_type G_GNUC_CONST
+g_value_set_enum
+g_value_set_flags
+g_value_get_enum
+g_value_get_flags
+#endif
+#endif
+
+#if IN_HEADER(__G_SOURCECLOSURE_H__)
+#if IN_FILE(__G_SOURCECLOSURE_C__)
g_io_channel_get_type
g_io_condition_get_type
+g_source_set_closure
+#endif
+#endif
+
+#if IN_HEADER(__G_OBJECT_H__)
+#if IN_FILE(__G_OBJECT_C__)
+g_cclosure_new_object
+g_cclosure_new_object_swap
+g_closure_new_object
g_object_add_weak_pointer
g_object_class_find_property
g_object_class_install_property
g_object_watch_closure
g_object_weak_ref
g_object_weak_unref
+g_value_get_object
+g_value_set_object
+g_value_dup_object
+g_value_take_object
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_object_take_ownership
+#endif
+g_signal_connect_object
+#endif
+#endif
+
+#if IN_HEADER(__G_PARAMSPECS_H__)
+#if IN_FILE(__G_PARAMSPECS_C__)
g_param_spec_boolean
g_param_spec_boxed
g_param_spec_char
g_param_spec_enum
g_param_spec_flags
g_param_spec_float
-g_param_spec_get_blurb
-g_param_spec_get_name
-g_param_spec_get_nick
-g_param_spec_get_qdata
-g_param_spec_get_redirect_target
g_param_spec_int
g_param_spec_int64
-g_param_spec_internal
g_param_spec_long
g_param_spec_object
g_param_spec_override
g_param_spec_param
g_param_spec_pointer
-g_param_spec_pool_insert
-g_param_spec_pool_list
-g_param_spec_pool_list_owned
-g_param_spec_pool_lookup
-g_param_spec_pool_new
-g_param_spec_pool_remove
-g_param_spec_ref
-g_param_spec_set_qdata
-g_param_spec_set_qdata_full
-g_param_spec_sink
-g_param_spec_steal_qdata
g_param_spec_string
g_param_spec_uchar
g_param_spec_uint
g_param_spec_uint64
g_param_spec_ulong
g_param_spec_unichar
-g_param_spec_unref
g_param_spec_value_array
+#endif
+#endif
+
+#if IN_HEADER(__G_PARAM_H__)
+#if IN_FILE(__G_PARAM_C__)
+g_param_spec_get_blurb
+g_param_spec_get_name
+g_param_spec_get_nick
+g_param_spec_get_redirect_target
+g_param_spec_internal
g_param_type_register_static
+g_param_spec_ref
+g_param_spec_unref
+g_param_spec_sink
+g_param_spec_steal_qdata
+g_param_spec_set_qdata
+g_param_spec_set_qdata_full
+g_param_spec_get_qdata
g_param_value_convert
g_param_value_defaults
g_param_values_cmp
g_param_value_set_default
g_param_value_validate
+g_param_spec_pool_insert
+g_param_spec_pool_list
+g_param_spec_pool_list_owned
+g_param_spec_pool_lookup
+g_param_spec_pool_new
+g_param_spec_pool_remove
+g_value_get_param
+g_value_set_param
+g_value_dup_param
+g_value_take_param
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_param_take_ownership
+#endif
+#endif
+#endif
+
+#if IN_HEADER(__G_VALUETYPES_H__)
+#if IN_FILE(__G_VALUETYPES_C__)
g_pointer_type_register_static
+g_strdup_value_contents
+g_value_set_boolean
+g_value_set_char
+g_value_set_double
+g_value_set_float
+g_value_set_int
+g_value_set_int64
+g_value_set_long
+g_value_set_pointer
+g_value_set_static_string
+g_value_set_string
+#ifndef G_DISABLE_DEPRECATED
+g_value_set_string_take_ownership
+#endif
+g_value_set_uchar
+g_value_set_uint
+g_value_set_uint64
+g_value_set_ulong
+g_value_dup_string
+g_value_get_boolean
+g_value_get_char
+g_value_get_double
+g_value_get_float
+g_value_get_int
+g_value_get_int64
+g_value_get_long
+g_value_get_pointer
+g_value_get_string
+g_value_get_uchar
+g_value_get_uint
+g_value_get_uint64
+g_value_get_ulong
+g_value_take_string
+#endif
+#endif
+
+#if IN_HEADER(__G_SIGNAL_H__)
+#if IN_FILE(__G_SIGNAL_C__)
g_signal_accumulator_true_handled
g_signal_add_emission_hook
g_signal_chain_from_overridden
g_signal_connect_closure
g_signal_connect_closure_by_id
g_signal_connect_data
-g_signal_connect_object
g_signal_emit
g_signal_emit_by_name
g_signal_emitv
g_signal_remove_emission_hook
g_signal_stop_emission
g_signal_stop_emission_by_name
-g_signal_type_cclosure_new
-g_source_set_closure
-g_strdup_value_contents
-g_strv_get_type G_GNUC_CONST
+#endif
+#endif
+
+#if IN_HEADER(__G_TYPE_H__)
+#if IN_FILE(__G_TYPE_C__)
g_type_add_class_cache_func
g_type_add_interface_check
g_type_add_interface_dynamic
g_type_interface_prerequisites
g_type_interfaces
g_type_is_a
-g_type_module_add_interface
-g_type_module_get_type G_GNUC_CONST
-g_type_module_register_enum
-g_type_module_register_flags
-g_type_module_register_type
-g_type_module_set_name
-g_type_module_unuse
-g_type_module_use
g_type_name
g_type_name_from_class
g_type_name_from_instance
g_type_next_base
g_type_parent
-g_type_plugin_complete_interface_info
-g_type_plugin_complete_type_info
-g_type_plugin_get_type G_GNUC_CONST
-g_type_plugin_unuse
-g_type_plugin_use
g_type_qname
g_type_query
g_type_register_dynamic
g_type_set_qdata
g_type_test_flags
g_type_value_table_peek
+#endif
+#endif
+
+#if IN_HEADER(__G_TYPE_MODULE_H__)
+#if IN_FILE(__G_TYPE_MODULE_C__)
+g_type_module_add_interface
+g_type_module_get_type G_GNUC_CONST
+g_type_module_register_enum
+g_type_module_register_flags
+g_type_module_register_type
+g_type_module_set_name
+g_type_module_unuse
+g_type_module_use
+#endif
+#endif
+
+#if IN_HEADER(__G_VALUE_ARRAY_H__)
+#if IN_FILE(__G_VALUE_ARRAY_C__)
g_value_array_append
g_value_array_copy
g_value_array_free
g_value_array_get_nth
-g_value_array_get_type G_GNUC_CONST
g_value_array_insert
g_value_array_new
g_value_array_prepend
g_value_array_remove
g_value_array_sort
g_value_array_sort_with_data
+#endif
+#endif
+
+#if IN_HEADER(__G_TYPE_PLUGIN_H__)
+#if IN_FILE(__G_TYPE_PLUGIN_C__)
+g_type_plugin_complete_interface_info
+g_type_plugin_complete_type_info
+g_type_plugin_get_type G_GNUC_CONST
+g_type_plugin_unuse
+g_type_plugin_use
+#endif
+#endif
+
+#if IN_HEADER(__G_VALUE_H__)
+#if IN_FILE(__G_VALUE_C__)
g_value_copy
-g_value_dup_boxed
-g_value_dup_object
-g_value_dup_param
-g_value_dup_string
g_value_fits_pointer
-g_value_get_boolean
-g_value_get_boxed
-g_value_get_char
-g_value_get_double
-g_value_get_enum
-g_value_get_flags
-g_value_get_float
-g_value_get_int
-g_value_get_int64
-g_value_get_long
-g_value_get_object
-g_value_get_param
-g_value_get_pointer
-g_value_get_string
-g_value_get_type G_GNUC_CONST
-g_value_get_uchar
-g_value_get_uint
-g_value_get_uint64
-g_value_get_ulong
g_value_init
g_value_peek_pointer
g_value_register_transform_func
g_value_reset
-g_value_set_boolean
-g_value_set_boxed
-g_value_set_boxed_take_ownership
-g_value_set_char
-g_value_set_double
-g_value_set_enum
-g_value_set_flags
-g_value_set_float
-g_value_set_instance
-g_value_set_int
-g_value_set_int64
-g_value_set_long
-g_value_set_object
-g_value_set_object_take_ownership
-g_value_set_param
-g_value_set_param_take_ownership
-g_value_set_pointer
-g_value_set_static_boxed
-g_value_set_static_string
-g_value_set_string
-g_value_set_string_take_ownership
-g_value_set_uchar
-g_value_set_uint
-g_value_set_uint64
-g_value_set_ulong
-g_value_take_boxed
-g_value_take_object
-g_value_take_param
-g_value_take_string
g_value_transform
g_value_type_compatible
g_value_type_transformable
g_value_unset
+g_value_set_instance
+#endif
+#endif
+
#ifdef INCLUDE_VARIABLES
g_param_spec_types
#endif
G_END_DECLS
-#endif /* __G_OBJECT_H__ */
+#endif /* __G_NOTIFY_H__ */
* MT safe
*/
-#include "gobjectalias.h"
#include "gparam.h"
#include "gparamspecs.h"
#include "gvaluecollector.h"
+#include "gobjectalias.h"
#include <string.h>
return value->data[0].v_pointer ? g_param_spec_ref (value->data[0].v_pointer) : NULL;
}
+
+#define __G_PARAM_C__
+#include "gobjectaliasdef.c"
#include "../config.h"
-#include "gobjectalias.h"
#include "gparamspecs.h"
#include "gvaluecollector.h"
#include "gvaluearray.h"
+#include "gobjectalias.h"
#include <string.h>
#define G_FLOAT_EPSILON (1e-30)
return pspec;
}
+
+#define __G_PARAMSPECS_C__
+#include "gobjectaliasdef.c"
#include <config.h>
-#include "gobjectalias.h"
#include "gsignal.h"
+
#include "gbsearcharray.h"
#include "gvaluecollector.h"
#include "gvaluetypes.h"
#include "gboxed.h"
+
+#include "gobjectalias.h"
+
#include <string.h>
#include <signal.h>
#include "gobject.h"
#include "genums.h"
#include "gmarshal.c"
+
+#define __G_SIGNAL_C__
+#include "gobjectaliasdef.c"
* Boston, MA 02111-1307, USA.
*/
-#include "gobjectalias.h"
#include "gsourceclosure.h"
#include "gboxed.h"
#include "genums.h"
#include "gmarshal.h"
#include "gvalue.h"
#include "gvaluetypes.h"
+#include "gobjectalias.h"
GType
g_io_channel_get_type (void)
g_closure_set_marshal (closure, marshal);
}
}
+
+#define __G_SOURCECLOSURE_C__
+#include "gobjectaliasdef.c"
* Boston, MA 02111-1307, USA.
*/
#include <config.h>
-#include "gobjectalias.h"
#include "gtype.h"
+#include "gobjectalias.h"
/*
* MT safe
return G_STRUCT_MEMBER_P (instance, offset);
}
+
+#define __G_TYPE_C__
+#include "gobjectaliasdef.c"
#include <stdlib.h>
-#include "gobjectalias.h"
#include "gtypeplugin.h"
#include "gtypemodule.h"
+#include "gobjectalias.h"
typedef struct _ModuleTypeInfo ModuleTypeInfo;
typedef struct _ModuleInterfaceInfo ModuleInterfaceInfo;
return g_type_module_register_type (G_TYPE_MODULE (module),
G_TYPE_FLAGS, name, &flags_type_info, 0);
}
+
+
+#define __G_TYPE_MODULE_C__
+#include "gobjectaliasdef.c"
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
-#include "gobjectalias.h"
#include "gtypeplugin.h"
+#include "gobjectalias.h"
interface_type,
info);
}
+
+#define __G_TYPE_PLUGIN_C__
+#include "gobjectaliasdef.c"
#include <string.h>
-#include "gobjectalias.h"
#include "gvalue.h"
#include "gvaluecollector.h"
#include "gbsearcharray.h"
+#include "gobjectalias.h"
/* --- typedefs & structures --- */
}
return FALSE;
}
+
+#define __G_VALUE_C__
+#include "gobjectaliasdef.c"
#include <config.h>
-#include "gobjectalias.h"
#include "gvaluearray.h"
+#include "gobjectalias.h"
#include <string.h>
#include <stdlib.h> /* qsort() */
compare_func, user_data);
return value_array;
}
+
+#define __G_VALUE_ARRAY_C__
+#include "gobjectaliasdef.c"
*/
#include <string.h>
-#include "gobjectalias.h"
#include "gvalue.h"
#include "genums.h"
+#include "gobjectalias.h"
/* same type transforms
* MT safe
*/
-#include "gobjectalias.h"
#include "gvaluetypes.h"
#include "gvaluecollector.h"
+#include "gobjectalias.h"
#include <string.h>
#include <stdlib.h> /* qsort() */
return type;
}
+#define __G_VALUETYPES_C__
+#include "gobjectaliasdef.c"
#!/usr/bin/perl -w
+my $do_def = 0;
+
+if (($#ARGV >= 0) && ($ARGV[0] eq "-def")) {
+ shift;
+ $do_def = 1;
+}
+
print <<EOF;
/* Generated by makegobjectalias.pl */
#ifdef G_HAVE_GNUC_VISIBILITY
-#ifdef G_DISABLE_DEPRECATED
-#define WAS_NO_G_DEPR
-#endif
-#undef G_DISABLE_DEPRECATED
+EOF
+
+if ($do_def) {
+ print <<EOF
+#undef IN_FILE
+#define IN_FILE defined
-#include "glib-object.h"
+#undef IN_HEADER
+#define IN_HEADER(x) 1
EOF
+}
+else {
+ print <<EOF
+#define IN_FILE(x) 1
+#define IN_HEADER defined
+
+EOF
+}
my $in_comment = 0;
my $in_skipped_section = 0;
next;
}
- if ($_ =~ /^\#ifdef\s+(INCLUDE_VARIABLES|INCLUDE_INTERNAL_SYMBOLS)/)
+ if ($_ =~ /^\#ifdef\s+(INCLUDE_VARIABLES|INCLUDE_INTERNAL_SYMBOLS|ALL_FILES)/)
{
$in_skipped_section = 1;
}
next;
}
- if ($_ =~ /^\#ifdef\s+G/)
+ if ($_ =~ /^\#ifn?def\s+G/)
{
print $_;
next;
}
+ if ($_ =~ /^\#if.*(IN_FILE|IN_HEADER)/)
+ {
+ print $_;
+
+ next;
+ }
+
chop;
my $str = $_;
my @words;
$attributes = "$attributes $word" unless $word eq "PRIVATE";
}
- print <<EOF
+ if (!$do_def) {
+ print <<EOF
extern __typeof ($str) $alias __attribute((visibility("hidden")))$attributes;
-extern __typeof ($str) $str __attribute((alias("$alias"), visibility("default")));
\#define $str $alias
EOF
+ }
+ else {
+ print <<EOF
+\#undef $str
+extern __typeof ($str) $str __attribute((alias("$alias"), visibility("default")));
+
+EOF
+ }
}
print <<EOF;
-#ifdef WAS_NO_G_DEPR
-#define G_DISABLE_DEPRECATED
-#undef WAS_NO_G_DEPR
-#endif
-
#endif /* G_HAVE_GNUC_VISIBILITY */
-
#endif /* DISABLE_VISIBILITY */
EOF