Hi David, > On 24 Jan 2024, at 18:31, David Malcolm <dmalc...@redhat.com> wrote: > > 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.
I’m not sure we want to make a build dependency on Python 3.. the reason I say ‘build’ is ... > 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. … there are two other places in the current sources where ld map files are converted to Darwin (and Solaris) symbol export files [libgcc, libstdc++]. In these cases, the export file is created on-the-fly at build time by scripts (IIRC a mixture of awk, sh, perl). This requires more surgery to the Make stuff and that we have a suitable script - but it does mean that we do not need to commit the Darwin (and potentially Solaris) versions to the source tree. I’m actually happy with either solution - since we do not expect this to be a daily occurance, we could have a maintainter’s python3 script to update a committed export file or we could try the mechanism used in the other two places (but then the script would need to use awk/sh/perl to avoid new build deps). > 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 suspect the linker will accept other extensions, although ‘exp’ is a convention used elsewhere, it is unfortunate that it clashes indeed. - let me try an alternate (e.g. .export) and report back. > I think the patch as-is is OK for trunk now, assuming that you've > tested it as above. I’m going to hold off on this for now (but do want some solution before 14 branches, because there are quite a few new fails from it). Iain > > 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 >> +