diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6148f5ce944..d49ce7c050f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2019-04-11 Jonathan Wakely + + PR libstdc++/90046 + * src/c++17/memory_resource.cc + (monotonic_buffer_resource::_Chunk::allocate): Increase alignment if + needed to allow placing a _Chunk at the end of the buffer. + (monotonic_buffer_resource::_M_new_buffer): Remove static_assert. + 2019-04-10 Jonathan Wakely * doc/xml/faq.xml: Add information about emergency EH pool. diff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc index cd11bf5875c..b6698011f5c 100644 --- a/libstdc++-v3/src/c++17/memory_resource.cc +++ b/libstdc++-v3/src/c++17/memory_resource.cc @@ -182,7 +182,21 @@ namespace pmr _Chunk*& __head) { __size = std::__ceil2(__size + sizeof(_Chunk)); + + if constexpr (alignof(_Chunk) > 1) + { + // PR libstdc++/90046 + // For targets like epiphany-elf where alignof(_Chunk) != 1 + // ensure that the last sizeof(_Chunk) bytes in the buffer + // are suitably-aligned for a _Chunk. + // This should be unnecessary, because the caller already + // passes in max(__align, alignof(max_align_t)). + if (__align < alignof(_Chunk)) + __align = alignof(_Chunk); + } + void* __p = __r->allocate(__size, __align); + // Add a chunk defined by (__p, __size, __align) to linked list __head. void* const __back = (char*)__p + __size - sizeof(_Chunk); __head = ::new(__back) _Chunk(__size, __align, __head); @@ -231,9 +245,6 @@ namespace pmr void monotonic_buffer_resource::_M_new_buffer(size_t bytes, size_t alignment) { - // Need to check this somewhere, so put it here: - static_assert(alignof(monotonic_buffer_resource::_Chunk) == 1); - const size_t n = std::max(bytes, _M_next_bufsiz); const size_t m = std::max(alignment, alignof(std::max_align_t)); auto [p, size] = _Chunk::allocate(_M_upstream, n, m, _M_head);