From 6708ebf6020c59a4832aac95cb9524d533798100 Mon Sep 17 00:00:00 2001 From: Konstantin Varlamov Date: Fri, 11 Jul 2025 10:17:36 -0700 Subject: [PATCH 1/2] [libc++][hardening][NFC] Introduce `_LIBCPP_VERBOSE_TRAP` macro. Split out the calls to `__builtin_verbose_trap` into a separate header. This is just a refactoring to make the code a bit more structured. --- libcxx/include/CMakeLists.txt | 1 + libcxx/include/__verbose_trap | 36 +++++++++++++++++++ .../vendor/llvm/default_assertion_handler.in | 14 ++------ 3 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 libcxx/include/__verbose_trap diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index c8e6d28584623..f79edc9e32599 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -944,6 +944,7 @@ set(files __vector/vector_bool.h __vector/vector_bool_formatter.h __verbose_abort + __verbose_trap algorithm any array diff --git a/libcxx/include/__verbose_trap b/libcxx/include/__verbose_trap new file mode 100644 index 0000000000000..13ea727738c3b --- /dev/null +++ b/libcxx/include/__verbose_trap @@ -0,0 +1,36 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___VERBOSE_TRAP +#define _LIBCPP___VERBOSE_TRAP + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if __has_builtin(__builtin_verbose_trap) +// AppleClang shipped a slightly different version of __builtin_verbose_trap from the upstream +// version before upstream Clang actually got the builtin. +// TODO: Remove once AppleClang supports the two-arguments version of the builtin. +# if defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1700 +# define _LIBCPP_VERBOSE_TRAP(message) __builtin_verbose_trap(message) +# else +# define _LIBCPP_VERBOSE_TRAP(message) __builtin_verbose_trap("libc++", message) +# endif +#else +# define _LIBCPP_VERBOSE_TRAP(message) ((void)message, __builtin_trap()) +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___VERBOSE_TRAP diff --git a/libcxx/vendor/llvm/default_assertion_handler.in b/libcxx/vendor/llvm/default_assertion_handler.in index 1d6b21fc6bb45..90b202a2dae57 100644 --- a/libcxx/vendor/llvm/default_assertion_handler.in +++ b/libcxx/vendor/llvm/default_assertion_handler.in @@ -15,6 +15,7 @@ # include <__cxx03/__verbose_abort> #else # include <__config> +# include <__verbose_trap> # include <__verbose_abort> #endif @@ -28,18 +29,7 @@ #else -# if __has_builtin(__builtin_verbose_trap) -// AppleClang shipped a slightly different version of __builtin_verbose_trap from the upstream -// version before upstream Clang actually got the builtin. -// TODO: Remove once AppleClang supports the two-arguments version of the builtin. -# if defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1700 -# define _LIBCPP_ASSERTION_HANDLER(message) __builtin_verbose_trap(message) -# else -# define _LIBCPP_ASSERTION_HANDLER(message) __builtin_verbose_trap("libc++", message) -# endif -# else -# define _LIBCPP_ASSERTION_HANDLER(message) ((void)message, __builtin_trap()) -# endif +# define _LIBCPP_ASSERTION_HANDLER(message) _LIBCPP_VERBOSE_TRAP(message) #endif // _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG From 3ca83e671aa6b147cd855fc22d127d9b2fd16915 Mon Sep 17 00:00:00 2001 From: Konstantin Varlamov Date: Sat, 12 Jul 2025 01:11:47 -0700 Subject: [PATCH 2/2] Address feedback --- libcxx/include/CMakeLists.txt | 1 + libcxx/include/__cxx03/__verbose_trap | 36 +++++++++++++++++++ libcxx/include/module.modulemap.in | 3 ++ .../vendor/llvm/default_assertion_handler.in | 3 +- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 libcxx/include/__cxx03/__verbose_trap diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index f79edc9e32599..4f2a8dddad92c 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -1570,6 +1570,7 @@ set(files __cxx03/__utility/unreachable.h __cxx03/__variant/monostate.h __cxx03/__verbose_abort + __cxx03/__verbose_trap __cxx03/algorithm __cxx03/array __cxx03/atomic diff --git a/libcxx/include/__cxx03/__verbose_trap b/libcxx/include/__cxx03/__verbose_trap new file mode 100644 index 0000000000000..755124b97a5ac --- /dev/null +++ b/libcxx/include/__cxx03/__verbose_trap @@ -0,0 +1,36 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CXX03___VERBOSE_TRAP +#define _LIBCPP___CXX03___VERBOSE_TRAP + +#include <__cxx03/__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if __has_builtin(__builtin_verbose_trap) +// AppleClang shipped a slightly different version of __builtin_verbose_trap from the upstream +// version before upstream Clang actually got the builtin. +// TODO: Remove once AppleClang supports the two-arguments version of the builtin. +# if defined(_LIBCPP_APPLE_CLANG_VER) && _LIBCPP_APPLE_CLANG_VER < 1700 +# define _LIBCPP_VERBOSE_TRAP(message) __builtin_verbose_trap(message) +# else +# define _LIBCPP_VERBOSE_TRAP(message) __builtin_verbose_trap("libc++", message) +# endif +#else +# define _LIBCPP_VERBOSE_TRAP(message) ((void)message, __builtin_trap()) +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CXX03___VERBOSE_TRAP diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in index 45b9c72a05b82..61ba1c381b2b3 100644 --- a/libcxx/include/module.modulemap.in +++ b/libcxx/include/module.modulemap.in @@ -2356,6 +2356,9 @@ module std [system] { module verbose_abort { header "__verbose_abort" } + module verbose_trap { + header "__verbose_trap" + } module internal_assert { header "__assert" export * diff --git a/libcxx/vendor/llvm/default_assertion_handler.in b/libcxx/vendor/llvm/default_assertion_handler.in index 90b202a2dae57..f115658f9f3c6 100644 --- a/libcxx/vendor/llvm/default_assertion_handler.in +++ b/libcxx/vendor/llvm/default_assertion_handler.in @@ -13,10 +13,11 @@ #if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) # include <__cxx03/__config> # include <__cxx03/__verbose_abort> +# include <__cxx03/__verbose_trap> #else # include <__config> -# include <__verbose_trap> # include <__verbose_abort> +# include <__verbose_trap> #endif #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)