[libcxx-commits] [PATCH] D140453: [libc++] Remove HIDE_FROM_ABI from virtual functions
Louis Dionne via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Dec 20 20:43:30 PST 2022
ldionne created this revision.
Herald added a project: All.
ldionne requested review of this revision.
Herald added a project: libc++.
Herald added a subscriber: libcxx-commits.
Herald added a reviewer: libc++.
_LIBCPP_HIDE_FROM_ABI (which is what _LIBCPP_INLINE_VISIBILITY is) uses
ABI tags to avoid ODR violations when linking together object files
compiled against different versions of libc++. However, pointer
authentication uses the mangled name of the function to sign the
function pointer in the vtable, which means that the ABI tag effectively
changes how the pointers are signed.
This leads to PAC failures when passing an object that holds one of these
pointers in its vtable across an ABI boundary: one side will sign the
pointer using one function mangling (with one ABI tag), and the other
side will authenticate the pointer expecting it to have a different
signature, which won't work.
This patch is the result of a manual inspection of the code. However, we
should also setup a clang-tidy check to find those out in the future.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D140453
Files:
libcxx/include/__functional/function.h
libcxx/include/future
libcxx/include/locale
libcxx/include/regex
Index: libcxx/include/regex
===================================================================
--- libcxx/include/regex
+++ libcxx/include/regex
@@ -1446,12 +1446,9 @@
_LIBCPP_INLINE_VISIBILITY
__node() {}
- _LIBCPP_INLINE_VISIBILITY
virtual ~__node() {}
- _LIBCPP_INLINE_VISIBILITY
virtual void __exec(__state&) const {}
- _LIBCPP_INLINE_VISIBILITY
virtual void __exec_split(bool, __state&) const {}
};
Index: libcxx/include/locale
===================================================================
--- libcxx/include/locale
+++ libcxx/include/locale
@@ -2479,7 +2479,7 @@
static locale::id id;
protected:
- _LIBCPP_HIDE_FROM_ABI ~time_put() override {}
+ ~time_put() override {}
virtual iter_type do_put(iter_type __s, ios_base&, char_type, const tm* __tm,
char __fmt, char __mod) const;
Index: libcxx/include/future
===================================================================
--- libcxx/include/future
+++ libcxx/include/future
@@ -1626,7 +1626,6 @@
public:
_LIBCPP_INLINE_VISIBILITY
__packaged_task_base() {}
- _LIBCPP_INLINE_VISIBILITY
virtual ~__packaged_task_base() {}
virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0;
virtual void destroy() = 0;
Index: libcxx/include/__functional/function.h
===================================================================
--- libcxx/include/__functional/function.h
+++ libcxx/include/__functional/function.h
@@ -262,7 +262,7 @@
__base& operator=(const __base&);
public:
_LIBCPP_INLINE_VISIBILITY __base() {}
- _LIBCPP_INLINE_VISIBILITY virtual ~__base() {}
+ virtual ~__base() {}
virtual __base* __clone() const = 0;
virtual void __clone(__base*) const = 0;
virtual void destroy() _NOEXCEPT = 0;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140453.484458.patch
Type: text/x-patch
Size: 1816 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20221221/da89a1ad/attachment.bin>
More information about the libcxx-commits
mailing list