diff mbox series

[libstdc++] introduce --disable-compat-libstdcxx-abi

Message ID or5xwidlmm.fsf@lxoliva.fsfla.org
State New
Headers show
Series [libstdc++] introduce --disable-compat-libstdcxx-abi | expand

Commit Message

Alexandre Oliva April 16, 2024, 3:36 a.m. UTC
A number of libstdc++ tests that implicitly instantiate
__to_chars_i<unsigned int128_t> and also link floating_to_chars.o in
fail on vxworks kernel mode.  The platform doesn't support undefweak
symbols (the kernel module loader fails to load modules containing
them), and because creating such modules doesn't involve final
linking, only -r linking.  The vague-linkage weak defs with abi-v2
mangling that get discarded from floating_to_chars.o because the same
comdat section is present in the main executable.  But since the
alternate mangling is not defined in the main executable, the weak
definition decays to a weak undefined symbol in the partially-linked
kernel module, and then the kernel module loader barfs.

Since our vxworks toolchains have little use for the compat ABI
symbols, I thought we could work around this problem by getting rid of
them.  Absent a configure option to control that, I added one.

Regstrapped on x86_64-linux-gnu.  Also tested with gcc-13 on arm-,
aarch64-, x86- and x86_64-vxworks7r2.  Ok to install?

PS: for an alternate path to avoid this problem, see also
https://sourceware.org/pipermail/binutils/2024-April/133602.html
https://sourceware.org/pipermail/binutils/2024-April/133410.html 


for  libstdc++-v3/ChangeLog

	* acinclude.m4 (GLIBCXX_EXPORT_FLAGS): Split -Wabi=2...
	(GLIBCXX_ENABLE_WABI): ... here.  Control it with newly added
	--disable-compat-libstdcxx-abi.
	* configure: Rebuilt.
	* doc/html/manual/configure.html: Document it.
---
 libstdc++-v3/acinclude.m4                   |   26 ++++++++++++++
 libstdc++-v3/configure                      |   49 ++++++++++++++++++++++-----
 libstdc++-v3/doc/html/manual/configure.html |    2 +
 3 files changed, 67 insertions(+), 10 deletions(-)

Comments

