[libcxx-commits] [PATCH] D82627: Fix CFI issues in <future>
Brandon Tolsch via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jul 29 10:19:58 PDT 2020
btolsch updated this revision to Diff 281653.
btolsch added a comment.
I changed the patch to be more annotation-oriented while trying to avoid just tacking _LIBCPP_NO_CFI onto every function. PTAL, thanks!
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D82627/new/
https://reviews.llvm.org/D82627
Files:
libcxx/include/future
Index: libcxx/include/future
===================================================================
--- libcxx/include/future
+++ libcxx/include/future
@@ -1823,6 +1823,9 @@
class _LIBCPP_AVAILABILITY_FUTURE __packaged_task_function<_Rp(_ArgTypes...)>
{
typedef __packaged_task_base<_Rp(_ArgTypes...)> __base;
+
+ _LIBCPP_NO_CFI __base* buf_() { return (__base*)&__buf_; }
+
typename aligned_storage<3*sizeof(void*)>::type __buf_;
__base* __f_;
@@ -1856,10 +1859,10 @@
{
if (__f.__f_ == nullptr)
__f_ = nullptr;
- else if (__f.__f_ == (__base*)&__f.__buf_)
+ else if (__f.__f_ == __f.buf_())
{
+ __f.__f_->__move_to(buf_());
__f_ = (__base*)&__buf_;
- __f.__f_->__move_to(__f_);
}
else
{
@@ -1877,8 +1880,8 @@
typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF;
if (sizeof(_FF) <= sizeof(__buf_))
{
+ ::new (&__buf_) _FF(_VSTD::forward<_Fp>(__f));
__f_ = (__base*)&__buf_;
- ::new (__f_) _FF(_VSTD::forward<_Fp>(__f));
}
else
{
@@ -1920,17 +1923,17 @@
__packaged_task_function<_Rp(_ArgTypes...)>&
__packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) _NOEXCEPT
{
- if (__f_ == (__base*)&__buf_)
+ if (__f_ == buf_())
__f_->destroy();
else if (__f_)
__f_->destroy_deallocate();
__f_ = nullptr;
if (__f.__f_ == nullptr)
__f_ = nullptr;
- else if (__f.__f_ == (__base*)&__f.__buf_)
+ else if (__f.__f_ == __f.buf_())
{
+ __f.__f_->__move_to(buf_());
__f_ = (__base*)&__buf_;
- __f.__f_->__move_to(__f_);
}
else
{
@@ -1943,13 +1946,14 @@
template<class _Rp, class ..._ArgTypes>
__packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function()
{
- if (__f_ == (__base*)&__buf_)
+ if (__f_ == buf_())
__f_->destroy();
else if (__f_)
__f_->destroy_deallocate();
}
template<class _Rp, class ..._ArgTypes>
+_LIBCPP_NO_CFI
void
__packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) _NOEXCEPT
{
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D82627.281653.patch
Type: text/x-patch
Size: 2149 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20200729/0523b796/attachment.bin>
More information about the libcxx-commits
mailing list