From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id C80743858025 for ; Tue, 12 Apr 2022 21:41:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C80743858025 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-643-ZteHvr49MuSCmgZpi0wRHw-1; Tue, 12 Apr 2022 17:41:33 -0400 X-MC-Unique: ZteHvr49MuSCmgZpi0wRHw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 29BB3185A7BA; Tue, 12 Apr 2022 21:41:33 +0000 (UTC) Received: from localhost (unknown [10.33.36.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id E2BD6404729B; Tue, 12 Apr 2022 21:41:32 +0000 (UTC) From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed 5/5] libstdc++: Prefer to use mmap instead of malloc in libbacktrace Date: Tue, 12 Apr 2022 22:41:28 +0100 Message-Id: <20220412214128.509227-5-jwakely@redhat.com> In-Reply-To: <20220412214128.509227-1-jwakely@redhat.com> References: <20220412214128.509227-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Apr 2022 21:41:36 -0000 Tested powerpc64-linux, pushed to trunk. -- >8 -- As reported in PR libbacktrace/105240, libbacktrace leaks memory when using malloc for allocations. I originally thought it would be simpler to just use malloc unconditionally (because it's supported on all targets) but the leaks make that problematic. This adds libbacktrace's detection for mmap to the libstdc++ configury, so that we use mmap.c and mmapio.c when possible. This avoids the leaks seen previously, at least on linux. libstdc++-v3/ChangeLog: * acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): Check for mmap. * config.h.in: Regenerate. * configure: Regenerate. --- libstdc++-v3/acinclude.m4 | 35 +++++++++++++++++++---- libstdc++-v3/config.h.in | 3 ++ libstdc++-v3/configure | 59 +++++++++++++++++++++++++++++++++------ 3 files changed, 83 insertions(+), 14 deletions(-) diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index f53461c85a5..eac8aeda48b 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -5003,18 +5003,41 @@ elf64) elfsize=64 ;; esac BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize" - ALLOC_FILE=alloc.lo - AC_SUBST(ALLOC_FILE) - VIEW_FILE=read.lo - AC_SUBST(VIEW_FILE) - AC_MSG_CHECKING([whether to build libbacktrace support]) if test "$enable_libstdcxx_backtrace" == "auto"; then enable_libstdcxx_backtrace=no fi if test "$enable_libstdcxx_backtrace" == "yes"; then BACKTRACE_SUPPORTED=1 - BACKTRACE_USES_MALLOC=1 + + AC_CHECK_HEADERS(sys/mman.h) + case "${host}" in + *-*-msdosdjgpp) # DJGPP has sys/man.h, but no mmap + have_mmap=no ;; + *-*-*) + have_mmap="$ac_cv_header_sys_mman_h" ;; + esac + + if test "$have_mmap" = "no"; then + VIEW_FILE=read.lo + ALLOC_FILE=alloc.lo + else + VIEW_FILE=mmapio.lo + AC_PREPROC_IFELSE([AC_LANG_SOURCE([ + #include + #if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON) + #error no MAP_ANONYMOUS + #endif + ])], [ALLOC_FILE=mmap.lo], [ALLOC_FILE=alloc.lo]) + fi + AC_SUBST(VIEW_FILE) + AC_SUBST(ALLOC_FILE) + + BACKTRACE_USES_MALLOC=0 + if test "$ALLOC_FILE" = "alloc.lo"; then + BACKTRACE_USES_MALLOC=1 + fi + if test "$ac_has_gthreads" = "yes"; then BACKTRACE_SUPPORTS_THREADS=1 else diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in index f6212de9268..f30a8c51c45 100644 --- a/libstdc++-v3/config.h.in +++ b/libstdc++-v3/config.h.in @@ -420,6 +420,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MACHINE_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index ef80912d0b9..35dc3f49383 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -681,8 +681,8 @@ BACKTRACE_SUPPORTS_THREADS BACKTRACE_USES_MALLOC BACKTRACE_SUPPORTED BACKTRACE_CPPFLAGS -VIEW_FILE ALLOC_FILE +VIEW_FILE FORMAT_FILE ENABLE_FILESYSTEM_TS_FALSE ENABLE_FILESYSTEM_TS_TRUE @@ -16190,7 +16190,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_save_CXXFLAGS="$CXXFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 @@ -77463,11 +77463,6 @@ elf64) elfsize=64 ;; esac BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize" - ALLOC_FILE=alloc.lo - - VIEW_FILE=read.lo - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build libbacktrace support" >&5 $as_echo_n "checking whether to build libbacktrace support... " >&6; } if test "$enable_libstdcxx_backtrace" == "auto"; then @@ -77475,7 +77470,55 @@ $as_echo_n "checking whether to build libbacktrace support... " >&6; } fi if test "$enable_libstdcxx_backtrace" == "yes"; then BACKTRACE_SUPPORTED=1 - BACKTRACE_USES_MALLOC=1 + + for ac_header in sys/mman.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_MMAN_H 1 +_ACEOF + +fi + +done + + case "${host}" in + *-*-msdosdjgpp) # DJGPP has sys/man.h, but no mmap + have_mmap=no ;; + *-*-*) + have_mmap="$ac_cv_header_sys_mman_h" ;; + esac + + if test "$have_mmap" = "no"; then + VIEW_FILE=read.lo + ALLOC_FILE=alloc.lo + else + VIEW_FILE=mmapio.lo + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON) + #error no MAP_ANONYMOUS + #endif + +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ALLOC_FILE=mmap.lo +else + ALLOC_FILE=alloc.lo +fi +rm -f conftest.err conftest.i conftest.$ac_ext + fi + + + + BACKTRACE_USES_MALLOC=0 + if test "$ALLOC_FILE" = "alloc.lo"; then + BACKTRACE_USES_MALLOC=1 + fi + if test "$ac_has_gthreads" = "yes"; then BACKTRACE_SUPPORTS_THREADS=1 else -- 2.34.1