Skip to content

Commit

Permalink
defaultPanic: @trap on 'other' target
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
rootbeer authored and andrewrk committed Nov 29, 2024
1 parent a47aa9d commit 5e1a83a
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 7 deletions.
2 changes: 1 addition & 1 deletion lib/std/debug.zig
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,7 @@ pub fn defaultPanic(
}

switch (builtin.os.tag) {
.freestanding => {
.freestanding, .other => {
@trap();
},
.uefi => {
Expand Down
2 changes: 1 addition & 1 deletion lib/std/debug/MemoryAccessor.zig
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ pub fn load(ma: *MemoryAccessor, comptime Type: type, address: usize) ?Type {

pub fn isValidMemory(address: usize) bool {
// We are unable to determine validity of memory for freestanding targets
if (native_os == .freestanding or native_os == .uefi) return true;
if (native_os == .freestanding or native_os == .other or native_os == .uefi) return true;

const aligned_address = address & ~@as(usize, @intCast((page_size - 1)));
if (aligned_address == 0) return false;
Expand Down
5 changes: 3 additions & 2 deletions test/standalone/stack_iterator/build.zig
Original file line number Diff line number Diff line change
Expand Up @@ -113,13 +113,14 @@ pub fn build(b: *std.Build) void {
// Unwinding without libc/posix
//
// No "getcontext" or "ucontext_t"
{
const no_os_targets = [_]std.Target.Os.Tag{ .freestanding, .other };
inline for (no_os_targets) |os_tag| {
const exe = b.addExecutable(.{
.name = "unwind_freestanding",
.root_source_file = b.path("unwind_freestanding.zig"),
.target = b.resolveTargetQuery(.{
.cpu_arch = .x86_64,
.os_tag = .freestanding,
.os_tag = os_tag,
}),
.optimize = optimize,
.unwind_tables = null,
Expand Down
7 changes: 4 additions & 3 deletions test/standalone/stack_iterator/unwind_freestanding.zig
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ noinline fn frame0(expected: *[4]usize, unwound: *[4]usize) void {
frame1(expected, unwound);
}

// Freestanding entrypoint
// No-OS entrypoint

This comment has been minimized.

Copy link
@perillo

perillo Dec 1, 2024

Contributor

What is the reason why you replaced Freestanding with No-OS?

Do No-OS refers to https://wiki.analog.com/resources/no-os ?

Thanks.

This comment has been minimized.

Copy link
@alexrp

alexrp Dec 1, 2024

Member

It's just meant to encompass both freestanding and other. However, "no-OS" is technically inaccurate for that, because what sets other apart from freestanding is that it is a hosted environment - just one where the standard library doesn't know any details about it.

It would be nice if we could come up with an accurate umbrella term for these two tags.

export fn _start() callconv(.C) noreturn {
var expected: [4]usize = undefined;
var unwound: [4]usize = undefined;
Expand All @@ -50,8 +50,9 @@ export fn _start() callconv(.C) noreturn {
}
}

// Need to compile as "freestanding" to exercise the StackIterator code, but when run as a
// regression test need to actually exit. So assume we're running on x86_64-linux ...
// Need to compile with the target OS as "freestanding" or "other" to
// exercise the StackIterator code, but when run as a regression test
// need to actually exit. So assume we're running on x86_64-linux ...
asm volatile (
\\movl $60, %%eax
\\syscall
Expand Down

0 comments on commit 5e1a83a

Please sign in to comment.