Skip to content

Commit

Permalink
Module: keep frame pointer in ReleaseSmall on x86
Browse files Browse the repository at this point in the history
On x86 and x86_64 keeping the frame pointer usually reduces binary size, even for simple programs:

```
~$ cat x.zig
pub fn main() void {
    @import("std").debug.print("hello", .{});
}
~$ zig build-exe x.zig -target x86_64-linux -OReleaseSmall -fno-omit-frame-pointer && wc -c x
5168 x
~$ zig build-exe x.zig -target x86_64-linux -OReleaseSmall -fomit-frame-pointer && wc -c x
5216 x
```
```
~$ cat x.zig
pub fn main() void {
    @import("std").debug.print("hello", .{});
}
~$ zig build-exe x.zig -target x86-linux -OReleaseSmall -fno-omit-frame-pointer && wc -c x
3400 x
~$ zig build-exe x.zig -target x86-linux -OReleaseSmall -fomit-frame-pointer && wc -c x
3556 x
```

A bigger benchmark is the Zig compiler:

With no changes to anything on master branch:
```
$ zig build -Dno-lib -Dno-langref --zig-lib-dir lib -Doptimize=ReleaseSmall
$ wc -c zig-out/bin/zig
10698792 zig-out/bin/zig
```
Adding `.omit_frame_pointer = false` in `addCompilerStep` in `build.zig`:
```
$ zig build -Dno-lib -Dno-langref --zig-lib-dir lib -Doptimize=ReleaseSmall
$ wc -c zig-out/bin/zig
10155744 zig-out/bin/zig
```
  • Loading branch information
wooster0 authored and alexrp committed Dec 19, 2024
1 parent e2e3633 commit 0ff0bdb
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/Package/Module.zig
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,12 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
const omit_frame_pointer = b: {
if (options.inherited.omit_frame_pointer) |x| break :b x;
if (options.parent) |p| break :b p.omit_frame_pointer;
if (optimize_mode == .ReleaseSmall) break :b true;
if (optimize_mode == .ReleaseSmall) {
// On x86, in most cases, keeping the frame pointer usually results in smaller binary size.
// This has to do with how instructions for memory access via the stack base pointer register (when keeping the frame pointer)
// are smaller than instructions for memory access via the stack pointer register (when omitting the frame pointer).
break :b !target.cpu.arch.isX86();
}
break :b false;
};

Expand Down

0 comments on commit 0ff0bdb

Please sign in to comment.