[PATCH 1/2] libstdc++: Add std::align.

Jonathan Wakely jwakely@redhat.com
Mon Oct 13 14:19:00 GMT 2014


On 13/10/14 14:04 +0100, Jonathan Wakely wrote:
>On 13/10/14 13:10 +0100, Jonathan Wakely wrote:
>>On 13/10/14 12:35 +0200, Rüdiger Sonderfeld wrote:
>>>On Monday 13 October 2014 11:03:51 Jonathan Wakely wrote:
>>>>Fixed (the new function should be in namespace std!) and applied to
>>>>trunk. Thanks for the patch.
>>>
>>>Thanks for merging and improving my patches!
>>>
>>>If you have the time maybe you could also look at the put_time patch.  Unlike
>>>get_time it does not require an ABI change.
>>
>>I was about to close https://gcc.gnu.org/PR57350 as fixed, but the
>>test in the SO question it links to fails with your implementation
>>that I've just committed:
>>
>>https://stackoverflow.com/questions/16305311/usage-issue-of-stdalign
>
>I'm testing this fix.

Committed to trunk.

>commit 60aa345d8122053f7c8ba7c743b458e799eb1455
>Author: Jonathan Wakely <jwakely@redhat.com>
>Date:   Mon Oct 13 14:02:39 2014 +0100
>
>    	PR libstdc++/57350
>    	* include/std/memory (align): Do not adjust correctly aligned address.
>    	* testsuite/20_util/align/2.cc: New.
>
>diff --git a/libstdc++-v3/include/std/memory b/libstdc++-v3/include/std/memory
>index affc8b1..b5792ad 100644
>--- a/libstdc++-v3/include/std/memory
>+++ b/libstdc++-v3/include/std/memory
>@@ -113,14 +113,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> inline void*
> align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept
> {
>-  const size_t __diff = __align - reinterpret_cast<uintptr_t>(__ptr) % __align;
>-  if (__diff + __size >= __space)
>+  const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
>+  const auto __aligned = (__intptr - 1u + __align) & -__align;
>+  const auto __diff = __aligned - __intptr;
>+  if ((__size + __diff) > __space)
>     return nullptr;
>   else
>     {
>       __space -= __diff;
>-      __ptr = static_cast<char*>(__ptr) + __diff;
>-      return __ptr;
>+      return __ptr = reinterpret_cast<void*>(__aligned);
>     }
> }
> 
>diff --git a/libstdc++-v3/testsuite/20_util/align/2.cc b/libstdc++-v3/testsuite/20_util/align/2.cc
>new file mode 100644
>index 0000000..efad56a
>--- /dev/null
>+++ b/libstdc++-v3/testsuite/20_util/align/2.cc
>@@ -0,0 +1,42 @@
>+// { dg-options " -std=gnu++11 " }
>+
>+// Copyright (C) 2014 Free Software Foundation, Inc.
>+//
>+// This file is part of the GNU ISO C++ Library.  This library is free
>+// software; you can redistribute it and/or modify it under the terms
>+// of the GNU General Public License as published by the Free Software
>+// Foundation; either version 3, or (at your option) any later
>+// version.
>+
>+// This library is distributed in the hope that it will be useful, but
>+// WITHOUT ANY WARRANTY; without even the implied warranty of
>+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>+// General Public License for more details.
>+
>+// You should have received a copy of the GNU General Public License
>+// along with this library; see the file COPYING3.  If not see
>+// <http://www.gnu.org/licenses/>.
>+
>+// C++11 [ptr.align] (20.6.5): std::align
>+
>+#include <memory>
>+#include <testsuite_hooks.h>
>+
>+void
>+test01()
>+{
>+  bool test __attribute__((unused)) = true;
>+
>+  int i = 0;
>+  void* ptr = &i;
>+  auto space = sizeof(i);
>+  auto p2 = std::align(alignof(i), space, ptr, space);
>+  VERIFY( ptr == &i );
>+  VERIFY( p2 == &i );
>+  VERIFY(space == sizeof(i));
>+}
>+
>+int main()
>+{
>+  test01();
>+}



More information about the Libstdc++ mailing list