public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-9073] libstdc++, Darwin: Handle a linker warning [PR112397].
@ 2024-02-19 20:16 Iain D Sandoe
  0 siblings, 0 replies; only message in thread
From: Iain D Sandoe @ 2024-02-19 20:16 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:1609fdff16f17ead37666f6d0e801800ee3d04d2

commit r14-9073-g1609fdff16f17ead37666f6d0e801800ee3d04d2
Author: Iain Sandoe <iain@sandoe.co.uk>
Date:   Thu Feb 8 17:54:31 2024 +0000

    libstdc++, Darwin: Handle a linker warning [PR112397].
    
    Darwin's linker warns when we make a direct branch to code that is
    in a weak definition (citing that if a different implementation of
    the weak function is chosen by the dynamic linker this would be an
    error).
    
    As the analysis in the PR shows, this can happen when we have hot/
    cold partitioning and there is an error path that is primarily cold
    but makes use of epilogue code in the hot section.  In this simple
    case, we can easily deduce that the code is in fact safe; however
    that is not something we can realistically implement in the linker.
    
    Since the user-replaceable allocators are implemented using weak
    definitions, this is a warning that is frequently flagged up in both
    the testsuite and end-user code.
    
    The chosen solution here is to suppress the hot/cold partitioning for
    these cases (it is unlikely to impact performance much c.f. the
    actual allocation).
    
            PR target/112397
    
    libstdc++-v3/ChangeLog:
    
            * configure: Regenerate.
            * configure.ac: Detect if we are building for Darwin.
            * libsupc++/Makefile.am: If we are building for Darwin, then
            suppress hot/cold partitioning for the array allocators.
            * libsupc++/Makefile.in: Regenerated.
    
    Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
    Co-authored-by: Jonathan Wakely <jwakely@redhat.com>

Diff:
---
 libstdc++-v3/configure             | 35 +++++++++++++++++++++++++++--------
 libstdc++-v3/configure.ac          |  6 ++++++
 libstdc++-v3/libsupc++/Makefile.am |  8 ++++++++
 libstdc++-v3/libsupc++/Makefile.in |  6 ++++++
 4 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index f4bc04867683..21abaeb07788 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -789,6 +789,8 @@ GLIBCXX_HOSTED_TRUE
 glibcxx_compiler_shared_flag
 glibcxx_compiler_pic_flag
 glibcxx_lt_pic_flag
+OS_IS_DARWIN_FALSE
+OS_IS_DARWIN_TRUE
 ENABLE_DARWIN_AT_RPATH_FALSE
 ENABLE_DARWIN_AT_RPATH_TRUE
 enable_static
@@ -12278,7 +12280,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12281 "configure"
+#line 12283 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12384,7 +12386,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12387 "configure"
+#line 12389 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -15744,6 +15746,19 @@ else
   ENABLE_DARWIN_AT_RPATH_FALSE=
 fi
 
+os_is_darwin=no
+case ${host_os} in
+  darwin*) os_is_darwin=yes ;;
+  *) ;;
+esac
+ if test x${os_is_darwin} = xyes; then
+  OS_IS_DARWIN_TRUE=
+  OS_IS_DARWIN_FALSE='#'
+else
+  OS_IS_DARWIN_TRUE='#'
+  OS_IS_DARWIN_FALSE=
+fi
+
 
 if test "$enable_vtable_verify" = yes; then
   predep_objects_CXX="${predep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_start.o"
@@ -16167,7 +16182,7 @@ $as_echo "$glibcxx_cv_atomic_long_long" >&6; }
   # Fake what AC_TRY_COMPILE does.
 
     cat > conftest.$ac_ext << EOF
-#line 16170 "configure"
+#line 16185 "configure"
 int main()
 {
   typedef bool atomic_type;
@@ -16202,7 +16217,7 @@ $as_echo "$glibcxx_cv_atomic_bool" >&6; }
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 16205 "configure"
+#line 16220 "configure"
 int main()
 {
   typedef short atomic_type;
@@ -16237,7 +16252,7 @@ $as_echo "$glibcxx_cv_atomic_short" >&6; }
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 16240 "configure"
+#line 16255 "configure"
 int main()
 {
   // NB: _Atomic_word not necessarily int.
@@ -16273,7 +16288,7 @@ $as_echo "$glibcxx_cv_atomic_int" >&6; }
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 16276 "configure"
+#line 16291 "configure"
 int main()
 {
   typedef long long atomic_type;
@@ -16429,7 +16444,7 @@ $as_echo "mutex" >&6; }
   # unnecessary for this test.
 
     cat > conftest.$ac_ext << EOF
