Hi Joseph, hi Jakub,

(a) For the driver route:

On 10/15/20 12:22 AM, Joseph Myers wrote:
I think it should be somewhere in the expansion of %(link_gcc_c_sequence)
(i.e. LINK_GCC_C_SEQUENCE_SPEC, which has various target-specific
definitions), since that's what expands to something like -lgcc -lc -lgcc.
Maybe after the first -lgcc and before the -lc, since libatomic has
references to libc functions.

Lightly tested draft patch attached. (--enable-autolink-libatomic is 'no' by 
default)
Does this make sense, in principle?

When trying the patch, one runs into the problem that -latomic
fails in the target configure for libgomp ("error: C compiler
cannot create executables"). Any suggestion? (That's on x86_64-gnu-linux.)

(b) I start thinking that putting it into libgomp.spec – possibly with the new 
configure
--enable... flag and/or only for nvptx (which uses libatomic via
../libgomp/config/nvptx/atomic.c) – is the better solution.
Thoughts?

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander 
Walter
configure: Add --enable-autolink-libatomic, use in LINK_GCC_C_SEQUENCE_SPEC [PR81358]

ChangeLog:
	PR gcc/81358
	* Makefile.in (HOST_EXPORTS): Also export TARGET_CONFIGDIRS.

gcc/ChangeLog:

	PR gcc/81358
	* configure.ac: Add --enable-autolink-libatomic.
	* gcc.c (LINK_LIBATOMIC_SPEC): Conditionally define it.
	(LINK_GCC_C_SEQUENCE_SPEC): Use it.
	* config/gnu-user.h (LINK_LIBATOMIC_SPEC): Conditionally define it.
	(GNU_USER_TARGET_LINK_GCC_C_SEQUENCE_SPEC): Use it.
	* doc/install.texi: Add --enable-autolink-libatomic.
	* doc/tm.texi.in (LINK_LIBATOMIC_SPEC): Add.
	(LINK_GCC_C_SEQUENCE_SPEC): Update.
	* config.in: Regenerated.
	* configure: Regenerated.
	* doc/tm.texi: Regenerated.

 Makefile.in           |  1 +
 gcc/config.in         |  6 ++++++
 gcc/config/gnu-user.h | 10 +++++++++-
 gcc/configure         | 36 +++++++++++++++++++++++++++++++++---
 gcc/configure.ac      | 23 ++++++++++++++++++++++-
 gcc/doc/install.texi  |  8 ++++++++
 gcc/doc/tm.texi       |  8 +++++++-
 gcc/doc/tm.texi.in    |  8 +++++++-
 gcc/gcc.c             | 10 +++++++++-
 9 files changed, 102 insertions(+), 8 deletions(-)

diff --git a/Makefile.in b/Makefile.in
index 36e369df6e7..7deb476905f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -221,6 +221,7 @@ HOST_EXPORTS = \
 	RANLIB_FOR_TARGET="$(RANLIB_FOR_TARGET)"; export RANLIB_FOR_TARGET; \
 	READELF_FOR_TARGET="$(READELF_FOR_TARGET)"; export READELF_FOR_TARGET; \
 	TOPLEVEL_CONFIGURE_ARGUMENTS="$(TOPLEVEL_CONFIGURE_ARGUMENTS)"; export TOPLEVEL_CONFIGURE_ARGUMENTS; \
+	TARGET_CONFIGDIRS="$(TARGET_CONFIGDIRS)"; export TARGET_CONFIGDIRS; \
 	HOST_LIBS="$(STAGE1_LIBS)"; export HOST_LIBS; \
 	GMPLIBS="$(HOST_GMPLIBS)"; export GMPLIBS; \
 	GMPINC="$(HOST_GMPINC)"; export GMPINC; \
diff --git a/gcc/config/gnu-user.h b/gcc/config/gnu-user.h
index ff2e880b1fa..73a34118949 100644
--- a/gcc/config/gnu-user.h
+++ b/gcc/config/gnu-user.h
@@ -109,8 +109,16 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
 #endif
 
+#if !defined(LINK_LIBATOMIC_SPEC) && defined(ENABLE_AUTOLINK_LIBATOMIC)
+#  ifdef LD_AS_NEEDED_OPTION
+#    define LINK_LIBATOMIC_SPEC LD_AS_NEEDED_OPTION " -latomic " LD_NO_AS_NEEDED_OPTION
+#  else
+#    define LINK_LIBATOMIC_SPEC "-latomic"
+#  endif
+#endif
+
 #define GNU_USER_TARGET_LINK_GCC_C_SEQUENCE_SPEC \
-  "%{static|static-pie:--start-group} %G %{!nolibc:%L} \
+  "%{static|static-pie:--start-group} %G %{!nolibc:" LINK_LIBATOMIC_SPEC " %L} \
    %{static|static-pie:--end-group}%{!static:%{!static-pie:%G}}"
 
 #undef LINK_GCC_C_SEQUENCE_SPEC
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 26a5d8e3619..a6e795986c0 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -1102,6 +1102,28 @@ AC_ARG_WITH(multilib-list,
 :,
 with_multilib_list=default)
 
+# If libatomic is available, whether it should be linked automatically
+AC_ARG_ENABLE(autolink-libatomic,
+[AS_HELP_STRING([--enable-autolink-libatomic],
+		[enable automatic linking of libatomic (ignored if not built)])],
+[
+  case $enable_autolink_libatomic in
+    yes | no) ;;
+    *) AC_MSG_ERROR(['$enable_autolink_libatomic' is an invalid value for
+--enable-autolink-libatomic.  Valid choices are 'yes' and 'no'.]) ;;
+  esac
+], [enable_autolink_libatomic=''])
+
+if test x$enable_autolink_libatomic = xyes; then
+  if echo " ${TARGET_CONFIGDIRS} " | grep " libatomic " > /dev/null 2>&1 ; then
+    AC_DEFINE(ENABLE_AUTOLINK_LIBATOMIC, 1,
+	[Define if libatomic should always be linked.])
+  else
+    AC_MSG_WARN([libatomic is not build for this target, --enable-autolink-libatomic ignored])
+  fi
+fi
+
+
 # -------------------------
 # Checks for other programs
 # -------------------------