Jonathan Wakely April 16, 2024, 6:55 a.m. UTC | #1
On Tue, 16 Apr 2024 at 04:37, Alexandre Oliva <oliva@adacore.com> wrote:
>
>
> A number of libstdc++ tests that implicitly instantiate
> __to_chars_i<unsigned int128_t> and also link floating_to_chars.o in
> fail on vxworks kernel mode.  The platform doesn't support undefweak
> symbols (the kernel module loader fails to load modules containing
> them), and because creating such modules doesn't involve final
> linking, only -r linking.  The vague-linkage weak defs with abi-v2
> mangling that get discarded from floating_to_chars.o because the same
> comdat section is present in the main executable.  But since the
> alternate mangling is not defined in the main executable, the weak
> definition decays to a weak undefined symbol in the partially-linked
> kernel module, and then the kernel module loader barfs.
>
> Since our vxworks toolchains have little use for the compat ABI
> symbols, I thought we could work around this problem by getting rid of
> them.  Absent a configure option to control that, I added one.
>
> Regstrapped on x86_64-linux-gnu.  Also tested with gcc-13 on arm-,
> aarch64-, x86- and x86_64-vxworks7r2.  Ok to install?
>
> PS: for an alternate path to avoid this problem, see also
> https://sourceware.org/pipermail/binutils/2024-April/133602.html
> https://sourceware.org/pipermail/binutils/2024-April/133410.html
>
>
> for  libstdc++-v3/ChangeLog
>
>         * acinclude.m4 (GLIBCXX_EXPORT_FLAGS): Split -Wabi=2...
>         (GLIBCXX_ENABLE_WABI): ... here.  Control it with newly added
>         --disable-compat-libstdcxx-abi.
>         * configure: Rebuilt.
>         * doc/html/manual/configure.html: Document it.
> ---
>  libstdc++-v3/acinclude.m4                   |   26 ++++++++++++++
>  libstdc++-v3/configure                      |   49 ++++++++++++++++++++++-----
>  libstdc++-v3/doc/html/manual/configure.html |    2 +
>  3 files changed, 67 insertions(+), 10 deletions(-)
>
> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
> index 51a08bcc8b1d0..4ef5d5e98c2be 100644
> --- a/libstdc++-v3/acinclude.m4
> +++ b/libstdc++-v3/acinclude.m4
> @@ -707,10 +707,34 @@ AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
>    # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
>    AC_SUBST(OPTIMIZE_CXXFLAGS)
>
> -  WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
> +  WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual"
>    AC_SUBST(WARN_FLAGS)
> +
> +  GLIBCXX_ENABLE_WABI
>  ])
>
> +dnl
> +dnl Enable -Wabi=2 if not overridden by --disable-compat-libstdcxx-abi.
> +dnl
> +AC_DEFUN([GLIBCXX_ENABLE_WABI], [
> +  # Default.
> +  WARN_FLAGS_WABI=\ -Wabi=2
> +  AC_MSG_CHECKING([for --disable-compat-libstdcxx-abi])
> +  AC_ARG_ENABLE([compat-libstdcxx-abi],

We have the GLIBCXX_ENABLE macro to simplify creating new --enable options.

> +    AC_HELP_STRING([--disable-compat-libstdcxx-abi],
> +                  [Disable backward-compatibility ABI symbols)]),

There's a stray ')' here.

> +    [case "$enableval" in
> +      yes) AC_MSG_RESULT(enabled$WARN_FLAGS_WABI) ;;
> +      no)  WARN_FLAGS_WABI=
> +          AC_MSG_RESULT(disabled) ;;
> +      *)   AC_MSG_RESULT(unsupported)
> +          AC_MSG_ERROR([Unsupported argument to enable/disable compat libstdc++ abi]);;
> +     esac], [
> +          AC_MSG_RESULT(defaulting to enabled$WARN_FLAGS_WABI)
> +     ])
> +
> +  WARN_FLAGS="$WARN_FLAGS$WARN_FLAGS_WABI"
> +])
>
>  dnl
>  dnl All installation directory information is determined here.

[...]

> diff --git a/libstdc++-v3/doc/html/manual/configure.html b/libstdc++-v3/doc/html/manual/configure.html
> index 346b5d345cd1b..8636b2360d9f0 100644
> --- a/libstdc++-v3/doc/html/manual/configure.html
> +++ b/libstdc++-v3/doc/html/manual/configure.html
> @@ -108,6 +108,8 @@
>         then the [time.clock] implementation will use a system call to access
>         the realtime and monotonic clocks, which is significantly slower than
>         the C library's <code class="function">clock_gettime</code> function.
> +    </p></dd><dt><span class="term"><code class="code">--disable-compat-libstdcxx-abi</code></span></dt><dd><p>Disables
> +    backward-compatibility ABI symbols.
>      </p></dd><dt><span class="term"><code class="code">--enable-libstdcxx-debug</code></span></dt><dd><p>Build separate debug libraries in addition to what is normally built.
>         By default, the debug libraries are compiled with
>         <code class="code"> CXXFLAGS='-g3 -O0 -fno-inline'</code>

This should be in doc/xml/manual/configure.xml too, which is used to
generate the HTML using docbook. Otherwise this change will be lost
next time the docs are regenerated.

The description here in the docs (and the name of the configure
option) seem much too vague. Libstdc++ has dozens, probably hundreds,
of "backward-compatibility ABI symbols", and this only affects touches
a tiny handful of them. Just the aliases created automatically by the
compiler for mangling changes, right? From the name of the configure
option and the doc entry, I'd expect it to also affect e.g.
src/c++11/compatibility-*.cc and maybe to have some interaction with
--disable-libstdcxx-dual-abi.

The change seems fine in principle, but needs a better name and documentation.
Alexandre Oliva April 18, 2024, 2:45 p.m. UTC | #2
On Apr 16, 2024, Jonathan Wakely <jwakely.gcc@gmail.com> wrote:

