Skip to content

Commit 56a33ba

Browse files
committed
[libc++] Implement P0154R1 (Hardware inference size)
`__GCC_CONSTRUCTIVE_SIZE` and `__GCC_DESTRUCTIVE_SIZE` are available since GCC 12. I'm assuming clang will also implement these for compatability with libstdc++. Reviewed By: ldionne, #libc Spies: h-vetinari, libcxx-commits, arichardson Differential Revision: https://reviews.llvm.org/D122276
1 parent 758504b commit 56a33ba

File tree

10 files changed

+55
-23
lines changed

10 files changed

+55
-23
lines changed

libcxx/docs/FeatureTestMacroTable.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ Status
100100
------------------------------------------------- -----------------
101101
``__cpp_lib_gcd_lcm`` ``201606L``
102102
------------------------------------------------- -----------------
103-
``__cpp_lib_hardware_interference_size`` *unimplemented*
103+
``__cpp_lib_hardware_interference_size`` ``201703L``
104104
------------------------------------------------- -----------------
105105
``__cpp_lib_has_unique_object_representations`` ``201606L``
106106
------------------------------------------------- -----------------

libcxx/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Implemented Papers
4545
- P2216R3 (std::format improvements)
4646
- P0174R2 (Deprecating Vestigial Library Parts in C++17)
4747
- N4190 (Removing auto_ptr, random_shuffle(), And Old <functional> Stuff)
48+
- P0154R1 (Hardware inference size)
4849

4950
- Marked the following papers as "Complete" (note that some of those might have
5051
been implemented in a previous release but not marked as such):

libcxx/docs/Status/Cxx17.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Paper Status
4242

