authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-09-11 13:32:15+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-09-30 13:44:53+01:00
log02a0ade138c035a7d45bd1ed26fe49dfec2942d2
tree6cfe8918c2ebf221f557249d639d074d00c29966
parent4e45362529e05ba1be44fab48bc3469f5bb6492d
signaturelock-open Commit is signed but in an unrecognized format.

std.debug: never attempt FP unwind under fomit-frame-pointer


1 files changed, 6 insertions(+), 2 deletions(-)

lib/std/debug.zig+6-2
......@@ -815,13 +815,17 @@ const StackIterator = union(enum) {
815815
816816 /// On aarch64-macos, Apple mandate that the frame pointer is always used.
817817 /// TODO: are there any other architectures with guarantees like this?
818 const fp_unwind_is_safe = !builtin.omit_frame_pointer and builtin.cpu.arch == .aarch64 and builtin.os.tag.isDarwin();
818 const fp_unwind_is_safe = builtin.cpu.arch == .aarch64 and builtin.os.tag.isDarwin();
819819
820820 /// Whether the current unwind strategy is allowed given `allow_unsafe`.
821821 fn stratOk(it: *const StackIterator, allow_unsafe: bool) bool {
822822 return switch (it.*) {
823823 .di => true,
824 .fp => allow_unsafe or fp_unwind_is_safe,
824 // If we omitted frame pointers from *this* compilation, FP unwinding would crash
825 // immediately regardless of anything. But FPs could also be omitted from a different
826 // linked object, so it's not guaranteed to be safe, unless the target specifically
827 // requires it.
828 .fp => !builtin.omit_frame_pointer and (fp_unwind_is_safe or allow_unsafe),
825829 };
826830 }
827831