>> +dnl
>> +dnl Enable -Wabi=2 if not overridden by --disable-compat-libstdcxx-abi.
>> +dnl
>> +AC_DEFUN([GLIBCXX_ENABLE_WABI], [
>> +  # Default.
>> +  WARN_FLAGS_WABI=\ -Wabi=2
>> +  AC_MSG_CHECKING([for --disable-compat-libstdcxx-abi])
>> +  AC_ARG_ENABLE([compat-libstdcxx-abi],

> We have the GLIBCXX_ENABLE macro to simplify creating new --enable options.

*nod*.  There was some reason why I didn't use it at first.  Maybe it
can be used with the patch as it ended up.  Will revisit.

>> +    AC_HELP_STRING([--disable-compat-libstdcxx-abi],
>> +                  [Disable backward-compatibility ABI symbols)]),

> There's a stray ')' here.

Ugh, thanks

>> --- a/libstdc++-v3/doc/html/manual/configure.html
>> +++ b/libstdc++-v3/doc/html/manual/configure.html

> This should be in doc/xml/manual/configure.xml too, which is used to
> generate the HTML using docbook.

Oh, right.  Doh.  So much for grepping for an existing option and
jumping to edit the first match :-)

> The description here in the docs (and the name of the configure
> option) seem much too vague. Libstdc++ has dozens, probably hundreds,
> of "backward-compatibility ABI symbols", and this only affects touches
> a tiny handful of them. Just the aliases created automatically by the
> compiler for mangling changes, right?

Yeah.

I had used --disable-libstdcxx-Wabi at some point, maybe that's better.


FTR, we now have a binutils patch (thanks H.J.Lu) to address the
underlying problem, so we'll probably no longer need the workaround that
led me to propose this change.  I wonder if there's interest in keeping
it.  I'd be equally happy to make the adjustments, or to withdraw it (or
pretty much anything in between ;-).  WDYT?
diff mbox series

Patch

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 51a08bcc8b1d0..4ef5d5e98c2be 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -707,10 +707,34 @@  AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
   # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
   AC_SUBST(OPTIMIZE_CXXFLAGS)
 
-  WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
+  WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual"
   AC_SUBST(WARN_FLAGS)
+
+  GLIBCXX_ENABLE_WABI
 ])
 
+dnl
+dnl Enable -Wabi=2 if not overridden by --disable-compat-libstdcxx-abi.
+dnl
+AC_DEFUN([GLIBCXX_ENABLE_WABI], [
+  # Default.
+  WARN_FLAGS_WABI=\ -Wabi=2
+  AC_MSG_CHECKING([for --disable-compat-libstdcxx-abi])
+  AC_ARG_ENABLE([compat-libstdcxx-abi],
+    AC_HELP_STRING([--disable-compat-libstdcxx-abi],
+		   [Disable backward-compatibility ABI symbols)]),
+    [case "$enableval" in
+      yes) AC_MSG_RESULT(enabled$WARN_FLAGS_WABI) ;;
+      no)  WARN_FLAGS_WABI=
+	   AC_MSG_RESULT(disabled) ;;
+      *)   AC_MSG_RESULT(unsupported)
+	   AC_MSG_ERROR([Unsupported argument to enable/disable compat libstdc++ abi]);;
+     esac], [
+	   AC_MSG_RESULT(defaulting to enabled$WARN_FLAGS_WABI)
+     ])
+
+  WARN_FLAGS="$WARN_FLAGS$WARN_FLAGS_WABI"
+])
 
 dnl
 dnl All installation directory information is determined here.
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 21abaeb077881..8066397b58c2e 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -973,6 +973,7 @@  enable_cet
 with_gxx_include_dir
 enable_version_specific_runtime_libs
 with_toolexeclibdir
+enable_compat_libstdcxx_abi
 with_gcc_major_version_only
 '
       ac_precious_vars='build_alias
@@ -1689,6 +1690,8 @@  Optional Features:
   --enable-version-specific-runtime-libs
                           Specify that runtime libraries should be installed
                           in a compiler-specific directory
