diff options
author | Caroline Tice <cmtice@google.com> | 2016-02-10 14:40:41 -0800 |
---|---|---|
committer | Caroline Tice <cmtice@google.com> | 2016-02-26 08:25:55 -0800 |
commit | 817a788f9eb01eff367191401d48f2aaa8d4f428 (patch) | |
tree | 637f745404b37fbf3fcff629227d7d542725e5fe /gcc-4.9/libstdc++-v3/include/ext/aligned_buffer.h | |
parent | a4ca82cac69c3147143d7b4b4d7cdeb5e02f20ef (diff) | |
download | toolchain_gcc-817a788f9eb01eff367191401d48f2aaa8d4f428.zip toolchain_gcc-817a788f9eb01eff367191401d48f2aaa8d4f428.tar.gz toolchain_gcc-817a788f9eb01eff367191401d48f2aaa8d4f428.tar.bz2 |
Unify ChromeOS and Android versions of GCC.
This CL updates Android's GCC to match ChromeOS's GCC (with
appropriate patches applied in both places to make sure no
cherry-picked changes are lost).
Change-Id: I390140c449b0e5df9ee78a06268319c8c510302f
Diffstat (limited to 'gcc-4.9/libstdc++-v3/include/ext/aligned_buffer.h')
-rw-r--r-- | gcc-4.9/libstdc++-v3/include/ext/aligned_buffer.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gcc-4.9/libstdc++-v3/include/ext/aligned_buffer.h b/gcc-4.9/libstdc++-v3/include/ext/aligned_buffer.h index 861de5b..99c4575 100644 --- a/gcc-4.9/libstdc++-v3/include/ext/aligned_buffer.h +++ b/gcc-4.9/libstdc++-v3/include/ext/aligned_buffer.h @@ -39,7 +39,48 @@ namespace __gnu_cxx { + // A utility type containing a POD object that can hold an object of type + // _Tp initialized via placement new or allocator_traits::construct. + // Intended for use as a data member subobject, use __aligned_buffer for + // complete objects. template<typename _Tp> + struct __aligned_membuf + { + // Target macro ADJUST_FIELD_ALIGN can produce different alignment for + // types when used as class members. __aligned_membuf is intended + // for use as a class member, so align the buffer as for a class member. + struct _Tp2 { _Tp _M_t; }; + + alignas(__alignof__(_Tp2::_M_t)) unsigned char _M_storage[sizeof(_Tp)]; + + __aligned_membuf() = default; + + // Can be used to avoid value-initialization zeroing _M_storage. + __aligned_membuf(std::nullptr_t) { } + + void* + _M_addr() noexcept + { return static_cast<void*>(&_M_storage); } + + const void* + _M_addr() const noexcept + { return static_cast<const void*>(&_M_storage); } + + _Tp* + _M_ptr() noexcept + { return static_cast<_Tp*>(_M_addr()); } + + const _Tp* + _M_ptr() const noexcept + { return static_cast<const _Tp*>(_M_addr()); } + }; + + // Similar to __aligned_membuf but aligned for complete objects, not members. + // This type is used in <forward_list>, <future>, <bits/shared_ptr_base.h> + // and <bits/hashtable_policy.h>, but ideally they would use __aligned_membuf + // instead, as it has smaller size for some types on some targets. + // This type is still used to avoid an ABI change. + template<typename _Tp> struct __aligned_buffer : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value> { |