From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1698) id C5D2F3846405; Wed, 3 Apr 2024 14:56:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C5D2F3846405 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1712156218; bh=bHVfEux9NLdopQQ5XW4QBuSBimDZzNUVXVmXU2oc1C8=; h=From:To:Subject:Date:From; b=GSp+uU+VDYlDeCJDjlsrLXvrBnSqYKnH8Mc1LmbBJUPNghlUeRijwCIU3ahDoG7HS 8VD8YX2gEtwY6qPIh1rAgIoxv3ZstsU3wEBoUhgVvvkJsTP+6jvyJYUBFfSjqVQhpT YISTAZrWv3Wz4dQ5BFN7e98Dy4zNM+183fE01CxU= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Iain D Sandoe To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r13-8577] libstdc++, Darwin: Handle a linker warning [PR112397]. X-Act-Checkin: gcc X-Git-Author: Iain Sandoe X-Git-Refname: refs/heads/releases/gcc-13 X-Git-Oldrev: 5975807ae77896e6e67656f38304149a643816b9 X-Git-Newrev: ae11f0154116f4e5fa8769b1ea1600b1b1c22958 Message-Id: <20240403145658.C5D2F3846405@sourceware.org> Date: Wed, 3 Apr 2024 14:56:58 +0000 (GMT) List-Id: https://gcc.gnu.org/g:ae11f0154116f4e5fa8769b1ea1600b1b1c22958 commit r13-8577-gae11f0154116f4e5fa8769b1ea1600b1b1c22958 Author: Iain Sandoe 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 Co-authored-by: Jonathan Wakely (cherry picked from commit 1609fdff16f17ead37666f6d0e801800ee3d04d2) Diff: --- libstdc++-v3/configure | 36 ++++++++++++++++++++++++++++-------- libstdc++-v3/configure.ac | 7 +++++++ libstdc++-v3/libsupc++/Makefile.am | 8 ++++++++ libstdc++-v3/libsupc++/Makefile.in | 6 ++++++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 53882c3f6b6..d35baaf7c6e 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_static enable_shared lt_host_flags @@ -12187,7 +12189,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12190 "configure" +#line 12192 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12293,7 +12295,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12296 "configure" +#line 12298 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -15595,6 +15597,20 @@ esac +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" postdep_objects_CXX="${postdep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_end.o" @@ -16017,7 +16033,7 @@ $as_echo "$glibcxx_cv_atomic_long_long" >&6; } # Fake what AC_TRY_COMPILE does. cat > conftest.$ac_ext << EOF -#line 16020 "configure" +#line 16036 "configure" int main() { typedef bool atomic_type; @@ -16052,7 +16068,7 @@ $as_echo "$glibcxx_cv_atomic_bool" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 16055 "configure" +#line 16071 "configure" int main() { typedef short atomic_type; @@ -16087,7 +16103,7 @@ $as_echo "$glibcxx_cv_atomic_short" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 16090 "configure" +#line 16106 "configure" int main() { // NB: _Atomic_word not necessarily int. @@ -16123,7 +16139,7 @@ $as_echo "$glibcxx_cv_atomic_int" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 16126 "configure" +#line 16142 "configure" int main() { typedef long long atomic_type; @@ -16279,7 +16295,7 @@ $as_echo "mutex" >&6; } # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 16282 "configure" +#line 16298 "configure" int main() { _Decimal32 d1; @@ -16321,7 +16337,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 16324 "configure" +#line 16340 "configure" template struct same { typedef T2 type; }; @@ -73293,6 +73309,10 @@ if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" 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 91b3c1f32f2..0c3c7a2c11c 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -109,6 +109,13 @@ ACX_LT_HOST_FLAGS AC_SUBST(enable_shared) AC_SUBST(enable_static) +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" postdep_objects_CXX="${postdep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_end.o" diff --git a/libstdc++-v3/libsupc++/Makefile.am b/libstdc++-v3/libsupc++/Makefile.am index edb6ebda851..2bd25211816 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 2e755abf14c..732ab89c8a2 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)