From 02f4b36ad5f2f97ff63259e38244da8fcd5a205e Mon Sep 17 00:00:00 2001 From: Tacet <4922191+AdvenamTacet@users.noreply.github.com> Date: Tue, 5 Dec 2023 19:27:08 +0100 Subject: [PATCH] [libc++] Refactor of ASan annotation functions (#74023) This commit refactors the ASan annotation functions in libc++ to reduce unnecessary code duplication. Additionally it adds a small optimization. - Eliminates two redundant function versions by utilizing the `[[maybe_unused]]` attribute and guarding function bodies with `#ifndef _LIBCPP_HAS_NO_ASAN`. - Introduces an additional guard to an auxiliary function, allowing the removal of a no-ops function body. This approach avoids relying on the optimizer for code elimination. Fixes #73043 --- libcxx/include/deque | 27 +++++++++++++++------------ libcxx/include/vector | 19 +++++++++---------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/libcxx/include/deque b/libcxx/include/deque index 83bb6e632903..b5d094dc415d 100644 --- a/libcxx/include/deque +++ b/libcxx/include/deque @@ -966,25 +966,27 @@ public: // __asan_annotate_container_with_allocator to false. // For more details, see the "Using libc++" documentation page or // the documentation for __sanitizer_annotate_contiguous_container. -#if !defined(_LIBCPP_HAS_NO_ASAN) _LIBCPP_HIDE_FROM_ABI void __annotate_double_ended_contiguous_container( - const void* __beg, - const void* __end, - const void* __old_con_beg, - const void* __old_con_end, - const void* __new_con_beg, - const void* __new_con_end) const { + [[__maybe_unused__]] const void* __beg, + [[__maybe_unused__]] const void* __end, + [[__maybe_unused__]] const void* __old_con_beg, + [[__maybe_unused__]] const void* __old_con_end, + [[__maybe_unused__]] const void* __new_con_beg, + [[__maybe_unused__]] const void* __new_con_end) const { +#ifndef _LIBCPP_HAS_NO_ASAN if (__beg != nullptr && __asan_annotate_container_with_allocator<_Allocator>::value) __sanitizer_annotate_double_ended_contiguous_container( __beg, __end, __old_con_beg, __old_con_end, __new_con_beg, __new_con_end); +#endif } -#else - _LIBCPP_HIDE_FROM_ABI void __annotate_double_ended_contiguous_container( - const void*, const void*, const void*, const void*, const void*, const void*) const _NOEXCEPT {} -#endif // !defined(_LIBCPP_HAS_NO_ASAN) _LIBCPP_HIDE_FROM_ABI - void __annotate_from_to(size_type __beg, size_type __end, __asan_annotation_type __annotation_type, __asan_annotation_place __place) const _NOEXCEPT { + void __annotate_from_to( + [[__maybe_unused__]] size_type __beg, + [[__maybe_unused__]] size_type __end, + [[__maybe_unused__]] __asan_annotation_type __annotation_type, + [[__maybe_unused__]] __asan_annotation_place __place) const _NOEXCEPT { +#ifndef _LIBCPP_HAS_NO_ASAN // __beg - index of the first item to annotate // __end - index behind the last item to annotate (so last item + 1) // __annotation_type - __asan_unposion or __asan_poison @@ -1075,6 +1077,7 @@ public: __annotate_double_ended_contiguous_container(__mem_beg, __mem_end, __old_beg, __old_end, __new_beg, __new_end); } +#endif // !_LIBCPP_HAS_NO_ASAN } _LIBCPP_HIDE_FROM_ABI diff --git a/libcxx/include/vector b/libcxx/include/vector index a91a4d00c42e..fd2d5e11f0ea 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -850,20 +850,19 @@ private: // __asan_annotate_container_with_allocator to false. // For more details, see the "Using libc++" documentation page or // the documentation for __sanitizer_annotate_contiguous_container. -#ifndef _LIBCPP_HAS_NO_ASAN - _LIBCPP_CONSTEXPR_SINCE_CXX20 - void __annotate_contiguous_container(const void *__beg, const void *__end, - const void *__old_mid, - const void *__new_mid) const + + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI + void __annotate_contiguous_container([[__maybe_unused__]] const void *__beg, + [[__maybe_unused__]] const void *__end, + [[__maybe_unused__]] const void *__old_mid, + [[__maybe_unused__]] const void *__new_mid) const { +#ifndef _LIBCPP_HAS_NO_ASAN if (!__libcpp_is_constant_evaluated() && __beg != nullptr && __asan_annotate_container_with_allocator<_Allocator>::value) __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid); - } -#else - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI - void __annotate_contiguous_container(const void*, const void*, const void*, - const void*) const _NOEXCEPT {} #endif + } + _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_new(size_type __current_size) const _NOEXCEPT { __annotate_contiguous_container(data(), data() + capacity(),