4343
.. [#note-P0067] P0067: ``std::(to|from)_chars`` for integrals has been available since version 7.0. ``std::to_chars`` for ``float`` and ``double`` since version 14.0 ``std::to_chars`` for ``long double`` uses the implementation for ``double``.
4444
.. [#note-P0607] P0607: The parts of P0607 that are not done are the ``<regex>`` bits.
45-
45+
.. [#note-P0154] P0154: This is currently not implemented for clang because clang does not implement the required macros.
4646
4747
.. _issues-status-cxx17:
4848

libcxx/docs/Status/Cxx17Papers.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"`P0185R1 <https://wg21.link/P0185R1>`__","LWG","Adding [nothrow-]swappable traits","Jacksonville","|Complete|","3.9"
3636
"`P0253R1 <https://wg21.link/P0253R1>`__","LWG","Fixing a design mistake in the searchers interface","Jacksonville","|Complete|","3.9"
3737
"`P0025R0 <https://wg21.link/P0025R0>`__","LWG","An algorithm to ""clamp"" a value between a pair of boundary values","Jacksonville","|Complete|","3.9"
38-
"`P0154R1 <https://wg21.link/P0154R1>`__","LWG","constexpr std::hardware_{constructive,destructive}_interference_size","Jacksonville","",""
38+
"`P0154R1 <https://wg21.link/P0154R1>`__","LWG","constexpr std::hardware_{constructive,destructive}_interference_size","Jacksonville","|Partial| [#note-P0154]_","15.0"
3939
"`P0030R1 <https://wg21.link/P0030R1>`__","LWG","Proposal to Introduce a 3-Argument Overload to std::hypot","Jacksonville","|Complete|","3.9"
4040
"`P0031R0 <https://wg21.link/P0031R0>`__","LWG","A Proposal to Add Constexpr Modifiers to reverse_iterator, move_iterator, array and Range Access","Jacksonville","|Complete|","4.0"
4141
"`P0272R1 <https://wg21.link/P0272R1>`__","LWG","Give ``std::string``\ a non-const ``.data()``\ member function","Jacksonville","|Complete|","3.9"

libcxx/include/new

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,17 @@ constexpr _Tp* launder(_Tp* __p) noexcept
360360
}
361361
#endif
362362

363+
#if _LIBCPP_STD_VER > 14
364+
365+
#if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
366+
367+
inline constexpr size_t hardware_destructive_interference_size = __GCC_DESTRUCTIVE_SIZE;
368+
inline constexpr size_t hardware_constructive_interference_size = __GCC_CONSTRUCTIVE_SIZE;
369+
370+
#endif // defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
371+
372+
#endif // _LIBCPP_STD_VER > 14
373+
363374
_LIBCPP_END_NAMESPACE_STD
364375

365376
#endif // _LIBCPP_NEW

libcxx/include/version

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,9 @@ __cpp_lib_void_t 201411L <type_traits>
247247
# define __cpp_lib_filesystem 201703L
248248
# endif
249249
# define __cpp_lib_gcd_lcm 201606L
250-
// # define __cpp_lib_hardware_interference_size 201703L
250+
# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
251+
# define __cpp_lib_hardware_interference_size 201703L
252+
# endif
251253
# define __cpp_lib_has_unique_object_representations 201606L
252254
# define __cpp_lib_hypot 201603L
253255
# define __cpp_lib_incomplete_container_elements 201505L
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// UNSUPPORTED: c++03, c++11, c++14
10+
// XFAIL: (clang || apple-clang) && stdlib=libc++
11+
12+
#include <new>
13+
14+
#include "test_macros.h"
15+
16+
ASSERT_SAME_TYPE(decltype(std::hardware_destructive_interference_size), const std::size_t);
17+
ASSERT_SAME_TYPE(decltype(std::hardware_constructive_interference_size), const std::size_t);

libcxx/test/std/language.support/support.limits/support.limits.general/new.version.compile.pass.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,16 @@
5858
# error "__cpp_lib_destroying_delete should not be defined before c++20"
5959
# endif
6060

61-
# if !defined(_LIBCPP_VERSION)
61+
# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
6262
# ifndef __cpp_lib_hardware_interference_size
6363
# error "__cpp_lib_hardware_interference_size should be defined in c++17"
6464
# endif
6565
# if __cpp_lib_hardware_interference_size != 201703L
6666
# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++17"
6767
# endif
68-
# else // _LIBCPP_VERSION
68+
# else
6969
# ifdef __cpp_lib_hardware_interference_size
70-
# error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!"
70+
# error "__cpp_lib_hardware_interference_size should not be defined when defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE) is not defined!"
7171
# endif
7272
# endif
7373

@@ -93,16 +93,16 @@
9393
# endif
9494
# endif
9595

96-
# if !defined(_LIBCPP_VERSION)
96+
# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
9797
# ifndef __cpp_lib_hardware_interference_size
9898
# error "__cpp_lib_hardware_interference_size should be defined in c++20"
9999
# endif
100100
# if __cpp_lib_hardware_interference_size != 201703L
101101
# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++20"
102102
# endif
103-
# else // _LIBCPP_VERSION
103+
# else
104104
# ifdef __cpp_lib_hardware_interference_size
105-
# error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!"
105+
# error "__cpp_lib_hardware_interference_size should not be defined when defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE) is not defined!"
106106
# endif
107107
# endif
108108

@@ -128,16 +128,16 @@
128128
# endif
129129
# endif
130130

131-
# if !defined(_LIBCPP_VERSION)
131+
# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
132132
# ifndef __cpp_lib_hardware_interference_size
133133
# error "__cpp_lib_hardware_interference_size should be defined in c++2b"
134134
# endif
135135
# if __cpp_lib_hardware_interference_size != 201703L
136136
# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++2b"
137137
# endif
138-
# else // _LIBCPP_VERSION
138+
# else
139139
# ifdef __cpp_lib_hardware_interference_size
140-
# error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!"
140+
# error "__cpp_lib_hardware_interference_size should not be defined when defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE) is not defined!"
141141
# endif
142142
# endif
143143

libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,16 +1806,16 @@
18061806
# error "__cpp_lib_generic_unordered_lookup should not be defined before c++20"
18071807
# endif
18081808

1809-
# if !defined(_LIBCPP_VERSION)
1809+
# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
18101810
# ifndef __cpp_lib_hardware_interference_size
18111811
# error "__cpp_lib_hardware_interference_size should be defined in c++17"
18121812
# endif
18131813
# if __cpp_lib_hardware_interference_size != 201703L
18141814
# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++17"
18151815
# endif
1816-
# else // _LIBCPP_VERSION
1816+
# else
18171817
# ifdef __cpp_lib_hardware_interference_size
1818-
# error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!"
1818+
# error "__cpp_lib_hardware_interference_size should not be defined when defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE) is not defined!"
18191819
# endif
18201820
# endif
18211821

@@ -2851,16 +2851,16 @@
28512851
# error "__cpp_lib_generic_unordered_lookup should have the value 201811L in c++20"
28522852
# endif
28532853

2854-
# if !defined(_LIBCPP_VERSION)
2854+
# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
28552855
# ifndef __cpp_lib_hardware_interference_size
28562856
# error "__cpp_lib_hardware_interference_size should be defined in c++20"
28572857
# endif
28582858
# if __cpp_lib_hardware_interference_size != 201703L
28592859
# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++20"
28602860
# endif
2861-
# else // _LIBCPP_VERSION
2861+
# else
28622862
# ifdef __cpp_lib_hardware_interference_size
2863-
# error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!"
2863+
# error "__cpp_lib_hardware_interference_size should not be defined when defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE) is not defined!"
28642864
# endif
28652865
# endif
28662866

@@ -4088,16 +4088,16 @@
40884088
# error "__cpp_lib_generic_unordered_lookup should have the value 201811L in c++2b"
40894089
# endif
40904090

4091-
# if !defined(_LIBCPP_VERSION)
4091+
# if defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)
40924092
# ifndef __cpp_lib_hardware_interference_size
40934093
# error "__cpp_lib_hardware_interference_size should be defined in c++2b"
40944094
# endif
40954095
# if __cpp_lib_hardware_interference_size != 201703L
40964096
# error "__cpp_lib_hardware_interference_size should have the value 201703L in c++2b"
40974097
# endif
4098-
# else // _LIBCPP_VERSION
4098+
# else
40994099
# ifdef __cpp_lib_hardware_interference_size
4100-
# error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!"
4100+
# error "__cpp_lib_hardware_interference_size should not be defined when defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE) is not defined!"
41014101
# endif
41024102
# endif
41034103

libcxx/utils/generate_feature_test_macro_components.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,9 @@ def add_version_header(tc):
329329
}, {
330330
"name": "__cpp_lib_hardware_interference_size",
331331
"values": { "c++17": 201703 },
332+
"test_suite_guard": "defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)",
333+
"libcxx_guard": "defined(__GCC_DESTRUCTIVE_SIZE) && defined(__GCC_CONSTRUCTIVE_SIZE)",
332334
"headers": ["new"],
333-
"unimplemented": True,
334335
}, {
335336
"name": "__cpp_lib_has_unique_object_representations",
336337
"values": { "c++17": 201606 },

0 commit comments

Comments
 (0)