On Tue, Apr 9, 2024 at 10:25 AM Andrew Pinski <pins...@gmail.com> wrote: > > > > On Tue, Apr 9, 2024, 10:07 H.J. Lu <hjl.to...@gmail.com> wrote: >> >> Since Glibc 2.34 all pthreads symbols are defined directly in libc not >> libpthread, and since Glibc 2.32 we have used __libc_single_threaded to >> avoid unnecessary locking in single-threaded programs. This means there >> is no reason to avoid linking to libpthread now, and so no reason to use >> weak symbols defined in gthr-posix.h for all the pthread_xxx functions. > > > > First you forgot to cc fortran@. Second the issue is in gthrd-posix.h which > should be fixed instead of libgfortran since the issue will also be seen with > libobjc, and the other users of gthrd.
Weak symbol reference to pthread doesn't fail for all static executables. Fixing it on a per-library basis is one approach. > Note the fix for libstdc++ was also done in the wrong location too and should > have done once and for all in gthrd-posix.h. > > > Thanks, > Andrew > >> >> Also add prune_warnings to libgomp.exp to prune glibc static link warning: >> >> .*: warning: Using 'dlopen' in statically linked applications requires at >> runtime the shared libraries from the glibc version us ed for linking >> >> libgfortran/ >> >> PR libgfortran/114646 >> * acinclude.m4: Define GTHREAD_USE_WEAK 0 for glibc 2.34 or >> above on Linux. >> * configure: Regenerated. >> >> libgomp/ >> >> PR libgfortran/114646 >> * testsuite/lib/libgomp.exp (prune_warnings): New. >> * testsuite/libgomp.fortran/pr114646-1.f90: New test. >> * testsuite/libgomp.fortran/pr114646-2.f90: Likewise. >> --- >> libgfortran/acinclude.m4 | 14 +++++++++ >> libgfortran/configure | 29 +++++++++++++++++++ >> libgomp/testsuite/lib/libgomp.exp | 14 +++++++++ >> .../testsuite/libgomp.fortran/pr114646-1.f90 | 11 +++++++ >> .../testsuite/libgomp.fortran/pr114646-2.f90 | 22 ++++++++++++++ >> 5 files changed, 90 insertions(+) >> create mode 100644 libgomp/testsuite/libgomp.fortran/pr114646-1.f90 >> create mode 100644 libgomp/testsuite/libgomp.fortran/pr114646-2.f90 >> >> diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4 >> index a73207e5465..f4642494c4f 100644 >> --- a/libgfortran/acinclude.m4 >> +++ b/libgfortran/acinclude.m4 >> @@ -92,6 +92,20 @@ void foo (void); >> AC_DEFINE(GTHREAD_USE_WEAK, 0, >> [Define to 0 if the target shouldn't use #pragma weak]) >> ;; >> + *-*-linux*) >> + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ >> +#include <features.h> >> +#if !__GLIBC_PREREQ(2, 34) >> +#error glibc version is too old >> +#endif >> +]], [[]])], >> + libgfor_cv_use_pragma_weak=no, >> + libgfor_cv_use_pragma_weak=yes) >> + if test $libgfor_cv_use_pragma_weak = no; then >> + AC_DEFINE(GTHREAD_USE_WEAK, 0, >> + [Define to 0 if the target shouldn't use #pragma weak]) >> + fi >> + ;; >> esac]) >> >> dnl Check whether target effectively supports weakref >> diff --git a/libgfortran/configure b/libgfortran/configure >> index 774dd52fc95..1f477256b75 100755 >> --- a/libgfortran/configure >> +++ b/libgfortran/configure >> @@ -31057,6 +31057,35 @@ $as_echo "#define SUPPORTS_WEAK 1" >>confdefs.h >> >> $as_echo "#define GTHREAD_USE_WEAK 0" >>confdefs.h >> >> + ;; >> + *-*-linux*) >> + cat confdefs.h - <<_ACEOF >conftest.$ac_ext >> +/* end confdefs.h. */ >> + >> +#include <features.h> >> +#if !__GLIBC_PREREQ(2, 34) >> +#error glibc version is too old >> +#endif >> + >> +int >> +main () >> +{ >> + >> + ; >> + return 0; >> +} >> +_ACEOF >> +if ac_fn_c_try_compile "$LINENO"; then : >> + libgfor_cv_use_pragma_weak=no >> +else >> + libgfor_cv_use_pragma_weak=yes >> +fi >> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext >> + if test $libgfor_cv_use_pragma_weak = no; then >> + >> +$as_echo "#define GTHREAD_USE_WEAK 0" >>confdefs.h >> + >> + fi >> ;; >> esac >> >> diff --git a/libgomp/testsuite/lib/libgomp.exp >> b/libgomp/testsuite/lib/libgomp.exp >> index cab926a798b..9cfa6d7b31d 100644 >> --- a/libgomp/testsuite/lib/libgomp.exp >> +++ b/libgomp/testsuite/lib/libgomp.exp >> @@ -54,6 +54,20 @@ set dg-do-what-default run >> >> set libgomp_compile_options "" >> >> +# Prune messages that aren't useful. >> + >> +proc prune_warnings { text } { >> + >> + verbose "prune_warnings: entry: $text" 2 >> + >> + # Ignore warning from -static: warning: Using 'dlopen' in statically >> linked applications requires at runtime the shared libraries from the glibc >> version used for linking >> + regsub -all "(^|\n)\[^\n\]*: warning: Using 'dlopen' in statically >> linked\[^\n\]*" $text "" text >> + >> + verbose "prune_warnings: exit: $text" 2 >> + >> + return $text >> +} >> + >> # >> # libgomp_init >> # >> diff --git a/libgomp/testsuite/libgomp.fortran/pr114646-1.f90 >> b/libgomp/testsuite/libgomp.fortran/pr114646-1.f90 >> new file mode 100644 >> index 00000000000..a48e6103343 >> --- /dev/null >> +++ b/libgomp/testsuite/libgomp.fortran/pr114646-1.f90 >> @@ -0,0 +1,11 @@ >> +! PR libgfortran/114646 >> +! { dg-do run } >> +! { dg-additional-options "-static" } >> + >> +!$OMP PARALLEL >> +!$OMP CRITICAL >> + write(6,*) "Hello world" >> +!$OMP END CRITICAL >> +!$OMP END PARALLEL >> + write(6,*) "Done!" >> +END >> diff --git a/libgomp/testsuite/libgomp.fortran/pr114646-2.f90 >> b/libgomp/testsuite/libgomp.fortran/pr114646-2.f90 >> new file mode 100644 >> index 00000000000..8c0d7526f95 >> --- /dev/null >> +++ b/libgomp/testsuite/libgomp.fortran/pr114646-2.f90 >> @@ -0,0 +1,22 @@ >> +! PR libgfortran/114646 >> +! { dg-do run } >> +! { dg-additional-options "-static" } >> + >> + use omp_lib >> + implicit none >> + integer, parameter :: NT = 4 >> + integer :: nThreads(NT) >> + >> + print *, 'Call omp_set_dynamic' >> +!$ call omp_set_dynamic(.false.) >> + print *, 'Call omp_set_num_threads' >> +!$ call omp_set_num_threads(NT) >> + print *, 'Now enter the parallel region' >> + >> +!$omp parallel default(none) shared(nThreads) >> + nThreads(omp_get_thread_num()+1) = omp_get_num_threads() >> +!$omp end parallel >> + >> + print*, nThreads >> + >> + END >> -- >> 2.44.0 >> -- H.J.