mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2026-06-03 02:10:04 +00:00
jemalloc: add backport patch to fix build with gcc 16
This patch replaces std::__throw_bad_alloc call with standard C++ Signed-off-by: Markus Volk <f_l_k@t-online.de> Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
+158
@@ -0,0 +1,158 @@
|
|||||||
|
From 1a15fe33a48c52bfe26ea83e49f0d317a47da3ea Mon Sep 17 00:00:00 2001
|
||||||
|
From: lexprfuncall <cshapiro@meta.com>
|
||||||
|
Date: Mon, 27 Apr 2026 11:50:27 -0700
|
||||||
|
Subject: [PATCH] Replace std::__throw_bad_alloc call with standard C++ (#2900)
|
||||||
|
|
||||||
|
* Replace std::__throw_bad_alloc call with standard C++
|
||||||
|
|
||||||
|
Since December of 2025, std::__throw_bad_alloc is no longer visible
|
||||||
|
through #include <new> causing jemalloc build failures with gcc 16.
|
||||||
|
As far as I can tell, all std::__throw_bad_alloc did was arrange to
|
||||||
|
raise a std::bad_alloc exception if exceptions are enabled. I am not
|
||||||
|
sure whether its usage was truly meaningful in jemalloc since the call
|
||||||
|
is wrapped in a try catch and any usage of try catch is considered an
|
||||||
|
error when compiling with -fno-exceptions on gcc, at least.
|
||||||
|
|
||||||
|
This change adds a check to configure.ac that determines whether
|
||||||
|
exceptions are enabled by compiling a simple try catch that raises a
|
||||||
|
std::bad_alloc exception. If that test succeeds, the macro
|
||||||
|
JEMALLOC_HAVE_CXX_EXCEPTIONS is defined, and jemalloc will raise an
|
||||||
|
exception. Otherwise, we call std::terminate() to abort.
|
||||||
|
|
||||||
|
This was tested on FreeBSD with the gcc16 port with and without exceptions
|
||||||
|
enabled.
|
||||||
|
|
||||||
|
* Replace std::set_new_handler calls with std::get_new_handler
|
||||||
|
|
||||||
|
Previously, std::set_new_handler was used as a workaround for
|
||||||
|
compilers with only partial support for C++11. Now that C++14 is a
|
||||||
|
requirement to enable C++ support, we can assume std::get_new_handler
|
||||||
|
is available.
|
||||||
|
|
||||||
|
Upstream-Status: Backport [https://github.com/jemalloc/jemalloc/commit/1a15fe33a48c52bfe26ea83e49f0d317a47da3ea]
|
||||||
|
---
|
||||||
|
Makefile.in | 6 +++--
|
||||||
|
configure.ac | 23 +++++++++++++++++
|
||||||
|
.../internal/jemalloc_internal_defs.h.in | 3 +++
|
||||||
|
src/jemalloc_cpp.cpp | 25 ++++++++++---------
|
||||||
|
4 files changed, 43 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile.in b/Makefile.in
|
||||||
|
index a93048d7b8..1f9d14f1f2 100644
|
||||||
|
--- a/Makefile.in
|
||||||
|
+++ b/Makefile.in
|
||||||
|
@@ -337,9 +337,11 @@ TESTS_INTEGRATION += \
|
||||||
|
endif
|
||||||
|
ifeq (@enable_cxx@, 1)
|
||||||
|
CPP_SRCS := $(srcroot)src/jemalloc_cpp.cpp
|
||||||
|
-TESTS_INTEGRATION_CPP := $(srcroot)test/integration/cpp/basic.cpp \
|
||||||
|
- $(srcroot)test/integration/cpp/infallible_new_true.cpp \
|
||||||
|
+TESTS_INTEGRATION_CPP := $(srcroot)test/integration/cpp/basic.cpp
|
||||||
|
+ifeq (@enable_cxx_exceptions@, 1)
|
||||||
|
+TESTS_INTEGRATION_CPP += $(srcroot)test/integration/cpp/infallible_new_true.cpp \
|
||||||
|
$(srcroot)test/integration/cpp/infallible_new_false.cpp
|
||||||
|
+endif
|
||||||
|
else
|
||||||
|
CPP_SRCS :=
|
||||||
|
TESTS_INTEGRATION_CPP :=
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 321a729012..d151829832 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -374,7 +374,30 @@ fi
|
||||||
|
if test "x$enable_cxx" = "x1"; then
|
||||||
|
AC_DEFINE([JEMALLOC_ENABLE_CXX], [ ], [ ])
|
||||||
|
fi
|
||||||
|
+if test "x$enable_cxx" = "x1"; then
|
||||||
|
+ dnl Now check whether the C++ compiler has exceptions enabled.
|
||||||
|
+ AC_LANG_PUSH([C++])
|
||||||
|
+ SAVED_CXXFLAGS="${CXXFLAGS}"
|
||||||
|
+ CXXFLAGS="${CXXFLAGS} ${EXTRA_CXXFLAGS}"
|
||||||
|
+ JE_COMPILABLE([C++ exception support], [
|
||||||
|
+#include <new>
|
||||||
|
+], [
|
||||||
|
+ try {
|
||||||
|
+ throw std::bad_alloc();
|
||||||
|
+ } catch (const std::bad_alloc &) {
|
||||||
|
+ }
|
||||||
|
+], [je_cv_cxx_exceptions])
|
||||||
|
+ CXXFLAGS="${SAVED_CXXFLAGS}"
|
||||||
|
+ AC_LANG_POP([C++])
|
||||||
|
+ if test "x${je_cv_cxx_exceptions}" = "xyes" ; then
|
||||||
|
+ AC_DEFINE([JEMALLOC_HAVE_CXX_EXCEPTIONS], [ ], [ ])
|
||||||
|
+ enable_cxx_exceptions="1"
|
||||||
|
+ else
|
||||||
|
+ enable_cxx_exceptions="0"
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
AC_SUBST([enable_cxx])
|
||||||
|
+AC_SUBST([enable_cxx_exceptions])
|
||||||
|
AC_SUBST([CONFIGURE_CXXFLAGS])
|
||||||
|
AC_SUBST([SPECIFIED_CXXFLAGS])
|
||||||
|
AC_SUBST([EXTRA_CXXFLAGS])
|
||||||
|
diff --git a/include/jemalloc/internal/jemalloc_internal_defs.h.in b/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||||
|
index 31ae2e8ed2..54d4da2032 100644
|
||||||
|
--- a/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||||
|
+++ b/include/jemalloc/internal/jemalloc_internal_defs.h.in
|
||||||
|
@@ -465,6 +465,9 @@
|
||||||
|
/* Is C++ support being built? */
|
||||||
|
#undef JEMALLOC_ENABLE_CXX
|
||||||
|
|
||||||
|
+/* Are C++ exceptions enabled? */
|
||||||
|
+#undef JEMALLOC_HAVE_CXX_EXCEPTIONS
|
||||||
|
+
|
||||||
|
/* Performs additional size checks when defined. */
|
||||||
|
#undef JEMALLOC_OPT_SIZE_CHECKS
|
||||||
|
|
||||||
|
diff --git a/src/jemalloc_cpp.cpp b/src/jemalloc_cpp.cpp
|
||||||
|
index 4e838d3b51..ac109bb28e 100644
|
||||||
|
--- a/src/jemalloc_cpp.cpp
|
||||||
|
+++ b/src/jemalloc_cpp.cpp
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#include <mutex>
|
||||||
|
+#include <exception>
|
||||||
|
#include <new>
|
||||||
|
// NOLINTBEGIN(misc-use-anonymous-namespace)
|
||||||
|
|
||||||
|
@@ -78,29 +78,30 @@ handleOOM(std::size_t size, bool nothrow) {
|
||||||
|
void *ptr = nullptr;
|
||||||
|
|
||||||
|
while (ptr == nullptr) {
|
||||||
|
- std::new_handler handler;
|
||||||
|
- // GCC-4.8 and clang 4.0 do not have std::get_new_handler.
|
||||||
|
- {
|
||||||
|
- static std::mutex mtx;
|
||||||
|
- std::lock_guard<std::mutex> lock(mtx);
|
||||||
|
-
|
||||||
|
- handler = std::set_new_handler(nullptr);
|
||||||
|
- std::set_new_handler(handler);
|
||||||
|
- }
|
||||||
|
+ std::new_handler handler = std::get_new_handler();
|
||||||
|
if (handler == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
+#ifdef JEMALLOC_HAVE_CXX_EXCEPTIONS
|
||||||
|
try {
|
||||||
|
handler();
|
||||||
|
} catch (const std::bad_alloc &) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+#else
|
||||||
|
+ handler();
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
ptr = je_malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (ptr == nullptr && !nothrow)
|
||||||
|
- std::__throw_bad_alloc();
|
||||||
|
+ if (ptr == nullptr && !nothrow) {
|
||||||
|
+#ifdef JEMALLOC_HAVE_CXX_EXCEPTIONS
|
||||||
|
+ throw std::bad_alloc();
|
||||||
|
+#else
|
||||||
|
+ std::terminate();
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -14,6 +14,7 @@ SECTION = "libs"
|
|||||||
LIC_FILES_CHKSUM = "file://COPYING;md5=ea061f8731d5e6a5761dfad951ef5f5f"
|
LIC_FILES_CHKSUM = "file://COPYING;md5=ea061f8731d5e6a5761dfad951ef5f5f"
|
||||||
|
|
||||||
SRC_URI = "git://github.com/jemalloc/jemalloc.git;branch=master;protocol=https;tag=${PV} \
|
SRC_URI = "git://github.com/jemalloc/jemalloc.git;branch=master;protocol=https;tag=${PV} \
|
||||||
|
file://1a15fe33a48c52bfe26ea83e49f0d317a47da3ea.patch \
|
||||||
file://run-ptest \
|
file://run-ptest \
|
||||||
"
|
"
|
||||||
SRCREV = "81034ce1f1373e37dc865038e1bc8eeecf559ce8"
|
SRCREV = "81034ce1f1373e37dc865038e1bc8eeecf559ce8"
|
||||||
|
|||||||
Reference in New Issue
Block a user