@@ -7106,4 +7128,3 @@ done
 ], 
 [subdirs='$subdirs'])
 AC_OUTPUT
-
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 5330bf3bb29..069d97fb500 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -2171,6 +2171,14 @@ files, but these changed header paths may conflict with some compilation
 environments.  Enabled by default, and may be disabled using
 @option{--disable-canonical-system-headers}.
 
+@item --enable-autolink-libatomic
+@itemx --disable-autolink-libatomic
+Tell GCC that it should automatically link libatomic; if supported by
+the linker, the file is only linked as needed. This flag is ignored
+when libatomic is not built. Note that this conigure flag is in particular
+useful when building an offloading-target compiler; as for those, a
+user had to specify @code{-foffload=target=-latomic} otherwise.
+
 @item --with-glibc-version=@var{major}.@var{minor}
 Tell GCC that when the GNU C Library (glibc) is used on the target it
 will be version @var{major}.@var{minor} or later.  Normally this can
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 412e22c89ab..500551da69a 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -381,7 +381,13 @@ the argument @option{-lgcc} to tell the linker to do the search.
 
 @defmac LINK_GCC_C_SEQUENCE_SPEC
 The sequence in which libgcc and libc are specified to the linker.
-By default this is @code{%G %L %G}.
+By default this is @code{%G LINK_LIBATOMIC_SPEC %L %G}.
+@end defmac
+
+@defmac LINK_LIBATOMIC_SPEC
+This macro is used in the default @code{LINK_GCC_C_SEQUENCE_SPEC} to link
+libatomic. By default, it is unset unless @code{ENABLE_AUTOLINK_LIBATOMIC}
+is set.
 @end defmac
 
 @defmac POST_LINK_SPEC
diff --git a/gcc/gcc.c b/gcc/gcc.c
index ff7b6c4a320..e69f7b34bc6 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -943,13 +943,21 @@ proper position among the other output files.  */
 # define ASM_DEBUG_OPTION_SPEC ""
 #endif
 
