diff options
| author | Carl Ã…stholm <carl@astholm.se> | 2025-03-23 13:12:45 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-03-23 17:13:19 -0400 |
| commit | f45f9649e3fc2aa2b6a76476f2467f02ffc7d461 (patch) | |
| tree | 4d10ac814ef9d7d7e9f06fffac796217336bfbc5 /lib/std/debug.zig | |
| parent | 9f235a105b29c6f1c0c773f66c40e7ee655da559 (diff) | |
| download | zig-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.zig | 4 |
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, |
