@zigc/lib 0.17.0-dev.135 → 0.17.0-dev.215

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/c/stdlib.zig +32 -22
  2. package/compiler/aro/aro/Compilation.zig +0 -3
  3. package/compiler/translate-c/ast.zig +5 -2
  4. package/compiler_rt/arm.zig +3 -3
  5. package/compiler_rt/trunctfhf2.zig +3 -0
  6. package/compiler_rt.zig +1 -22
  7. package/docs/wasm/markdown/Parser.zig +5 -9
  8. package/include/__clang_spirv_builtins.h +12 -12
  9. package/include/__float_float.h +176 -0
  10. package/include/__float_header_macro.h +12 -0
  11. package/include/__float_infinity_nan.h +20 -0
  12. package/include/amo.h +131 -0
  13. package/include/amxavx512intrin.h +215 -1
  14. package/include/amxintrin.h +0 -2
  15. package/include/arm_acle.h +37 -27
  16. package/include/arm_neon.h +218 -82
  17. package/include/arm_sme.h +8 -8
  18. package/include/arm_sve.h +4162 -3782
  19. package/include/avx10_2_512bf16intrin.h +19 -12
  20. package/include/avx10_2_512convertintrin.h +1 -1
  21. package/include/avx10_2_512niintrin.h +31 -31
  22. package/include/avx10_2_512satcvtdsintrin.h +1 -1
  23. package/include/avx10_2bf16intrin.h +54 -45
  24. package/include/avx10_2convertintrin.h +2 -2
  25. package/include/avx10_2copyintrin.h +1 -1
  26. package/include/avx10_2niintrin.h +14 -14
  27. package/include/avx10_2satcvtdsintrin.h +2 -2
  28. package/include/avx2intrin.h +275 -377
  29. package/include/avx512bf16intrin.h +25 -16
  30. package/include/avx512bitalgintrin.h +19 -30
  31. package/include/avx512bwintrin.h +386 -505
  32. package/include/avx512cdintrin.h +42 -55
  33. package/include/avx512dqintrin.h +132 -161
  34. package/include/avx512fintrin.h +1015 -1424
  35. package/include/avx512fp16intrin.h +112 -110
  36. package/include/avx512ifmaintrin.h +32 -34
  37. package/include/avx512ifmavlintrin.h +73 -46
  38. package/include/avx512vbmi2intrin.h +43 -32
  39. package/include/avx512vbmiintrin.h +19 -27
  40. package/include/avx512vbmivlintrin.h +35 -49
  41. package/include/avx512vlbf16intrin.h +32 -22
  42. package/include/avx512vlbitalgintrin.h +37 -53
  43. package/include/avx512vlbwintrin.h +470 -573
  44. package/include/avx512vlcdintrin.h +74 -102
  45. package/include/avx512vldqintrin.h +110 -127
  46. package/include/avx512vlfp16intrin.h +130 -111
  47. package/include/avx512vlintrin.h +945 -1299
  48. package/include/avx512vlvbmi2intrin.h +78 -63
  49. package/include/avx512vlvnniintrin.h +21 -18
  50. package/include/avx512vlvp2intersectintrin.h +2 -2
  51. package/include/avx512vnniintrin.h +10 -10
  52. package/include/avx512vp2intersectintrin.h +1 -2
  53. package/include/avx512vpopcntdqintrin.h +8 -10
  54. package/include/avx512vpopcntdqvlintrin.h +17 -15
  55. package/include/avxifmaintrin.h +16 -0
  56. package/include/avxintrin.h +165 -241
  57. package/include/avxvnniint16intrin.h +118 -99
  58. package/include/avxvnniint8intrin.h +56 -32
  59. package/include/avxvnniintrin.h +16 -8
  60. package/include/cpuid.h +101 -4
  61. package/include/emmintrin.h +168 -168
  62. package/include/f16cintrin.h +23 -9
  63. package/include/float.h +16 -155
  64. package/include/fma4intrin.h +98 -96
  65. package/include/fmaintrin.h +96 -66
  66. package/include/gfniintrin.h +21 -16
  67. package/include/hexagon_types.h +23 -20
  68. package/include/hvx_hexagon_protos.h +649 -860
  69. package/include/immintrin.h +0 -12
  70. package/include/intrin.h +4 -0
  71. package/include/lasxintrin.h +113 -0
  72. package/include/llvm_libc_wrappers/assert.h +3 -5
  73. package/include/llvm_libc_wrappers/ctype.h +3 -115
  74. package/include/llvm_libc_wrappers/inttypes.h +3 -5
  75. package/include/llvm_libc_wrappers/stdio.h +10 -38
  76. package/include/llvm_libc_wrappers/stdlib.h +3 -24
  77. package/include/llvm_libc_wrappers/string.h +2 -70
  78. package/include/llvm_libc_wrappers/time.h +4 -10
  79. package/include/mmintrin.h +188 -257
  80. package/include/module.modulemap +23 -4
  81. package/include/movrs_avx10_2_512intrin.h +2 -2
  82. package/include/movrs_avx10_2intrin.h +4 -4
  83. package/include/pmmintrin.h +12 -24
  84. package/include/ptrauth.h +16 -2
  85. package/include/riscv_mips.h +34 -0
  86. package/include/riscv_nds.h +89 -0
  87. package/include/sifive_vector.h +58 -2
  88. package/include/sm4evexintrin.h +2 -2
  89. package/include/smmintrin.h +77 -59
  90. package/include/spirvintrin.h +194 -0
  91. package/include/stddefer.h +19 -0
  92. package/include/tmmintrin.h +116 -147
  93. package/include/vaesintrin.h +1 -2
  94. package/include/xmmintrin.h +44 -70
  95. package/include/xopintrin.h +20 -10
  96. package/libcxx/include/__algorithm/all_of.h +11 -5
  97. package/libcxx/include/__algorithm/comp.h +4 -0
  98. package/libcxx/include/__algorithm/copy.h +28 -147
  99. package/libcxx/include/__algorithm/copy_backward.h +9 -24
  100. package/libcxx/include/__algorithm/copy_n.h +50 -16
  101. package/libcxx/include/__algorithm/count.h +2 -2
  102. package/libcxx/include/__algorithm/equal.h +43 -55
  103. package/libcxx/include/__algorithm/fill.h +26 -8
  104. package/libcxx/include/__algorithm/fill_n.h +32 -46
  105. package/libcxx/include/__algorithm/find.h +96 -39
  106. package/libcxx/include/__algorithm/find_end.h +105 -0
  107. package/libcxx/include/__algorithm/for_each.h +18 -24
  108. package/libcxx/include/__algorithm/for_each_n.h +20 -47
  109. package/libcxx/include/__algorithm/for_each_n_segment.h +1 -1
  110. package/libcxx/include/__algorithm/for_each_segment.h +26 -0
  111. package/libcxx/include/__algorithm/generate.h +4 -2
  112. package/libcxx/include/__algorithm/generate_n.h +19 -6
  113. package/libcxx/include/__algorithm/is_permutation.h +4 -4
  114. package/libcxx/include/__algorithm/iterator_operations.h +3 -0
  115. package/libcxx/include/__algorithm/lexicographical_compare.h +2 -2
  116. package/libcxx/include/__algorithm/lexicographical_compare_three_way.h +6 -6
  117. package/libcxx/include/__algorithm/make_heap.h +16 -4
  118. package/libcxx/include/__algorithm/mismatch.h +2 -2
  119. package/libcxx/include/__algorithm/move.h +8 -19
  120. package/libcxx/include/__algorithm/move_backward.h +9 -24
  121. package/libcxx/include/__algorithm/none_of.h +4 -4
  122. package/libcxx/include/__algorithm/partial_sort.h +1 -1
  123. package/libcxx/include/__algorithm/partial_sort_copy.h +1 -1
  124. package/libcxx/include/__algorithm/pstl.h +9 -9
  125. package/libcxx/include/__algorithm/radix_sort.h +27 -25
  126. package/libcxx/include/__algorithm/ranges_copy_n.h +3 -26
  127. package/libcxx/include/__algorithm/ranges_equal.h +17 -26
  128. package/libcxx/include/__algorithm/ranges_fill.h +7 -6
  129. package/libcxx/include/__algorithm/ranges_for_each.h +9 -1
  130. package/libcxx/include/__algorithm/ranges_generate_n.h +2 -6
  131. package/libcxx/include/__algorithm/ranges_search_n.h +2 -2
  132. package/libcxx/include/__algorithm/rotate.h +27 -44
  133. package/libcxx/include/__algorithm/search_n.h +49 -37
  134. package/libcxx/include/__algorithm/sift_down.h +19 -18
  135. package/libcxx/include/__algorithm/simd_utils.h +33 -4
  136. package/libcxx/include/__algorithm/specialized_algorithms.h +54 -0
  137. package/libcxx/include/__algorithm/stable_sort.h +1 -1
  138. package/libcxx/include/__assertion_handler +31 -4
  139. package/libcxx/include/__atomic/atomic.h +36 -60
  140. package/libcxx/include/__atomic/atomic_flag.h +19 -37
  141. package/libcxx/include/__atomic/atomic_ref.h +29 -12
  142. package/libcxx/include/__atomic/atomic_sync.h +127 -55
  143. package/libcxx/include/__atomic/atomic_sync_timed.h +144 -0
  144. package/libcxx/include/__atomic/atomic_waitable_traits.h +103 -0
  145. package/libcxx/include/__atomic/contention_t.h +27 -3
  146. package/libcxx/include/__atomic/floating_point_helper.h +55 -0
  147. package/libcxx/include/__bit/countl.h +1 -2
  148. package/libcxx/include/__bit/countr.h +1 -2
  149. package/libcxx/include/__bit/has_single_bit.h +1 -1
  150. package/libcxx/include/__bit/popcount.h +0 -1
  151. package/libcxx/include/__bit/rotate.h +15 -26
  152. package/libcxx/include/__bit_reference +207 -18
  153. package/libcxx/include/__charconv/from_chars_integral.h +1 -1
  154. package/libcxx/include/__charconv/from_chars_result.h +1 -1
  155. package/libcxx/include/__charconv/to_chars_integral.h +1 -0
  156. package/libcxx/include/__charconv/to_chars_result.h +1 -1
  157. package/libcxx/include/__charconv/traits.h +3 -24
  158. package/libcxx/include/__chrono/day.h +11 -0
  159. package/libcxx/include/__chrono/duration.h +58 -33
  160. package/libcxx/include/__chrono/file_clock.h +4 -2
  161. package/libcxx/include/__chrono/is_clock.h +72 -0
  162. package/libcxx/include/__chrono/leap_second.h +13 -0
  163. package/libcxx/include/__chrono/month.h +13 -0
  164. package/libcxx/include/__chrono/month_weekday.h +22 -0
  165. package/libcxx/include/__chrono/monthday.h +20 -0
  166. package/libcxx/include/__chrono/steady_clock.h +1 -1
  167. package/libcxx/include/__chrono/system_clock.h +3 -3
  168. package/libcxx/include/__chrono/time_point.h +37 -13
  169. package/libcxx/include/__chrono/weekday.h +25 -0
  170. package/libcxx/include/__chrono/year.h +11 -0
  171. package/libcxx/include/__chrono/year_month.h +13 -0
  172. package/libcxx/include/__chrono/year_month_day.h +23 -0
  173. package/libcxx/include/__chrono/year_month_weekday.h +26 -0
  174. package/libcxx/include/__chrono/zoned_time.h +16 -0
  175. package/libcxx/include/__compare/is_eq.h +6 -6
  176. package/libcxx/include/__compare/strong_order.h +12 -30
  177. package/libcxx/include/__compare/three_way_comparable.h +2 -2
  178. package/libcxx/include/__concepts/comparison_common_type.h +40 -0
  179. package/libcxx/include/__concepts/equality_comparable.h +2 -1
  180. package/libcxx/include/__condition_variable/condition_variable.h +1 -1
  181. package/libcxx/include/__config +63 -280
  182. package/libcxx/include/__configuration/abi.h +14 -24
  183. package/libcxx/include/__configuration/availability.h +65 -118
  184. package/libcxx/include/__configuration/compiler.h +6 -6
  185. package/libcxx/include/__configuration/experimental.h +38 -0
  186. package/libcxx/include/__configuration/hardening.h +215 -0
  187. package/libcxx/include/__configuration/language.h +3 -0
  188. package/libcxx/include/__configuration/platform.h +9 -16
  189. package/libcxx/include/__coroutine/coroutine_handle.h +9 -9
  190. package/libcxx/include/__coroutine/noop_coroutine_handle.h +11 -13
  191. package/libcxx/include/__debug_utils/strict_weak_ordering_check.h +1 -1
  192. package/libcxx/include/__exception/exception.h +6 -4
  193. package/libcxx/include/__exception/exception_ptr.h +27 -5
  194. package/libcxx/include/__exception/nested_exception.h +2 -2
  195. package/libcxx/include/__exception/operations.h +5 -5
  196. package/libcxx/include/__expected/bad_expected_access.h +8 -6
  197. package/libcxx/include/__expected/expected.h +62 -64
  198. package/libcxx/include/__expected/unexpected.h +4 -4
  199. package/libcxx/include/__filesystem/copy_options.h +4 -4
  200. package/libcxx/include/__filesystem/directory_entry.h +37 -33
  201. package/libcxx/include/__filesystem/directory_iterator.h +9 -11
  202. package/libcxx/include/__filesystem/directory_options.h +7 -4
  203. package/libcxx/include/__filesystem/file_status.h +3 -3
  204. package/libcxx/include/__filesystem/filesystem_error.h +9 -10
  205. package/libcxx/include/__filesystem/operations.h +97 -66
  206. package/libcxx/include/__filesystem/path.h +68 -64
  207. package/libcxx/include/__filesystem/path_iterator.h +1 -3
  208. package/libcxx/include/__filesystem/perm_options.h +4 -4
  209. package/libcxx/include/__filesystem/perms.h +4 -4
  210. package/libcxx/include/__filesystem/recursive_directory_iterator.h +9 -14
  211. package/libcxx/include/__filesystem/space_info.h +1 -1
  212. package/libcxx/include/__filesystem/u8path.h +12 -14
  213. package/libcxx/include/__flat_map/flat_map.h +88 -71
  214. package/libcxx/include/__flat_map/flat_multimap.h +251 -172
  215. package/libcxx/include/__flat_map/key_value_iterator.h +0 -1
  216. package/libcxx/include/__flat_map/utils.h +1 -0
  217. package/libcxx/include/__flat_set/flat_multiset.h +211 -143
  218. package/libcxx/include/__flat_set/flat_set.h +86 -68
  219. package/libcxx/include/__format/concepts.h +0 -14
  220. package/libcxx/include/__format/extended_grapheme_cluster_table.h +3 -2
  221. package/libcxx/include/__format/fmt_pair_like.h +42 -0
  222. package/libcxx/include/__format/format_arg.h +7 -10
  223. package/libcxx/include/__format/format_args.h +1 -1
  224. package/libcxx/include/__format/format_context.h +5 -5
  225. package/libcxx/include/__format/format_parse_context.h +2 -2
  226. package/libcxx/include/__format/formatter_output.h +30 -34
  227. package/libcxx/include/__format/indic_conjunct_break_table.h +3 -2
  228. package/libcxx/include/__format/range_default_formatter.h +2 -41
  229. package/libcxx/include/__format/range_format.h +71 -0
  230. package/libcxx/include/__format/range_formatter.h +1 -0
  231. package/libcxx/include/__format/width_estimation_table.h +4 -2
  232. package/libcxx/include/__functional/bind.h +10 -15
  233. package/libcxx/include/__functional/bind_back.h +1 -1
  234. package/libcxx/include/__functional/bind_front.h +1 -1
  235. package/libcxx/include/__functional/function.h +57 -75
  236. package/libcxx/include/__functional/hash.h +1 -10
  237. package/libcxx/include/__functional/identity.h +1 -1
  238. package/libcxx/include/__functional/is_transparent.h +8 -0
  239. package/libcxx/include/__functional/mem_fn.h +2 -1
  240. package/libcxx/include/__functional/operations.h +18 -0
  241. package/libcxx/include/__functional/ranges_operations.h +7 -0
  242. package/libcxx/include/__functional/reference_wrapper.h +7 -5
  243. package/libcxx/include/__functional/weak_result_type.h +14 -28
  244. package/libcxx/include/__fwd/ios.h +1 -1
  245. package/libcxx/include/__fwd/tuple.h +14 -0
  246. package/libcxx/include/__hash_table +371 -357
  247. package/libcxx/include/__ios/fpos.h +4 -4
  248. package/libcxx/include/__iterator/back_insert_iterator.h +1 -7
  249. package/libcxx/include/__iterator/bounded_iter.h +7 -8
  250. package/libcxx/include/__iterator/concepts.h +6 -9
  251. package/libcxx/include/__iterator/cpp17_iterator_concepts.h +13 -12
  252. package/libcxx/include/__iterator/distance.h +40 -18
  253. package/libcxx/include/__iterator/front_insert_iterator.h +1 -7
  254. package/libcxx/include/__iterator/insert_iterator.h +1 -7
  255. package/libcxx/include/__iterator/istream_iterator.h +6 -7
  256. package/libcxx/include/__iterator/istreambuf_iterator.h +6 -7
  257. package/libcxx/include/__iterator/iter_move.h +1 -1
  258. package/libcxx/include/__iterator/iterator.h +13 -0
  259. package/libcxx/include/__iterator/iterator_traits.h +13 -14
  260. package/libcxx/include/__iterator/ostream_iterator.h +1 -7
  261. package/libcxx/include/__iterator/ostreambuf_iterator.h +1 -7
  262. package/libcxx/include/__iterator/reverse_iterator.h +8 -13
  263. package/libcxx/include/__iterator/segmented_iterator.h +3 -8
  264. package/libcxx/include/__iterator/static_bounded_iter.h +3 -3
  265. package/libcxx/include/__iterator/wrap_iter.h +8 -6
  266. package/libcxx/include/__locale +3 -10
  267. package/libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h +0 -10
  268. package/libcxx/include/__locale_dir/locale_base_api.h +5 -28
  269. package/libcxx/include/__locale_dir/messages.h +1 -1
  270. package/libcxx/include/__locale_dir/money.h +2 -2
  271. package/libcxx/include/__locale_dir/num.h +190 -243
  272. package/libcxx/include/__locale_dir/pad_and_output.h +5 -6
  273. package/libcxx/include/__locale_dir/support/bsd_like.h +0 -20
  274. package/libcxx/include/__locale_dir/support/fuchsia.h +0 -7
  275. package/libcxx/include/__locale_dir/support/linux.h +0 -37
  276. package/libcxx/include/__locale_dir/support/netbsd.h +0 -2
  277. package/libcxx/include/__locale_dir/support/newlib.h +243 -0
  278. package/libcxx/include/__locale_dir/support/no_locale/characters.h +0 -4
  279. package/libcxx/include/__locale_dir/support/no_locale/strtonum.h +0 -9
  280. package/libcxx/include/__locale_dir/support/windows.h +0 -29
  281. package/libcxx/include/__locale_dir/time.h +3 -7
  282. package/libcxx/include/__math/hypot.h +1 -1
  283. package/libcxx/include/__math/logarithms.h +1 -1
  284. package/libcxx/include/__math/traits.h +80 -11
  285. package/libcxx/include/__mdspan/extents.h +7 -4
  286. package/libcxx/include/__mdspan/layout_stride.h +4 -5
  287. package/libcxx/include/__mdspan/mdspan.h +29 -23
  288. package/libcxx/include/__memory/addressof.h +7 -5
  289. package/libcxx/include/__memory/align.h +18 -1
  290. package/libcxx/include/__memory/allocate_at_least.h +15 -10
  291. package/libcxx/include/__memory/allocator.h +14 -26
  292. package/libcxx/include/__memory/allocator_traits.h +6 -4
  293. package/libcxx/include/__memory/compressed_pair.h +15 -9
  294. package/libcxx/include/__memory/construct_at.h +12 -23
  295. package/libcxx/include/__memory/inout_ptr.h +1 -1
  296. package/libcxx/include/__memory/is_sufficiently_aligned.h +1 -1
  297. package/libcxx/include/__memory/out_ptr.h +1 -1
  298. package/libcxx/include/__memory/pointer_traits.h +1 -1
  299. package/libcxx/include/__memory/raw_storage_iterator.h +3 -9
  300. package/libcxx/include/__memory/shared_count.h +9 -30
  301. package/libcxx/include/__memory/shared_ptr.h +100 -145
  302. package/libcxx/include/__memory/temp_value.h +1 -2
  303. package/libcxx/include/__memory/uninitialized_algorithms.h +44 -115
  304. package/libcxx/include/__memory/unique_ptr.h +14 -16
  305. package/libcxx/include/__memory/uses_allocator_construction.h +1 -0
  306. package/libcxx/include/__memory_resource/memory_resource.h +4 -2
  307. package/libcxx/include/__memory_resource/monotonic_buffer_resource.h +1 -1
  308. package/libcxx/include/__memory_resource/polymorphic_allocator.h +13 -8
  309. package/libcxx/include/__memory_resource/pool_options.h +1 -1
  310. package/libcxx/include/__memory_resource/synchronized_pool_resource.h +4 -2
  311. package/libcxx/include/__memory_resource/unsynchronized_pool_resource.h +1 -1
  312. package/libcxx/include/__mutex/mutex.h +2 -2
  313. package/libcxx/include/__mutex/once_flag.h +14 -11
  314. package/libcxx/include/__mutex/tag_types.h +3 -3
  315. package/libcxx/include/__mutex/unique_lock.h +8 -7
  316. package/libcxx/include/__new/align_val_t.h +6 -0
  317. package/libcxx/include/__new/allocate.h +1 -2
  318. package/libcxx/include/__new/exceptions.h +8 -2
  319. package/libcxx/include/__new/global_new_delete.h +4 -11
  320. package/libcxx/include/__new/interference_size.h +0 -4
  321. package/libcxx/include/__new/launder.h +3 -5
  322. package/libcxx/include/__new/nothrow_t.h +1 -1
  323. package/libcxx/include/__numeric/gcd_lcm.h +24 -34
  324. package/libcxx/include/__numeric/midpoint.h +9 -14
  325. package/libcxx/include/__numeric/pstl.h +2 -2
  326. package/libcxx/include/__numeric/saturation_arithmetic.h +13 -5
  327. package/libcxx/include/__ostream/basic_ostream.h +8 -8
  328. package/libcxx/include/__pstl/backends/default.h +14 -14
  329. package/libcxx/include/__pstl/backends/libdispatch.h +2 -2
  330. package/libcxx/include/__pstl/cpu_algos/find_if.h +1 -1
  331. package/libcxx/include/__pstl/cpu_algos/transform.h +5 -6
  332. package/libcxx/include/__pstl/cpu_algos/transform_reduce.h +5 -4
  333. package/libcxx/include/__random/binomial_distribution.h +10 -4
  334. package/libcxx/include/__random/mersenne_twister_engine.h +50 -154
  335. package/libcxx/include/__random/piecewise_constant_distribution.h +3 -2
  336. package/libcxx/include/__random/piecewise_linear_distribution.h +3 -2
  337. package/libcxx/include/__ranges/adjacent_transform_view.h +406 -0
  338. package/libcxx/include/__ranges/adjacent_view.h +419 -0
  339. package/libcxx/include/__ranges/as_rvalue_view.h +9 -9
  340. package/libcxx/include/__ranges/chunk_by_view.h +6 -6
  341. package/libcxx/include/__ranges/common_view.h +7 -7
  342. package/libcxx/include/__ranges/drop_view.h +8 -8
  343. package/libcxx/include/__ranges/drop_while_view.h +5 -5
  344. package/libcxx/include/__ranges/elements_of.h +49 -0
  345. package/libcxx/include/__ranges/empty_view.h +5 -5
  346. package/libcxx/include/__ranges/filter_view.h +10 -10
  347. package/libcxx/include/__ranges/iota_view.h +41 -22
  348. package/libcxx/include/__ranges/owning_view.h +15 -15
  349. package/libcxx/include/__ranges/ref_view.h +6 -6
  350. package/libcxx/include/__ranges/repeat_view.h +17 -10
  351. package/libcxx/include/__ranges/single_view.h +8 -8
  352. package/libcxx/include/__ranges/take_view.h +9 -9
  353. package/libcxx/include/__ranges/transform_view.h +1 -2
  354. package/libcxx/include/__ranges/view_interface.h +10 -10
  355. package/libcxx/include/__ranges/zip_transform_view.h +357 -0
  356. package/libcxx/include/__ranges/zip_view.h +20 -20
  357. package/libcxx/include/__split_buffer +612 -240
  358. package/libcxx/include/__stop_token/atomic_unique_lock.h +1 -1
  359. package/libcxx/include/__stop_token/stop_callback.h +2 -2
  360. package/libcxx/include/__stop_token/stop_source.h +1 -1
  361. package/libcxx/include/__stop_token/stop_state.h +4 -4
  362. package/libcxx/include/__stop_token/stop_token.h +1 -1
  363. package/libcxx/include/__string/char_traits.h +51 -31
  364. package/libcxx/include/__string/constexpr_c_functions.h +5 -5
  365. package/libcxx/include/__support/xlocale/__strtonum_fallback.h +0 -8
  366. package/libcxx/include/__system_error/error_category.h +8 -8
  367. package/libcxx/include/__system_error/error_code.h +5 -5
  368. package/libcxx/include/__system_error/error_condition.h +4 -4
  369. package/libcxx/include/__system_error/system_error.h +1 -1
  370. package/libcxx/include/__thread/id.h +1 -1
  371. package/libcxx/include/__thread/jthread.h +1 -1
  372. package/libcxx/include/__thread/poll_with_backoff.h +27 -8
  373. package/libcxx/include/__thread/support/c11.h +8 -8
  374. package/libcxx/include/__thread/support/pthread.h +8 -8
  375. package/libcxx/include/__thread/support/windows.h +8 -8
  376. package/libcxx/include/__thread/thread.h +13 -8
  377. package/libcxx/include/__thread/timed_backoff_policy.h +3 -2
  378. package/libcxx/include/__tree +849 -701
  379. package/libcxx/include/__tuple/sfinae_helpers.h +1 -44
  380. package/libcxx/include/__tuple/tuple_element.h +0 -12
  381. package/libcxx/include/__tuple/tuple_size.h +0 -4
  382. package/libcxx/include/__tuple/tuple_transform.h +45 -0
  383. package/libcxx/include/__type_traits/aligned_storage.h +13 -40
  384. package/libcxx/include/__type_traits/desugars_to.h +4 -0
  385. package/libcxx/include/__type_traits/invoke.h +8 -0
  386. package/libcxx/include/__type_traits/is_allocator.h +6 -7
  387. package/libcxx/include/__type_traits/is_array.h +26 -0
  388. package/libcxx/include/__type_traits/is_equality_comparable.h +16 -21
  389. package/libcxx/include/__type_traits/is_final.h +1 -1
  390. package/libcxx/include/__type_traits/is_floating_point.h +7 -6
  391. package/libcxx/include/__type_traits/is_generic_transparent_comparator.h +30 -0
  392. package/libcxx/include/__type_traits/is_specialization.h +2 -6
  393. package/libcxx/include/__type_traits/is_within_lifetime.h +29 -0
  394. package/libcxx/include/__type_traits/make_transparent.h +52 -0
  395. package/libcxx/include/__type_traits/reference_constructs_from_temporary.h +1 -7
  396. package/libcxx/include/__type_traits/reference_converts_from_temporary.h +1 -1
  397. package/libcxx/include/__utility/cmp.h +19 -7
  398. package/libcxx/include/__utility/default_three_way_comparator.h +70 -0
  399. package/libcxx/include/__utility/in_place.h +1 -1
  400. package/libcxx/include/__utility/integer_sequence.h +56 -41
  401. package/libcxx/include/__utility/lazy_synth_three_way_comparator.h +120 -0
  402. package/libcxx/include/__utility/pair.h +22 -25
  403. package/libcxx/include/__utility/scope_guard.h +2 -0
  404. package/libcxx/include/__utility/try_key_extraction.h +114 -0
  405. package/libcxx/include/__vector/vector.h +187 -160
  406. package/libcxx/include/__vector/vector_bool.h +76 -83
  407. package/libcxx/include/any +118 -155
  408. package/libcxx/include/array +88 -56
  409. package/libcxx/include/atomic +2 -0
  410. package/libcxx/include/barrier +20 -24
  411. package/libcxx/include/bitset +49 -30
  412. package/libcxx/include/ccomplex +3 -11
  413. package/libcxx/include/chrono +47 -0
  414. package/libcxx/include/ciso646 +3 -6
  415. package/libcxx/include/complex +77 -65
  416. package/libcxx/include/complex.h +10 -10
  417. package/libcxx/include/condition_variable +3 -3
  418. package/libcxx/include/cstdalign +3 -10
  419. package/libcxx/include/cstdbool +3 -10
  420. package/libcxx/include/ctgmath +2 -11
  421. package/libcxx/include/ctype.h +24 -24
  422. package/libcxx/include/cwchar +2 -2
  423. package/libcxx/include/deque +109 -225
  424. package/libcxx/include/errno.h +269 -269
  425. package/libcxx/include/exception +4 -1
  426. package/libcxx/include/ext/hash_map +7 -48
  427. package/libcxx/include/ext/hash_set +2 -8
  428. package/libcxx/include/fenv.h +43 -43
  429. package/libcxx/include/flat_map +663 -11
  430. package/libcxx/include/flat_set +543 -8
  431. package/libcxx/include/float.h +16 -16
  432. package/libcxx/include/forward_list +33 -53
  433. package/libcxx/include/fstream +57 -42
  434. package/libcxx/include/future +41 -51
  435. package/libcxx/include/initializer_list +9 -3
  436. package/libcxx/include/inttypes.h +16 -16
  437. package/libcxx/include/ios +28 -28
  438. package/libcxx/include/istream +19 -13
  439. package/libcxx/include/iterator +10 -0
  440. package/libcxx/include/latch +7 -5
  441. package/libcxx/include/limits +4 -4
  442. package/libcxx/include/list +61 -79
  443. package/libcxx/include/map +386 -274
  444. package/libcxx/include/math.h +19 -0
  445. package/libcxx/include/mdspan +1 -5
  446. package/libcxx/include/mutex +29 -19
  447. package/libcxx/include/optional +644 -149
  448. package/libcxx/include/print +9 -5
  449. package/libcxx/include/queue +39 -37
  450. package/libcxx/include/ranges +48 -0
  451. package/libcxx/include/regex +33 -31
  452. package/libcxx/include/scoped_allocator +16 -11
  453. package/libcxx/include/semaphore +15 -18
  454. package/libcxx/include/set +220 -192
  455. package/libcxx/include/shared_mutex +3 -8
  456. package/libcxx/include/span +53 -37
  457. package/libcxx/include/sstream +34 -28
  458. package/libcxx/include/stack +13 -15
  459. package/libcxx/include/stddef.h +10 -10
  460. package/libcxx/include/stdexcept +2 -2
  461. package/libcxx/include/stdio.h +20 -21
  462. package/libcxx/include/streambuf +59 -19
  463. package/libcxx/include/string +574 -573
  464. package/libcxx/include/string_view +113 -89
  465. package/libcxx/include/strstream +10 -10
  466. package/libcxx/include/syncstream +4 -4
  467. package/libcxx/include/tgmath.h +12 -12
  468. package/libcxx/include/tuple +242 -212
  469. package/libcxx/include/type_traits +8 -2
  470. package/libcxx/include/typeindex +5 -3
  471. package/libcxx/include/typeinfo +92 -89
  472. package/libcxx/include/unordered_map +179 -304
  473. package/libcxx/include/unordered_set +168 -195
  474. package/libcxx/include/utility +12 -0
  475. package/libcxx/include/valarray +106 -161
  476. package/libcxx/include/variant +25 -33
  477. package/libcxx/include/version +41 -24
  478. package/libcxx/include/wctype.h +29 -29
  479. package/libcxx/src/any.cpp +4 -0
  480. package/libcxx/src/atomic.cpp +365 -80
  481. package/libcxx/src/barrier.cpp +4 -3
  482. package/libcxx/src/charconv.cpp +6 -3
  483. package/libcxx/src/condition_variable_destructor.cpp +1 -1
  484. package/libcxx/src/error_category.cpp +3 -1
  485. package/libcxx/src/exception.cpp +2 -10
  486. package/libcxx/src/experimental/time_zone.cpp +1 -1
  487. package/libcxx/src/experimental/tzdb.cpp +4 -1
  488. package/libcxx/src/filesystem/error.h +4 -22
  489. package/libcxx/src/filesystem/format_string.h +9 -18
  490. package/libcxx/src/filesystem/int128_builtins.cpp +2 -0
  491. package/libcxx/src/filesystem/operations.cpp +2 -9
  492. package/libcxx/src/filesystem/path.cpp +3 -1
  493. package/libcxx/src/include/aligned_alloc.h +65 -0
  494. package/libcxx/src/include/config_elast.h +1 -1
  495. package/libcxx/src/include/from_chars_floating_point.h +11 -7
  496. package/libcxx/src/include/overridable_function.h +8 -10
  497. package/libcxx/src/iostream.cpp +56 -37
  498. package/libcxx/src/locale.cpp +213 -196
  499. package/libcxx/src/memory.cpp +12 -14
  500. package/libcxx/src/mutex_destructor.cpp +1 -1
  501. package/libcxx/src/new.cpp +5 -5
  502. package/libcxx/src/optional.cpp +4 -0
  503. package/libcxx/src/print.cpp +9 -1
  504. package/libcxx/src/random.cpp +0 -26
  505. package/libcxx/src/string.cpp +10 -25
  506. package/libcxx/src/support/runtime/exception_fallback.ipp +2 -0
  507. package/libcxx/src/support/runtime/exception_glibcxx.ipp +3 -0
  508. package/libcxx/src/support/runtime/exception_libcxxabi.ipp +6 -2
  509. package/libcxx/src/support/runtime/exception_libcxxrt.ipp +2 -0
  510. package/libcxx/src/support/runtime/exception_msvc.ipp +2 -0
  511. package/libcxx/src/support/runtime/exception_pointer_cxxabi.ipp +9 -10
  512. package/libcxx/src/support/runtime/exception_pointer_glibcxx.ipp +2 -0
  513. package/libcxx/src/support/runtime/exception_pointer_msvc.ipp +1 -0
  514. package/libcxx/src/support/runtime/exception_pointer_unimplemented.ipp +1 -0
  515. package/libcxx/src/support/win32/locale_win32.cpp +1 -1
  516. package/libcxx/src/system_error.cpp +2 -0
  517. package/libcxx/src/thread.cpp +1 -3
  518. package/libcxx/src/valarray.cpp +1 -2
  519. package/libcxx/src/vector.cpp +2 -2
  520. package/libcxxabi/include/__cxxabi_config.h +42 -23
  521. package/libcxxabi/src/cxa_exception.cpp +4 -2
  522. package/libcxxabi/src/cxa_exception.h +16 -14
  523. package/libcxxabi/src/cxa_personality.cpp +126 -9
  524. package/libcxxabi/src/cxa_thread_atexit.cpp +2 -1
  525. package/libcxxabi/src/demangle/DemangleConfig.h +4 -0
  526. package/libcxxabi/src/demangle/ItaniumDemangle.h +9 -6
  527. package/libcxxabi/src/demangle/Utility.h +21 -7
  528. package/libcxxabi/src/fallback_malloc.cpp +1 -1
  529. package/libcxxabi/src/private_typeinfo.cpp +6 -0
  530. package/libcxxabi/src/stdlib_new_delete.cpp +5 -5
  531. package/libtsan/LICENSE.TXT +311 -0
  532. package/libtsan/builtins/assembly.h +41 -8
  533. package/libtsan/interception/interception_win.cpp +4 -0
  534. package/libtsan/sanitizer_common/sanitizer_allocator_primary32.h +1 -0
  535. package/libtsan/sanitizer_common/sanitizer_allocator_primary64.h +18 -0
  536. package/libtsan/sanitizer_common/sanitizer_common.h +15 -2
  537. package/libtsan/sanitizer_common/sanitizer_common_interceptors.inc +30 -4
  538. package/libtsan/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +4 -0
  539. package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_aarch64.inc.S +2 -1
  540. package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_i386.inc.S +2 -0
  541. package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_x86_64.inc.S +2 -0
  542. package/libtsan/sanitizer_common/sanitizer_common_syscalls.inc +18 -0
  543. package/libtsan/sanitizer_common/sanitizer_file.cpp +40 -12
  544. package/libtsan/sanitizer_common/sanitizer_file.h +3 -0
  545. package/libtsan/sanitizer_common/sanitizer_flags.inc +7 -0
  546. package/libtsan/sanitizer_common/sanitizer_fuchsia.cpp +30 -3
  547. package/libtsan/sanitizer_common/sanitizer_haiku.cpp +2 -2
  548. package/libtsan/sanitizer_common/sanitizer_internal_defs.h +1 -1
  549. package/libtsan/sanitizer_common/sanitizer_libc.cpp +8 -0
  550. package/libtsan/sanitizer_common/sanitizer_libc.h +1 -0
  551. package/libtsan/sanitizer_common/sanitizer_linux.cpp +15 -7
  552. package/libtsan/sanitizer_common/sanitizer_linux.h +3 -3
  553. package/libtsan/sanitizer_common/sanitizer_linux_libcdep.cpp +1 -0
  554. package/libtsan/sanitizer_common/sanitizer_mac.cpp +255 -104
  555. package/libtsan/sanitizer_common/sanitizer_mac.h +5 -0
  556. package/libtsan/sanitizer_common/sanitizer_netbsd.cpp +2 -2
  557. package/libtsan/sanitizer_common/sanitizer_platform.h +27 -1
  558. package/libtsan/sanitizer_common/sanitizer_platform_interceptors.h +5 -4
  559. package/libtsan/sanitizer_common/sanitizer_platform_limits_posix.cpp +15 -17
  560. package/libtsan/sanitizer_common/sanitizer_platform_limits_posix.h +32 -6
  561. package/libtsan/sanitizer_common/sanitizer_posix.cpp +3 -12
  562. package/libtsan/sanitizer_common/sanitizer_posix.h +2 -1
  563. package/libtsan/sanitizer_common/sanitizer_posix_libcdep.cpp +19 -0
  564. package/libtsan/sanitizer_common/sanitizer_procmaps_mac.cpp +102 -37
  565. package/libtsan/sanitizer_common/sanitizer_redefine_builtins.h +1 -1
  566. package/libtsan/sanitizer_common/sanitizer_signal_interceptors.inc +40 -2
  567. package/libtsan/sanitizer_common/sanitizer_stoptheworld.h +1 -1
  568. package/libtsan/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp +83 -12
  569. package/libtsan/sanitizer_common/sanitizer_stoptheworld_mac.cpp +3 -3
  570. package/libtsan/sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp +7 -7
  571. package/libtsan/sanitizer_common/sanitizer_stoptheworld_win.cpp +2 -2
  572. package/libtsan/sanitizer_common/sanitizer_symbolizer_internal.h +5 -1
  573. package/libtsan/sanitizer_common/sanitizer_symbolizer_libcdep.cpp +11 -1
  574. package/libtsan/sanitizer_common/sanitizer_symbolizer_mac.cpp +86 -29
  575. package/libtsan/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp +27 -16
  576. package/libtsan/sanitizer_common/sanitizer_thread_registry.cpp +5 -4
  577. package/libtsan/sanitizer_common/sanitizer_thread_registry.h +4 -4
  578. package/libtsan/sanitizer_common/sanitizer_win.cpp +1 -3
  579. package/libtsan/tsan_debugging.cpp +2 -2
  580. package/libtsan/tsan_flags.cpp +37 -0
  581. package/libtsan/tsan_flags.h +8 -0
  582. package/libtsan/tsan_flags.inc +12 -0
  583. package/libtsan/tsan_interceptors.h +9 -1
  584. package/libtsan/tsan_interceptors_mac.cpp +19 -0
  585. package/libtsan/tsan_interceptors_posix.cpp +78 -32
  586. package/libtsan/tsan_interface.h +3 -3
  587. package/libtsan/tsan_interface_ann.cpp +23 -9
  588. package/libtsan/tsan_mman.cpp +18 -4
  589. package/libtsan/tsan_platform.h +44 -7
  590. package/libtsan/tsan_platform_linux.cpp +42 -14
  591. package/libtsan/tsan_platform_mac.cpp +16 -3
  592. package/libtsan/tsan_report.h +14 -1
  593. package/libtsan/tsan_rtl.cpp +14 -0
  594. package/libtsan/tsan_rtl.h +7 -2
  595. package/libtsan/tsan_rtl_aarch64.S +3 -5
  596. package/libtsan/tsan_rtl_access.cpp +8 -3
  597. package/libtsan/tsan_rtl_amd64.S +2 -0
  598. package/libtsan/tsan_rtl_mutex.cpp +94 -49
  599. package/libtsan/tsan_rtl_report.cpp +132 -65
  600. package/libtsan/tsan_rtl_thread.cpp +31 -9
  601. package/libtsan/tsan_symbolize.cpp +1 -1
  602. package/libtsan/tsan_symbolize.h +1 -1
  603. package/libtsan/tsan_trace.h +1 -1
  604. package/libunwind/include/__libunwind_config.h +11 -2
  605. package/libunwind/include/libunwind.h +117 -11
  606. package/libunwind/include/unwind_arm_ehabi.h +4 -1
  607. package/libunwind/src/AddressSpace.hpp +40 -19
  608. package/libunwind/src/CompactUnwinder.hpp +16 -5
  609. package/libunwind/src/DwarfInstructions.hpp +24 -13
  610. package/libunwind/src/DwarfParser.hpp +60 -22
  611. package/libunwind/src/EHHeaderParser.hpp +7 -4
  612. package/libunwind/src/Registers.hpp +226 -22
  613. package/libunwind/src/Unwind-seh.cpp +6 -7
  614. package/libunwind/src/Unwind-wasm.c +7 -7
  615. package/libunwind/src/UnwindCursor.hpp +167 -49
  616. package/libunwind/src/UnwindLevel1.c +46 -17
  617. package/libunwind/src/UnwindRegistersRestore.S +46 -5
  618. package/libunwind/src/UnwindRegistersSave.S +86 -2
  619. package/libunwind/src/assembly.h +5 -1
  620. package/libunwind/src/config.h +9 -0
  621. package/libunwind/src/gcc_personality_v0.c +79 -6
  622. package/libunwind/src/libunwind.cpp +104 -4
  623. package/libunwind/src/libunwind_ext.h +7 -1
  624. package/libunwind/src/shadow_stack_unwind.h +2 -2
  625. package/lldb/pretty_printers.py +948 -0
  626. package/package.json +1 -1
  627. package/std/Build/Step/Compile.zig +18 -19
  628. package/std/Build/Step/Run.zig +13 -6
  629. package/std/Build/Step.zig +0 -3
  630. package/std/Io/Threaded.zig +3 -0
  631. package/std/Target/aarch64.zig +620 -77
  632. package/std/Target/amdgcn.zig +421 -21
  633. package/std/Target/arm.zig +40 -6
  634. package/std/Target/bpf.zig +6 -0
  635. package/std/Target/hexagon.zig +41 -6
  636. package/std/Target/loongarch.zig +18 -0
  637. package/std/Target/mips.zig +6 -0
  638. package/std/Target/nvptx.zig +58 -35
  639. package/std/Target/powerpc.zig +27 -19
  640. package/std/Target/riscv.zig +415 -177
  641. package/std/Target/sparc.zig +17 -0
  642. package/std/Target/wasm.zig +7 -0
  643. package/std/Target/x86.zig +200 -31
  644. package/std/Target/xtensa.zig +65 -0
  645. package/std/Target.zig +11 -2
  646. package/std/c.zig +7 -0
  647. package/std/debug/Dwarf.zig +14 -11
  648. package/std/debug/Pdb.zig +24 -16
  649. package/std/hash/xxhash.zig +0 -6
  650. package/std/math/log10.zig +0 -2
  651. package/std/math/modf.zig +0 -1
  652. package/std/mem.zig +1 -2
  653. package/std/os/linux/x86.zig +2 -2
  654. package/std/os/windows.zig +130 -1
  655. package/std/simd.zig +4 -21
  656. package/std/start.zig +4 -3
  657. package/std/zig/Ast.zig +5 -7
  658. package/std/zig/AstGen.zig +20 -14
  659. package/std/zig/ErrorBundle.zig +6 -2
  660. package/std/zig/ZonGen.zig +13 -21
  661. package/std/zig/llvm/Builder.zig +2 -2
  662. package/std/zig/system/arm.zig +56 -2
  663. package/std/zig/system/windows.zig +34 -1
  664. package/std/zig/system/x86.zig +60 -16
  665. package/std/zig/system.zig +0 -10
  666. package/include/amxbf16transposeintrin.h +0 -94
  667. package/include/amxcomplextransposeintrin.h +0 -303
  668. package/include/amxfp16transposeintrin.h +0 -94
  669. package/include/amxmovrstransposeintrin.h +0 -200
  670. package/include/amxtf32transposeintrin.h +0 -105
  671. package/include/amxtransposeintrin.h +0 -248
  672. package/libtsan/sanitizer_common/sanitizer_coverage_interface.inc +0 -43
  673. package/std/Build/Step/CheckObject.zig +0 -2764
