Skip to content

wasm linker fails to use bss section for undefined bytes #22502

@andrewrk

Description

@andrewrk

zig version: 0.14.0-dev.2790+d4fe4698d

Observe:

var foo: [1000]u8 = undefined;
pub fn main() void {
    foo[100] = 1;
}
zig build-exe test.zig -target wasm32-wasi -fno-llvm -fno-lld -OReleaseFast

Then look at test.wasm with wasm-objdump -x. There are pages and pages of aaaaaaa. This is OK for debug mode but for release modes, it should lower these as zeroes so that the binary can be smaller.

...
  - 10006a0: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 10006b0: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 10006c0: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 10006d0: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 10006e0: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 10006f0: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 1000700: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 1000710: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 1000720: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 1000730: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 1000740: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 1000750: aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa  ................
  - 1000760: aaaa aa                                  ...

Another thing to look into: even for debug builds, emit these the same as zero data, and use runtime memory initialization to memset the undef bytes to aa.

Metadata

Metadata

Assignees

No one assigned

    Labels

    arch-wasm32-bit and 64-bit WebAssemblyenhancementSolving this issue will likely involve adding new logic or components to the codebase.linkingoptimization

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions