aboutsummaryrefslogtreecommitdiff
path: root/lib/std/debug.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-04-17 19:41:05 +0200
committerLuuk de Gram <luuk@degram.dev>2022-04-19 19:58:49 +0200
commitbe08d2bdbd2f64ccb9ef0f985a57a4bf89b9aebb (patch)
tree727d36adc443701b6aa8221797dc082f3670a290 /lib/std/debug.zig
parent2193f7c4a2b56f67bf07d27c3f715cf3969c392f (diff)
downloadzig-be08d2bdbd2f64ccb9ef0f985a57a4bf89b9aebb.tar.gz
zig-be08d2bdbd2f64ccb9ef0f985a57a4bf89b9aebb.zip
wasm: Fix unreachable paths
When the last instruction is a debug instruction, the type of it is void. Similarly for 'noreturn' emit an 'unreachable' instruction to tell the wasm-validator the path cannot be reached. Also respect the '--strip' flag in the self-hosted wasm linker and not emit a 'name' section when the flag is set to `true`.
Diffstat (limited to 'lib/std/debug.zig')
-rw-r--r--lib/std/debug.zig36
1 files changed, 34 insertions, 2 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
index 6a0d4dac93..b600f7245a 100644
--- a/lib/std/debug.zig
+++ b/lib/std/debug.zig
@@ -113,11 +113,14 @@ pub fn detectTTYConfig() TTY.Config {
/// TODO multithreaded awareness
pub fn dumpCurrentStackTrace(start_addr: ?usize) void {
nosuspend {
- const stderr = io.getStdErr().writer();
if (comptime builtin.target.isWasm()) {
- stderr.print("Unable to dump stack trace: not implemented for Wasm\n", .{}) catch return;
+ if (native_os == .wasi) {
+ const stderr = io.getStdErr().writer();
+ stderr.print("Unable to dump stack trace: not implemented for Wasm\n", .{}) catch return;
+ }
return;
}
+ const stderr = io.getStdErr().writer();
if (builtin.strip_debug_info) {
stderr.print("Unable to dump stack trace: debug info stripped\n", .{}) catch return;
return;
@@ -138,6 +141,13 @@ pub fn dumpCurrentStackTrace(start_addr: ?usize) void {
/// TODO multithreaded awareness
pub fn dumpStackTraceFromBase(bp: usize, ip: usize) void {
nosuspend {
+ if (comptime builtin.target.isWasm()) {
+ if (native_os == .wasi) {
+ const stderr = io.getStdErr().writer();
+ stderr.print("Unable to dump stack trace: not implemented for Wasm\n", .{}) catch return;
+ }
+ return;
+ }
const stderr = io.getStdErr().writer();
if (builtin.strip_debug_info) {
stderr.print("Unable to dump stack trace: debug info stripped\n", .{}) catch return;
@@ -208,6 +218,13 @@ pub fn captureStackTrace(first_address: ?usize, stack_trace: *std.builtin.StackT
/// TODO multithreaded awareness
pub fn dumpStackTrace(stack_trace: std.builtin.StackTrace) void {
nosuspend {
+ if (comptime builtin.target.isWasm()) {
+ if (native_os == .wasi) {
+ const stderr = io.getStdErr().writer();
+ stderr.print("Unable to dump stack trace: not implemented for Wasm\n", .{}) catch return;
+ }
+ return;
+ }
const stderr = io.getStdErr().writer();
if (builtin.strip_debug_info) {
stderr.print("Unable to dump stack trace: debug info stripped\n", .{}) catch return;
@@ -1138,6 +1155,8 @@ pub const DebugInfo = struct {
return self.lookupModuleWin32(address);
} else if (native_os == .haiku) {
return self.lookupModuleHaiku(address);
+ } else if (comptime builtin.target.isWasm()) {
+ return self.lookupModuleWasm(address);
} else {
return self.lookupModuleDl(address);
}
@@ -1353,6 +1372,12 @@ pub const DebugInfo = struct {
_ = address;
@panic("TODO implement lookup module for Haiku");
}
+
+ fn lookupModuleWasm(self: *DebugInfo, address: usize) !*ModuleDebugInfo {
+ _ = self;
+ _ = address;
+ @panic("TODO implement lookup module for Wasm");
+ }
};
pub const ModuleDebugInfo = switch (native_os) {
@@ -1632,6 +1657,13 @@ pub const ModuleDebugInfo = switch (native_os) {
return getSymbolFromDwarf(relocated_address, &self.dwarf);
}
},
+ .wasi => struct {
+ pub fn getSymbolAtAddress(self: *@This(), address: usize) !SymbolInfo {
+ _ = self;
+ _ = address;
+ return SymbolInfo{};
+ }
+ },
else => DW.DwarfInfo,
};