@zigc/lib 0.17.0-dev.135 → 0.17.0-dev.224
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.
- package/c/stdlib.zig +32 -22
- package/compiler/aro/aro/Compilation.zig +0 -3
- package/compiler/translate-c/ast.zig +5 -2
- package/compiler_rt/arm.zig +3 -3
- package/compiler_rt/trunctfhf2.zig +3 -0
- package/compiler_rt.zig +1 -22
- package/docs/wasm/markdown/Parser.zig +5 -9
- package/include/__clang_spirv_builtins.h +12 -12
- package/include/__float_float.h +176 -0
- package/include/__float_header_macro.h +12 -0
- package/include/__float_infinity_nan.h +20 -0
- package/include/amo.h +131 -0
- package/include/amxavx512intrin.h +215 -1
- package/include/amxintrin.h +0 -2
- package/include/arm_acle.h +37 -27
- package/include/arm_neon.h +218 -82
- package/include/arm_sme.h +8 -8
- package/include/arm_sve.h +4162 -3782
- package/include/avx10_2_512bf16intrin.h +19 -12
- package/include/avx10_2_512convertintrin.h +1 -1
- package/include/avx10_2_512niintrin.h +31 -31
- package/include/avx10_2_512satcvtdsintrin.h +1 -1
- package/include/avx10_2bf16intrin.h +54 -45
- package/include/avx10_2convertintrin.h +2 -2
- package/include/avx10_2copyintrin.h +1 -1
- package/include/avx10_2niintrin.h +14 -14
- package/include/avx10_2satcvtdsintrin.h +2 -2
- package/include/avx2intrin.h +275 -377
- package/include/avx512bf16intrin.h +25 -16
- package/include/avx512bitalgintrin.h +19 -30
- package/include/avx512bwintrin.h +386 -505
- package/include/avx512cdintrin.h +42 -55
- package/include/avx512dqintrin.h +132 -161
- package/include/avx512fintrin.h +1015 -1424
- package/include/avx512fp16intrin.h +112 -110
- package/include/avx512ifmaintrin.h +32 -34
- package/include/avx512ifmavlintrin.h +73 -46
- package/include/avx512vbmi2intrin.h +43 -32
- package/include/avx512vbmiintrin.h +19 -27
- package/include/avx512vbmivlintrin.h +35 -49
- package/include/avx512vlbf16intrin.h +32 -22
- package/include/avx512vlbitalgintrin.h +37 -53
- package/include/avx512vlbwintrin.h +470 -573
- package/include/avx512vlcdintrin.h +74 -102
- package/include/avx512vldqintrin.h +110 -127
- package/include/avx512vlfp16intrin.h +130 -111
- package/include/avx512vlintrin.h +945 -1299
- package/include/avx512vlvbmi2intrin.h +78 -63
- package/include/avx512vlvnniintrin.h +21 -18
- package/include/avx512vlvp2intersectintrin.h +2 -2
- package/include/avx512vnniintrin.h +10 -10
- package/include/avx512vp2intersectintrin.h +1 -2
- package/include/avx512vpopcntdqintrin.h +8 -10
- package/include/avx512vpopcntdqvlintrin.h +17 -15
- package/include/avxifmaintrin.h +16 -0
- package/include/avxintrin.h +165 -241
- package/include/avxvnniint16intrin.h +118 -99
- package/include/avxvnniint8intrin.h +56 -32
- package/include/avxvnniintrin.h +16 -8
- package/include/cpuid.h +101 -4
- package/include/emmintrin.h +168 -168
- package/include/f16cintrin.h +23 -9
- package/include/float.h +16 -155
- package/include/fma4intrin.h +98 -96
- package/include/fmaintrin.h +96 -66
- package/include/gfniintrin.h +21 -16
- package/include/hexagon_types.h +23 -20
- package/include/hvx_hexagon_protos.h +649 -860
- package/include/immintrin.h +0 -12
- package/include/intrin.h +4 -0
- package/include/lasxintrin.h +113 -0
- package/include/llvm_libc_wrappers/assert.h +3 -5
- package/include/llvm_libc_wrappers/ctype.h +3 -115
- package/include/llvm_libc_wrappers/inttypes.h +3 -5
- package/include/llvm_libc_wrappers/stdio.h +10 -38
- package/include/llvm_libc_wrappers/stdlib.h +3 -24
- package/include/llvm_libc_wrappers/string.h +2 -70
- package/include/llvm_libc_wrappers/time.h +4 -10
- package/include/mmintrin.h +188 -257
- package/include/module.modulemap +23 -4
- package/include/movrs_avx10_2_512intrin.h +2 -2
- package/include/movrs_avx10_2intrin.h +4 -4
- package/include/pmmintrin.h +12 -24
- package/include/ptrauth.h +16 -2
- package/include/riscv_mips.h +34 -0
- package/include/riscv_nds.h +89 -0
- package/include/sifive_vector.h +58 -2
- package/include/sm4evexintrin.h +2 -2
- package/include/smmintrin.h +77 -59
- package/include/spirvintrin.h +194 -0
- package/include/stddefer.h +19 -0
- package/include/tmmintrin.h +116 -147
- package/include/vaesintrin.h +1 -2
- package/include/xmmintrin.h +44 -70
- package/include/xopintrin.h +20 -10
- package/libcxx/include/__algorithm/all_of.h +11 -5
- package/libcxx/include/__algorithm/comp.h +4 -0
- package/libcxx/include/__algorithm/copy.h +28 -147
- package/libcxx/include/__algorithm/copy_backward.h +9 -24
- package/libcxx/include/__algorithm/copy_n.h +50 -16
- package/libcxx/include/__algorithm/count.h +2 -2
- package/libcxx/include/__algorithm/equal.h +43 -55
- package/libcxx/include/__algorithm/fill.h +26 -8
- package/libcxx/include/__algorithm/fill_n.h +32 -46
- package/libcxx/include/__algorithm/find.h +96 -39
- package/libcxx/include/__algorithm/find_end.h +105 -0
- package/libcxx/include/__algorithm/for_each.h +18 -24
- package/libcxx/include/__algorithm/for_each_n.h +20 -47
- package/libcxx/include/__algorithm/for_each_n_segment.h +1 -1
- package/libcxx/include/__algorithm/for_each_segment.h +26 -0
- package/libcxx/include/__algorithm/generate.h +4 -2
- package/libcxx/include/__algorithm/generate_n.h +19 -6
- package/libcxx/include/__algorithm/is_permutation.h +4 -4
- package/libcxx/include/__algorithm/iterator_operations.h +3 -0
- package/libcxx/include/__algorithm/lexicographical_compare.h +2 -2
- package/libcxx/include/__algorithm/lexicographical_compare_three_way.h +6 -6
- package/libcxx/include/__algorithm/make_heap.h +16 -4
- package/libcxx/include/__algorithm/mismatch.h +2 -2
- package/libcxx/include/__algorithm/move.h +8 -19
- package/libcxx/include/__algorithm/move_backward.h +9 -24
- package/libcxx/include/__algorithm/none_of.h +4 -4
- package/libcxx/include/__algorithm/partial_sort.h +1 -1
- package/libcxx/include/__algorithm/partial_sort_copy.h +1 -1
- package/libcxx/include/__algorithm/pstl.h +9 -9
- package/libcxx/include/__algorithm/radix_sort.h +27 -25
- package/libcxx/include/__algorithm/ranges_copy_n.h +3 -26
- package/libcxx/include/__algorithm/ranges_equal.h +17 -26
- package/libcxx/include/__algorithm/ranges_fill.h +7 -6
- package/libcxx/include/__algorithm/ranges_for_each.h +9 -1
- package/libcxx/include/__algorithm/ranges_generate_n.h +2 -6
- package/libcxx/include/__algorithm/ranges_search_n.h +2 -2
- package/libcxx/include/__algorithm/rotate.h +27 -44
- package/libcxx/include/__algorithm/search_n.h +49 -37
- package/libcxx/include/__algorithm/sift_down.h +19 -18
- package/libcxx/include/__algorithm/simd_utils.h +33 -4
- package/libcxx/include/__algorithm/specialized_algorithms.h +54 -0
- package/libcxx/include/__algorithm/stable_sort.h +1 -1
- package/libcxx/include/__assertion_handler +31 -4
- package/libcxx/include/__atomic/atomic.h +36 -60
- package/libcxx/include/__atomic/atomic_flag.h +19 -37
- package/libcxx/include/__atomic/atomic_ref.h +29 -12
- package/libcxx/include/__atomic/atomic_sync.h +127 -55
- package/libcxx/include/__atomic/atomic_sync_timed.h +144 -0
- package/libcxx/include/__atomic/atomic_waitable_traits.h +103 -0
- package/libcxx/include/__atomic/contention_t.h +27 -3
- package/libcxx/include/__atomic/floating_point_helper.h +55 -0
- package/libcxx/include/__bit/countl.h +1 -2
- package/libcxx/include/__bit/countr.h +1 -2
- package/libcxx/include/__bit/has_single_bit.h +1 -1
- package/libcxx/include/__bit/popcount.h +0 -1
- package/libcxx/include/__bit/rotate.h +15 -26
- package/libcxx/include/__bit_reference +207 -18
- package/libcxx/include/__charconv/from_chars_integral.h +1 -1
- package/libcxx/include/__charconv/from_chars_result.h +1 -1
- package/libcxx/include/__charconv/to_chars_integral.h +1 -0
- package/libcxx/include/__charconv/to_chars_result.h +1 -1
- package/libcxx/include/__charconv/traits.h +3 -24
- package/libcxx/include/__chrono/day.h +11 -0
- package/libcxx/include/__chrono/duration.h +58 -33
- package/libcxx/include/__chrono/file_clock.h +4 -2
- package/libcxx/include/__chrono/is_clock.h +72 -0
- package/libcxx/include/__chrono/leap_second.h +13 -0
- package/libcxx/include/__chrono/month.h +13 -0
- package/libcxx/include/__chrono/month_weekday.h +22 -0
- package/libcxx/include/__chrono/monthday.h +20 -0
- package/libcxx/include/__chrono/steady_clock.h +1 -1
- package/libcxx/include/__chrono/system_clock.h +3 -3
- package/libcxx/include/__chrono/time_point.h +37 -13
- package/libcxx/include/__chrono/weekday.h +25 -0
- package/libcxx/include/__chrono/year.h +11 -0
- package/libcxx/include/__chrono/year_month.h +13 -0
- package/libcxx/include/__chrono/year_month_day.h +23 -0
- package/libcxx/include/__chrono/year_month_weekday.h +26 -0
- package/libcxx/include/__chrono/zoned_time.h +16 -0
- package/libcxx/include/__compare/is_eq.h +6 -6
- package/libcxx/include/__compare/strong_order.h +12 -30
- package/libcxx/include/__compare/three_way_comparable.h +2 -2
- package/libcxx/include/__concepts/comparison_common_type.h +40 -0
- package/libcxx/include/__concepts/equality_comparable.h +2 -1
- package/libcxx/include/__condition_variable/condition_variable.h +1 -1
- package/libcxx/include/__config +63 -280
- package/libcxx/include/__configuration/abi.h +14 -24
- package/libcxx/include/__configuration/availability.h +65 -118
- package/libcxx/include/__configuration/compiler.h +6 -6
- package/libcxx/include/__configuration/experimental.h +38 -0
- package/libcxx/include/__configuration/hardening.h +215 -0
- package/libcxx/include/__configuration/language.h +3 -0
- package/libcxx/include/__configuration/platform.h +9 -16
- package/libcxx/include/__coroutine/coroutine_handle.h +9 -9
- package/libcxx/include/__coroutine/noop_coroutine_handle.h +11 -13
- package/libcxx/include/__debug_utils/strict_weak_ordering_check.h +1 -1
- package/libcxx/include/__exception/exception.h +6 -4
- package/libcxx/include/__exception/exception_ptr.h +27 -5
- package/libcxx/include/__exception/nested_exception.h +2 -2
- package/libcxx/include/__exception/operations.h +5 -5
- package/libcxx/include/__expected/bad_expected_access.h +8 -6
- package/libcxx/include/__expected/expected.h +62 -64
- package/libcxx/include/__expected/unexpected.h +4 -4
- package/libcxx/include/__filesystem/copy_options.h +4 -4
- package/libcxx/include/__filesystem/directory_entry.h +37 -33
- package/libcxx/include/__filesystem/directory_iterator.h +9 -11
- package/libcxx/include/__filesystem/directory_options.h +7 -4
- package/libcxx/include/__filesystem/file_status.h +3 -3
- package/libcxx/include/__filesystem/filesystem_error.h +9 -10
- package/libcxx/include/__filesystem/operations.h +97 -66
- package/libcxx/include/__filesystem/path.h +68 -64
- package/libcxx/include/__filesystem/path_iterator.h +1 -3
- package/libcxx/include/__filesystem/perm_options.h +4 -4
- package/libcxx/include/__filesystem/perms.h +4 -4
- package/libcxx/include/__filesystem/recursive_directory_iterator.h +9 -14
- package/libcxx/include/__filesystem/space_info.h +1 -1
- package/libcxx/include/__filesystem/u8path.h +12 -14
- package/libcxx/include/__flat_map/flat_map.h +88 -71
- package/libcxx/include/__flat_map/flat_multimap.h +251 -172
- package/libcxx/include/__flat_map/key_value_iterator.h +0 -1
- package/libcxx/include/__flat_map/utils.h +1 -0
- package/libcxx/include/__flat_set/flat_multiset.h +211 -143
- package/libcxx/include/__flat_set/flat_set.h +86 -68
- package/libcxx/include/__format/concepts.h +0 -14
- package/libcxx/include/__format/extended_grapheme_cluster_table.h +3 -2
- package/libcxx/include/__format/fmt_pair_like.h +42 -0
- package/libcxx/include/__format/format_arg.h +7 -10
- package/libcxx/include/__format/format_args.h +1 -1
- package/libcxx/include/__format/format_context.h +5 -5
- package/libcxx/include/__format/format_parse_context.h +2 -2
- package/libcxx/include/__format/formatter_output.h +30 -34
- package/libcxx/include/__format/indic_conjunct_break_table.h +3 -2
- package/libcxx/include/__format/range_default_formatter.h +2 -41
- package/libcxx/include/__format/range_format.h +71 -0
- package/libcxx/include/__format/range_formatter.h +1 -0
- package/libcxx/include/__format/width_estimation_table.h +4 -2
- package/libcxx/include/__functional/bind.h +10 -15
- package/libcxx/include/__functional/bind_back.h +1 -1
- package/libcxx/include/__functional/bind_front.h +1 -1
- package/libcxx/include/__functional/function.h +57 -75
- package/libcxx/include/__functional/hash.h +1 -10
- package/libcxx/include/__functional/identity.h +1 -1
- package/libcxx/include/__functional/is_transparent.h +8 -0
- package/libcxx/include/__functional/mem_fn.h +2 -1
- package/libcxx/include/__functional/operations.h +18 -0
- package/libcxx/include/__functional/ranges_operations.h +7 -0
- package/libcxx/include/__functional/reference_wrapper.h +7 -5
- package/libcxx/include/__functional/weak_result_type.h +14 -28
- package/libcxx/include/__fwd/ios.h +1 -1
- package/libcxx/include/__fwd/tuple.h +14 -0
- package/libcxx/include/__hash_table +371 -357
- package/libcxx/include/__ios/fpos.h +4 -4
- package/libcxx/include/__iterator/back_insert_iterator.h +1 -7
- package/libcxx/include/__iterator/bounded_iter.h +7 -8
- package/libcxx/include/__iterator/concepts.h +6 -9
- package/libcxx/include/__iterator/cpp17_iterator_concepts.h +13 -12
- package/libcxx/include/__iterator/distance.h +40 -18
- package/libcxx/include/__iterator/front_insert_iterator.h +1 -7
- package/libcxx/include/__iterator/insert_iterator.h +1 -7
- package/libcxx/include/__iterator/istream_iterator.h +6 -7
- package/libcxx/include/__iterator/istreambuf_iterator.h +6 -7
- package/libcxx/include/__iterator/iter_move.h +1 -1
- package/libcxx/include/__iterator/iterator.h +13 -0
- package/libcxx/include/__iterator/iterator_traits.h +13 -14
- package/libcxx/include/__iterator/ostream_iterator.h +1 -7
- package/libcxx/include/__iterator/ostreambuf_iterator.h +1 -7
- package/libcxx/include/__iterator/reverse_iterator.h +8 -13
- package/libcxx/include/__iterator/segmented_iterator.h +3 -8
- package/libcxx/include/__iterator/static_bounded_iter.h +3 -3
- package/libcxx/include/__iterator/wrap_iter.h +8 -6
- package/libcxx/include/__locale +3 -10
- package/libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h +0 -10
- package/libcxx/include/__locale_dir/locale_base_api.h +5 -28
- package/libcxx/include/__locale_dir/messages.h +1 -1
- package/libcxx/include/__locale_dir/money.h +2 -2
- package/libcxx/include/__locale_dir/num.h +190 -243
- package/libcxx/include/__locale_dir/pad_and_output.h +5 -6
- package/libcxx/include/__locale_dir/support/bsd_like.h +0 -20
- package/libcxx/include/__locale_dir/support/fuchsia.h +0 -7
- package/libcxx/include/__locale_dir/support/linux.h +0 -37
- package/libcxx/include/__locale_dir/support/netbsd.h +0 -2
- package/libcxx/include/__locale_dir/support/newlib.h +243 -0
- package/libcxx/include/__locale_dir/support/no_locale/characters.h +0 -4
- package/libcxx/include/__locale_dir/support/no_locale/strtonum.h +0 -9
- package/libcxx/include/__locale_dir/support/windows.h +0 -29
- package/libcxx/include/__locale_dir/time.h +3 -7
- package/libcxx/include/__math/hypot.h +1 -1
- package/libcxx/include/__math/logarithms.h +1 -1
- package/libcxx/include/__math/traits.h +80 -11
- package/libcxx/include/__mdspan/extents.h +7 -4
- package/libcxx/include/__mdspan/layout_stride.h +4 -5
- package/libcxx/include/__mdspan/mdspan.h +29 -23
- package/libcxx/include/__memory/addressof.h +7 -5
- package/libcxx/include/__memory/align.h +18 -1
- package/libcxx/include/__memory/allocate_at_least.h +15 -10
- package/libcxx/include/__memory/allocator.h +14 -26
- package/libcxx/include/__memory/allocator_traits.h +6 -4
- package/libcxx/include/__memory/compressed_pair.h +15 -9
- package/libcxx/include/__memory/construct_at.h +12 -23
- package/libcxx/include/__memory/inout_ptr.h +1 -1
- package/libcxx/include/__memory/is_sufficiently_aligned.h +1 -1
- package/libcxx/include/__memory/out_ptr.h +1 -1
- package/libcxx/include/__memory/pointer_traits.h +1 -1
- package/libcxx/include/__memory/raw_storage_iterator.h +3 -9
- package/libcxx/include/__memory/shared_count.h +9 -30
- package/libcxx/include/__memory/shared_ptr.h +100 -145
- package/libcxx/include/__memory/temp_value.h +1 -2
- package/libcxx/include/__memory/uninitialized_algorithms.h +44 -115
- package/libcxx/include/__memory/unique_ptr.h +14 -16
- package/libcxx/include/__memory/uses_allocator_construction.h +1 -0
- package/libcxx/include/__memory_resource/memory_resource.h +4 -2
- package/libcxx/include/__memory_resource/monotonic_buffer_resource.h +1 -1
- package/libcxx/include/__memory_resource/polymorphic_allocator.h +13 -8
- package/libcxx/include/__memory_resource/pool_options.h +1 -1
- package/libcxx/include/__memory_resource/synchronized_pool_resource.h +4 -2
- package/libcxx/include/__memory_resource/unsynchronized_pool_resource.h +1 -1
- package/libcxx/include/__mutex/mutex.h +2 -2
- package/libcxx/include/__mutex/once_flag.h +14 -11
- package/libcxx/include/__mutex/tag_types.h +3 -3
- package/libcxx/include/__mutex/unique_lock.h +8 -7
- package/libcxx/include/__new/align_val_t.h +6 -0
- package/libcxx/include/__new/allocate.h +1 -2
- package/libcxx/include/__new/exceptions.h +8 -2
- package/libcxx/include/__new/global_new_delete.h +4 -11
- package/libcxx/include/__new/interference_size.h +0 -4
- package/libcxx/include/__new/launder.h +3 -5
- package/libcxx/include/__new/nothrow_t.h +1 -1
- package/libcxx/include/__numeric/gcd_lcm.h +24 -34
- package/libcxx/include/__numeric/midpoint.h +9 -14
- package/libcxx/include/__numeric/pstl.h +2 -2
- package/libcxx/include/__numeric/saturation_arithmetic.h +13 -5
- package/libcxx/include/__ostream/basic_ostream.h +8 -8
- package/libcxx/include/__pstl/backends/default.h +14 -14
- package/libcxx/include/__pstl/backends/libdispatch.h +2 -2
- package/libcxx/include/__pstl/cpu_algos/find_if.h +1 -1
- package/libcxx/include/__pstl/cpu_algos/transform.h +5 -6
- package/libcxx/include/__pstl/cpu_algos/transform_reduce.h +5 -4
- package/libcxx/include/__random/binomial_distribution.h +10 -4
- package/libcxx/include/__random/mersenne_twister_engine.h +50 -154
- package/libcxx/include/__random/piecewise_constant_distribution.h +3 -2
- package/libcxx/include/__random/piecewise_linear_distribution.h +3 -2
- package/libcxx/include/__ranges/adjacent_transform_view.h +406 -0
- package/libcxx/include/__ranges/adjacent_view.h +419 -0
- package/libcxx/include/__ranges/as_rvalue_view.h +9 -9
- package/libcxx/include/__ranges/chunk_by_view.h +6 -6
- package/libcxx/include/__ranges/common_view.h +7 -7
- package/libcxx/include/__ranges/drop_view.h +8 -8
- package/libcxx/include/__ranges/drop_while_view.h +5 -5
- package/libcxx/include/__ranges/elements_of.h +49 -0
- package/libcxx/include/__ranges/empty_view.h +5 -5
- package/libcxx/include/__ranges/filter_view.h +10 -10
- package/libcxx/include/__ranges/iota_view.h +41 -22
- package/libcxx/include/__ranges/owning_view.h +15 -15
- package/libcxx/include/__ranges/ref_view.h +6 -6
- package/libcxx/include/__ranges/repeat_view.h +17 -10
- package/libcxx/include/__ranges/single_view.h +8 -8
- package/libcxx/include/__ranges/take_view.h +9 -9
- package/libcxx/include/__ranges/transform_view.h +1 -2
- package/libcxx/include/__ranges/view_interface.h +10 -10
- package/libcxx/include/__ranges/zip_transform_view.h +357 -0
- package/libcxx/include/__ranges/zip_view.h +20 -20
- package/libcxx/include/__split_buffer +612 -240
- package/libcxx/include/__stop_token/atomic_unique_lock.h +1 -1
- package/libcxx/include/__stop_token/stop_callback.h +2 -2
- package/libcxx/include/__stop_token/stop_source.h +1 -1
- package/libcxx/include/__stop_token/stop_state.h +4 -4
- package/libcxx/include/__stop_token/stop_token.h +1 -1
- package/libcxx/include/__string/char_traits.h +51 -31
- package/libcxx/include/__string/constexpr_c_functions.h +5 -5
- package/libcxx/include/__support/xlocale/__strtonum_fallback.h +0 -8
- package/libcxx/include/__system_error/error_category.h +8 -8
- package/libcxx/include/__system_error/error_code.h +5 -5
- package/libcxx/include/__system_error/error_condition.h +4 -4
- package/libcxx/include/__system_error/system_error.h +1 -1
- package/libcxx/include/__thread/id.h +1 -1
- package/libcxx/include/__thread/jthread.h +1 -1
- package/libcxx/include/__thread/poll_with_backoff.h +27 -8
- package/libcxx/include/__thread/support/c11.h +8 -8
- package/libcxx/include/__thread/support/pthread.h +8 -8
- package/libcxx/include/__thread/support/windows.h +8 -8
- package/libcxx/include/__thread/thread.h +13 -8
- package/libcxx/include/__thread/timed_backoff_policy.h +3 -2
- package/libcxx/include/__tree +849 -701
- package/libcxx/include/__tuple/sfinae_helpers.h +1 -44
- package/libcxx/include/__tuple/tuple_element.h +0 -12
- package/libcxx/include/__tuple/tuple_size.h +0 -4
- package/libcxx/include/__tuple/tuple_transform.h +45 -0
- package/libcxx/include/__type_traits/aligned_storage.h +13 -40
- package/libcxx/include/__type_traits/desugars_to.h +4 -0
- package/libcxx/include/__type_traits/invoke.h +8 -0
- package/libcxx/include/__type_traits/is_allocator.h +6 -7
- package/libcxx/include/__type_traits/is_array.h +26 -0
- package/libcxx/include/__type_traits/is_equality_comparable.h +16 -21
- package/libcxx/include/__type_traits/is_final.h +1 -1
- package/libcxx/include/__type_traits/is_floating_point.h +7 -6
- package/libcxx/include/__type_traits/is_generic_transparent_comparator.h +30 -0
- package/libcxx/include/__type_traits/is_specialization.h +2 -6
- package/libcxx/include/__type_traits/is_within_lifetime.h +29 -0
- package/libcxx/include/__type_traits/make_transparent.h +52 -0
- package/libcxx/include/__type_traits/reference_constructs_from_temporary.h +1 -7
- package/libcxx/include/__type_traits/reference_converts_from_temporary.h +1 -1
- package/libcxx/include/__utility/cmp.h +19 -7
- package/libcxx/include/__utility/default_three_way_comparator.h +70 -0
- package/libcxx/include/__utility/in_place.h +1 -1
- package/libcxx/include/__utility/integer_sequence.h +56 -41
- package/libcxx/include/__utility/lazy_synth_three_way_comparator.h +120 -0
- package/libcxx/include/__utility/pair.h +22 -25
- package/libcxx/include/__utility/scope_guard.h +2 -0
- package/libcxx/include/__utility/try_key_extraction.h +114 -0
- package/libcxx/include/__vector/vector.h +187 -160
- package/libcxx/include/__vector/vector_bool.h +76 -83
- package/libcxx/include/any +118 -155
- package/libcxx/include/array +88 -56
- package/libcxx/include/atomic +2 -0
- package/libcxx/include/barrier +20 -24
- package/libcxx/include/bitset +49 -30
- package/libcxx/include/ccomplex +3 -11
- package/libcxx/include/chrono +47 -0
- package/libcxx/include/ciso646 +3 -6
- package/libcxx/include/complex +77 -65
- package/libcxx/include/complex.h +10 -10
- package/libcxx/include/condition_variable +3 -3
- package/libcxx/include/cstdalign +3 -10
- package/libcxx/include/cstdbool +3 -10
- package/libcxx/include/ctgmath +2 -11
- package/libcxx/include/ctype.h +24 -24
- package/libcxx/include/cwchar +2 -2
- package/libcxx/include/deque +109 -225
- package/libcxx/include/errno.h +269 -269
- package/libcxx/include/exception +4 -1
- package/libcxx/include/ext/hash_map +7 -48
- package/libcxx/include/ext/hash_set +2 -8
- package/libcxx/include/fenv.h +43 -43
- package/libcxx/include/flat_map +663 -11
- package/libcxx/include/flat_set +543 -8
- package/libcxx/include/float.h +16 -16
- package/libcxx/include/forward_list +33 -53
- package/libcxx/include/fstream +57 -42
- package/libcxx/include/future +41 -51
- package/libcxx/include/initializer_list +9 -3
- package/libcxx/include/inttypes.h +16 -16
- package/libcxx/include/ios +28 -28
- package/libcxx/include/istream +19 -13
- package/libcxx/include/iterator +10 -0
- package/libcxx/include/latch +7 -5
- package/libcxx/include/limits +4 -4
- package/libcxx/include/list +61 -79
- package/libcxx/include/map +386 -274
- package/libcxx/include/math.h +19 -0
- package/libcxx/include/mdspan +1 -5
- package/libcxx/include/mutex +29 -19
- package/libcxx/include/optional +644 -149
- package/libcxx/include/print +9 -5
- package/libcxx/include/queue +39 -37
- package/libcxx/include/ranges +48 -0
- package/libcxx/include/regex +33 -31
- package/libcxx/include/scoped_allocator +16 -11
- package/libcxx/include/semaphore +15 -18
- package/libcxx/include/set +220 -192
- package/libcxx/include/shared_mutex +3 -8
- package/libcxx/include/span +53 -37
- package/libcxx/include/sstream +34 -28
- package/libcxx/include/stack +13 -15
- package/libcxx/include/stddef.h +10 -10
- package/libcxx/include/stdexcept +2 -2
- package/libcxx/include/stdio.h +20 -21
- package/libcxx/include/streambuf +59 -19
- package/libcxx/include/string +574 -573
- package/libcxx/include/string_view +113 -89
- package/libcxx/include/strstream +10 -10
- package/libcxx/include/syncstream +4 -4
- package/libcxx/include/tgmath.h +12 -12
- package/libcxx/include/tuple +242 -212
- package/libcxx/include/type_traits +8 -2
- package/libcxx/include/typeindex +5 -3
- package/libcxx/include/typeinfo +92 -89
- package/libcxx/include/unordered_map +179 -304
- package/libcxx/include/unordered_set +168 -195
- package/libcxx/include/utility +12 -0
- package/libcxx/include/valarray +106 -161
- package/libcxx/include/variant +25 -33
- package/libcxx/include/version +41 -24
- package/libcxx/include/wctype.h +29 -29
- package/libcxx/libc/hdr/errno_macros.h +3 -1
- package/libcxx/libc/hdr/stdint_proxy.h +18 -0
- package/libcxx/libc/hdr/types/wchar_t.h +23 -0
- package/libcxx/libc/hdr/wchar_overlay.h +69 -0
- package/libcxx/libc/include/llvm-libc-macros/cfloat128-macros.h +41 -0
- package/libcxx/libc/include/llvm-libc-macros/cfloat16-macros.h +20 -0
- package/libcxx/libc/include/llvm-libc-macros/wchar-macros.h +18 -0
- package/libcxx/libc/include/llvm-libc-types/cfloat128.h +11 -28
- package/libcxx/libc/include/llvm-libc-types/cfloat16.h +4 -7
- package/libcxx/libc/include/llvm-libc-types/wint_t.h +14 -0
- package/libcxx/libc/shared/libc_common.h +5 -0
- package/libcxx/libc/src/__support/CPP/bit.h +50 -12
- package/libcxx/libc/src/__support/CPP/type_traits/is_complex.h +7 -0
- package/libcxx/libc/src/__support/CPP/type_traits/is_destructible.h +2 -1
- package/libcxx/libc/src/__support/CPP/type_traits/is_unsigned.h +6 -0
- package/libcxx/libc/src/__support/CPP/utility/integer_sequence.h +10 -0
- package/libcxx/libc/src/__support/FPUtil/FPBits.h +6 -7
- package/libcxx/libc/src/__support/FPUtil/rounding_mode.h +50 -4
- package/libcxx/libc/src/__support/big_int.h +14 -14
- package/libcxx/libc/src/__support/common.h +3 -2
- package/libcxx/libc/src/__support/ctype_utils.h +19 -12
- package/libcxx/libc/src/__support/detailed_powers_of_ten.h +1 -2
- package/libcxx/libc/src/__support/high_precision_decimal.h +33 -14
- package/libcxx/libc/src/__support/libc_assert.h +2 -0
- package/libcxx/libc/src/__support/macros/attributes.h +44 -1
- package/libcxx/libc/src/__support/macros/config.h +23 -0
- package/libcxx/libc/src/__support/macros/null_check.h +1 -2
- package/libcxx/libc/src/__support/macros/optimization.h +3 -0
- package/libcxx/libc/src/__support/macros/properties/architectures.h +5 -1
- package/libcxx/libc/src/__support/macros/properties/compiler.h +8 -3
- package/libcxx/libc/src/__support/macros/properties/cpu_features.h +17 -1
- package/libcxx/libc/src/__support/macros/properties/types.h +2 -3
- package/libcxx/libc/src/__support/macros/sanitizer.h +0 -10
- package/libcxx/libc/src/__support/math_extras.h +20 -4
- package/libcxx/libc/src/__support/str_to_float.h +98 -125
- package/libcxx/libc/src/__support/str_to_integer.h +39 -27
- package/libcxx/libc/src/__support/wctype_utils.h +588 -0
- package/libcxx/src/any.cpp +4 -0
- package/libcxx/src/atomic.cpp +365 -80
- package/libcxx/src/barrier.cpp +4 -3
- package/libcxx/src/charconv.cpp +6 -3
- package/libcxx/src/condition_variable_destructor.cpp +1 -1
- package/libcxx/src/error_category.cpp +3 -1
- package/libcxx/src/exception.cpp +2 -10
- package/libcxx/src/experimental/time_zone.cpp +1 -1
- package/libcxx/src/experimental/tzdb.cpp +4 -1
- package/libcxx/src/filesystem/error.h +4 -22
- package/libcxx/src/filesystem/format_string.h +9 -18
- package/libcxx/src/filesystem/int128_builtins.cpp +2 -0
- package/libcxx/src/filesystem/operations.cpp +2 -9
- package/libcxx/src/filesystem/path.cpp +3 -1
- package/libcxx/src/include/aligned_alloc.h +65 -0
- package/libcxx/src/include/config_elast.h +1 -1
- package/libcxx/src/include/from_chars_floating_point.h +11 -7
- package/libcxx/src/include/overridable_function.h +8 -10
- package/libcxx/src/iostream.cpp +56 -37
- package/libcxx/src/locale.cpp +213 -196
- package/libcxx/src/memory.cpp +12 -14
- package/libcxx/src/mutex_destructor.cpp +1 -1
- package/libcxx/src/new.cpp +5 -5
- package/libcxx/src/optional.cpp +4 -0
- package/libcxx/src/print.cpp +9 -1
- package/libcxx/src/random.cpp +0 -26
- package/libcxx/src/string.cpp +10 -25
- package/libcxx/src/support/runtime/exception_fallback.ipp +2 -0
- package/libcxx/src/support/runtime/exception_glibcxx.ipp +3 -0
- package/libcxx/src/support/runtime/exception_libcxxabi.ipp +6 -2
- package/libcxx/src/support/runtime/exception_libcxxrt.ipp +2 -0
- package/libcxx/src/support/runtime/exception_msvc.ipp +2 -0
- package/libcxx/src/support/runtime/exception_pointer_cxxabi.ipp +9 -10
- package/libcxx/src/support/runtime/exception_pointer_glibcxx.ipp +2 -0
- package/libcxx/src/support/runtime/exception_pointer_msvc.ipp +1 -0
- package/libcxx/src/support/runtime/exception_pointer_unimplemented.ipp +1 -0
- package/libcxx/src/support/win32/locale_win32.cpp +1 -1
- package/libcxx/src/system_error.cpp +2 -0
- package/libcxx/src/thread.cpp +1 -3
- package/libcxx/src/valarray.cpp +1 -2
- package/libcxx/src/vector.cpp +2 -2
- package/libcxxabi/include/__cxxabi_config.h +42 -23
- package/libcxxabi/src/cxa_exception.cpp +4 -2
- package/libcxxabi/src/cxa_exception.h +16 -14
- package/libcxxabi/src/cxa_personality.cpp +126 -9
- package/libcxxabi/src/cxa_thread_atexit.cpp +2 -1
- package/libcxxabi/src/demangle/DemangleConfig.h +4 -0
- package/libcxxabi/src/demangle/ItaniumDemangle.h +9 -6
- package/libcxxabi/src/demangle/Utility.h +21 -7
- package/libcxxabi/src/fallback_malloc.cpp +1 -1
- package/libcxxabi/src/private_typeinfo.cpp +6 -0
- package/libcxxabi/src/stdlib_new_delete.cpp +5 -5
- package/libtsan/LICENSE.TXT +311 -0
- package/libtsan/builtins/assembly.h +41 -8
- package/libtsan/interception/interception_win.cpp +4 -0
- package/libtsan/sanitizer_common/sanitizer_allocator_primary32.h +1 -0
- package/libtsan/sanitizer_common/sanitizer_allocator_primary64.h +18 -0
- package/libtsan/sanitizer_common/sanitizer_common.h +15 -2
- package/libtsan/sanitizer_common/sanitizer_common_interceptors.inc +30 -4
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_ioctl.inc +4 -0
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_aarch64.inc.S +2 -1
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_i386.inc.S +2 -0
- package/libtsan/sanitizer_common/sanitizer_common_interceptors_vfork_x86_64.inc.S +2 -0
- package/libtsan/sanitizer_common/sanitizer_common_syscalls.inc +18 -0
- package/libtsan/sanitizer_common/sanitizer_file.cpp +40 -12
- package/libtsan/sanitizer_common/sanitizer_file.h +3 -0
- package/libtsan/sanitizer_common/sanitizer_flags.inc +7 -0
- package/libtsan/sanitizer_common/sanitizer_fuchsia.cpp +30 -3
- package/libtsan/sanitizer_common/sanitizer_haiku.cpp +2 -2
- package/libtsan/sanitizer_common/sanitizer_internal_defs.h +1 -1
- package/libtsan/sanitizer_common/sanitizer_libc.cpp +8 -0
- package/libtsan/sanitizer_common/sanitizer_libc.h +1 -0
- package/libtsan/sanitizer_common/sanitizer_linux.cpp +15 -7
- package/libtsan/sanitizer_common/sanitizer_linux.h +3 -3
- package/libtsan/sanitizer_common/sanitizer_linux_libcdep.cpp +1 -0
- package/libtsan/sanitizer_common/sanitizer_mac.cpp +255 -104
- package/libtsan/sanitizer_common/sanitizer_mac.h +5 -0
- package/libtsan/sanitizer_common/sanitizer_netbsd.cpp +2 -2
- package/libtsan/sanitizer_common/sanitizer_platform.h +27 -1
- package/libtsan/sanitizer_common/sanitizer_platform_interceptors.h +5 -4
- package/libtsan/sanitizer_common/sanitizer_platform_limits_posix.cpp +15 -17
- package/libtsan/sanitizer_common/sanitizer_platform_limits_posix.h +32 -6
- package/libtsan/sanitizer_common/sanitizer_posix.cpp +3 -12
- package/libtsan/sanitizer_common/sanitizer_posix.h +2 -1
- package/libtsan/sanitizer_common/sanitizer_posix_libcdep.cpp +19 -0
- package/libtsan/sanitizer_common/sanitizer_procmaps_mac.cpp +102 -37
- package/libtsan/sanitizer_common/sanitizer_redefine_builtins.h +1 -1
- package/libtsan/sanitizer_common/sanitizer_signal_interceptors.inc +40 -2
- package/libtsan/sanitizer_common/sanitizer_stoptheworld.h +1 -1
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp +83 -12
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_mac.cpp +3 -3
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp +7 -7
- package/libtsan/sanitizer_common/sanitizer_stoptheworld_win.cpp +2 -2
- package/libtsan/sanitizer_common/sanitizer_symbolizer_internal.h +5 -1
- package/libtsan/sanitizer_common/sanitizer_symbolizer_libcdep.cpp +11 -1
- package/libtsan/sanitizer_common/sanitizer_symbolizer_mac.cpp +86 -29
- package/libtsan/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp +27 -16
- package/libtsan/sanitizer_common/sanitizer_thread_registry.cpp +5 -4
- package/libtsan/sanitizer_common/sanitizer_thread_registry.h +4 -4
- package/libtsan/sanitizer_common/sanitizer_win.cpp +1 -3
- package/libtsan/tsan_debugging.cpp +2 -2
- package/libtsan/tsan_flags.cpp +37 -0
- package/libtsan/tsan_flags.h +8 -0
- package/libtsan/tsan_flags.inc +12 -0
- package/libtsan/tsan_interceptors.h +9 -1
- package/libtsan/tsan_interceptors_mac.cpp +19 -0
- package/libtsan/tsan_interceptors_posix.cpp +78 -32
- package/libtsan/tsan_interface.h +3 -3
- package/libtsan/tsan_interface_ann.cpp +23 -9
- package/libtsan/tsan_mman.cpp +18 -4
- package/libtsan/tsan_platform.h +44 -7
- package/libtsan/tsan_platform_linux.cpp +42 -14
- package/libtsan/tsan_platform_mac.cpp +16 -3
- package/libtsan/tsan_report.h +14 -1
- package/libtsan/tsan_rtl.cpp +14 -0
- package/libtsan/tsan_rtl.h +7 -2
- package/libtsan/tsan_rtl_aarch64.S +3 -5
- package/libtsan/tsan_rtl_access.cpp +8 -3
- package/libtsan/tsan_rtl_amd64.S +2 -0
- package/libtsan/tsan_rtl_mutex.cpp +94 -49
- package/libtsan/tsan_rtl_report.cpp +132 -65
- package/libtsan/tsan_rtl_thread.cpp +31 -9
- package/libtsan/tsan_symbolize.cpp +1 -1
- package/libtsan/tsan_symbolize.h +1 -1
- package/libtsan/tsan_trace.h +1 -1
- package/libunwind/include/__libunwind_config.h +11 -2
- package/libunwind/include/libunwind.h +117 -11
- package/libunwind/include/unwind_arm_ehabi.h +4 -1
- package/libunwind/src/AddressSpace.hpp +42 -20
- package/libunwind/src/CompactUnwinder.hpp +16 -5
- package/libunwind/src/DwarfInstructions.hpp +24 -13
- package/libunwind/src/DwarfParser.hpp +62 -23
- package/libunwind/src/EHHeaderParser.hpp +7 -4
- package/libunwind/src/Registers.hpp +226 -22
- package/libunwind/src/Unwind-seh.cpp +6 -7
- package/libunwind/src/Unwind-wasm.c +7 -7
- package/libunwind/src/UnwindCursor.hpp +167 -49
- package/libunwind/src/UnwindLevel1.c +46 -17
- package/libunwind/src/UnwindRegistersRestore.S +46 -5
- package/libunwind/src/UnwindRegistersSave.S +86 -2
- package/libunwind/src/assembly.h +5 -1
- package/libunwind/src/config.h +9 -0
- package/libunwind/src/gcc_personality_v0.c +79 -6
- package/libunwind/src/libunwind.cpp +104 -4
- package/libunwind/src/libunwind_ext.h +7 -1
- package/libunwind/src/shadow_stack_unwind.h +2 -2
- package/lldb/pretty_printers.py +948 -0
- package/package.json +1 -1
- package/std/Build/Step/Compile.zig +18 -19
- package/std/Build/Step/Run.zig +13 -6
- package/std/Build/Step.zig +0 -3
- package/std/Io/Threaded.zig +3 -0
- package/std/Target/aarch64.zig +620 -77
- package/std/Target/amdgcn.zig +421 -21
- package/std/Target/arm.zig +40 -6
- package/std/Target/bpf.zig +6 -0
- package/std/Target/hexagon.zig +41 -6
- package/std/Target/loongarch.zig +18 -0
- package/std/Target/mips.zig +6 -0
- package/std/Target/nvptx.zig +58 -35
- package/std/Target/powerpc.zig +27 -19
- package/std/Target/riscv.zig +415 -177
- package/std/Target/sparc.zig +17 -0
- package/std/Target/wasm.zig +7 -0
- package/std/Target/x86.zig +200 -31
- package/std/Target/xtensa.zig +65 -0
- package/std/Target.zig +16 -8
- package/std/c.zig +7 -0
- package/std/crypto/ml_kem.zig +0 -15
- package/std/debug/Dwarf.zig +14 -11
- package/std/debug/Pdb.zig +24 -16
- package/std/hash/xxhash.zig +0 -6
- package/std/math/log10.zig +0 -2
- package/std/math/modf.zig +1 -2
- package/std/mem.zig +1 -2
- package/std/os/linux/x86.zig +2 -2
- package/std/os/windows.zig +130 -1
- package/std/simd.zig +4 -21
- package/std/start.zig +4 -3
- package/std/zig/Ast.zig +5 -7
- package/std/zig/AstGen.zig +20 -14
- package/std/zig/ErrorBundle.zig +6 -2
- package/std/zig/ZonGen.zig +13 -21
- package/std/zig/llvm/Builder.zig +2 -2
- package/std/zig/system/arm.zig +56 -2
- package/std/zig/system/windows.zig +34 -1
- package/std/zig/system/x86.zig +60 -16
- package/std/zig/system.zig +0 -10
- package/std/zig/target.zig +1 -2
- package/std/zon/parse.zig +1 -1
- package/include/amxbf16transposeintrin.h +0 -94
- package/include/amxcomplextransposeintrin.h +0 -303
- package/include/amxfp16transposeintrin.h +0 -94
- package/include/amxmovrstransposeintrin.h +0 -200
- package/include/amxtf32transposeintrin.h +0 -105
- package/include/amxtransposeintrin.h +0 -248
- package/libtsan/sanitizer_common/sanitizer_coverage_interface.inc +0 -43
- package/std/Build/Step/CheckObject.zig +0 -2764
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
|
|
24
24
|
#include "config.h"
|
|
25
25
|
|
|
26
|
+
#if defined(_LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING)
|
|
27
|
+
#include <ptrauth.h>
|
|
28
|
+
#endif
|
|
29
|
+
|
|
26
30
|
namespace libunwind {
|
|
27
31
|
|
|
28
32
|
/// CFI_Parser does basic parsing of a CFI (Call Frame Information) records.
|
|
@@ -33,6 +37,7 @@ template <typename A>
|
|
|
33
37
|
class CFI_Parser {
|
|
34
38
|
public:
|
|
35
39
|
typedef typename A::pint_t pint_t;
|
|
40
|
+
typedef pint_t __ptrauth_unwind_cie_info_personality personality_t;
|
|
36
41
|
|
|
37
42
|
/// Information encoded in a CIE (Common Information Entry)
|
|
38
43
|
struct CIE_Info {
|
|
@@ -43,7 +48,7 @@ public:
|
|
|
43
48
|
uint8_t lsdaEncoding;
|
|
44
49
|
uint8_t personalityEncoding;
|
|
45
50
|
uint8_t personalityOffsetInCIE;
|
|
46
|
-
|
|
51
|
+
personality_t personality;
|
|
47
52
|
uint32_t codeAlignFactor;
|
|
48
53
|
int dataAlignFactor;
|
|
49
54
|
bool isSignalFrame;
|
|
@@ -155,14 +160,17 @@ public:
|
|
|
155
160
|
}
|
|
156
161
|
};
|
|
157
162
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
163
|
+
template <typename R>
|
|
164
|
+
static bool findFDE(A &addressSpace, typename R::link_hardened_reg_arg_t pc,
|
|
165
|
+
pint_t ehSectionStart, size_t sectionLength,
|
|
166
|
+
pint_t fdeHint, FDE_Info *fdeInfo, CIE_Info *cieInfo);
|
|
161
167
|
static const char *decodeFDE(A &addressSpace, pint_t fdeStart,
|
|
162
168
|
FDE_Info *fdeInfo, CIE_Info *cieInfo,
|
|
163
169
|
bool useCIEInfo = false);
|
|
170
|
+
template <typename R>
|
|
164
171
|
static bool parseFDEInstructions(A &addressSpace, const FDE_Info &fdeInfo,
|
|
165
|
-
const CIE_Info &cieInfo,
|
|
172
|
+
const CIE_Info &cieInfo,
|
|
173
|
+
typename R::link_hardened_reg_arg_t upToPC,
|
|
166
174
|
int arch, PrologInfo *results);
|
|
167
175
|
|
|
168
176
|
static const char *parseCIE(A &addressSpace, pint_t cie, CIE_Info *cieInfo);
|
|
@@ -234,9 +242,12 @@ const char *CFI_Parser<A>::decodeFDE(A &addressSpace, pint_t fdeStart,
|
|
|
234
242
|
|
|
235
243
|
/// Scan an eh_frame section to find an FDE for a pc
|
|
236
244
|
template <typename A>
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
245
|
+
template <typename R>
|
|
246
|
+
bool CFI_Parser<A>::findFDE(A &addressSpace,
|
|
247
|
+
typename R::link_hardened_reg_arg_t pc,
|
|
248
|
+
pint_t ehSectionStart, size_t sectionLength,
|
|
249
|
+
pint_t fdeHint, FDE_Info *fdeInfo,
|
|
250
|
+
CIE_Info *cieInfo) {
|
|
240
251
|
//fprintf(stderr, "findFDE(0x%llX)\n", (long long)pc);
|
|
241
252
|
pint_t p = (fdeHint != 0) ? fdeHint : ehSectionStart;
|
|
242
253
|
const pint_t ehSectionEnd = (sectionLength == SIZE_MAX)
|
|
@@ -273,7 +284,7 @@ bool CFI_Parser<A>::findFDE(A &addressSpace, pint_t pc, pint_t ehSectionStart,
|
|
|
273
284
|
pint_t pcRange = addressSpace.getEncodedP(
|
|
274
285
|
p, nextCFI, cieInfo->pointerEncoding & 0x0F);
|
|
275
286
|
// Test if pc is within the function this FDE covers.
|
|
276
|
-
if ((pcStart
|
|
287
|
+
if ((pcStart <= pc) && (pc < pcStart + pcRange)) {
|
|
277
288
|
// parse rest of info
|
|
278
289
|
fdeInfo->lsda = 0;
|
|
279
290
|
// check for augmentation length
|
|
@@ -369,6 +380,7 @@ const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie,
|
|
|
369
380
|
cieInfo->returnAddressRegister = (uint8_t)raReg;
|
|
370
381
|
// parse augmentation data based on augmentation string
|
|
371
382
|
const char *result = NULL;
|
|
383
|
+
pint_t resultAddr = 0;
|
|
372
384
|
if (addressSpace.get8(strStart) == 'z') {
|
|
373
385
|
// parse augmentation data length
|
|
374
386
|
addressSpace.getULEB128(p, cieContentEnd);
|
|
@@ -377,13 +389,41 @@ const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie,
|
|
|
377
389
|
case 'z':
|
|
378
390
|
cieInfo->fdesHaveAugmentationData = true;
|
|
379
391
|
break;
|
|
380
|
-
case 'P':
|
|
392
|
+
case 'P': {
|
|
381
393
|
cieInfo->personalityEncoding = addressSpace.get8(p);
|
|
382
394
|
++p;
|
|
383
395
|
cieInfo->personalityOffsetInCIE = (uint8_t)(p - cie);
|
|
384
|
-
|
|
385
|
-
|
|
396
|
+
pint_t personality = addressSpace.getEncodedP(
|
|
397
|
+
p, cieContentEnd, cieInfo->personalityEncoding,
|
|
398
|
+
/*datarelBase=*/0, &resultAddr);
|
|
399
|
+
#if defined(_LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING)
|
|
400
|
+
if (personality) {
|
|
401
|
+
// The GOT for the personality function was signed address
|
|
402
|
+
// authenticated. Manually re-sign with the CIE_Info::personality
|
|
403
|
+
// schema. If we could guarantee the encoding of the personality we
|
|
404
|
+
// could avoid this by simply giving resultAddr the correct ptrauth
|
|
405
|
+
// schema and performing an assignment.
|
|
406
|
+
#if defined(__arm64e__)
|
|
407
|
+
const auto oldDiscriminator = resultAddr;
|
|
408
|
+
#else
|
|
409
|
+
const auto oldDiscriminator = ptrauth_blend_discriminator(
|
|
410
|
+
(void *)resultAddr, __ptrauth_unwind_pauthtest_personality_disc);
|
|
411
|
+
#endif
|
|
412
|
+
const auto discriminator = ptrauth_blend_discriminator(
|
|
413
|
+
&cieInfo->personality,
|
|
414
|
+
__ptrauth_unwind_cie_info_personality_disc);
|
|
415
|
+
void *signedPtr = ptrauth_auth_and_resign(
|
|
416
|
+
(void *)personality, ptrauth_key_function_pointer,
|
|
417
|
+
oldDiscriminator, ptrauth_key_function_pointer, discriminator);
|
|
418
|
+
personality = (pint_t)signedPtr;
|
|
419
|
+
}
|
|
420
|
+
#endif
|
|
421
|
+
// We use memmove to set the CIE personality as we have already
|
|
422
|
+
// re-signed the pointer to the correct schema.
|
|
423
|
+
memmove((void *)&cieInfo->personality, (void *)&personality,
|
|
424
|
+
sizeof(personality));
|
|
386
425
|
break;
|
|
426
|
+
}
|
|
387
427
|
case 'L':
|
|
388
428
|
cieInfo->lsdaEncoding = addressSpace.get8(p);
|
|
389
429
|
++p;
|
|
@@ -417,10 +457,10 @@ const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie,
|
|
|
417
457
|
|
|
418
458
|
/// "run" the DWARF instructions and create the abstract PrologInfo for an FDE
|
|
419
459
|
template <typename A>
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
460
|
+
template <typename R>
|
|
461
|
+
bool CFI_Parser<A>::parseFDEInstructions(
|
|
462
|
+
A &addressSpace, const FDE_Info &fdeInfo, const CIE_Info &cieInfo,
|
|
463
|
+
typename R::link_hardened_reg_arg_t upToPC, int arch, PrologInfo *results) {
|
|
424
464
|
// Alloca is used for the allocation of the rememberStack entries. It removes
|
|
425
465
|
// the dependency on new/malloc but the below for loop can not be refactored
|
|
426
466
|
// into functions. Entry could be saved during the processing of a CIE and
|
|
@@ -433,11 +473,12 @@ bool CFI_Parser<A>::parseFDEInstructions(A &addressSpace,
|
|
|
433
473
|
pint_t pcoffset;
|
|
434
474
|
};
|
|
435
475
|
|
|
476
|
+
// zig patch: https://github.com/llvm/llvm-project/issues/194228
|
|
436
477
|
ParseInfo parseInfoArray[] = {
|
|
437
478
|
{cieInfo.cieInstructions, cieInfo.cieStart + cieInfo.cieLength,
|
|
438
479
|
(pint_t)(-1)},
|
|
439
480
|
{fdeInfo.fdeInstructions, fdeInfo.fdeStart + fdeInfo.fdeLength,
|
|
440
|
-
upToPC - fdeInfo.pcStart}};
|
|
481
|
+
static_cast<pint_t>(upToPC) - fdeInfo.pcStart}};
|
|
441
482
|
|
|
442
483
|
for (const auto &info : parseInfoArray) {
|
|
443
484
|
pint_t p = info.instructions;
|
|
@@ -808,12 +849,10 @@ bool CFI_Parser<A>::parseFDEInstructions(A &addressSpace,
|
|
|
808
849
|
results->savedRegisters[UNW_AARCH64_RA_SIGN_STATE].value ^ 0x3;
|
|
809
850
|
results->setRegisterValue(UNW_AARCH64_RA_SIGN_STATE, value,
|
|
810
851
|
initialState);
|
|
811
|
-
// When
|
|
812
|
-
//
|
|
813
|
-
//
|
|
814
|
-
|
|
815
|
-
// the PC value by 4 bytes to compensate.
|
|
816
|
-
results->ptrAuthDiversifier = fdeInfo.pcStart + codeOffset - 0x4;
|
|
852
|
+
// When using Feat_PAuthLR, the PC value needs to be captured so that
|
|
853
|
+
// during unwinding, the correct PC value is used for re-authentication.
|
|
854
|
+
// It is assumed that the CFI is placed before the signing instruction.
|
|
855
|
+
results->ptrAuthDiversifier = fdeInfo.pcStart + codeOffset;
|
|
817
856
|
_LIBUNWIND_TRACE_DWARF(
|
|
818
857
|
"DW_CFA_AARCH64_negate_ra_state_with_pc(pc=0x%" PRIx64 ")\n",
|
|
819
858
|
static_cast<uint64_t>(results->ptrAuthDiversifier));
|
|
@@ -37,8 +37,9 @@ public:
|
|
|
37
37
|
|
|
38
38
|
static bool decodeEHHdr(A &addressSpace, pint_t ehHdrStart, pint_t ehHdrEnd,
|
|
39
39
|
EHHeaderInfo &ehHdrInfo);
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
template <typename R>
|
|
41
|
+
static bool findFDE(A &addressSpace, typename R::link_hardened_reg_arg_t pc,
|
|
42
|
+
pint_t ehHdrStart, uint32_t sectionLength,
|
|
42
43
|
typename CFI_Parser<A>::FDE_Info *fdeInfo,
|
|
43
44
|
typename CFI_Parser<A>::CIE_Info *cieInfo);
|
|
44
45
|
|
|
@@ -112,8 +113,10 @@ bool EHHeaderParser<A>::decodeTableEntry(
|
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
template <typename A>
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
template <typename R>
|
|
117
|
+
bool EHHeaderParser<A>::findFDE(A &addressSpace,
|
|
118
|
+
typename R::link_hardened_reg_arg_t pc,
|
|
119
|
+
pint_t ehHdrStart, uint32_t sectionLength,
|
|
117
120
|
typename CFI_Parser<A>::FDE_Info *fdeInfo,
|
|
118
121
|
typename CFI_Parser<A>::CIE_Info *cieInfo) {
|
|
119
122
|
pint_t ehHdrEnd = ehHdrStart + sectionLength;
|
|
@@ -17,8 +17,13 @@
|
|
|
17
17
|
|
|
18
18
|
#include "config.h"
|
|
19
19
|
#include "libunwind.h"
|
|
20
|
+
#include "libunwind_ext.h"
|
|
20
21
|
#include "shadow_stack_unwind.h"
|
|
21
22
|
|
|
23
|
+
#if defined(_LIBUNWIND_HAVE_GETAUXVAL) || defined(_LIBUNWIND_HAVE_ELF_AUX_INFO)
|
|
24
|
+
#include <sys/auxv.h>
|
|
25
|
+
#endif
|
|
26
|
+
|
|
22
27
|
namespace libunwind {
|
|
23
28
|
|
|
24
29
|
// For emulating 128-bit registers
|
|
@@ -60,6 +65,10 @@ public:
|
|
|
60
65
|
Registers_x86();
|
|
61
66
|
Registers_x86(const void *registers);
|
|
62
67
|
|
|
68
|
+
typedef uint32_t reg_t;
|
|
69
|
+
typedef uint32_t link_reg_t;
|
|
70
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
71
|
+
|
|
63
72
|
bool validRegister(int num) const;
|
|
64
73
|
uint32_t getRegister(int num) const;
|
|
65
74
|
void setRegister(int num, uint32_t value);
|
|
@@ -278,6 +287,10 @@ public:
|
|
|
278
287
|
Registers_x86_64();
|
|
279
288
|
Registers_x86_64(const void *registers);
|
|
280
289
|
|
|
290
|
+
typedef uint64_t reg_t;
|
|
291
|
+
typedef uint64_t link_reg_t;
|
|
292
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
293
|
+
|
|
281
294
|
bool validRegister(int num) const;
|
|
282
295
|
uint64_t getRegister(int num) const;
|
|
283
296
|
void setRegister(int num, uint64_t value);
|
|
@@ -597,6 +610,10 @@ public:
|
|
|
597
610
|
Registers_ppc();
|
|
598
611
|
Registers_ppc(const void *registers);
|
|
599
612
|
|
|
613
|
+
typedef uint32_t reg_t;
|
|
614
|
+
typedef uint32_t link_reg_t;
|
|
615
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
616
|
+
|
|
600
617
|
bool validRegister(int num) const;
|
|
601
618
|
uint32_t getRegister(int num) const;
|
|
602
619
|
void setRegister(int num, uint32_t value);
|
|
@@ -1169,6 +1186,10 @@ public:
|
|
|
1169
1186
|
Registers_ppc64();
|
|
1170
1187
|
Registers_ppc64(const void *registers);
|
|
1171
1188
|
|
|
1189
|
+
typedef uint64_t reg_t;
|
|
1190
|
+
typedef uint64_t link_reg_t;
|
|
1191
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
1192
|
+
|
|
1172
1193
|
bool validRegister(int num) const;
|
|
1173
1194
|
uint64_t getRegister(int num) const;
|
|
1174
1195
|
void setRegister(int num, uint64_t value);
|
|
@@ -1814,7 +1835,9 @@ inline const char *Registers_ppc64::getRegisterName(int regNum) {
|
|
|
1814
1835
|
/// Registers_arm64 holds the register state of a thread in a 64-bit arm
|
|
1815
1836
|
/// process.
|
|
1816
1837
|
class _LIBUNWIND_HIDDEN Registers_arm64;
|
|
1817
|
-
extern "C"
|
|
1838
|
+
extern "C" int64_t __libunwind_Registers_arm64_za_disable();
|
|
1839
|
+
extern "C" void __libunwind_Registers_arm64_jumpto(Registers_arm64 *,
|
|
1840
|
+
unsigned walkedFrames);
|
|
1818
1841
|
|
|
1819
1842
|
#if defined(_LIBUNWIND_USE_GCS)
|
|
1820
1843
|
extern "C" void *__libunwind_shstk_get_jump_target() {
|
|
@@ -1824,8 +1847,21 @@ extern "C" void *__libunwind_shstk_get_jump_target() {
|
|
|
1824
1847
|
|
|
1825
1848
|
class _LIBUNWIND_HIDDEN Registers_arm64 {
|
|
1826
1849
|
public:
|
|
1827
|
-
Registers_arm64();
|
|
1850
|
+
Registers_arm64() = default;
|
|
1828
1851
|
Registers_arm64(const void *registers);
|
|
1852
|
+
Registers_arm64(const Registers_arm64 &);
|
|
1853
|
+
Registers_arm64 &operator=(const Registers_arm64 &);
|
|
1854
|
+
|
|
1855
|
+
typedef uint64_t reg_t;
|
|
1856
|
+
typedef uint64_t __ptrauth_unwind_registers_arm64_link_reg link_reg_t;
|
|
1857
|
+
|
|
1858
|
+
// Use `link_hardened_reg_arg_t` to pass values of `link_reg_t` type as
|
|
1859
|
+
// function arguments. We need to use a const l-value reference to keep
|
|
1860
|
+
// signature of `__ptrauth`-qualified values of `link_reg_t` type on AArch64
|
|
1861
|
+
// PAuth-enabled ABI intact. Passing the raw pointer by value would cause
|
|
1862
|
+
// authentication on the caller side and make the pointer prone to
|
|
1863
|
+
// substitution if spilled to the stack in the callee.
|
|
1864
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
1829
1865
|
|
|
1830
1866
|
bool validRegister(int num) const;
|
|
1831
1867
|
uint64_t getRegister(int num) const;
|
|
@@ -1837,7 +1873,14 @@ public:
|
|
|
1837
1873
|
v128 getVectorRegister(int num) const;
|
|
1838
1874
|
void setVectorRegister(int num, v128 value);
|
|
1839
1875
|
static const char *getRegisterName(int num);
|
|
1840
|
-
void jumpto(
|
|
1876
|
+
void jumpto(unsigned walkedFrames = 0) {
|
|
1877
|
+
zaDisable();
|
|
1878
|
+
__libunwind_Registers_arm64_jumpto(this, walkedFrames);
|
|
1879
|
+
}
|
|
1880
|
+
#ifdef _LIBUNWIND_TRACE_RET_INJECT
|
|
1881
|
+
_LIBUNWIND_TRACE_NO_INLINE
|
|
1882
|
+
void returnto(unsigned walkedFrames) { jumpto(walkedFrames); }
|
|
1883
|
+
#endif
|
|
1841
1884
|
static constexpr int lastDwarfRegNum() {
|
|
1842
1885
|
return _LIBUNWIND_HIGHEST_DWARF_REGISTER_ARM64;
|
|
1843
1886
|
}
|
|
@@ -1845,27 +1888,104 @@ public:
|
|
|
1845
1888
|
|
|
1846
1889
|
uint64_t getSP() const { return _registers.__sp; }
|
|
1847
1890
|
void setSP(uint64_t value) { _registers.__sp = value; }
|
|
1848
|
-
uint64_t getIP() const
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1891
|
+
uint64_t getIP() const {
|
|
1892
|
+
uint64_t value = _registers.__pc;
|
|
1893
|
+
#if defined(_LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING)
|
|
1894
|
+
// Note the value of the PC was signed to its address in the register state
|
|
1895
|
+
// but everyone else expects it to be sign by the SP, so convert on return.
|
|
1896
|
+
value = (uint64_t)ptrauth_auth_and_resign((void *)_registers.__pc,
|
|
1897
|
+
ptrauth_key_return_address,
|
|
1898
|
+
&_registers.__pc,
|
|
1899
|
+
ptrauth_key_return_address,
|
|
1900
|
+
getSP());
|
|
1901
|
+
#endif
|
|
1902
|
+
return value;
|
|
1903
|
+
}
|
|
1904
|
+
void setIP(uint64_t value) {
|
|
1905
|
+
#if defined(_LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING)
|
|
1906
|
+
// Note the value which was set should have been signed with the SP.
|
|
1907
|
+
// We then resign with the slot we are being stored in to so that both SP
|
|
1908
|
+
// and LR can't be spoofed at the same time.
|
|
1909
|
+
value = (uint64_t)ptrauth_auth_and_resign((void *)value,
|
|
1910
|
+
ptrauth_key_return_address,
|
|
1911
|
+
getSP(),
|
|
1912
|
+
ptrauth_key_return_address,
|
|
1913
|
+
&_registers.__pc);
|
|
1914
|
+
#endif
|
|
1915
|
+
_registers.__pc = value;
|
|
1916
|
+
}
|
|
1917
|
+
uint64_t getFP() const { return _registers.__fp; }
|
|
1918
|
+
void setFP(uint64_t value) { _registers.__fp = value; }
|
|
1919
|
+
|
|
1920
|
+
#if defined(_LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING)
|
|
1921
|
+
void
|
|
1922
|
+
loadAndAuthenticateLinkRegister(reg_t inplaceAuthedLinkRegister,
|
|
1923
|
+
link_reg_t *referenceAuthedLinkRegister) {
|
|
1924
|
+
// If we are in an arm64/arm64e frame, then the PC should have been signed
|
|
1925
|
+
// with the SP
|
|
1926
|
+
*referenceAuthedLinkRegister =
|
|
1927
|
+
(uint64_t)ptrauth_auth_data((void *)inplaceAuthedLinkRegister,
|
|
1928
|
+
ptrauth_key_return_address,
|
|
1929
|
+
_registers.__sp);
|
|
1930
|
+
}
|
|
1931
|
+
#endif
|
|
1852
1932
|
|
|
1853
1933
|
private:
|
|
1934
|
+
uint64_t lazyGetVG() const;
|
|
1935
|
+
|
|
1936
|
+
void zaDisable() const {
|
|
1937
|
+
if (!_misc_registers.__has_sme)
|
|
1938
|
+
return;
|
|
1939
|
+
if (__libunwind_Registers_arm64_za_disable() != 0)
|
|
1940
|
+
_LIBUNWIND_ABORT("SME ZA disable failed");
|
|
1941
|
+
}
|
|
1942
|
+
|
|
1943
|
+
#if defined(_LIBUNWIND_HAVE_GETAUXVAL)
|
|
1944
|
+
static bool checkHasSME() {
|
|
1945
|
+
constexpr int hwcap2_sme = (1 << 23);
|
|
1946
|
+
unsigned long hwcap2 = getauxval(AT_HWCAP2);
|
|
1947
|
+
return (hwcap2 & hwcap2_sme) != 0;
|
|
1948
|
+
}
|
|
1949
|
+
#elif defined(_LIBUNWIND_HAVE_ELF_AUX_INFO)
|
|
1950
|
+
static bool checkHasSME() {
|
|
1951
|
+
constexpr int hwcap2_sme = (1 << 23);
|
|
1952
|
+
unsigned long hwcap2 = 0;
|
|
1953
|
+
elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2));
|
|
1954
|
+
return (hwcap2 & hwcap2_sme) != 0;
|
|
1955
|
+
}
|
|
1956
|
+
#else
|
|
1957
|
+
static bool checkHasSME() {
|
|
1958
|
+
// TODO: Support other platforms.
|
|
1959
|
+
return false;
|
|
1960
|
+
}
|
|
1961
|
+
#endif
|
|
1962
|
+
|
|
1854
1963
|
struct GPRs {
|
|
1855
|
-
uint64_t __x[29];
|
|
1856
|
-
uint64_t __fp;
|
|
1857
|
-
uint64_t __lr;
|
|
1858
|
-
uint64_t __sp;
|
|
1859
|
-
uint64_t __pc;
|
|
1860
|
-
uint64_t __ra_sign_state; // RA sign state register
|
|
1964
|
+
uint64_t __x[29] = {}; // x0-x28
|
|
1965
|
+
uint64_t __fp = 0; // Frame pointer x29
|
|
1966
|
+
uint64_t __lr = 0; // Link register x30
|
|
1967
|
+
uint64_t __sp = 0; // Stack pointer x31
|
|
1968
|
+
uint64_t __pc = 0; // Program counter
|
|
1969
|
+
uint64_t __ra_sign_state = 0; // RA sign state register
|
|
1970
|
+
};
|
|
1971
|
+
|
|
1972
|
+
struct Misc {
|
|
1973
|
+
mutable uint32_t __vg = 0; // Vector Granule
|
|
1974
|
+
bool __has_sme = checkHasSME();
|
|
1861
1975
|
};
|
|
1862
1976
|
|
|
1863
|
-
GPRs
|
|
1864
|
-
double _vectorHalfRegisters[32];
|
|
1977
|
+
GPRs _registers = {};
|
|
1865
1978
|
// Currently only the lower double in 128-bit vectore registers
|
|
1866
1979
|
// is perserved during unwinding. We could define new register
|
|
1867
1980
|
// numbers (> 96) which mean whole vector registers, then this
|
|
1868
1981
|
// struct would need to change to contain whole vector registers.
|
|
1982
|
+
double _vectorHalfRegisters[32] = {};
|
|
1983
|
+
|
|
1984
|
+
// Miscellaneous/virtual registers. These are stored below the GPRs and FPRs
|
|
1985
|
+
// as they do not correspond to physical registers, so do not need to be
|
|
1986
|
+
// saved/restored in UnwindRegistersRestore.S and UnwindRegistersSave.S, and
|
|
1987
|
+
// we don't want to modify the existing offsets for GPRs and FPRs.
|
|
1988
|
+
Misc _misc_registers;
|
|
1869
1989
|
};
|
|
1870
1990
|
|
|
1871
1991
|
inline Registers_arm64::Registers_arm64(const void *registers) {
|
|
@@ -1877,11 +1997,31 @@ inline Registers_arm64::Registers_arm64(const void *registers) {
|
|
|
1877
1997
|
memcpy(_vectorHalfRegisters,
|
|
1878
1998
|
static_cast<const uint8_t *>(registers) + sizeof(GPRs),
|
|
1879
1999
|
sizeof(_vectorHalfRegisters));
|
|
2000
|
+
_misc_registers.__vg = 0;
|
|
2001
|
+
|
|
2002
|
+
#if defined(_LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING)
|
|
2003
|
+
// We have to do some pointer authentication fixups after this copy,
|
|
2004
|
+
// and as part of that we need to load the source pc without
|
|
2005
|
+
// authenticating so that we maintain the signature for the resigning
|
|
2006
|
+
// performed by setIP.
|
|
2007
|
+
uint64_t pcRegister = 0;
|
|
2008
|
+
memmove(&pcRegister, ((uint8_t *)&_registers) + offsetof(GPRs, __pc),
|
|
2009
|
+
sizeof(pcRegister));
|
|
2010
|
+
setIP(pcRegister);
|
|
2011
|
+
#endif
|
|
1880
2012
|
}
|
|
1881
2013
|
|
|
1882
|
-
inline Registers_arm64::Registers_arm64() {
|
|
1883
|
-
|
|
1884
|
-
|
|
2014
|
+
inline Registers_arm64::Registers_arm64(const Registers_arm64 &other) {
|
|
2015
|
+
*this = other;
|
|
2016
|
+
}
|
|
2017
|
+
|
|
2018
|
+
inline Registers_arm64 &
|
|
2019
|
+
Registers_arm64::operator=(const Registers_arm64 &other) {
|
|
2020
|
+
memmove(static_cast<void *>(this), &other, sizeof(*this));
|
|
2021
|
+
// We perform this step to ensure that we correctly authenticate and re-sign
|
|
2022
|
+
// the pc after the bitwise copy.
|
|
2023
|
+
setIP(other.getIP());
|
|
2024
|
+
return *this;
|
|
1885
2025
|
}
|
|
1886
2026
|
|
|
1887
2027
|
inline bool Registers_arm64::validRegister(int regNum) const {
|
|
@@ -1895,22 +2035,40 @@ inline bool Registers_arm64::validRegister(int regNum) const {
|
|
|
1895
2035
|
return false;
|
|
1896
2036
|
if (regNum == UNW_AARCH64_RA_SIGN_STATE)
|
|
1897
2037
|
return true;
|
|
2038
|
+
if (regNum == UNW_AARCH64_VG)
|
|
2039
|
+
return true;
|
|
1898
2040
|
if ((regNum > 32) && (regNum < 64))
|
|
1899
2041
|
return false;
|
|
1900
2042
|
return true;
|
|
1901
2043
|
}
|
|
1902
2044
|
|
|
2045
|
+
inline uint64_t Registers_arm64::lazyGetVG() const {
|
|
2046
|
+
if (!_misc_registers.__vg) {
|
|
2047
|
+
#if defined(__aarch64__)
|
|
2048
|
+
register uint64_t vg asm("x0");
|
|
2049
|
+
asm(".inst 0x04e0e3e0" // CNTD x0
|
|
2050
|
+
: "=r"(vg));
|
|
2051
|
+
_misc_registers.__vg = vg;
|
|
2052
|
+
#else
|
|
2053
|
+
_LIBUNWIND_ABORT("arm64 VG undefined");
|
|
2054
|
+
#endif
|
|
2055
|
+
}
|
|
2056
|
+
return _misc_registers.__vg;
|
|
2057
|
+
}
|
|
2058
|
+
|
|
1903
2059
|
inline uint64_t Registers_arm64::getRegister(int regNum) const {
|
|
1904
2060
|
if (regNum == UNW_REG_IP || regNum == UNW_AARCH64_PC)
|
|
1905
|
-
return
|
|
2061
|
+
return getIP();
|
|
1906
2062
|
if (regNum == UNW_REG_SP || regNum == UNW_AARCH64_SP)
|
|
1907
2063
|
return _registers.__sp;
|
|
1908
2064
|
if (regNum == UNW_AARCH64_RA_SIGN_STATE)
|
|
1909
2065
|
return _registers.__ra_sign_state;
|
|
1910
2066
|
if (regNum == UNW_AARCH64_FP)
|
|
1911
|
-
return
|
|
2067
|
+
return getFP();
|
|
1912
2068
|
if (regNum == UNW_AARCH64_LR)
|
|
1913
2069
|
return _registers.__lr;
|
|
2070
|
+
if (regNum == UNW_AARCH64_VG)
|
|
2071
|
+
return lazyGetVG();
|
|
1914
2072
|
if ((regNum >= 0) && (regNum < 29))
|
|
1915
2073
|
return _registers.__x[regNum];
|
|
1916
2074
|
_LIBUNWIND_ABORT("unsupported arm64 register");
|
|
@@ -1918,15 +2076,17 @@ inline uint64_t Registers_arm64::getRegister(int regNum) const {
|
|
|
1918
2076
|
|
|
1919
2077
|
inline void Registers_arm64::setRegister(int regNum, uint64_t value) {
|
|
1920
2078
|
if (regNum == UNW_REG_IP || regNum == UNW_AARCH64_PC)
|
|
1921
|
-
|
|
2079
|
+
setIP(value);
|
|
1922
2080
|
else if (regNum == UNW_REG_SP || regNum == UNW_AARCH64_SP)
|
|
1923
2081
|
_registers.__sp = value;
|
|
1924
2082
|
else if (regNum == UNW_AARCH64_RA_SIGN_STATE)
|
|
1925
2083
|
_registers.__ra_sign_state = value;
|
|
1926
2084
|
else if (regNum == UNW_AARCH64_FP)
|
|
1927
|
-
|
|
2085
|
+
setFP(value);
|
|
1928
2086
|
else if (regNum == UNW_AARCH64_LR)
|
|
1929
2087
|
_registers.__lr = value;
|
|
2088
|
+
else if (regNum == UNW_AARCH64_VG)
|
|
2089
|
+
_misc_registers.__vg = value;
|
|
1930
2090
|
else if ((regNum >= 0) && (regNum < 29))
|
|
1931
2091
|
_registers.__x[regNum] = value;
|
|
1932
2092
|
else
|
|
@@ -2116,6 +2276,10 @@ public:
|
|
|
2116
2276
|
Registers_arm();
|
|
2117
2277
|
Registers_arm(const void *registers);
|
|
2118
2278
|
|
|
2279
|
+
typedef uint32_t reg_t;
|
|
2280
|
+
typedef uint32_t link_reg_t;
|
|
2281
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
2282
|
+
|
|
2119
2283
|
bool validRegister(int num) const;
|
|
2120
2284
|
uint32_t getRegister(int num) const;
|
|
2121
2285
|
void setRegister(int num, uint32_t value);
|
|
@@ -2621,6 +2785,10 @@ public:
|
|
|
2621
2785
|
Registers_or1k();
|
|
2622
2786
|
Registers_or1k(const void *registers);
|
|
2623
2787
|
|
|
2788
|
+
typedef uint32_t reg_t;
|
|
2789
|
+
typedef uint32_t link_reg_t;
|
|
2790
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
2791
|
+
|
|
2624
2792
|
bool validRegister(int num) const;
|
|
2625
2793
|
uint32_t getRegister(int num) const;
|
|
2626
2794
|
void setRegister(int num, uint32_t value);
|
|
@@ -2820,6 +2988,10 @@ public:
|
|
|
2820
2988
|
Registers_mips_o32();
|
|
2821
2989
|
Registers_mips_o32(const void *registers);
|
|
2822
2990
|
|
|
2991
|
+
typedef uint32_t reg_t;
|
|
2992
|
+
typedef uint32_t link_reg_t;
|
|
2993
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
2994
|
+
|
|
2823
2995
|
bool validRegister(int num) const;
|
|
2824
2996
|
uint32_t getRegister(int num) const;
|
|
2825
2997
|
void setRegister(int num, uint32_t value);
|
|
@@ -3155,6 +3327,10 @@ public:
|
|
|
3155
3327
|
Registers_mips_newabi();
|
|
3156
3328
|
Registers_mips_newabi(const void *registers);
|
|
3157
3329
|
|
|
3330
|
+
typedef uint64_t reg_t;
|
|
3331
|
+
typedef uint64_t link_reg_t;
|
|
3332
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
3333
|
+
|
|
3158
3334
|
bool validRegister(int num) const;
|
|
3159
3335
|
uint64_t getRegister(int num) const;
|
|
3160
3336
|
void setRegister(int num, uint64_t value);
|
|
@@ -3458,6 +3634,10 @@ public:
|
|
|
3458
3634
|
Registers_sparc();
|
|
3459
3635
|
Registers_sparc(const void *registers);
|
|
3460
3636
|
|
|
3637
|
+
typedef uint32_t reg_t;
|
|
3638
|
+
typedef uint32_t link_reg_t;
|
|
3639
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
3640
|
+
|
|
3461
3641
|
bool validRegister(int num) const;
|
|
3462
3642
|
uint32_t getRegister(int num) const;
|
|
3463
3643
|
void setRegister(int num, uint32_t value);
|
|
@@ -3644,6 +3824,10 @@ public:
|
|
|
3644
3824
|
Registers_sparc64() = default;
|
|
3645
3825
|
Registers_sparc64(const void *registers);
|
|
3646
3826
|
|
|
3827
|
+
typedef uint64_t reg_t;
|
|
3828
|
+
typedef uint64_t link_reg_t;
|
|
3829
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
3830
|
+
|
|
3647
3831
|
bool validRegister(int num) const;
|
|
3648
3832
|
uint64_t getRegister(int num) const;
|
|
3649
3833
|
void setRegister(int num, uint64_t value);
|
|
@@ -3829,6 +4013,10 @@ public:
|
|
|
3829
4013
|
Registers_hexagon();
|
|
3830
4014
|
Registers_hexagon(const void *registers);
|
|
3831
4015
|
|
|
4016
|
+
typedef uint32_t reg_t;
|
|
4017
|
+
typedef uint32_t link_reg_t;
|
|
4018
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
4019
|
+
|
|
3832
4020
|
bool validRegister(int num) const;
|
|
3833
4021
|
uint32_t getRegister(int num) const;
|
|
3834
4022
|
void setRegister(int num, uint32_t value);
|
|
@@ -4044,6 +4232,10 @@ public:
|
|
|
4044
4232
|
Registers_riscv();
|
|
4045
4233
|
Registers_riscv(const void *registers);
|
|
4046
4234
|
|
|
4235
|
+
typedef ::libunwind::reg_t reg_t;
|
|
4236
|
+
typedef ::libunwind::reg_t link_reg_t;
|
|
4237
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
4238
|
+
|
|
4047
4239
|
bool validRegister(int num) const;
|
|
4048
4240
|
reg_t getRegister(int num) const;
|
|
4049
4241
|
void setRegister(int num, reg_t value);
|
|
@@ -4341,6 +4533,10 @@ public:
|
|
|
4341
4533
|
Registers_ve();
|
|
4342
4534
|
Registers_ve(const void *registers);
|
|
4343
4535
|
|
|
4536
|
+
typedef uint64_t reg_t;
|
|
4537
|
+
typedef uint64_t link_reg_t;
|
|
4538
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
4539
|
+
|
|
4344
4540
|
bool validRegister(int num) const;
|
|
4345
4541
|
uint64_t getRegister(int num) const;
|
|
4346
4542
|
void setRegister(int num, uint64_t value);
|
|
@@ -4784,6 +4980,10 @@ public:
|
|
|
4784
4980
|
Registers_s390x();
|
|
4785
4981
|
Registers_s390x(const void *registers);
|
|
4786
4982
|
|
|
4983
|
+
typedef uint64_t reg_t;
|
|
4984
|
+
typedef uint64_t link_reg_t;
|
|
4985
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
4986
|
+
|
|
4787
4987
|
bool validRegister(int num) const;
|
|
4788
4988
|
uint64_t getRegister(int num) const;
|
|
4789
4989
|
void setRegister(int num, uint64_t value);
|
|
@@ -5072,6 +5272,10 @@ public:
|
|
|
5072
5272
|
Registers_loongarch();
|
|
5073
5273
|
Registers_loongarch(const void *registers);
|
|
5074
5274
|
|
|
5275
|
+
typedef uint64_t reg_t;
|
|
5276
|
+
typedef uint64_t link_reg_t;
|
|
5277
|
+
typedef const link_reg_t &link_hardened_reg_arg_t;
|
|
5278
|
+
|
|
5075
5279
|
bool validRegister(int num) const;
|
|
5076
5280
|
uint64_t getRegister(int num) const;
|
|
5077
5281
|
void setRegister(int num, uint64_t value);
|
|
@@ -163,7 +163,7 @@ _GCC_specific_handler(PEXCEPTION_RECORD ms_exc, PVOID frame, PCONTEXT ms_ctx,
|
|
|
163
163
|
// If we were called by __libunwind_seh_personality(), indicate that
|
|
164
164
|
// a handler was found; otherwise, initiate phase 2 by unwinding.
|
|
165
165
|
if (ours && ms_exc->NumberParameters > 1)
|
|
166
|
-
return 4
|
|
166
|
+
return static_cast<EXCEPTION_DISPOSITION>(4);
|
|
167
167
|
// This should never happen in phase 2.
|
|
168
168
|
if (IS_UNWINDING(ms_exc->ExceptionFlags))
|
|
169
169
|
_LIBUNWIND_ABORT("Personality indicated exception handler in phase 2!");
|
|
@@ -182,7 +182,7 @@ _GCC_specific_handler(PEXCEPTION_RECORD ms_exc, PVOID frame, PCONTEXT ms_ctx,
|
|
|
182
182
|
// a handler was found; otherwise, it's time to initiate a collided
|
|
183
183
|
// unwind to the target.
|
|
184
184
|
if (ours && !IS_UNWINDING(ms_exc->ExceptionFlags) && ms_exc->NumberParameters > 1)
|
|
185
|
-
return 4
|
|
185
|
+
return static_cast<EXCEPTION_DISPOSITION>(4);
|
|
186
186
|
// This should never happen in phase 1.
|
|
187
187
|
if (!IS_UNWINDING(ms_exc->ExceptionFlags))
|
|
188
188
|
_LIBUNWIND_ABORT("Personality installed context during phase 1!");
|
|
@@ -259,13 +259,12 @@ __libunwind_seh_personality(int version, _Unwind_Action state,
|
|
|
259
259
|
(void *)disp_ctx->LanguageHandler, (void *)&ms_exc,
|
|
260
260
|
(void *)disp_ctx->EstablisherFrame,
|
|
261
261
|
(void *)disp_ctx->ContextRecord, (void *)disp_ctx);
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
disp_ctx);
|
|
262
|
+
int ms_act = static_cast<int>(
|
|
263
|
+
disp_ctx->LanguageHandler(&ms_exc, (PVOID)disp_ctx->EstablisherFrame,
|
|
264
|
+
disp_ctx->ContextRecord, disp_ctx));
|
|
266
265
|
_LIBUNWIND_TRACE_UNWINDING("__libunwind_seh_personality() LanguageHandler "
|
|
267
266
|
"returned %d",
|
|
268
|
-
|
|
267
|
+
ms_act);
|
|
269
268
|
switch (ms_act) {
|
|
270
269
|
case ExceptionContinueExecution: return _URC_END_OF_STACK;
|
|
271
270
|
case ExceptionContinueSearch: return _URC_CONTINUE_UNWIND;
|