On Tue, 2024-01-16 at 11:10 +0000, Iain Sandoe wrote:
> Tested on x86_64, i686 Darwin and x86_64 Linux,
> OK for trunk? when ?
> thanks,
> Iain

Hi Iain, thanks for the patch.

I'll have to defer to your Darwin expertise here; given that you've
tested it on the above configurations I'll assume it's correct, but...

> 
> --- 8< ---
> 
> Currently, we have no exports list for libgccjit, which means that
> all symbols are exported, including those from libstdc++ which is
> linked statically into the lib.  This causes failures when the
> shared libstdc++ is used but some c++ symbols are satisfied from
> libgccjit.
> 
> This implements an export file for Darwin (which is currently
> manually created by cross-checking libgccjit.map).

...I'm a little nervous about this; Antoyo has a number of out-of-tree
patches we're working towards merging, and almost all of these touch
libgccjit.map.


>   Ideally we'd
> script this, at some point.  

Yes.  How about a Python 3 script (inside "contrib", or in "gcc/jit")
that would do that.  Then whenever a patch touches libgccjit.map we'd
run that script to regenerate libgccjit.exp in the source tree.  I can
have a go at writing it, if you think that's the best way to go.

I take it .exp is the standard extension for these exports file in the
Darwin world.  If so, it's a shame (but unavoidable) that it clashes
with the existing uses of .exp in our source tree for our
expect/Tcl/DejaGnu sources.

I think the patch as-is is OK for trunk now, assuming that you've
tested it as above.

Dave


