[libcxx-commits] [libcxxabi] f21cf11 - [libc++abi][NFCI] Refactor demangling_terminate_handler to reduce nesting
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Fri May 13 09:22:52 PDT 2022
Author: Louis Dionne
Date: 2022-05-13T12:22:40-04:00
New Revision: f21cf11a4c1d4b09f956e50706307fe986f527dc
URL: https://github.com/llvm/llvm-project/commit/f21cf11a4c1d4b09f956e50706307fe986f527dc
DIFF: https://github.com/llvm/llvm-project/commit/f21cf11a4c1d4b09f956e50706307fe986f527dc.diff
LOG: [libc++abi][NFCI] Refactor demangling_terminate_handler to reduce nesting
This keeps the same logic, but uses early return to avoid multiple layers
of nested ifs and make the code simpler to follow.
Differential Revision: https://reviews.llvm.org/D125476
Added:
Modified:
libcxxabi/src/cxa_default_handlers.cpp
Removed:
################################################################################
diff --git a/libcxxabi/src/cxa_default_handlers.cpp b/libcxxabi/src/cxa_default_handlers.cpp
index 49e21c9834783..7bcfca069fb7f 100644
--- a/libcxxabi/src/cxa_default_handlers.cpp
+++ b/libcxxabi/src/cxa_default_handlers.cpp
@@ -33,56 +33,57 @@ static std::unique_ptr<char const, void (*)(char const*)> demangle(char const* s
#endif
return {str, [](char const*) { /* nothing to free */ }};
}
-#endif
__attribute__((noreturn))
static void demangling_terminate_handler()
{
-#ifndef _LIBCXXABI_NO_EXCEPTIONS
- // If there might be an uncaught exception
using namespace __cxxabiv1;
__cxa_eh_globals* globals = __cxa_get_globals_fast();
- if (globals)
+
+ // If there is no uncaught exception, just note that we're terminating
+ if (!globals)
+ abort_message("terminating");
+
+ __cxa_exception* exception_header = globals->caughtExceptions;
+ if (!exception_header)
+ abort_message("terminating");
+
+ _Unwind_Exception* unwind_exception =
+ reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1;
+
+ // If we're terminating due to a foreign exception
+ if (!__isOurExceptionClass(unwind_exception))
+ abort_message("terminating due to %s foreign exception", cause);
+
+ void* thrown_object =
+ __getExceptionClass(unwind_exception) == kOurDependentExceptionClass ?
+ ((__cxa_dependent_exception*)exception_header)->primaryException :
+ exception_header + 1;
+ const __shim_type_info* thrown_type =
+ static_cast<const __shim_type_info*>(exception_header->exceptionType);
+ auto name = demangle(thrown_type->name());
+ // 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));
+ if (catch_type->can_catch(thrown_type, thrown_object))
{
- __cxa_exception* exception_header = globals->caughtExceptions;
- // If there is an uncaught exception
- if (exception_header)
- {
- _Unwind_Exception* unwind_exception =
- reinterpret_cast<_Unwind_Exception*>(exception_header + 1) - 1;
- if (__isOurExceptionClass(unwind_exception))
- {
- void* thrown_object =
- __getExceptionClass(unwind_exception) == kOurDependentExceptionClass ?
- ((__cxa_dependent_exception*)exception_header)->primaryException :
- exception_header + 1;
- const __shim_type_info* thrown_type =
- static_cast<const __shim_type_info*>(exception_header->exceptionType);
- auto name = demangle(thrown_type->name());
- // 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));
- if (catch_type->can_catch(thrown_type, thrown_object))
- {
- // 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());
- }
- 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());
- }
- else
- // Else we're terminating due to a foreign exception
- abort_message("terminating due to %s foreign exception", cause);
- }
+ // 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());
}
-#endif
- // Else just note that we're terminating
+ 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());
+ }
+}
+#else // !_LIBCXXABI_NO_EXCEPTIONS
+__attribute__((noreturn))
+static void demangling_terminate_handler()
+{
abort_message("terminating");
}
+#endif // !_LIBCXXABI_NO_EXCEPTIONS
__attribute__((noreturn))
static void demangling_unexpected_handler()
More information about the libcxx-commits
mailing list