On Tue, Jun 11, 2024 at 11:21 AM Arthur Cohen <arthur.co...@embecosm.com> wrote: > > Thanks Richi! > > Tested again and pushed on trunk.
This patch introduced a couple of errors during ./configure: checking for library containing dlopen... none required checking for library containing pthread_create... none required /git/gcc/configure: line 8997: test: too many arguments /git/gcc/configure: line 8999: test: too many arguments /git/gcc/configure: line 9003: test: too many arguments /git/gcc/configure: line 9005: test: =: unary operator expected You have to wrap arguments of the test with double quotes. Uros. > Best, > > Arthur > > On 5/31/24 15:02, Richard Biener wrote: > > On Fri, May 31, 2024 at 12:24 PM Arthur Cohen <arthur.co...@embecosm.com> > > wrote: > >> > >> Hi Richard, > >> > >> On 4/30/24 09:55, Richard Biener wrote: > >>> On Fri, Apr 19, 2024 at 11:49 AM Arthur Cohen <arthur.co...@embecosm.com> > >>> wrote: > >>>> > >>>> Hi everyone, > >>>> > >>>> This patch checks for the presence of dlopen and pthread_create in libc. > >>>> If that is not the > >>>> case, we check for the existence of -ldl and -lpthread, as these > >>>> libraries are required to > >>>> link the Rust runtime to our Rust frontend. > >>>> > >>>> If these libs are not present on the system, then we disable the Rust > >>>> frontend. > >>>> > >>>> This was tested on x86_64, in an environment with a recent GLIBC and in > >>>> a container with GLIBC > >>>> 2.27. > >>>> > >>>> Apologies for sending it in so late. > >>> > >>> For example GCC_ENABLE_PLUGINS simply does > >>> > >>> # Check -ldl > >>> saved_LIBS="$LIBS" > >>> AC_SEARCH_LIBS([dlopen], [dl]) > >>> if test x"$ac_cv_search_dlopen" = x"-ldl"; then > >>> pluginlibs="$pluginlibs -ldl" > >>> fi > >>> LIBS="$saved_LIBS" > >>> > >>> which I guess would also work for pthread_create? This would simplify > >>> the code a bit. > >> > >> Thanks a lot for the review. I've udpated the patch's content in > >> configure.ac per your suggestion. Tested similarly on x86_64 and in a > >> container with libc 2.27 > > > > LGTM. > > > > Thanks, > > Richard. > > > >> From 00669b600a75743523c358ee41ab999b6e9fa0f6 Mon Sep 17 00:00:00 2001 > >> From: Arthur Cohen <arthur.co...@embecosm.com> > >> Date: Fri, 12 Apr 2024 13:52:18 +0200 > >> Subject: [PATCH] rust: Do not link with libdl and libpthread > >> unconditionally > >> > >> ChangeLog: > >> > >> * Makefile.tpl: Add CRAB1_LIBS variable. > >> * Makefile.in: Regenerate. > >> * configure: Regenerate. > >> * configure.ac: Check if -ldl and -lpthread are needed, and if > >> so, add > >> them to CRAB1_LIBS. > >> > >> gcc/rust/ChangeLog: > >> > >> * Make-lang.in: Remove overazealous LIBS = -ldl -lpthread line, > >> link > >> crab1 against CRAB1_LIBS. > >> --- > >> Makefile.in | 3 + > >> Makefile.tpl | 3 + > >> configure | 154 ++++++++++++++++++++++++++++++++++++++++++ > >> configure.ac | 41 +++++++++++ > >> gcc/rust/Make-lang.in | 6 +- > >> 5 files changed, 203 insertions(+), 4 deletions(-) > >> > >> diff --git a/Makefile.in b/Makefile.in > >> index edb0c8a9a42..1753fb6b862 100644 > >> --- a/Makefile.in > >> +++ b/Makefile.in > >> @@ -197,6 +197,7 @@ HOST_EXPORTS = \ > >> $(BASE_EXPORTS) \ > >> CC="$(CC)"; export CC; \ > >> ADA_CFLAGS="$(ADA_CFLAGS)"; export ADA_CFLAGS; \ > >> + CRAB1_LIBS="$(CRAB1_LIBS)"; export CRAB1_LIBS; \ > >> CFLAGS="$(CFLAGS)"; export CFLAGS; \ > >> CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \ > >> CXX="$(CXX)"; export CXX; \ > >> @@ -450,6 +451,8 @@ GOCFLAGS = $(CFLAGS) > >> GDCFLAGS = @GDCFLAGS@ > >> GM2FLAGS = $(CFLAGS) > >> > >> +CRAB1_LIBS = @CRAB1_LIBS@ > >> + > >> PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ > >> > >> GUILE = guile > >> diff --git a/Makefile.tpl b/Makefile.tpl > >> index adbcbdd1d57..4aeaad3c1a5 100644 > >> --- a/Makefile.tpl > >> +++ b/Makefile.tpl > >> @@ -200,6 +200,7 @@ HOST_EXPORTS = \ > >> $(BASE_EXPORTS) \ > >> CC="$(CC)"; export CC; \ > >> ADA_CFLAGS="$(ADA_CFLAGS)"; export ADA_CFLAGS; \ > >> + CRAB1_LIBS="$(CRAB1_LIBS)"; export CRAB1_LIBS; \ > >> CFLAGS="$(CFLAGS)"; export CFLAGS; \ > >> CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \ > >> CXX="$(CXX)"; export CXX; \ > >> @@ -453,6 +454,8 @@ GOCFLAGS = $(CFLAGS) > >> GDCFLAGS = @GDCFLAGS@ > >> GM2FLAGS = $(CFLAGS) > >> > >> +CRAB1_LIBS = @CRAB1_LIBS@ > >> + > >> PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ > >> > >> GUILE = guile > >> diff --git a/configure b/configure > >> index 02b435c1163..a9ea5258f0f 100755 > >> --- a/configure > >> +++ b/configure > >> @@ -690,6 +690,7 @@ extra_host_zlib_configure_flags > >> extra_host_libiberty_configure_flags > >> stage1_languages > >> host_libs_picflag > >> +CRAB1_LIBS > >> PICFLAG > >> host_shared > >> gcc_host_pie > >> @@ -8826,6 +8827,139 @@ fi > >> > >> > >> > >> +# Rust requires -ldl and -lpthread if you are using an old glibc that > >> does not include them by > >> +# default, so we check for them here > >> + > >> +missing_rust_dynlibs=none > >> + > >> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library > >> containing dlopen" >&5 > >> +$as_echo_n "checking for library containing dlopen... " >&6; } > >> +if ${ac_cv_search_dlopen+:} false; then : > >> + $as_echo_n "(cached) " >&6 > >> +else > >> + ac_func_search_save_LIBS=$LIBS > >> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext > >> +/* end confdefs.h. */ > >> + > >> +/* Override any GCC internal prototype to avoid an error. > >> + Use char because int might match the return type of a GCC > >> + builtin and then its argument prototype would still apply. */ > >> +#ifdef __cplusplus > >> +extern "C" > >> +#endif > >> +char dlopen (); > >> +int > >> +main () > >> +{ > >> +return dlopen (); > >> + ; > >> + return 0; > >> +} > >> +_ACEOF > >> +for ac_lib in '' dl; do > >> + if test -z "$ac_lib"; then > >> + ac_res="none required" > >> + else > >> + ac_res=-l$ac_lib > >> + LIBS="-l$ac_lib $ac_func_search_save_LIBS" > >> + fi > >> + if ac_fn_c_try_link "$LINENO"; then : > >> + ac_cv_search_dlopen=$ac_res > >> +fi > >> +rm -f core conftest.err conftest.$ac_objext \ > >> + conftest$ac_exeext > >> + if ${ac_cv_search_dlopen+:} false; then : > >> + break > >> +fi > >> +done > >> +if ${ac_cv_search_dlopen+:} false; then : > >> + > >> +else > >> + ac_cv_search_dlopen=no > >> +fi > >> +rm conftest.$ac_ext > >> +LIBS=$ac_func_search_save_LIBS > >> +fi > >> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 > >> +$as_echo "$ac_cv_search_dlopen" >&6; } > >> +ac_res=$ac_cv_search_dlopen > >> +if test "$ac_res" != no; then : > >> + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" > >> + > >> +fi > >> + > >> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library > >> containing pthread_create" >&5 > >> +$as_echo_n "checking for library containing pthread_create... " >&6; } > >> +if ${ac_cv_search_pthread_create+:} false; then : > >> + $as_echo_n "(cached) " >&6 > >> +else > >> + ac_func_search_save_LIBS=$LIBS > >> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext > >> +/* end confdefs.h. */ > >> + > >> +/* Override any GCC internal prototype to avoid an error. > >> + Use char because int might match the return type of a GCC > >> + builtin and then its argument prototype would still apply. */ > >> +#ifdef __cplusplus > >> +extern "C" > >> +#endif > >> +char pthread_create (); > >> +int > >> +main () > >> +{ > >> +return pthread_create (); > >> + ; > >> + return 0; > >> +} > >> +_ACEOF > >> +for ac_lib in '' pthread; do > >> + if test -z "$ac_lib"; then > >> + ac_res="none required" > >> + else > >> + ac_res=-l$ac_lib > >> + LIBS="-l$ac_lib $ac_func_search_save_LIBS" > >> + fi > >> + if ac_fn_c_try_link "$LINENO"; then : > >> + ac_cv_search_pthread_create=$ac_res > >> +fi > >> +rm -f core conftest.err conftest.$ac_objext \ > >> + conftest$ac_exeext > >> + if ${ac_cv_search_pthread_create+:} false; then : > >> + break > >> +fi > >> +done > >> +if ${ac_cv_search_pthread_create+:} false; then : > >> + > >> +else > >> + ac_cv_search_pthread_create=no > >> +fi > >> +rm conftest.$ac_ext > >> +LIBS=$ac_func_search_save_LIBS > >> +fi > >> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: > >> $ac_cv_search_pthread_create" >&5 > >> +$as_echo "$ac_cv_search_pthread_create" >&6; } > >> +ac_res=$ac_cv_search_pthread_create > >> +if test "$ac_res" != no; then : > >> + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" > >> + > >> +fi > >> + > >> + > >> +if test $ac_cv_search_dlopen = -ldl; then > >> + CRAB1_LIBS="$CRAB1_LIBS -ldl" > >> +elif test $ac_cv_search_dlopen = no; then > >> + missing_rust_dynlibs="libdl" > >> +fi > >> + > >> +if test $ac_cv_search_pthread_create = -lpthread; then > >> + CRAB1_LIBS="$CRAB1_LIBS -lpthread" > >> +elif test $ac_cv_search_pthread_crate = no; then > >> + missing_rust_dynlibs="$missing_rust_dynlibs, libpthread" > >> +fi > >> + > >> +CRAB1_LIBS="$CRAB1_LIBS" > >> + > >> + > >> # If we are building PIC/PIE host executables, and we are building > >> dependent > >> # libs (e.g. GMP) in-tree those libs need to be configured to generate > >> PIC > >> # code. > >> @@ -9066,6 +9200,26 @@ $as_echo "$as_me: WARNING: GDC is required to > >> build $language" >&2;} > >> ;; > >> esac > >> > >> + # Disable Rust if we are missing some required C libraries for > >> the Rust runtime. > >> + case ${add_this_lang}:${language}:${missing_rust_dynlibs} in > >> + *:rust:none) > >> + # Nothing to do - we're not missing any C libraries > >> + ;; > >> + yes:rust:*) > >> + as_fn_error $? "some C libraries are required to build > >> $language: $missing_rust_dynlibs" "$LINENO" 5 > >> + add_this_lang=unsupported > >> + ;; > >> + all:rust:*) > >> + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: some C > >> libraries are required to build $language: $missing_rust_dynlibs" >&5 > >> +$as_echo "$as_me: WARNING: some C libraries are required to build > >> $language: $missing_rust_dynlibs" >&2;} > >> + add_this_lang=unsupported > >> + ;; > >> + *:rust:*) > >> + # Silently disable. > >> + add_this_lang=unsupported > >> + ;; > >> + esac > >> + > >> # Disable jit if -enable-host-shared not specified > >> # but not if building for Mingw. All code in Windows > >> # is position independent code (PIC). > >> diff --git a/configure.ac b/configure.ac > >> index 1a19c07a27b..adb738ac346 100644 > >> --- a/configure.ac > >> +++ b/configure.ac > >> @@ -2036,6 +2036,28 @@ fi > >> > >> AC_SUBST(PICFLAG) > >> > >> +# Rust requires -ldl and -lpthread if you are using an old glibc that > >> does not include them by > >> +# default, so we check for them here > >> + > >> +missing_rust_dynlibs=none > >> + > >> +AC_SEARCH_LIBS([dlopen], [dl]) > >> +AC_SEARCH_LIBS([pthread_create], [pthread]) > >> + > >> +if test $ac_cv_search_dlopen = -ldl; then > >> + CRAB1_LIBS="$CRAB1_LIBS -ldl" > >> +elif test $ac_cv_search_dlopen = no; then > >> + missing_rust_dynlibs="libdl" > >> +fi > >> + > >> +if test $ac_cv_search_pthread_create = -lpthread; then > >> + CRAB1_LIBS="$CRAB1_LIBS -lpthread" > >> +elif test $ac_cv_search_pthread_crate = no; then > >> + missing_rust_dynlibs="$missing_rust_dynlibs, libpthread" > >> +fi > >> + > >> +AC_SUBST(CRAB1_LIBS, "$CRAB1_LIBS") > >> + > >> # If we are building PIC/PIE host executables, and we are building > >> dependent > >> # libs (e.g. GMP) in-tree those libs need to be configured to generate > >> PIC > >> # code. > >> @@ -2273,6 +2295,25 @@ if test -d ${srcdir}/gcc; then > >> ;; > >> esac > >> > >> + # Disable Rust if we are missing some required C libraries for > >> the Rust runtime. > >> + case ${add_this_lang}:${language}:${missing_rust_dynlibs} in > >> + *:rust:none) > >> + # Nothing to do - we're not missing any C libraries > >> + ;; > >> + yes:rust:*) > >> + AC_MSG_ERROR([some C libraries are required to build > >> $language: $missing_rust_dynlibs]) > >> + add_this_lang=unsupported > >> + ;; > >> + all:rust:*) > >> + AC_MSG_WARN([some C libraries are required to build > >> $language: $missing_rust_dynlibs]) > >> + add_this_lang=unsupported > >> + ;; > >> + *:rust:*) > >> + # Silently disable. > >> + add_this_lang=unsupported > >> + ;; > >> + esac > >> + > >> # Disable jit if -enable-host-shared not specified > >> # but not if building for Mingw. All code in Windows > >> # is position independent code (PIC). > >> diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in > >> index dd94c9b5eab..edcf2ee4c7b 100644 > >> --- a/gcc/rust/Make-lang.in > >> +++ b/gcc/rust/Make-lang.in > >> @@ -54,8 +54,6 @@ GCCRS_D_OBJS = \ > >> rust/rustspec.o \ > >> $(END) > >> > >> -LIBS += -ldl -lpthread > >> - > >> gccrs$(exeext): $(GCCRS_D_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a > >> $(LIBDEPS) > >> +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ > >> $(GCCRS_D_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \ > >> @@ -234,7 +232,7 @@ crab1$(exeext): $(RUST_ALL_OBJS) attribs.o > >> $(BACKEND) $(LIBDEPS) $(LIBPROC_MACRO > >> @$(call LINK_PROGRESS,$(INDEX.rust),start) > >> +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ > >> $(RUST_ALL_OBJS) attribs.o $(BACKEND) \ > >> - $(LIBS) $(LIBPROC_MACRO_INTERNAL) $(LIBFORMAT_PARSER) > >> $(LIBFFI_POLONIUS) \ > >> + $(LIBS) $(CRAB1_LIBS) $(LIBPROC_MACRO_INTERNAL) > >> $(LIBFORMAT_PARSER) $(LIBFFI_POLONIUS) \ > >> $(BACKENDLIBS) > >> @$(call LINK_PROGRESS,$(INDEX.rust),end) > >> > >> @@ -496,4 +494,4 @@ rust/libffi_polonius.a: \ > >> rust/checks/errors/borrowck/ffi-polonius/Cargo.toml \ > >> $(wildcard > >> $(srcdir)/rust/checks/errors/borrowck/ffi-polonius/src/*) > >> cargo build --manifest-path > >> $(srcdir)/rust/checks/errors/borrowck/ffi-polonius/Cargo.toml --release > >> --target-dir rust/ffi-polonius > >> - cp rust/ffi-polonius/release/libffi_polonius.a > >> rust/libffi_polonius.a > >> \ No newline at end of file > >> + cp rust/ffi-polonius/release/libffi_polonius.a > >> rust/libffi_polonius.a > >> -- > >> 2.42.0 > >> > > -- > Arthur Cohen <arthur.co...@embecosm.com> > > Toolchain Engineer > > Embecosm GmbH > > Geschäftsführer: Jeremy Bennett > Niederlassung: Nürnberg > Handelsregister: HR-B 36368 > www.embecosm.de > > Fürther Str. 27 > 90429 Nürnberg > > > Tel.: 091 - 128 707 040 > Fax: 091 - 128 707 077