aboutsummaryrefslogtreecommitdiff
path: root/lib/std/debug.zig
diff options
context:
space:
mode:
authorCarl Ã…stholm <carl@astholm.se>2025-03-23 13:12:45 +0100
committerAndrew Kelley <andrew@ziglang.org>2025-03-23 17:13:19 -0400
commitf45f9649e3fc2aa2b6a76476f2467f02ffc7d461 (patch)
tree4d10ac814ef9d7d7e9f06fffac796217336bfbc5 /lib/std/debug.zig
parent9f235a105b29c6f1c0c773f66c40e7ee655da559 (diff)
downloadzig-f45f9649e3fc2aa2b6a76476f2467f02ffc7d461.tar.gz
zig-f45f9649e3fc2aa2b6a76476f2467f02ffc7d461.zip
Lower `@returnAddress` to a constant 0 in Emscripten release builds
Emscripten currently implements `emscripten_return_address()` by calling out into JavaScript and parsing a stack trace, which introduces significant overhead that we would prefer to avoid in release builds. This is especially problematic for allocators because the generic parts of `std.mem.Allocator` make frequent use of `@returnAddress`, even though very few allocator implementations even observe the return address, which makes allocators nigh unusable for performance-critical applications like games if the compiler is unable to devirtualize the allocator calls.
Diffstat (limited to 'lib/std/debug.zig')
-rw-r--r--lib/std/debug.zig4
1 files changed, 3 insertions, 1 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
index 77b619a056..929ab69bf0 100644
--- a/lib/std/debug.zig
+++ b/lib/std/debug.zig
@@ -183,9 +183,11 @@ pub const sys_can_stack_trace = switch (builtin.cpu.arch) {
// `@returnAddress()` in LLVM 10 gives
// "Non-Emscripten WebAssembly hasn't implemented __builtin_return_address".
+ // On Emscripten, Zig only supports `@returnAddress()` in debug builds
+ // because Emscripten's implementation is very slow.
.wasm32,
.wasm64,
- => native_os == .emscripten,
+ => native_os == .emscripten and builtin.mode == .Debug,
// `@returnAddress()` is unsupported in LLVM 13.
.bpfel,