authorgravatar for pat.github@tullmann.orgPat Tullmann <pat.github@tullmann.org> 2024-07-28 13:14:45-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-11-29 15:30:05-05:00
log5e1a83ad2975afdca4f3c9d11ace61fa5dad205a
treedbe969d38e964e3127ff4831363f01b7e08de780
parenta47aa9dd9d7f950427aacc360f1302e636234bc2

defaultPanic: @trap on 'other' target

The freestanding and other OS targets by default need to just @trap in the default Panic implementation. And `isValidMemory` won't work with freestanding or other targets. Update the unwind_freestanding.zig test case to also run on the 'other' OS target, too. This should keep the Zig's stacktrace generation from regressing on the standalone targets.

4 files changed, 9 insertions(+), 7 deletions(-)

lib/std/debug.zig+1-1
......@@ -480,7 +480,7 @@ pub fn defaultPanic(
480480 }
481481
482482 switch (builtin.os.tag) {
483 .freestanding => {
483 .freestanding, .other => {
484484 @trap();
485485 },
486486 .uefi => {
lib/std/debug/MemoryAccessor.zig+1-1
......@@ -80,7 +80,7 @@ pub fn load(ma: *MemoryAccessor, comptime Type: type, address: usize) ?Type {
8080
8181pub fn isValidMemory(address: usize) bool {
8282 // We are unable to determine validity of memory for freestanding targets
83 if (native_os == .freestanding or native_os == .uefi) return true;
83 if (native_os == .freestanding or native_os == .other or native_os == .uefi) return true;
8484
8585 const aligned_address = address & ~@as(usize, @intCast((page_size - 1)));
8686 if (aligned_address == 0) return false;
test/standalone/stack_iterator/build.zig+3-2
......@@ -113,13 +113,14 @@ pub fn build(b: *std.Build) void {
113113 // Unwinding without libc/posix
114114 //
115115 // No "getcontext" or "ucontext_t"
116 {
116 const no_os_targets = [_]std.Target.Os.Tag{ .freestanding, .other };
117 inline for (no_os_targets) |os_tag| {
117118 const exe = b.addExecutable(.{
118119 .name = "unwind_freestanding",
119120 .root_source_file = b.path("unwind_freestanding.zig"),
120121 .target = b.resolveTargetQuery(.{
121122 .cpu_arch = .x86_64,
122 .os_tag = .freestanding,
123 .os_tag = os_tag,
123124 }),
124125 .optimize = optimize,
125126 .unwind_tables = null,
test/standalone/stack_iterator/unwind_freestanding.zig+4-3
......@@ -36,7 +36,7 @@ noinline fn frame0(expected: *[4]usize, unwound: *[4]usize) void {
3636 frame1(expected, unwound);
3737}
3838
39// Freestanding entrypoint
39// No-OS entrypoint
4040export fn _start() callconv(.C) noreturn {
4141 var expected: [4]usize = undefined;
4242 var unwound: [4]usize = undefined;
......@@ -50,8 +50,9 @@ export fn _start() callconv(.C) noreturn {
5050 }
5151 }
5252
53 // Need to compile as "freestanding" to exercise the StackIterator code, but when run as a
54 // regression test need to actually exit. So assume we're running on x86_64-linux ...
53 // Need to compile with the target OS as "freestanding" or "other" to
54 // exercise the StackIterator code, but when run as a regression test
55 // need to actually exit. So assume we're running on x86_64-linux ...
5556 asm volatile (
5657 \\movl $60, %%eax
5758 \\syscall