-#line 16432 "configure"
+#line 16447 "configure"
 int main()
 {
   _Decimal32 d1;
@@ -16471,7 +16486,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
   # unnecessary for this test.
 
   cat > conftest.$ac_ext << EOF
-#line 16474 "configure"
+#line 16489 "configure"
 template<typename T1, typename T2>
   struct same
   { typedef T2 type; };
@@ -55833,6 +55848,10 @@ if test -z "${ENABLE_DARWIN_AT_RPATH_TRUE}" && test -z "${ENABLE_DARWIN_AT_RPATH
   as_fn_error $? "conditional \"ENABLE_DARWIN_AT_RPATH\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${OS_IS_DARWIN_TRUE}" && test -z "${OS_IS_DARWIN_FALSE}"; then
+  as_fn_error $? "conditional \"OS_IS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${GLIBCXX_HOSTED_TRUE}" && test -z "${GLIBCXX_HOSTED_FALSE}"; then
   as_fn_error $? "conditional \"GLIBCXX_HOSTED\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index c68cac4f345d..37396bd6ebbe 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -109,6 +109,12 @@ ACX_LT_HOST_FLAGS
 AC_SUBST(enable_shared)
 AC_SUBST(enable_static)
 AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = xyes])
+os_is_darwin=no
+case ${host_os} in
+  darwin*) os_is_darwin=yes ;;
+  *) ;;
+esac
+AM_CONDITIONAL([OS_IS_DARWIN], [test x${os_is_darwin} = xyes])
 
 if test "$enable_vtable_verify" = yes; then
   predep_objects_CXX="${predep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_start.o"
diff --git a/libstdc++-v3/libsupc++/Makefile.am b/libstdc++-v3/libsupc++/Makefile.am
index d0e1618507e0..e151ce7a1fe6 100644
--- a/libstdc++-v3/libsupc++/Makefile.am
+++ b/libstdc++-v3/libsupc++/Makefile.am
@@ -132,6 +132,14 @@ atomicity_file = ${glibcxx_srcdir}/$(ATOMICITY_SRCDIR)/atomicity.h
 atomicity.cc: ${atomicity_file}
 	$(LN_S) ${atomicity_file} ./atomicity.cc || true
 
+if OS_IS_DARWIN
+# See PR 112397
+new_opvnt.lo: new_opvnt.cc
+	$(LTCXXCOMPILE) -fno-reorder-blocks-and-partition -I. -c $<
+new_opvnt.o: new_opvnt.cc
+	$(CXXCOMPILE) -fno-reorder-blocks-and-partition -I. -c $<
+endif
+
 # AM_CXXFLAGS needs to be in each subdirectory so that it can be
 # modified in a per-library or per-sub-library way.  Need to manually
 # set this option because CONFIG_CXXFLAGS has to be after
diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in
index 2e755abf14c1..732ab89c8a2e 100644
--- a/libstdc++-v3/libsupc++/Makefile.in
+++ b/libstdc++-v3/libsupc++/Makefile.in
@@ -973,6 +973,12 @@ cp-demangle.o: cp-demangle.c
 atomicity.cc: ${atomicity_file}
 	$(LN_S) ${atomicity_file} ./atomicity.cc || true
 
+# See PR 112397
+@OS_IS_DARWIN_TRUE@new_opvnt.lo: new_opvnt.cc
+@OS_IS_DARWIN_TRUE@	$(LTCXXCOMPILE) -fno-reorder-blocks-and-partition -I. -c $<
+@OS_IS_DARWIN_TRUE@new_opvnt.o: new_opvnt.cc
+@OS_IS_DARWIN_TRUE@	$(CXXCOMPILE) -fno-reorder-blocks-and-partition -I. -c $<
+
 install-stdHEADERS: $(std_HEADERS)
 	@$(NORMAL_INSTALL)
 	$(mkinstalldirs) $(DESTDIR)$(stddir)

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-19 20:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-19 20:16 [gcc r14-9073] libstdc++, Darwin: Handle a linker warning [PR112397] Iain D Sandoe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).