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

Use multi-value with interface types #1764

Merged
merged 10 commits into from
Sep 16, 2019
Merged

Commits on Sep 11, 2019

  1. Update to walrus 0.12.0

    fitzgen committed Sep 11, 2019
    Configuration menu
    Copy the full SHA
    582b733 View commit details
    Browse the repository at this point in the history
  2. Introduce the multi-value-xform crate

    This crate provides a transformation to turn exported functions that use a
    return pointer into exported functions that use multi-value.
    
    Consider the following function:
    
    ```rust
    pub extern "C" fn pair(a: u32, b: u32) -> [u32; 2] {
        [a, b]
    }
    ```
    
    LLVM will by default compile this down into the following Wasm:
    
    ```wasm
    (func $pair (param i32 i32 i32)
      local.get 0
      local.get 2
      i32.store offset=4
      local.get 0
      local.get 1
      i32.store)
    ```
    
    What's happening here is that the function is not directly returning the
    pair at all, but instead the first `i32` parameter is a pointer to some
    scratch space, and the return value is written into the scratch space. LLVM
    does this because it doesn't yet have support for multi-value Wasm, and so
    it only knows how to return a single value at a time.
    
    Ideally, with multi-value, what we would like instead is this:
    
    ```wasm
    (func $pair (param i32 i32) (result i32 i32)
      local.get 0
      local.get 1)
    ```
    
    However, that's not what this transformation does at the moment. This
    transformation is a little simpler than mutating existing functions to
    produce a multi-value result, instead it introduces new functions that wrap
    the original function and translate the return pointer to multi-value
    results in this wrapper function.
    
    With our running example, we end up with this:
    
    ```wasm
    ;; The original function.
    (func $pair (param i32 i32 i32)
      local.get 0
      local.get 2
      i32.store offset=4
      local.get 0
      local.get 1
      i32.store)
    
    (func $pairWrapper (param i32 i32) (result i32 i32)
      ;; Our return pointer that points to the scratch space we are allocating
      ;; on the shadow stack for calling `$pair`.
      (local i32)
    
      ;; Allocate space on the shadow stack for the result.
      global.get $shadowStackPointer
      i32.const 8
      i32.sub
      local.tee 2
      global.set $shadowStackPointer
    
      ;; Call `$pair` with our allocated shadow stack space for its results.
      local.get 2
      local.get 0
      local.get 1
      call $pair
    
      ;; Copy the return values from the shadow stack to the wasm stack.
      local.get 2
      i32.load
      local.get 2 offset=4
      i32.load
    
      ;; Finally, restore the shadow stack pointer.
      local.get 2
      i32.const 8
      i32.add
      global.set $shadowStackPointer)
    ```
    
    This `$pairWrapper` function is what we actually end up exporting instead of
    `$pair`.
    fitzgen committed Sep 11, 2019
    Configuration menu
    Copy the full SHA
    44c3f8a View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    fc2c502 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    5f90951 View commit details
    Browse the repository at this point in the history
  5. cli-support: cargo fmt

    fitzgen committed Sep 11, 2019
    Configuration menu
    Copy the full SHA
    908fc61 View commit details
    Browse the repository at this point in the history
  6. Configuration menu
    Copy the full SHA
    68af85d View commit details
    Browse the repository at this point in the history

Commits on Sep 16, 2019

  1. Create the wasm-bindgen-wasm-conventions crate

    This tiny crate provides utilities for working with Wasm codegen
    conventions (typically established by LLVM or lld) such as getting the shadow
    stack pointer.
    
    It also de-duplicates all the places in the codebase where we were implementing
    these conventions in one-off ways.
    fitzgen committed Sep 16, 2019
    Configuration menu
    Copy the full SHA
    2fbb835 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    d9c4164 View commit details
    Browse the repository at this point in the history
  3. rustfmt the publish script

    fitzgen committed Sep 16, 2019
    Configuration menu
    Copy the full SHA
    a0582cd View commit details
    Browse the repository at this point in the history
  4. CI: Temporarily disable sccache usage

    It is failing to install / setup on CI.
    fitzgen committed Sep 16, 2019
    Configuration menu
    Copy the full SHA
    b2d1165 View commit details
    Browse the repository at this point in the history