> Update libtool current and age to
> reflect the current ABI version (we are not bumping the SO name
> at this stage).
> 
> This fixes a number of new failures in jit testing.
> 
> gcc/jit/ChangeLog:
> 
>         * Make-lang.in: Implement exports list, and use a shared
>         libgcc.
>         * libgccjit.exp: New file.
> 
> Signed-off-by: Iain Sandoe <i...@sandoe.co.uk>
> ---
>  gcc/jit/Make-lang.in  |  38 ++++---
>  gcc/jit/libgccjit.exp | 229
> ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 251 insertions(+), 16 deletions(-)
>  create mode 100644 gcc/jit/libgccjit.exp
> 
> diff --git a/gcc/jit/Make-lang.in b/gcc/jit/Make-lang.in
> index b1f0ce73e12..52dc2c24908 100644
> --- a/gcc/jit/Make-lang.in
> +++ b/gcc/jit/Make-lang.in
> @@ -55,7 +55,10 @@ else
>  
>  ifneq (,$(findstring darwin,$(host)))
>  
> -LIBGCCJIT_AGE = 1
> +LIBGCCJIT_CURRENT = 26
> +LIBGCCJIT_REVISION = 0
> +LIBGCCJIT_AGE = 26
> +LIBGCCJIT_COMPAT = 0
>  LIBGCCJIT_BASENAME = libgccjit
>  
>  LIBGCCJIT_SONAME = \
> @@ -63,15 +66,15 @@ LIBGCCJIT_SONAME = \
>  LIBGCCJIT_FILENAME =
> $(LIBGCCJIT_BASENAME).$(LIBGCCJIT_VERSION_NUM).dylib
>  LIBGCCJIT_LINKER_NAME = $(LIBGCCJIT_BASENAME).dylib
>  
> -# Conditionalize the use of the LD_VERSION_SCRIPT_OPTION and
> -# LD_SONAME_OPTION depending if configure found them, using $(if)
> -# We have to define a COMMA here, otherwise the commas in the "true"
> -# result are treated as separators by the $(if).
> -COMMA := ,
> +# Darwin does not have a version script option. Exported symbols are
> controlled
> +# by the following, and library versioning is done using libtool.
>  LIBGCCJIT_VERSION_SCRIPT_OPTION = \
> -       $(if $(LD_VERSION_SCRIPT_OPTION),\
> -         -
> Wl$(COMMA)$(LD_VERSION_SCRIPT_OPTION)$(COMMA)$(srcdir)/jit/libgccjit.
> map)
> +  -Wl,-exported_symbols_list,$(srcdir)/jit/libgccjit.exp
>  
> +# Conditionalize the use of  LD_SONAME_OPTION on configure finding
> it, using
> +# $(if).  We have to define a COMMA here, otherwise the commas in
> the "true"
> +# result are treated as separators by the $(if).
> +COMMA := ,
>  LIBGCCJIT_SONAME_OPTION = \
>         $(if $(LD_SONAME_OPTION), \
>              -
> Wl$(COMMA)$(LD_SONAME_OPTION)$(COMMA)$(LIBGCCJIT_SONAME))
> @@ -143,15 +146,18 @@ ifneq (,$(findstring mingw,$(target)))
>  # Create import library
>  LIBGCCJIT_EXTRA_OPTS = -Wl,--out-implib,$(LIBGCCJIT_IMPORT_LIB)
>  else
> -
>  ifneq (,$(findstring darwin,$(host)))
> -# TODO : Construct a Darwin-style symbol export file.
> -LIBGCCJIT_EXTRA_OPTS = -Wl,-
> compatibility_version,$(LIBGCCJIT_VERSION_NUM) \
> -       -Wl,-
> current_version,$(LIBGCCJIT_VERSION_NUM).$(LIBGCCJIT_MINOR_NUM).$(LIB
> GCCJIT_AGE) \
> -       $(LIBGCCJIT_VERSION_SCRIPT_OPTION) \
> -       $(LIBGCCJIT_SONAME_OPTION)
> +LIBGCCJIT_VERS =
> $(LIBGCCJIT_CURRENT).$(LIBGCCJIT_REVISION).$(LIBGCCJIT_AGE)
> +LIBGCCJIT_EXTRA_OPTS = -Wl,-current_version,$(LIBGCCJIT_VERS) \
> + -Wl,-compatibility_version,$(LIBGCCJIT_COMPAT) \
> +  $(LIBGCCJIT_VERSION_SCRIPT_OPTION) $(LIBGCCJIT_SONAME_OPTION)
> +# Use the default (shared) libgcc.
> +JIT_LDFLAGS = $(filter-out -static-libgcc, $(LDFLAGS))
> +ifeq (,$(findstring darwin8,$(host)))
> +JIT_LDFLAGS += -Wl,-rpath,@loader_path
> +endif
>  else
> -
> +JIT_LDFLAGS = $(LDFLAGS)
>  LIBGCCJIT_EXTRA_OPTS = $(LIBGCCJIT_VERSION_SCRIPT_OPTION) \
>         $(LIBGCCJIT_SONAME_OPTION)
>  endif
> @@ -170,7 +176,7 @@ $(LIBGCCJIT_FILENAME): $(jit_OBJS) \
>         $(LIBDEPS) $(srcdir)/jit/libgccjit.map \
>         $(EXTRA_GCC_OBJS_EXCLUSIVE) $(jit.prev)
>         @$(call LINK_PROGRESS,$(INDEX.jit),start)
> -       +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ -shared \
> +       +$(LLINKER) $(ALL_LINKERFLAGS) $(JIT_LDFLAGS) -o $@ -shared \
>              $(jit_OBJS) libbackend.a libcommon-target.a libcommon.a
> \
>              $(CPPLIB) $(LIBDECNUMBER) $(EXTRA_GCC_LIBS) $(LIBS)
> $(BACKENDLIBS) \
>              $(EXTRA_GCC_OBJS_EXCLUSIVE) \
> diff --git a/gcc/jit/libgccjit.exp b/gcc/jit/libgccjit.exp
> new file mode 100644
> index 00000000000..0829503a53e
> --- /dev/null
> +++ b/gcc/jit/libgccjit.exp
> @@ -0,0 +1,229 @@
> +# Linker export list for Darwin libgccjit.dylib
> +
> +#   Contributed by Iain Sandoe <i...@sandoe.co.uk>.
> +#
> +# 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.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with GCC see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.  */
> +
> +# The initial release of the library.
> +# Keep this list sorted alphabetically:
> +_gcc_jit_block_add_assignment
> +_gcc_jit_block_add_assignment_op
> +_gcc_jit_block_add_comment
> +_gcc_jit_block_add_eval
> +_gcc_jit_block_as_object
> +_gcc_jit_block_end_with_conditional
> +_gcc_jit_block_end_with_jump
> +_gcc_jit_block_end_with_return
> +_gcc_jit_block_end_with_void_return
> +_gcc_jit_block_get_function
> +_gcc_jit_context_acquire
> +_gcc_jit_context_compile
> +_gcc_jit_context_compile_to_file
> +_gcc_jit_context_dump_to_file
> +_gcc_jit_context_dump_reproducer_to_file
> +_gcc_jit_context_enable_dump
> +_gcc_jit_context_get_builtin_function
> +_gcc_jit_context_get_first_error
> +_gcc_jit_context_get_last_error
> +_gcc_jit_context_get_type
> +_gcc_jit_context_get_int_type
> +_gcc_jit_context_new_array_access
> +_gcc_jit_context_new_array_type
> +_gcc_jit_context_new_binary_op
> +_gcc_jit_context_new_call
> +_gcc_jit_context_new_call_through_ptr
> +_gcc_jit_context_new_cast
> +_gcc_jit_context_new_child_context
> +_gcc_jit_context_new_comparison
> +_gcc_jit_context_new_field
> +_gcc_jit_context_new_function
> +_gcc_jit_context_new_function_ptr_type
> +_gcc_jit_context_new_global
> +_gcc_jit_context_new_location
> +_gcc_jit_context_new_opaque_struct
> +_gcc_jit_context_new_param
> +_gcc_jit_context_new_rvalue_from_double
> +_gcc_jit_context_new_rvalue_from_int
> +_gcc_jit_context_new_rvalue_from_long
> +_gcc_jit_context_new_rvalue_from_ptr
> +_gcc_jit_context_new_string_literal
> +_gcc_jit_context_new_struct_type
> +_gcc_jit_context_new_unary_op
> +_gcc_jit_context_new_union_type
> +_gcc_jit_context_null
> +_gcc_jit_context_one
> +_gcc_jit_context_release
> +_gcc_jit_context_set_bool_option
> +_gcc_jit_context_set_int_option
> +_gcc_jit_context_set_logfile
> +_gcc_jit_context_set_str_option
> +_gcc_jit_context_zero
> +_gcc_jit_field_as_object
> +_gcc_jit_function_as_object
> +_gcc_jit_function_dump_to_dot
> +_gcc_jit_function_get_param
> +_gcc_jit_function_new_block
> +_gcc_jit_function_new_local
> +_gcc_jit_location_as_object
> +_gcc_jit_lvalue_as_object
> +_gcc_jit_lvalue_as_rvalue
> +_gcc_jit_lvalue_access_field
> +_gcc_jit_lvalue_get_address
> +_gcc_jit_object_get_context
> +_gcc_jit_object_get_debug_string
> +_gcc_jit_param_as_lvalue
> +_gcc_jit_param_as_object
> +_gcc_jit_param_as_rvalue
> +_gcc_jit_result_get_code
> +_gcc_jit_result_get_global
> +_gcc_jit_result_release
> +_gcc_jit_rvalue_access_field
> +_gcc_jit_rvalue_as_object
> +_gcc_jit_rvalue_dereference
> +_gcc_jit_rvalue_dereference_field
> +_gcc_jit_rvalue_get_type
> +_gcc_jit_struct_as_type
> +_gcc_jit_struct_set_fields
> +_gcc_jit_type_as_object
> +_gcc_jit_type_get_const
> +_gcc_jit_type_get_pointer
> +_gcc_jit_type_get_volatile
> +
> +# Add support for adding arbitrary command-line options (PR
> jit/66628).
> +# LIBGCCJIT_ABI_1
> +_gcc_jit_context_add_command_line_option
> +
> +# Add support for disabling the check for unreachable blocks (PR
> jit/66546).
> +# LIBGCCJIT_ABI_2
> +_gcc_jit_context_set_bool_allow_unreachable_blocks
> +
> +# Add support for switch statements.
> +# LIBGCCJIT_ABI_3
> +_gcc_jit_block_end_with_switch
> +_gcc_jit_case_as_object
> +_gcc_jit_context_new_case
> +
> +# Add timing API.
> +#LIBGCCJIT_ABI_4
> +_gcc_jit_context_get_timer
> +_gcc_jit_context_set_timer
> +_gcc_jit_timer_new
> +_gcc_jit_timer_release
> +_gcc_jit_timer_push
> +_gcc_jit_timer_pop
> +_gcc_jit_timer_print
> +
> +# LIBGCCJIT_ABI_5
> +_gcc_jit_context_set_bool_use_external_driver
> +
> +# LIBGCCJIT_ABI_6
> +_gcc_jit_rvalue_set_bool_require_tail_call
> +
> +# LIBGCCJIT_ABI_7
> +_gcc_jit_type_get_aligned
> +
> +# LIBGCCJIT_ABI_8
> +_gcc_jit_type_get_vector
> +
> +# LIBGCCJIT_ABI_9
> +_gcc_jit_function_get_address
> +
> +# LIBGCCJIT_ABI_10
> +_gcc_jit_context_new_rvalue_from_vector
> +
> +# LIBGCCJIT_ABI_11
> +_gcc_jit_context_add_driver_option
> +
> +# LIBGCCJIT_ABI_12
> +_gcc_jit_context_new_bitfield
> +
> +# LIBGCCJIT_ABI_13
> +_gcc_jit_version_major
> +_gcc_jit_version_minor
> +_gcc_jit_version_patchlevel
> +
> +# LIBGCCJIT_ABI_14
> +_gcc_jit_global_set_initializer
> +
> +# LIBGCCJIT_ABI_15
> +_gcc_jit_block_add_extended_asm
> +_gcc_jit_block_end_with_extended_asm_goto
> +_gcc_jit_extended_asm_as_object
> +_gcc_jit_extended_asm_set_volatile_flag
> +_gcc_jit_extended_asm_set_inline_flag
> +_gcc_jit_extended_asm_add_output_operand
> +_gcc_jit_extended_asm_add_input_operand
> +_gcc_jit_extended_asm_add_clobber
> +_gcc_jit_context_add_top_level_asm
> +
> +# LIBGCCJIT_ABI_16
> +_gcc_jit_function_get_return_type
> +_gcc_jit_function_get_param_count
> +_gcc_jit_function_type_get_return_type
> +_gcc_jit_function_type_get_param_count
> +_gcc_jit_function_type_get_param_type
> +_gcc_jit_type_unqualified
> +_gcc_jit_type_dyncast_array
> +_gcc_jit_type_is_bool
> +_gcc_jit_type_dyncast_function_ptr_type
> +_gcc_jit_type_is_integral
> +_gcc_jit_type_is_pointer
> +_gcc_jit_type_dyncast_vector
> +_gcc_jit_vector_type_get_element_type
> +_gcc_jit_vector_type_get_num_units
> +_gcc_jit_struct_get_field
> +_gcc_jit_type_is_struct
> +_gcc_jit_struct_get_field_count
> +
> +# LIBGCCJIT_ABI_17
> +_gcc_jit_lvalue_set_tls_model
> +
> +# LIBGCCJIT_ABI_18
> +_gcc_jit_lvalue_set_link_section
> +
> +#LIBGCCJIT_ABI_19
> +_gcc_jit_context_new_array_constructor
> +_gcc_jit_context_new_struct_constructor
> +_gcc_jit_context_new_union_constructor
> +_gcc_jit_global_set_initializer_rvalue
> +
> +# LIBGCCJIT_ABI_20
> +_gcc_jit_compatible_types
> +_gcc_jit_type_get_size
> +
> +# LIBGCCJIT_ABI_21
> +_gcc_jit_context_new_bitcast
> +
> +# LIBGCCJIT_ABI_22
> +_gcc_jit_lvalue_set_register_name
> +
> +# LIBGCCJIT_ABI_23
> +_gcc_jit_context_set_bool_print_errors_to_stderr
> +
> +# LIBGCCJIT_ABI_24
> +_gcc_jit_lvalue_set_alignment
> +_gcc_jit_lvalue_get_alignment
> +
> +# LIBGCCJIT_ABI_25
> +_gcc_jit_type_get_restrict
> +
> +# LIBGCCJIT_ABI_26 
> +_gcc_jit_function_add_attribute
> +_gcc_jit_function_add_string_attribute
> +_gcc_jit_lvalue_add_string_attribute
> +_gcc_jit_function_add_integer_array_attribute
> +

Reply via email to