Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fully support multiple returns in Wasmtime #2806

Merged
merged 16 commits into from
Apr 7, 2021

Commits on Apr 5, 2021

  1. Fully support multiple returns in Wasmtime

    For quite some time now Wasmtime has "supported" multiple return values,
    but only in the mose bare bones ways. Up until recently you couldn't get
    a typed version of functions with multiple return values, and never have
    you been able to use `Func::wrap` with functions that return multiple
    values. Even recently where `Func::typed` can call functions that return
    multiple values it uses a double-indirection by calling a trampoline
    which calls the real function.
    
    The underlying reason for this lack of support is that cranelift's ABI
    for returning multiple values is not possible to write in Rust. For
    example if a wasm function returns two `i32` values there is no Rust (or
    C!) function you can write to correspond to that. This commit, however
    fixes that.
    
    This commit adds two new ABIs to Cranelift: `WasmtimeSystemV` and
    `WasmtimeFastcall`. The intention is that these Wasmtime-specific ABIs
    match their corresponding ABI (e.g. `SystemV` or `WindowsFastcall`) for
    everything *except* how multiple values are returned. For multiple
    return values we simply define our own version of the ABI which Wasmtime
    implements, which is that for N return values the first is returned as
    if the function only returned that and the latter N-1 return values are
    returned via an out-ptr that's the last parameter to the function.
    
    These custom ABIs provides the ability for Wasmtime to bind these in
    Rust meaning that `Func::wrap` can now wrap functions that return
    multiple values and `Func::typed` no longer uses trampolines when
    calling functions that return multiple values. Although there's lots of
    internal changes there's no actual changes in the API surface area of
    Wasmtime, just a few more impls of more public traits which means that
    more types are supported in more places!
    
    Another change made with this PR is a consolidation of how the ABI of
    each function in a wasm module is selected. The native `SystemV` ABI,
    for example, is more efficient at returning multiple values than the
    wasmtime version of the ABI (since more things are in more registers).
    To continue to take advantage of this Wasmtime will now classify some
    functions in a wasm module with the "fast" ABI. Only functions that are
    not reachable externally from the module are classified with the fast
    ABI (e.g. those not exported, used in tables, or used with `ref.func`).
    This should enable purely internal functions of modules to have a faster
    calling convention than those which might be exposed to Wasmtime itself.
    
    Closes bytecodealliance#1178
    alexcrichton committed Apr 5, 2021
    Configuration menu
    Copy the full SHA
    81e96c0 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    ee18cbd View commit details
    Browse the repository at this point in the history
  3. "fix" lightbeam compile

    alexcrichton committed Apr 5, 2021
    Configuration menu
    Copy the full SHA
    7ae86d9 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    a676461 View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    97bf807 View commit details
    Browse the repository at this point in the history
  6. Configuration menu
    Copy the full SHA
    4f9dbb6 View commit details
    Browse the repository at this point in the history
  7. Attempt to fix arm64

    alexcrichton committed Apr 5, 2021
    Configuration menu
    Copy the full SHA
    f768433 View commit details
    Browse the repository at this point in the history
  8. Configuration menu
    Copy the full SHA
    386623b View commit details
    Browse the repository at this point in the history
  9. Configuration menu
    Copy the full SHA
    5445469 View commit details
    Browse the repository at this point in the history

Commits on Apr 6, 2021

  1. Don't always do 64-bit stores with cranelift

    This was overwriting upper bits when 32-bit registers were being stored
    into return values, so fix the code inline to do a sized store instead
    of one-size-fits-all store.
    alexcrichton committed Apr 6, 2021
    Configuration menu
    Copy the full SHA
    95f86be View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    51fe59a View commit details
    Browse the repository at this point in the history
  3. Fix a typo

    alexcrichton committed Apr 6, 2021
    Configuration menu
    Copy the full SHA
    1020005 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    5962d4c View commit details
    Browse the repository at this point in the history

Commits on Apr 7, 2021

  1. Configuration menu
    Copy the full SHA
    213613a View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    4a379c2 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    9dda311 View commit details
    Browse the repository at this point in the history