[libcxx-commits] [libcxxabi] [libc++abi] Remove unnecessary dependency on std::unique_ptr (PR #73277)
Michael Kenzel via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Aug 11 02:07:32 PDT 2024
https://github.com/michael-kenzel updated https://github.com/llvm/llvm-project/pull/73277
>From ead219ea2caffe4a11c1acbca571b8c51a7d4a04 Mon Sep 17 00:00:00 2001
From: Michael Kenzel <michael.kenzel at gmail.com>
Date: Wed, 22 Nov 2023 05:33:56 +0100
Subject: [PATCH] [libc++abi] Remove unnecessary dependency on std::unique_ptr
---
libcxxabi/src/cxa_default_handlers.cpp | 30 ++++++++++++--------------
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/libcxxabi/src/cxa_default_handlers.cpp b/libcxxabi/src/cxa_default_handlers.cpp
index 7bcfca069fb7f7..60e402c55b395b 100644
--- a/libcxxabi/src/cxa_default_handlers.cpp
+++ b/libcxxabi/src/cxa_default_handlers.cpp
@@ -10,8 +10,6 @@
//===----------------------------------------------------------------------===//
#include <exception>
-#include <memory>
-#include <stdlib.h>
#include "abort_message.h"
#include "cxxabi.h"
#include "cxa_handlers.h"
@@ -23,17 +21,7 @@
static constinit const char* cause = "uncaught";
-#ifndef _LIBCXXABI_NO_EXCEPTIONS
-// Demangle the given string, or return the string as-is in case of an error.
-static std::unique_ptr<char const, void (*)(char const*)> demangle(char const* str)
-{
-#if !defined(LIBCXXABI_NON_DEMANGLING_TERMINATE)
- if (const char* result = __cxxabiv1::__cxa_demangle(str, nullptr, nullptr, nullptr))
- return {result, [](char const* p) { std::free(const_cast<char*>(p)); }};
-#endif
- return {str, [](char const*) { /* nothing to free */ }};
-}
-
+# ifndef _LIBCXXABI_NO_EXCEPTIONS
__attribute__((noreturn))
static void demangling_terminate_handler()
{
@@ -61,7 +49,17 @@ static void demangling_terminate_handler()
exception_header + 1;
const __shim_type_info* thrown_type =
static_cast<const __shim_type_info*>(exception_header->exceptionType);
- auto name = demangle(thrown_type->name());
+
+ auto name = [str = thrown_type->name()] {
+# ifndef LIBCXXABI_NON_DEMANGLING_TERMINATE
+ if (const char* result = __cxxabiv1::__cxa_demangle(str, nullptr, nullptr, nullptr))
+ // We're about to abort(), this memory can never be freed; so it's fine
+ // to just return a raw pointer
+ return result;
+# endif
+ return str;
+ }();
+
// If the uncaught exception can be caught with std::exception&
const __shim_type_info* catch_type =
static_cast<const __shim_type_info*>(&typeid(std::exception));
@@ -69,12 +67,12 @@ static void demangling_terminate_handler()
{
// Include the what() message from the exception
const std::exception* e = static_cast<const std::exception*>(thrown_object);
- abort_message("terminating due to %s exception of type %s: %s", cause, name.get(), e->what());
+ abort_message("terminating due to %s exception of type %s: %s", cause, name, e->what());
}
else
{
// Else just note that we're terminating due to an exception
- abort_message("terminating due to %s exception of type %s", cause, name.get());
+ abort_message("terminating due to %s exception of type %s", cause, name);
}
}
#else // !_LIBCXXABI_NO_EXCEPTIONS
More information about the libcxx-commits
mailing list