Skip to content

Update our baseline and generic CPU models for WebAssembly #21818

Closed
@alexrp

Description

@alexrp

Currently, we use LLVM's generic model for both the generic and baseline models. LLVM's generic model for WebAssembly somewhat annoyingly represents a moving target that can change with any given LLVM version; it's basically just "what the major implementations support at this point in time". This makes it outright wrong as a generic model by our definition, but also a bad choice for a baseline model since our notion of "baseline" means wide compatibility, and that should clearly include more than just the major WebAssembly implementations. (An example of a problematic feature currently included in generic would be reference_types.)

So, the first order of business here should be to switch our generic model to LLVM's mvp model, which, as the name implies, targets a minimum viable WebAssembly implementation with no post-1.0 features. That can be done today while still mapping baseline to LLVM's generic.

Secondly, there is a WATC proposal to add a lime1 model to LLVM to address the problem of there not being a good baseline model:

The feature set proposed there seems to me to be a very reasonable one for a baseline model. So, if that proposal is accepted, I think we should switch our baseline for WebAssembly to lime1 after we update to LLVM 20.

This may involve a bit of work in wasm2c to add support for a couple of features. Note that neither LLVM nor our self-hosted backend make use of multivalue in the mvp ABI, so we don't actually need to support that in wasm2c. That only leaves relatively simple features like nontrapping_fptoint and extended_const.

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.standard libraryThis issue involves writing Zig code for the standard library.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions