From 4bc32920c63821b5d168ec15c2912289faf30348 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Wed, 3 Apr 2024 08:14:39 -0400 Subject: [PATCH] [libc++][libc++abi] Minor follow-up changes after ptrauth upstreaming This patch applies the comments provided on #84573. This is done as a separate PR to avoid merge conflicts with downstreams that already had ptrauth support. --- libcxx/include/typeinfo | 2 +- libcxx/src/include/overridable_function.h | 6 +++--- libcxxabi/src/private_typeinfo.cpp | 23 ++++++++--------------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/libcxx/include/typeinfo b/libcxx/include/typeinfo index d1c0de3c1bfdd3..76320c33c692e7 100644 --- a/libcxx/include/typeinfo +++ b/libcxx/include/typeinfo @@ -275,7 +275,7 @@ struct __type_info_implementations { __impl; }; -# if defined(__arm64__) && __has_cpp_attribute(clang::ptrauth_vtable_pointer) +# if __has_cpp_attribute(clang::ptrauth_vtable_pointer) # if __has_feature(ptrauth_type_info_discriminated_vtable_pointer) # define _LIBCPP_TYPE_INFO_VTABLE_POINTER_AUTH \ [[clang::ptrauth_vtable_pointer(process_independent, address_discrimination, type_discrimination)]] diff --git a/libcxx/src/include/overridable_function.h b/libcxx/src/include/overridable_function.h index fca66ea6daf7a8..2f590483a9023c 100644 --- a/libcxx/src/include/overridable_function.h +++ b/libcxx/src/include/overridable_function.h @@ -13,7 +13,7 @@ #include <__config> #include -#if defined(__arm64e__) && __has_feature(ptrauth_calls) +#if __has_feature(ptrauth_calls) # include #endif @@ -85,13 +85,13 @@ _LIBCPP_HIDE_FROM_ABI bool __is_function_overridden(_Ret (*__fptr)(_Args...)) no uintptr_t __end = reinterpret_cast(&__lcxx_override_end); uintptr_t __ptr = reinterpret_cast(__fptr); -#if defined(__arm64e__) && __has_feature(ptrauth_calls) +# if __has_feature(ptrauth_calls) // We must pass a void* to ptrauth_strip since it only accepts a pointer type. Also, in particular, // we must NOT pass a function pointer, otherwise we will strip the function pointer, and then attempt // to authenticate and re-sign it when casting it to a uintptr_t again, which will fail because we just // stripped the function pointer. See rdar://122927845. __ptr = reinterpret_cast(ptrauth_strip(reinterpret_cast(__ptr), ptrauth_key_function_pointer)); -#endif +# endif // Finally, the function was overridden if it falls outside of the section's bounds. return __ptr < __start || __ptr > __end; diff --git a/libcxxabi/src/private_typeinfo.cpp b/libcxxabi/src/private_typeinfo.cpp index 9e58501a559342..2fbfa526afc0ec 100644 --- a/libcxxabi/src/private_typeinfo.cpp +++ b/libcxxabi/src/private_typeinfo.cpp @@ -55,15 +55,12 @@ #include #endif - -template -static inline -T * -get_vtable(T *vtable) { +template +static inline T* strip_vtable(T* vtable) { #if __has_feature(ptrauth_calls) - vtable = ptrauth_strip(vtable, ptrauth_key_cxx_vtable_pointer); + vtable = ptrauth_strip(vtable, ptrauth_key_cxx_vtable_pointer); #endif - return vtable; + return vtable; } static inline @@ -117,8 +114,7 @@ void dyn_cast_get_derived_info(derived_object_info* info, const void* static_ptr reinterpret_cast(vtable) + offset_to_ti_proxy; info->dynamic_type = *(reinterpret_cast(ptr_to_ti_proxy)); #else - void **vtable = *static_cast(static_ptr); - vtable = get_vtable(vtable); + void **vtable = strip_vtable(*static_cast(static_ptr)); info->offset_to_derived = reinterpret_cast(vtable[-2]); info->dynamic_ptr = static_cast(static_ptr) + info->offset_to_derived; info->dynamic_type = static_cast(vtable[-1]); @@ -576,8 +572,7 @@ __base_class_type_info::has_unambiguous_public_base(__dynamic_cast_info* info, find the layout. */ offset_to_base = __offset_flags >> __offset_shift; if (is_virtual) { - const char* vtable = *static_cast(adjustedPtr); - vtable = get_vtable(vtable); + const char* vtable = strip_vtable(*static_cast(adjustedPtr)); offset_to_base = update_offset_to_base(vtable, offset_to_base); } } else if (!is_virtual) { @@ -1517,8 +1512,7 @@ __base_class_type_info::search_above_dst(__dynamic_cast_info* info, ptrdiff_t offset_to_base = __offset_flags >> __offset_shift; if (__offset_flags & __virtual_mask) { - const char* vtable = *static_cast(current_ptr); - vtable = get_vtable(vtable); + const char* vtable = strip_vtable(*static_cast(current_ptr)); offset_to_base = update_offset_to_base(vtable, offset_to_base); } __base_type->search_above_dst(info, dst_ptr, @@ -1538,8 +1532,7 @@ __base_class_type_info::search_below_dst(__dynamic_cast_info* info, ptrdiff_t offset_to_base = __offset_flags >> __offset_shift; if (__offset_flags & __virtual_mask) { - const char* vtable = *static_cast(current_ptr); - vtable = get_vtable(vtable); + const char* vtable = strip_vtable(*static_cast(current_ptr)); offset_to_base = update_offset_to_base(vtable, offset_to_base); } __base_type->search_below_dst(info,