@@ -9,8 +9,13 @@
9
9
  #include <__thread/timed_backoff_policy.h>
10
10
  #include <atomic>
11
11
  #include <climits>
12
+ #include <cstddef>
13
+ #include <cstdint>
14
+ #include <cstring>
12
15
  #include <functional>
16
+ #include <new>
13
17
  #include <thread>
18
+ #include <type_traits>
14
19
 
15
20
  #include "include/apple_availability.h"
16
21
 
@@ -41,6 +46,11 @@
41
46
  // OpenBSD has no indirect syscalls
42
47
  # define _LIBCPP_FUTEX(...) futex(__VA_ARGS__)
43
48
 
49
+ #elif defined(_WIN32)
50
+
51
+ # include <memory>
52
+ # include <windows.h>
53
+
44
54
  #else // <- Add other operating systems here
45
55
 
46
56
  // Baseline needs no new headers
@@ -49,17 +59,34 @@
49
59
 
50
60
  #endif
51
61
 
62
+ _LIBCPP_PUSH_MACROS
63
+ #include <__undef_macros>
64
+
52
65
  _LIBCPP_BEGIN_NAMESPACE_STD
53
66
 
67
+ struct NoTimeout {};
68
+
54
69
  #ifdef __linux__
55
70
 
56
- static void
57
- __libcpp_platform_wait_on_address(__cxx_atomic_contention_t const volatile* __ptr, __cxx_contention_t __val) {
58
- static constexpr timespec __timeout = {2, 0};
59
- _LIBCPP_FUTEX(__ptr, FUTEX_WAIT_PRIVATE, __val, &__timeout, 0, 0);
71
+ template <std::size_t _Size, class MaybeTimeout>
72
+ static void __platform_wait_on_address(void const* __ptr, void const* __val, MaybeTimeout maybe_timeout_ns) {
73
+ static_assert(_Size == 4, "Can only wait on 4 bytes value");
74
+ alignas(__cxx_contention_t) char buffer[_Size];
75
+ std::memcpy(&buffer, const_cast<const void*>(__val), _Size);
76
+ static constexpr timespec __default_timeout = {2, 0};
77
+ timespec __timeout;
78
+ if constexpr (is_same_v<MaybeTimeout, NoTimeout>) {
79
+ __timeout = __default_timeout;
80
+ } else {
81
+ __timeout.tv_sec = maybe_timeout_ns / 1'000'000'000;
82
+ __timeout.tv_nsec = maybe_timeout_ns % 1'000'000'000;
83
+ }
84
+ _LIBCPP_FUTEX(__ptr, FUTEX_WAIT_PRIVATE, *reinterpret_cast<__cxx_contention_t const*>(&buffer), &__timeout, 0, 0);
60
85
  }
61
86
 
62
- static void __libcpp_platform_wake_by_address(__cxx_atomic_contention_t const volatile* __ptr, bool __notify_one) {
87
+ template <std::size_t _Size>
88
+ static void __platform_wake_by_address(void const* __ptr, bool __notify_one) {
89
+ static_assert(_Size == 4, "Can only wake up on 4 bytes value");
63
90
  _LIBCPP_FUTEX(__ptr, FUTEX_WAKE_PRIVATE, __notify_one ? 1 : INT_MAX, 0, 0, 0);
64
91
  }
65
92
 
@@ -70,19 +97,41 @@ extern "C" int __ulock_wait(
70
97
  extern "C" int __ulock_wake(uint32_t operation, void* addr, uint64_t wake_value);
71
98
 
72
99
  // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/sys/ulock.h#L82
100
+ # define UL_COMPARE_AND_WAIT 1
73
101
  # define UL_COMPARE_AND_WAIT64 5
74
102
  # define ULF_WAKE_ALL 0x00000100
75
103
 
76
- static void
77
- __libcpp_platform_wait_on_address(__cxx_atomic_contention_t const volatile* __ptr, __cxx_contention_t __val) {
78
- static_assert(sizeof(__cxx_atomic_contention_t) == 8, "Waiting on 8 bytes value");
79
- __ulock_wait(UL_COMPARE_AND_WAIT64, const_cast<__cxx_atomic_contention_t*>(__ptr), __val, 0);
104
+ template <std::size_t _Size, class MaybeTimeout>
105
+ static void __platform_wait_on_address(void const* __ptr, void const* __val, MaybeTimeout maybe_timeout_ns) {
106
+ static_assert(_Size == 8 || _Size == 4, "Can only wait on 8 bytes or 4 bytes value");
107
+ auto __timeout_us = [&] {
108
+ if constexpr (is_same_v<MaybeTimeout, NoTimeout>) {
109
+ return uint32_t(0);
110
+ } else {
111
+ return std::max(static_cast<uint32_t>(maybe_timeout_ns / 1000), uint32_t(1));
112
+ }
113
+ }();
114
+ if constexpr (_Size == 4) {
115
+ alignas(uint32_t) char buffer[_Size];
116
+ std::memcpy(&buffer, const_cast<const void*>(__val), _Size);
117
+ __ulock_wait(
118
+ UL_COMPARE_AND_WAIT, const_cast<void*>(__ptr), *reinterpret_cast<uint32_t const*>(&buffer), __timeout_us);
119
+ } else {
120
+ alignas(uint64_t) char buffer[_Size];
121
+ std::memcpy(&buffer, const_cast<const void*>(__val), _Size);
122
+ __ulock_wait(
123
+ UL_COMPARE_AND_WAIT64, const_cast<void*>(__ptr), *reinterpret_cast<uint64_t const*>(&buffer), __timeout_us);
124
+ }
80
125
  }
81
126
 
82
- static void __libcpp_platform_wake_by_address(__cxx_atomic_contention_t const volatile* __ptr, bool __notify_one) {
83
- static_assert(sizeof(__cxx_atomic_contention_t) == 8, "Waking up on 8 bytes value");
84
- __ulock_wake(
85
- UL_COMPARE_AND_WAIT64 | (__notify_one ? 0 : ULF_WAKE_ALL), const_cast<__cxx_atomic_contention_t*>(__ptr), 0);
127
+ template <std::size_t _Size>
128
+ static void __platform_wake_by_address(void const* __ptr, bool __notify_one) {
129
+ static_assert(_Size == 8 || _Size == 4, "Can only wake up on 8 bytes or 4 bytes value");
130
+
131
+ if constexpr (_Size == 4)
132
+ __ulock_wake(UL_COMPARE_AND_WAIT | (__notify_one ? 0 : ULF_WAKE_ALL), const_cast<void*>(__ptr), 0);
133
+ else
134
+ __ulock_wake(UL_COMPARE_AND_WAIT64 | (__notify_one ? 0 : ULF_WAKE_ALL), const_cast<void*>(__ptr), 0);
86
135
  }
87
136
 
88
137
  #elif defined(__FreeBSD__) && __SIZEOF_LONG__ == 8
@@ -92,119 +141,355 @@ static void __libcpp_platform_wake_by_address(__cxx_atomic_contention_t const vo
92
141
  * limit its use to architectures where long and int64_t are synonyms.
93
142
  */
94
143
 
95
- static void
96
- __libcpp_platform_wait_on_address(__cxx_atomic_contention_t const volatile* __ptr, __cxx_contention_t __val) {
97
- _umtx_op(const_cast<__cxx_atomic_contention_t*>(__ptr), UMTX_OP_WAIT, __val, nullptr, nullptr);
144
+ template <std::size_t _Size, class MaybeTimeout>
145
+ static void __platform_wait_on_address(void const* __ptr, void const* __val, MaybeTimeout maybe_timeout_ns) {
146
+ static_assert(_Size == 8, "Can only wait on 8 bytes value");
147
+ // At the moment, FreeBSD is stuck on stable ABI, which only supports platform wait with __cxx_contention_t
148
+ // It is safe to reinterpret_cast the val as it is ever going to be passed a __cxx_contention_t under this ABI
149
+ // If in the future FreeBSD decides to experiment unstable ABI to support more types, this cast will no longer be
150
+ // safe.
151
+ __cxx_contention_t value = *reinterpret_cast<const __cxx_contention_t*>(__val);
152
+ if constexpr (is_same_v<MaybeTimeout, NoTimeout>) {
153
+ _umtx_op(const_cast<void*>(__ptr), UMTX_OP_WAIT, value, nullptr, nullptr);
154
+ } else {
155
+ timespec timeout{};
156
+ timeout.tv_sec = maybe_timeout_ns / 1'000'000'000;
157
+ timeout.tv_nsec = maybe_timeout_ns % 1'000'000'000;
158
+
159
+ _umtx_op(const_cast<void*>(__ptr),
160
+ UMTX_OP_WAIT,
161
+ value,
162
+ reinterpret_cast<void*>(static_cast<uintptr_t>(sizeof(timeout))),
163
+ &timeout);
164
+ }
165
+ }
166
+
167
+ template <std::size_t _Size>
168
+ static void __platform_wake_by_address(void const* __ptr, bool __notify_one) {
169
+ static_assert(_Size == 8, "Can only wake up on 8 bytes value");
170
+ _umtx_op(const_cast<void*>(__ptr), UMTX_OP_WAKE, __notify_one ? 1 : INT_MAX, nullptr, nullptr);
171
+ }
172
+
173
+ #elif defined(_WIN32)
174
+
175
+ static void* win32_get_synch_api_function(const char* function_name) {
176
+ // Attempt to load the API set. Note that as per the Microsoft STL implementation, we assume this API is already
177
+ // loaded and accessible. While this isn't explicitly guaranteed by publicly available Win32 API documentation, it is
178
+ // true in practice, and may be guaranteed by internal documentation not released publicly. In any case the fact that
179
+ // the Microsoft STL made this assumption is reasonable basis to say that we can too. The alternative to this would be
180
+ // to use LoadLibrary, but then leak the module handle. We can't call FreeLibrary, as this would have to be triggered
181
+ // by a global static destructor, which would hang off DllMain, and calling FreeLibrary from DllMain is explicitly
182
+ // mentioned as not being allowed:
183
+ // https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain
184
+ // Given the range of bad options here, we have chosen to mirror what Microsoft did, as it seems fair to assume that
185
+ // Microsoft will guarantee compatibility for us, as we are exposed to the same conditions as all existing Windows
186
+ // apps using the Microsoft STL VS2015/2017/2019/2022 runtimes, where Windows 7 support has not been excluded at
187
+ // compile time.
188
+ static auto module_handle = GetModuleHandleW(L"api-ms-win-core-synch-l1-2-0.dll");
189
+ if (module_handle == nullptr) {
190
+ return nullptr;
191
+ }
192
+
193
+ // Attempt to locate the function in the API and return the result to the caller. Note that the NULL return from this
194
+ // method is documented as being interchangeable with nullptr.
195
+ // https://devblogs.microsoft.com/oldnewthing/20180307-00/?p=98175
196
+ return reinterpret_cast<void*>(GetProcAddress(module_handle, function_name));
98
197
  }
99
198
 
100
- static void __libcpp_platform_wake_by_address(__cxx_atomic_contention_t const volatile* __ptr, bool __notify_one) {
101
- _umtx_op(const_cast<__cxx_atomic_contention_t*>(__ptr), UMTX_OP_WAKE, __notify_one ? 1 : INT_MAX, nullptr, nullptr);
199
+ template <std::size_t _Size, class MaybeTimeout>
200
+ static void __platform_wait_on_address(void const* __ptr, void const* __val, MaybeTimeout maybe_timeout_ns) {
201
+ static_assert(_Size == 8, "Can only wait on 8 bytes value");
202
+ // WaitOnAddress was added in Windows 8 (build 9200)
203
+ static auto wait_on_address =
204
+ reinterpret_cast<BOOL(WINAPI*)(void*, PVOID, SIZE_T, DWORD)>(win32_get_synch_api_function("WaitOnAddress"));
205
+ if (wait_on_address != nullptr) {
206
+ auto timeout_ms = [&]() -> DWORD {
207
+ if constexpr (is_same_v<MaybeTimeout, NoTimeout>) {
208
+ return INFINITE;
209
+ } else {
210
+ uint64_t ms = maybe_timeout_ns / 1'000'000;
211
+ if (ms == 0 && maybe_timeout_ns > 100'000)
212
+ // Round up to 1ms if requested between 100us - 1ms
213
+ return 1;
214
+
215
+ return static_cast<DWORD>(std::min(static_cast<uint64_t>(INFINITE), ms));
216
+ }
217
+ }();
218
+ wait_on_address(const_cast<void*>(__ptr), const_cast<void*>(__val), _Size, timeout_ms);
219
+ } else {
220
+ std::chrono::nanoseconds timeout = std::chrono::nanoseconds(0);
221
+ if constexpr (!is_same_v<MaybeTimeout, NoTimeout>) {
222
+ timeout = std::chrono::nanoseconds(maybe_timeout_ns);
223
+ }
224
+ __libcpp_thread_poll_with_backoff(
225
+ [=]() -> bool { return std::memcmp(const_cast<const void*>(__ptr), __val, _Size) != 0; },
226
+ __libcpp_timed_backoff_policy(),
227
+ timeout);
228
+ }
229
+ }
230
+
231
+ template <std::size_t _Size>
232
+ static void __platform_wake_by_address(void const* __ptr, bool __notify_one) {
233
+ static_assert(_Size == 8, "Can only wake up on 8 bytes value");
234
+ if (__notify_one) {
235
+ // WakeByAddressSingle was added in Windows 8 (build 9200)
236
+ static auto wake_by_address_single =
237
+ reinterpret_cast<void(WINAPI*)(PVOID)>(win32_get_synch_api_function("WakeByAddressSingle"));
238
+ if (wake_by_address_single != nullptr) {
239
+ wake_by_address_single(const_cast<void*>(__ptr));
240
+ } else {
241
+ // The fallback implementation of waking does nothing, as the fallback wait implementation just does polling, so
242
+ // there's nothing to do here.
243
+ }
244
+ } else {
245
+ // WakeByAddressAll was added in Windows 8 (build 9200)
246
+ static auto wake_by_address_all =
247
+ reinterpret_cast<void(WINAPI*)(PVOID)>(win32_get_synch_api_function("WakeByAddressAll"));
248
+ if (wake_by_address_all != nullptr) {
249
+ wake_by_address_all(const_cast<void*>(__ptr));
250
+ } else {
251
+ // The fallback implementation of waking does nothing, as the fallback wait implementation just does polling, so
252
+ // there's nothing to do here.
253
+ }
254
+ }
102
255
  }
103
256
 
104
257
  #else // <- Add other operating systems here
105
258
 
106
259
  // Baseline is just a timed backoff
107
260
 
108
- static void
109
- __libcpp_platform_wait_on_address(__cxx_atomic_contention_t const volatile* __ptr, __cxx_contention_t __val) {
261
+ template <std::size_t _Size, class MaybeTimeout>
262
+ static void __platform_wait_on_address(void const* __ptr, void const* __val, MaybeTimeout maybe_timeout_ns) {
263
+ std::chrono::nanoseconds timeout = std::chrono::nanoseconds(0);
264
+ if constexpr (!is_same_v<MaybeTimeout, NoTimeout>) {
265
+ timeout = std::chrono::nanoseconds(maybe_timeout_ns);
266
+ }
110
267
  __libcpp_thread_poll_with_backoff(
111
- [=]() -> bool { return !__cxx_nonatomic_compare_equal(__cxx_atomic_load(__ptr, memory_order_relaxed), __val); },
112
- __libcpp_timed_backoff_policy());
268
+ [=]() -> bool { return std::memcmp(const_cast<const void*>(__ptr), __val, _Size) != 0; },
269
+ __libcpp_timed_backoff_policy(),
270
+ timeout);
113
271
  }
114
272
 
115
- static void __libcpp_platform_wake_by_address(__cxx_atomic_contention_t const volatile*, bool) {}
273
+ template <std::size_t _Size>
274
+ static void __platform_wake_by_address(void const*, bool) {}
116
275
 
117
276
  #endif // __linux__
118
277
 
119
- static constexpr size_t __libcpp_contention_table_size = (1 << 8); /* < there's no magic in this number */
120
-
121
- struct alignas(64) /* aim to avoid false sharing */ __libcpp_contention_table_entry {
122
- __cxx_atomic_contention_t __contention_state;
123
- __cxx_atomic_contention_t __platform_state;
124
- inline constexpr __libcpp_contention_table_entry() : __contention_state(0), __platform_state(0) {}
125
- };
126
-
127
- static __libcpp_contention_table_entry __libcpp_contention_table[__libcpp_contention_table_size];
128
-
129
- static hash<void const volatile*> __libcpp_contention_hasher;
130
-
131
- static __libcpp_contention_table_entry* __libcpp_contention_state(void const volatile* p) {
132
- return &__libcpp_contention_table[__libcpp_contention_hasher(p) & (__libcpp_contention_table_size - 1)];
133
- }
278
+ // =============================
279
+ // Local hidden helper functions
280
+ // =============================
134
281
 
135
282
  /* Given an atomic to track contention and an atomic to actually wait on, which may be
136
283
  the same atomic, we try to detect contention to avoid spuriously calling the platform. */
137
284
 
138
- static void __libcpp_contention_notify(__cxx_atomic_contention_t volatile* __contention_state,
139
- __cxx_atomic_contention_t const volatile* __platform_state,
140
- bool __notify_one) {
141
- if (0 != __cxx_atomic_load(__contention_state, memory_order_seq_cst))
285
+ template <std::size_t _Size>
286
+ static void
287
+ __contention_notify(__cxx_atomic_contention_t* __waiter_count, void const* __address_to_notify, bool __notify_one) {
288
+ if (0 != __cxx_atomic_load(__waiter_count, memory_order_seq_cst))
142
289
  // We only call 'wake' if we consumed a contention bit here.
143
- __libcpp_platform_wake_by_address(__platform_state, __notify_one);
144
- }
145
- static __cxx_contention_t
146
- __libcpp_contention_monitor_for_wait(__cxx_atomic_contention_t volatile* /*__contention_state*/,
147
- __cxx_atomic_contention_t const volatile* __platform_state) {
148
- // We will monitor this value.
149
- return __cxx_atomic_load(__platform_state, memory_order_acquire);
150
- }
151
- static void __libcpp_contention_wait(__cxx_atomic_contention_t volatile* __contention_state,
152
- __cxx_atomic_contention_t const volatile* __platform_state,
153
- __cxx_contention_t __old_value) {
154
- __cxx_atomic_fetch_add(__contention_state, __cxx_contention_t(1), memory_order_relaxed);
155
- // https://github.com/llvm/llvm-project/issues/109290
290
+ __platform_wake_by_address<_Size>(__address_to_notify, __notify_one);
291
+ }
292
+
293
+ template <std::size_t _Size, class MaybeTimeout>
294
+ static void __contention_wait(__cxx_atomic_contention_t* __waiter_count,
295
+ void const* __address_to_wait,
296
+ void const* __old_value,
297
+ MaybeTimeout maybe_timeout_ns) {
298
+ __cxx_atomic_fetch_add(__waiter_count, __cxx_contention_t(1), memory_order_relaxed);
299
+ // https://llvm.org/PR109290
156
300
  // There are no platform guarantees of a memory barrier in the platform wait implementation
157
301
  __cxx_atomic_thread_fence(memory_order_seq_cst);
158
302
  // We sleep as long as the monitored value hasn't changed.
159
- __libcpp_platform_wait_on_address(__platform_state, __old_value);
160
- __cxx_atomic_fetch_sub(__contention_state, __cxx_contention_t(1), memory_order_release);
303
+ __platform_wait_on_address<_Size>(__address_to_wait, __old_value, maybe_timeout_ns);
304
+ __cxx_atomic_fetch_sub(__waiter_count, __cxx_contention_t(1), memory_order_release);
305
+ }
306
+
307
+ static constexpr size_t __contention_table_size = (1 << 8); /* < there's no magic in this number */
308
+
309
+ static constexpr hash<void const*> __contention_hasher;
310
+
311
+ // Waiter count table for all atomics with the correct size that use itself as the wait/notify address.
312
+
313
+ struct alignas(
314
+ std::hardware_constructive_interference_size) /* aim to avoid false sharing */ __contention_state_native {
315
+ __cxx_atomic_contention_t __waiter_count;
316
+ constexpr __contention_state_native() : __waiter_count(0) {}
317
+ };
318
+
319
+ static __contention_state_native __contention_table_native[__contention_table_size];
320
+
321
+ static __cxx_atomic_contention_t* __get_native_waiter_count(void const* p) {
322
+ return &__contention_table_native[__contention_hasher(p) & (__contention_table_size - 1)].__waiter_count;
323
+ }
324
+
325
+ // Global contention table for all atomics with the wrong size that use the global table's atomic as wait/notify
326
+ // address.
327
+
328
+ struct alignas(
329
+ std::hardware_constructive_interference_size) /* aim to avoid false sharing */ __contention_state_global {
330
+ __cxx_atomic_contention_t __waiter_count;
331
+ __cxx_atomic_contention_t __platform_state;
332
+ constexpr __contention_state_global() : __waiter_count(0), __platform_state(0) {}
333
+ };
334
+
335
+ static __contention_state_global __contention_table_global[__contention_table_size];
336
+
337
+ static __contention_state_global* __get_global_contention_state(void const* p) {
338
+ return &__contention_table_global[__contention_hasher(p) & (__contention_table_size - 1)];
161
339
  }
162
340
 
163
341
  /* When the incoming atomic is the wrong size for the platform wait size, need to
164
342
  launder the value sequence through an atomic from our table. */
165
343
 
166
- static void __libcpp_atomic_notify(void const volatile* __location) {
167
- auto const __entry = __libcpp_contention_state(__location);
344
+ static void __atomic_notify_global_table(void const* __location) {
345
+ auto const __entry = __get_global_contention_state(__location);
168
346
  // The value sequence laundering happens on the next line below.
169
347
  __cxx_atomic_fetch_add(&__entry->__platform_state, __cxx_contention_t(1), memory_order_seq_cst);
170
- __libcpp_contention_notify(
171
- &__entry->__contention_state,
172
- &__entry->__platform_state,
173
- false /* when laundering, we can't handle notify_one */);
348
+ __contention_notify<sizeof(__cxx_atomic_contention_t)>(
349
+ &__entry->__waiter_count, &__entry->__platform_state, false /* when laundering, we can't handle notify_one */);
350
+ }
351
+
352
+ // =============================
353
+ // New dylib exported symbols
354
+ // =============================
355
+
356
+ // global
357
+ _LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t __atomic_monitor_global(void const* __location) noexcept {
358
+ auto const __entry = __get_global_contention_state(__location);
359
+ return __cxx_atomic_load(&__entry->__platform_state, memory_order_acquire);
360
+ }
361
+
362
+ _LIBCPP_EXPORTED_FROM_ABI void
363
+ __atomic_wait_global_table(void const* __location, __cxx_contention_t __old_value) noexcept {
364
+ auto const __entry = __get_global_contention_state(__location);
365
+ __contention_wait<sizeof(__cxx_atomic_contention_t)>(
366
+ &__entry->__waiter_count, &__entry->__platform_state, &__old_value, NoTimeout{});
367
+ }
368
+
369
+ _LIBCPP_EXPORTED_FROM_ABI void __atomic_wait_global_table_with_timeout(
370
+ void const* __location, __cxx_contention_t __old_value, uint64_t __timeout_ns) _NOEXCEPT {
371
+ auto const __entry = __get_global_contention_state(__location);
372
+ __contention_wait<sizeof(__cxx_atomic_contention_t)>(
373
+ &__entry->__waiter_count, &__entry->__platform_state, &__old_value, __timeout_ns);
374
+ }
375
+
376
+ _LIBCPP_EXPORTED_FROM_ABI void __atomic_notify_one_global_table(void const* __location) noexcept {
377
+ __atomic_notify_global_table(__location);
378
+ }
379
+
380
+ _LIBCPP_EXPORTED_FROM_ABI void __atomic_notify_all_global_table(void const* __location) noexcept {
381
+ __atomic_notify_global_table(__location);
382
+ }
383
+
384
+ // native
385
+
386
+ template <std::size_t _Size>
387
+ _LIBCPP_EXPORTED_FROM_ABI void __atomic_wait_native(void const* __address, void const* __old_value) noexcept {
388
+ __contention_wait<_Size>(__get_native_waiter_count(__address), __address, __old_value, NoTimeout{});
174
389
  }
390
+
391
+ template <std::size_t _Size>
392
+ _LIBCPP_EXPORTED_FROM_ABI void
393
+ __atomic_wait_native_with_timeout(void const* __address, void const* __old_value, uint64_t __timeout_ns) noexcept {
394
+ __contention_wait<_Size>(__get_native_waiter_count(__address), __address, __old_value, __timeout_ns);
395
+ }
396
+
397
+ template <std::size_t _Size>
398
+ _LIBCPP_EXPORTED_FROM_ABI void __atomic_notify_one_native(void const* __location) noexcept {
399
+ __contention_notify<_Size>(__get_native_waiter_count(__location), __location, true);
400
+ }
401
+
402
+ template <std::size_t _Size>
403
+ _LIBCPP_EXPORTED_FROM_ABI void __atomic_notify_all_native(void const* __location) noexcept {
404
+ __contention_notify<_Size>(__get_native_waiter_count(__location), __location, false);
405
+ }
406
+
407
+ // ==================================================
408
+ // Instantiation of the templates with supported size
409
+ // ==================================================
410
+
411
+ #if defined(_LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE)
412
+
413
+ # define _INSTANTIATE(_SIZE) \
414
+ template _LIBCPP_EXPORTED_FROM_ABI void __atomic_wait_native<_SIZE>(void const*, void const*) noexcept; \
415
+ template _LIBCPP_EXPORTED_FROM_ABI void __atomic_wait_native_with_timeout<_SIZE>( \
416
+ void const*, void const*, uint64_t) noexcept; \
417
+ template _LIBCPP_EXPORTED_FROM_ABI void __atomic_notify_one_native<_SIZE>(void const*) noexcept; \
418
+ template _LIBCPP_EXPORTED_FROM_ABI void __atomic_notify_all_native<_SIZE>(void const*) noexcept;
419
+
420
+ _LIBCPP_NATIVE_PLATFORM_WAIT_SIZES(_INSTANTIATE)
421
+
422
+ # undef _INSTANTIATE
423
+
424
+ #else // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
425
+
426
+ template _LIBCPP_EXPORTED_FROM_ABI void
427
+ __atomic_wait_native<sizeof(__cxx_contention_t)>(void const* __address, void const* __old_value) noexcept;
428
+
429
+ template _LIBCPP_EXPORTED_FROM_ABI void __atomic_wait_native_with_timeout<sizeof(__cxx_contention_t)>(
430
+ void const* __address, void const* __old_value, uint64_t) noexcept;
431
+
432
+ template _LIBCPP_EXPORTED_FROM_ABI void
433
+ __atomic_notify_one_native<sizeof(__cxx_contention_t)>(void const* __location) noexcept;
434
+
435
+ template _LIBCPP_EXPORTED_FROM_ABI void
436
+ __atomic_notify_all_native<sizeof(__cxx_contention_t)>(void const* __location) noexcept;
437
+
438
+ #endif // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
439
+
440
+ // =============================================================
441
+ // Old dylib exported symbols, for backwards compatibility
442
+ // =============================================================
443
+ _LIBCPP_DIAGNOSTIC_PUSH
444
+ _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wmissing-prototypes")
445
+
175
446
  _LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_one(void const volatile* __location) noexcept {
176
- __libcpp_atomic_notify(__location);
447
+ __atomic_notify_global_table(const_cast<void const*>(__location));
177
448
  }
449
+
178
450
  _LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_all(void const volatile* __location) noexcept {
179
- __libcpp_atomic_notify(__location);
451
+ __atomic_notify_global_table(const_cast<void const*>(__location));
180
452
  }
453
+
181
454
  _LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t __libcpp_atomic_monitor(void const volatile* __location) noexcept {
182
- auto const __entry = __libcpp_contention_state(__location);
183
- return __libcpp_contention_monitor_for_wait(&__entry->__contention_state, &__entry->__platform_state);
455
+ auto const __entry = __get_global_contention_state(const_cast<void const*>(__location));
456
+ return __cxx_atomic_load(&__entry->__platform_state, memory_order_acquire);
184
457
  }
458
+
185
459
  _LIBCPP_EXPORTED_FROM_ABI void
186
460
  __libcpp_atomic_wait(void const volatile* __location, __cxx_contention_t __old_value) noexcept {
187
- auto const __entry = __libcpp_contention_state(__location);
188
- __libcpp_contention_wait(&__entry->__contention_state, &__entry->__platform_state, __old_value);
461
+ auto const __entry = __get_global_contention_state(const_cast<void const*>(__location));
462
+ __contention_wait<sizeof(__cxx_atomic_contention_t)>(
463
+ &__entry->__waiter_count, &__entry->__platform_state, &__old_value, NoTimeout{});
189
464
  }
190
465
 
191
- /* When the incoming atomic happens to be the platform wait size, we still need to use the
192
- table for the contention detection, but we can use the atomic directly for the wait. */
193
-
194
466
  _LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_one(__cxx_atomic_contention_t const volatile* __location) noexcept {
195
- __libcpp_contention_notify(&__libcpp_contention_state(__location)->__contention_state, __location, true);
467
+ auto __location_cast = const_cast<const void*>(static_cast<const volatile void*>(__location));
468
+ __contention_notify<sizeof(__cxx_atomic_contention_t)>(
469
+ __get_native_waiter_count(__location_cast), __location_cast, true);
196
470
  }
471
+
197
472
  _LIBCPP_EXPORTED_FROM_ABI void __cxx_atomic_notify_all(__cxx_atomic_contention_t const volatile* __location) noexcept {
198
- __libcpp_contention_notify(&__libcpp_contention_state(__location)->__contention_state, __location, false);
199
- }
200
- // This function is never used, but still exported for ABI compatibility.
201
- _LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t
202
- __libcpp_atomic_monitor(__cxx_atomic_contention_t const volatile* __location) noexcept {
203
- return __libcpp_contention_monitor_for_wait(&__libcpp_contention_state(__location)->__contention_state, __location);
473
+ auto __location_cast = const_cast<const void*>(static_cast<const volatile void*>(__location));
474
+ __contention_notify<sizeof(__cxx_atomic_contention_t)>(
475
+ __get_native_waiter_count(__location_cast), __location_cast, false);
204
476
  }
477
+
205
478
  _LIBCPP_EXPORTED_FROM_ABI void
206
479
  __libcpp_atomic_wait(__cxx_atomic_contention_t const volatile* __location, __cxx_contention_t __old_value) noexcept {
207
- __libcpp_contention_wait(&__libcpp_contention_state(__location)->__contention_state, __location, __old_value);
480
+ auto __location_cast = const_cast<const void*>(static_cast<const volatile void*>(__location));
481
+ __contention_wait<sizeof(__cxx_atomic_contention_t)>(
482
+ __get_native_waiter_count(__location_cast), __location_cast, &__old_value, NoTimeout{});
208
483
  }
209
484
 
485
+ // this function is even unused in the old ABI
486
+ _LIBCPP_EXPORTED_FROM_ABI __cxx_contention_t
487
+ __libcpp_atomic_monitor(__cxx_atomic_contention_t const volatile* __location) noexcept {
488
+ return __cxx_atomic_load(__location, memory_order_acquire);
489
+ }
490
+
491
+ _LIBCPP_DIAGNOSTIC_POP
492
+
210
493
  _LIBCPP_END_NAMESPACE_STD
494
+
495
+ _LIBCPP_POP_MACROS
@@ -60,11 +60,12 @@ public:
60
60
  _LIBCPP_EXPORTED_FROM_ABI __barrier_algorithm_base* __construct_barrier_algorithm_base(ptrdiff_t& __expected) {
61
61
  return new __barrier_algorithm_base(__expected);
62
62
  }
63
- _LIBCPP_EXPORTED_FROM_ABI bool
64
- __arrive_barrier_algorithm_base(__barrier_algorithm_base* __barrier, __barrier_phase_t __old_phase) noexcept {
63
+ _LIBCPP_EXPORTED_FROM_ABI bool __arrive_barrier_algorithm_base(
64
+ _LIBCPP_NOESCAPE __barrier_algorithm_base* __barrier, __barrier_phase_t __old_phase) noexcept {
65
65
  return __barrier->__arrive(__old_phase);
66
66
  }
67
- _LIBCPP_EXPORTED_FROM_ABI void __destroy_barrier_algorithm_base(__barrier_algorithm_base* __barrier) noexcept {
67
+ _LIBCPP_EXPORTED_FROM_ABI void
68
+ __destroy_barrier_algorithm_base(_LIBCPP_NOESCAPE __barrier_algorithm_base* __barrier) noexcept {
68
69
  delete __barrier;
69
70
  }
70
71
 
@@ -14,17 +14,20 @@
14
14
 
15
15
  _LIBCPP_BEGIN_NAMESPACE_STD
16
16
 
17
- #ifndef _LIBCPP_ABI_DO_NOT_EXPORT_TO_CHARS_BASE_10
17
+ #if _LIBCPP_AVAILABILITY_MINIMUM_HEADER_VERSION < 15
18
18
 
19
19
  namespace __itoa {
20
20
 
21
+ _LIBCPP_DIAGNOSTIC_PUSH
22
+ _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wmissing-prototypes")
23
+ // These functions exist for ABI compatibility, so we don't ever want a declaration prior to the definition.
21
24
  _LIBCPP_EXPORTED_FROM_ABI char* __u32toa(uint32_t value, char* buffer) noexcept { return __base_10_u32(buffer, value); }
22
-
23
25
  _LIBCPP_EXPORTED_FROM_ABI char* __u64toa(uint64_t value, char* buffer) noexcept { return __base_10_u64(buffer, value); }
26
+ _LIBCPP_DIAGNOSTIC_POP
24
27
 
25
28
  } // namespace __itoa
26
29
 
27
- #endif // _LIBCPP_ABI_DO_NOT_EXPORT_TO_CHARS_BASE_10
30
+ #endif // _LIBCPP_AVAILABILITY_MINIMUM_HEADER_VERSION < 15
28
31
 
29
32
  // The original version of floating-point to_chars was written by Microsoft and
30
33
  // contributed with the following license.
@@ -14,7 +14,7 @@
14
14
  #include <__config>
15
15
  #include <__thread/support.h>
16
16
 
17
- #if _LIBCPP_ABI_VERSION == 1 || !_LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION
17
+ #if _LIBCPP_AVAILABILITY_MINIMUM_HEADER_VERSION < 9 || !_LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION
18
18
  # define NEEDS_CONDVAR_DESTRUCTOR
19
19
  #endif
20
20
 
@@ -8,7 +8,9 @@
8
8
 
9
9
  #include <__config>
10
10
 
11
- #ifdef _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS
11
+ // This has technically been removed in LLVM 3.4
12
+ #if !defined(_LIBCPP_OBJECT_FORMAT_COFF) && !defined(_LIBCPP_OBJECT_FORMAT_XCOFF) && \
13
+ _LIBCPP_AVAILABILITY_MINIMUM_HEADER_VERSION < 4
12
14
  # define _LIBCPP_ERROR_CATEGORY_DEFINE_LEGACY_INLINE_FUNCTIONS
13
15
  #endif
14
16
 
@@ -9,20 +9,12 @@
9
9
  #define _LIBCPP_ENABLE_CXX20_REMOVED_UNCAUGHT_EXCEPTION
10
10
  #define _LIBCPP_DISABLE_DEPRECATION_WARNINGS
11
11
 
12
- #include <exception>
13
- #include <new>
14
- #include <typeinfo>
15
-
16
- #if defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI)
17
- # include <cxxabi.h>
18
- using namespace __cxxabiv1;
19
- # define HAVE_DEPENDENT_EH_ABI 1
20
- #endif
12
+ #include <__config>
21
13
 
22
14
  #if defined(_LIBCPP_ABI_MICROSOFT)
23
15
  # include "support/runtime/exception_msvc.ipp"
24
16
  # include "support/runtime/exception_pointer_msvc.ipp"
25
- #elif defined(_LIBCPPABI_VERSION)
17
+ #elif defined(LIBCXX_BUILDING_LIBCXXABI)
26
18
  # include "support/runtime/exception_libcxxabi.ipp"
27
19
  # include "support/runtime/exception_pointer_cxxabi.ipp"
28
20
  #elif defined(LIBCXXRT)
@@ -720,7 +720,7 @@ __get_sys_info(sys_seconds __time,
720
720
  // Iff the "offsets" are the same '__current.__end' is replaced with
721
721
  // '__next.__end', which effectively merges the two objects in one object. The
722
722
  // function returns true if a merge occurred.
723
- [[nodiscard]] bool __merge_continuation(sys_info& __current, const sys_info& __next) {
723
+ [[nodiscard]] static bool __merge_continuation(sys_info& __current, const sys_info& __next) {
724
724
  if (__current.end != __next.begin)
725
725
  return false;
726
726
 
@@ -49,6 +49,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD
49
49
 
50
50
  namespace chrono {
51
51
 
52
+ _LIBCPP_DIAGNOSTIC_PUSH
53
+ _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wmissing-prototypes")
52
54
  // This function is weak so it can be overriden in the tests. The
53
55
  // declaration is in the test header test/support/test_tzdb.h
54
56
  _LIBCPP_WEAK string_view __libcpp_tzdb_directory() {
@@ -59,6 +61,7 @@ _LIBCPP_WEAK string_view __libcpp_tzdb_directory() {
59
61
  abort();
60
62
  #endif
61
63
  }
64
+ _LIBCPP_DIAGNOSTIC_POP
62
65
 
63
66
  //===----------------------------------------------------------------------===//
64
67
  // Details
@@ -767,7 +770,7 @@ void __init_tzdb(tzdb& __tzdb, __tz::__rules_storage_type& __rules) {
767
770
  // On Linux systems it seems /etc/timezone is deprecated and being phased out.
768
771
  // This file is used when /etc/localtime does not exist, or when it exists but
769
772
  // is not a symlink. For more information and links see
770
- // https://github.com/llvm/llvm-project/issues/105634
773
+ // https://llvm.org/PR105634
771
774
 
772
775
  string __name = chrono::__current_zone_environment();
773
776