+#if !defined(LINK_LIBATOMIC_SPEC) && defined(ENABLE_AUTOLINK_LIBATOMIC)
+#  ifdef LD_AS_NEEDED_OPTION
+#    define LINK_LIBATOMIC_SPEC LD_AS_NEEDED_OPTION " -latomic " LD_NO_AS_NEEDED_OPTION
+#  else
+#    define LINK_LIBATOMIC_SPEC "-latomic"
+#  endif
+#endif
+
 /* Here is the spec for running the linker, after compiling all files.  */
 
 /* This is overridable by the target in case they need to specify the
    -lgcc and -lc order specially, yet not require them to override all
    of LINK_COMMAND_SPEC.  */
 #ifndef LINK_GCC_C_SEQUENCE_SPEC
-#define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:%L %G}"
+#define LINK_GCC_C_SEQUENCE_SPEC "%G %{!nolibc:" LINK_LIBATOMIC_SPEC " %L %G}"
 #endif
 
 #ifndef LINK_SSP_SPEC
diff --git a/gcc/config.in b/gcc/config.in
index 3657c46f349..ed4fefe35cd 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -106,6 +106,12 @@
 #endif
 
 
+/* Define if libatomic should always be linked. */
+#ifndef USED_FOR_TARGET
+#undef ENABLE_AUTOLINK_LIBATOMIC
+#endif
+
+
 /* Define to 1 to specify that we are using the BID decimal floating point
    format instead of DPD */
 #ifndef USED_FOR_TARGET
diff --git a/gcc/configure b/gcc/configure
index abff47d30eb..eb9d02bbef1 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -972,6 +972,7 @@ with_documentation_root_url
 with_changes_root_url
 enable_languages
 with_multilib_list
+enable_autolink_libatomic
 with_zstd
 with_zstd_include
 with_zstd_lib
@@ -1698,6 +1699,9 @@ Optional Features:
   --disable-shared        don't provide a shared libgcc
   --disable-gcov          don't provide libgcov and related host tools
   --enable-languages=LIST specify which front-ends to build
+  --enable-autolink-libatomic
+                          enable automatic linking of libatomic (ignored if
+                          not built)
   --disable-rpath         do not hardcode runtime library paths
   --enable-sjlj-exceptions
                           arrange to use setjmp/longjmp exception handling
@@ -8002,6 +8006,33 @@ else
 fi
 
 
+# If libatomic is available, whether it should be linked automatically
+# Check whether --enable-autolink-libatomic was given.
+if test "${enable_autolink_libatomic+set}" = set; then :
+  enableval=$enable_autolink_libatomic;
+  case $enable_autolink_libatomic in
+    yes | no) ;;
+    *) as_fn_error $? "'$enable_autolink_libatomic' is an invalid value for
+--enable-autolink-libatomic.  Valid choices are 'yes' and 'no'." "$LINENO" 5 ;;
+  esac
+
+else
+  enable_autolink_libatomic=''
+fi
+
+
+if test x$enable_autolink_libatomic = xyes; then
+  if echo " ${TARGET_CONFIGDIRS} " | grep " libatomic " > /dev/null 2>&1 ; then
+
+$as_echo "#define ENABLE_AUTOLINK_LIBATOMIC 1" >>confdefs.h
+
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libatomic is not build for this target, --enable-autolink-libatomic ignored" >&5
+$as_echo "$as_me: WARNING: libatomic is not build for this target, --enable-autolink-libatomic ignored" >&2;}
+  fi
+fi
+
+
 # -------------------------
 # Checks for other programs
 # -------------------------
@@ -19018,7 +19049,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 19021 "configure"
+#line 19052 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -19124,7 +19155,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 19127 "configure"
+#line 19158 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -32715,4 +32746,3 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
-
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 97437e8274f..bf7f846c6bc 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -381,7 +381,13 @@ the argument @option{-lgcc} to tell the linker to do the search.
 
 @defmac LINK_GCC_C_SEQUENCE_SPEC
 The sequence in which libgcc and libc are specified to the linker.
-By default this is @code{%G %L %G}.
+By default this is @code{%G LINK_LIBATOMIC_SPEC %L %G}.
+@end defmac
+
+@defmac LINK_LIBATOMIC_SPEC
+This macro is used in the default @code{LINK_GCC_C_SEQUENCE_SPEC} to link
+libatomic. By default, it is unset unless @code{ENABLE_AUTOLINK_LIBATOMIC}
+is set.
 @end defmac
 
 @defmac POST_LINK_SPEC

Reply via email to