mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			Implement P1007R3 std::assume_aligned
Implement P1007R3 std::assume_aligned * include/std/memory (assume_aligned): Implement for C++17. * testsuite/20_util/assume_aligned/1.cc: New test. * testsuite/20_util/assume_aligned/2_neg.cc: New test. * testsuite/20_util/assume_aligned/3.cc: New test. From-SVN: r266009
This commit is contained in:
		
							parent
							
								
									47d591cf00
								
							
						
					
					
						commit
						37b736f6bd
					
				|  | @ -1,3 +1,11 @@ | ||||||
|  | 2018-11-11  Jonathan Wakely  <jwakely@redhat.com> | ||||||
|  | 
 | ||||||
|  | 	Implement P1007R3 std::assume_aligned | ||||||
|  | 	* include/std/memory (assume_aligned): Implement for C++17. | ||||||
|  | 	* testsuite/20_util/assume_aligned/1.cc: New test. | ||||||
|  | 	* testsuite/20_util/assume_aligned/2_neg.cc: New test. | ||||||
|  | 	* testsuite/20_util/assume_aligned/3.cc: New test. | ||||||
|  | 
 | ||||||
| 2018-11-09  Jonathan Wakely  <jwakely@redhat.com> | 2018-11-09  Jonathan Wakely  <jwakely@redhat.com> | ||||||
| 
 | 
 | ||||||
| 	PR libstdc++/87787 | 	PR libstdc++/87787 | ||||||
|  |  | ||||||
|  | @ -89,6 +89,9 @@ | ||||||
| 
 | 
 | ||||||
| #if __cplusplus >= 201103L | #if __cplusplus >= 201103L | ||||||
| #include <cstdint> | #include <cstdint> | ||||||
|  | #if __cplusplus > 201703L | ||||||
|  | # include <bit>			// for ispow2 | ||||||
|  | #endif | ||||||
| namespace std _GLIBCXX_VISIBILITY(default) | namespace std _GLIBCXX_VISIBILITY(default) | ||||||
| { | { | ||||||
| _GLIBCXX_BEGIN_NAMESPACE_VERSION | _GLIBCXX_BEGIN_NAMESPACE_VERSION | ||||||
|  | @ -151,6 +154,18 @@ undeclare_no_pointers(char*, size_t) { } | ||||||
| inline pointer_safety | inline pointer_safety | ||||||
| get_pointer_safety() noexcept { return pointer_safety::relaxed; } | get_pointer_safety() noexcept { return pointer_safety::relaxed; } | ||||||
| 
 | 
 | ||||||
|  | #if __cplusplus > 201703L | ||||||
|  |   /// Inform the compiler that a pointer is aligned. | ||||||
|  |   template<size_t _Align, class _Tp> | ||||||
|  |     [[nodiscard,__gnu__::__always_inline__]] | ||||||
|  |     constexpr _Tp* assume_aligned(_Tp* __ptr) | ||||||
|  |     { | ||||||
|  |       static_assert(std::ispow2(_Align)); | ||||||
|  |       _GLIBCXX_DEBUG_ASSERT((std::uintptr_t)__ptr % _Align == 0); | ||||||
|  |       return static_cast<_Tp*>(__builtin_assume_aligned(__ptr, _Align)); | ||||||
|  |     } | ||||||
|  | #endif // C++2a | ||||||
|  | 
 | ||||||
| _GLIBCXX_END_NAMESPACE_VERSION | _GLIBCXX_END_NAMESPACE_VERSION | ||||||
| } // namespace | } // namespace | ||||||
| #endif // C++11 | #endif // C++11 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | // Copyright (C) 2018 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/>.
 | ||||||
|  | 
 | ||||||
|  | // { dg-options "-std=gnu++2a" }
 | ||||||
|  | // { dg-do run { target c++2a } }
 | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | #include <testsuite_hooks.h> | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | test01() | ||||||
|  | { | ||||||
|  |   int i = 0; | ||||||
|  |   int* p = std::assume_aligned<alignof(int)>(&i); | ||||||
|  |   VERIFY( p == &i ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   test01(); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | // Copyright (C) 2018 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/>.
 | ||||||
|  | 
 | ||||||
|  | // { dg-options "-std=gnu++2a" }
 | ||||||
|  | // { dg-do compile { target c++2a } }
 | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | test01() | ||||||
|  | { | ||||||
|  |   int i = 0; | ||||||
|  |   std::assume_aligned<2>(&i); // { dg-warning "ignoring return value" }
 | ||||||
|  |   (void) std::assume_aligned<3>(&i); // { dg-error "here" }
 | ||||||
|  |   // { dg-error "static assertion failed" "" { target *-*-* } 0 }
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,34 @@ | ||||||
|  | // Copyright (C) 2018 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/>.
 | ||||||
|  | 
 | ||||||
|  | // { dg-options "-std=gnu++2a -O2" }
 | ||||||
|  | // { dg-do compile { target c++2a } }
 | ||||||
|  | // { dg-final { scan-assembler-not "undefined" } }
 | ||||||
|  | 
 | ||||||
|  | #include <memory> | ||||||
|  | 
 | ||||||
|  | int* ptr(); | ||||||
|  | extern "C" void undefined(); | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | test01() | ||||||
|  | { | ||||||
|  |   const std::size_t alignment = 4 * alignof(int); | ||||||
|  |   int* p = std::assume_aligned<alignment>(ptr()); | ||||||
|  |   if ((std::uintptr_t)p % alignment) | ||||||
|  |     undefined(); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jonathan Wakely
						Jonathan Wakely