+  --disable-compat-libstdcxx-abi
+                          Disable backward-compatibility ABI symbols)
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -12280,7 +12283,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12283 "configure"
+#line 12286 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12386,7 +12389,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12389 "configure"
+#line 12392 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -16182,7 +16185,7 @@  $as_echo "$glibcxx_cv_atomic_long_long" >&6; }
   # Fake what AC_TRY_COMPILE does.
 
     cat > conftest.$ac_ext << EOF
-#line 16185 "configure"
+#line 16188 "configure"
 int main()
 {
   typedef bool atomic_type;
@@ -16217,7 +16220,7 @@  $as_echo "$glibcxx_cv_atomic_bool" >&6; }
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 16220 "configure"
+#line 16223 "configure"
 int main()
 {
   typedef short atomic_type;
@@ -16252,7 +16255,7 @@  $as_echo "$glibcxx_cv_atomic_short" >&6; }
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 16255 "configure"
+#line 16258 "configure"
 int main()
 {
   // NB: _Atomic_word not necessarily int.
@@ -16288,7 +16291,7 @@  $as_echo "$glibcxx_cv_atomic_int" >&6; }
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 16291 "configure"
+#line 16294 "configure"
 int main()
 {
   typedef long long atomic_type;
@@ -16444,7 +16447,7 @@  $as_echo "mutex" >&6; }
   # unnecessary for this test.
 
     cat > conftest.$ac_ext << EOF
-#line 16447 "configure"
+#line 16450 "configure"
 int main()
 {
   _Decimal32 d1;
@@ -16486,7 +16489,7 @@  ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
   # unnecessary for this test.
 
   cat > conftest.$ac_ext << EOF
-#line 16489 "configure"
+#line 16492 "configure"
 template<typename T1, typename T2>
   struct same
   { typedef T2 type; };
@@ -55671,7 +55674,35 @@  $as_echo "$gxx_include_dir" >&6; }
   # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
 
 
-  WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
+  WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual"
+
+
+
+  # Default.
+  WARN_FLAGS_WABI=\ -Wabi=2
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --disable-compat-libstdcxx-abi" >&5
+$as_echo_n "checking for --disable-compat-libstdcxx-abi... " >&6; }
+  # Check whether --enable-compat-libstdcxx-abi was given.
+if test "${enable_compat_libstdcxx_abi+set}" = set; then :
+  enableval=$enable_compat_libstdcxx_abi; case "$enableval" in
+      yes) { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled$WARN_FLAGS_WABI" >&5
+$as_echo "enabled$WARN_FLAGS_WABI" >&6; } ;;
+      no)  WARN_FLAGS_WABI=
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; } ;;
+      *)   { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; }
+	   as_fn_error $? "Unsupported argument to enable/disable compat libstdc++ abi" "$LINENO" 5;;
+     esac
+else
+
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: result: defaulting to enabled$WARN_FLAGS_WABI" >&5
+$as_echo "defaulting to enabled$WARN_FLAGS_WABI" >&6; }
+
+fi
+
+
+  WARN_FLAGS="$WARN_FLAGS$WARN_FLAGS_WABI"
 
 
 
diff --git a/libstdc++-v3/doc/html/manual/configure.html b/libstdc++-v3/doc/html/manual/configure.html
index 346b5d345cd1b..8636b2360d9f0 100644
--- a/libstdc++-v3/doc/html/manual/configure.html
+++ b/libstdc++-v3/doc/html/manual/configure.html
@@ -108,6 +108,8 @@ 
 	then the [time.clock] implementation will use a system call to access
 	the realtime and monotonic clocks, which is significantly slower than
 	the C library's <code class="function">clock_gettime</code> function.
+    </p></dd><dt><span class="term"><code class="code">--disable-compat-libstdcxx-abi</code></span></dt><dd><p>Disables
+    backward-compatibility ABI symbols.
     </p></dd><dt><span class="term"><code class="code">--enable-libstdcxx-debug</code></span></dt><dd><p>Build separate debug libraries in addition to what is normally built.
 	By default, the debug libraries are compiled with
 	<code class="code"> CXXFLAGS='-g3 -O0 -fno-inline'</code>