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

winch: Implement new trampolines #6358

Merged

Conversation

saulecabrera
Copy link
Member

@saulecabrera saulecabrera commented May 9, 2023

This change is a follow-up to
#6262, in which the new trampolines, described here, were introduced to Wasmtime.

This change, focuses on the array-to-wasm,
native-to-wasm and wasm-to-native trampolines to restore Winch's working state prior to the introduction of the new trampolines. It's worth noting that the new approach for trampolines make it easier to support the TypedFunc API in Winch. Prior to the introduction of the new trampolines, it was not obvious how to approach it.

This change also introduces a pinned register that will hold the VMContext pointer, which is loaded in the *-to-wasm trampolines; the VMContext register is a pre-requisite to this change to support the wasm-to-native trampolines.

Lastly, with the introduction of the VMContext register and the wasm-to-native trampolines, this change also introduces support for calling function imports, which is a variation of the already existing calls to locally defined functions.

The other notable piece of this change aside from the trampolines is winch-codegen's dependency on wasmtime-environ. Winch is so closely tied to the concepts exposed by the wasmtime crates that it makes sense to tie them together, even though the separation provides some advantages like easier testing in some cases, in the long run, there's probably going to be less need to test Winch in isolation and rather we'd rely more on integration style tests which require all of Wasmtime
pieces anyway (fuzzing, spec tests, etc).

This change doesn't update the existing implmenetation of winch_codegen::FuncEnv, but the intention is to update that part after this change.

@github-actions github-actions bot added the winch Winch issues or pull requests label May 9, 2023
@github-actions
Copy link

github-actions bot commented May 9, 2023

Subscribe to Label Action

cc @saulecabrera

This issue or pull request has been labeled: "winch"

Thus the following users have been cc'd because of the following labels:

  • saulecabrera: winch

To subscribe or unsubscribe from this label, edit the .github/subscribe-to-label.json configuration file.

Learn more.

Copy link
Member

@alexcrichton alexcrichton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

crates/winch/src/compiler.rs Outdated Show resolved Hide resolved
crates/winch/src/compiler.rs Outdated Show resolved Hide resolved
winch/environ/src/lib.rs Outdated Show resolved Hide resolved
winch/codegen/src/isa/x64/mod.rs Outdated Show resolved Hide resolved
winch/codegen/src/trampoline.rs Outdated Show resolved Hide resolved
winch/codegen/src/trampoline.rs Show resolved Hide resolved
@alexcrichton
Copy link
Member

Random thought about pinned registers -- while this isn't a problem for winch yet the final set of trampolines are the libcall trampolines which enter the runtime for instructions like memory.grow. These trampolines are still handwritten asm and don't come from Cranelift, and they don't handle anything about pinned registers and such at this time. Not to say they couldn't, just something to keep in mind.

@saulecabrera saulecabrera force-pushed the winch-array-wasm-trampoline branch 18 times, most recently from f3cf780 to becb391 Compare May 15, 2023 20:34
@saulecabrera
Copy link
Member Author

saulecabrera commented May 15, 2023

@alexcrichton I've addressed all of your comments; I think this is ready for another pass. I've opted to leave the translation between ptr_size <> ValType as a TODO for now.

Regarding your other comments, I've introduced wasmtime-environ as a dependency to winch-codegen as discussed during our last meeting, which allows for a direct usage of VMOffsets and FooIndex types across trampolines. After this PR lands, I'll update the other pre-existing code that uses winch_environ::FuncEnv.

@saulecabrera saulecabrera marked this pull request as ready for review May 15, 2023 20:37
@saulecabrera saulecabrera requested review from a team as code owners May 15, 2023 20:37
@saulecabrera saulecabrera requested review from cfallin and removed request for a team May 15, 2023 20:37
@saulecabrera
Copy link
Member Author

I'm not exactly sure why the MIRI check is failing.

@elliottt elliottt removed the request for review from a team May 15, 2023 21:35
@saulecabrera saulecabrera force-pushed the winch-array-wasm-trampoline branch 2 times, most recently from e0c7b64 to 5677405 Compare May 16, 2023 13:07
@saulecabrera
Copy link
Member Author

I'm not exactly sure why the MIRI check is failing.

I realized that all the other tests are ignoring miri, so I applied the same attribute to Winch's tests.

@saulecabrera saulecabrera force-pushed the winch-array-wasm-trampoline branch from 5677405 to f0e2850 Compare May 16, 2023 13:11
This change is a follow-up to
bytecodealliance#6262, in which the new
trampolines, described [here](https://github.com/bytecodealliance/rfcs/blob/main/accepted/tail-calls.md#new-trampolines-and-vmcallercheckedanyfunc-changes),
were introduced to Wasmtime.

This change, focuses on the `array-to-wasm`,
`native-to-wasm` and `wasm-to-native` trampolines to restore Winch's
working state prior to the introduction of the new trampolines. It's
worth noting that the new approach for trampolines make it easier to support
the `TypedFunc` API in Winch. Prior to the introduction of the new
trampolines, it was not obvious how to approach it.

This change also introduces a pinned register that will hold the
`VMContext` pointer, which is loaded in the `*-to-wasm`  trampolines;
the `VMContext`  register is a pre-requisite to this change to support
the `wasm-to-native` trampolines.

Lastly, with the introduction of the `VMContext` register and the
`wasm-to-native` trampolines, this change also introduces support for
calling function imports, which is a variation of the already existing
calls to locally defined functions.

The other notable piece of this change aside from the trampolines is
`winch-codegen`'s dependency on `wasmtime-environ`. Winch is so closely
tied to the concepts exposed by the wasmtime crates that it makes sense
to tie them together, even though the separation provides some
advantages like easier testing in some cases, in the long run, there's
probably going to be less need to test Winch in isolation and rather
we'd rely more on integration style tests which require all of Wasmtime
pieces anyway (fuzzing, spec tests, etc).

This change doesn't update the  existing implmenetation of
`winch_codegen::FuncEnv`, but the intention is to update that part after
this change.

prtest:full
@saulecabrera saulecabrera force-pushed the winch-array-wasm-trampoline branch from f0e2850 to e9fecc4 Compare May 16, 2023 13:58
Copy link
Member

@alexcrichton alexcrichton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me! @cfallin may want to also take a look at some of the assembly bits too though?

@saulecabrera saulecabrera requested a review from cfallin May 16, 2023 16:11
@saulecabrera saulecabrera force-pushed the winch-array-wasm-trampoline branch from 0fc38d5 to 0eff833 Compare May 16, 2023 16:16
@saulecabrera
Copy link
Member Author

saulecabrera commented May 16, 2023

Agreed; @cfallin, re-added you as a reviewer, let me know if you have any thoughts!

@cfallin
Copy link
Member

cfallin commented May 16, 2023

Agreed; @cfallin, re-added you as a reviewer, let me know if you have any thoughts!

Yep, I'll take a look now!

Copy link
Member

@cfallin cfallin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall this looks very reasonable -- no objections (and thanks Alex for doing the detailed review here)!

@saulecabrera saulecabrera added this pull request to the merge queue May 16, 2023
Merged via the queue into bytecodealliance:main with commit 20c5836 May 16, 2023
@saulecabrera saulecabrera deleted the winch-array-wasm-trampoline branch May 16, 2023 18:06
saulecabrera added a commit to saulecabrera/wasmtime that referenced this pull request May 17, 2023
This change is a follow-up to bytecodealliance#6358

This change implements the necessary stores of SP, FP and return address
for fast stack walking.
saulecabrera added a commit that referenced this pull request May 22, 2023
* winch(trampolines): Save SP, FP and return address

This change is a follow-up to #6358

This change implements the necessary stores of SP, FP and return address
for fast stack walking.

* Ignore backtrace test on Windows

Temporarily ignoring Winch's trap test on Windows while
support for unwind information is added.
saulecabrera added a commit to saulecabrera/wasmtime that referenced this pull request May 24, 2023
This commit is a small cleanup to drop the usage of the `FuncEnv` trait.

In bytecodealliance#6358, we agreed on
making `winch-codegen` directly depend on `wasmtime-environ`.

Introducing a direct relatioship between `winch-codegen` and
`wasmtime-environ` means that the `FuncEnv` trait is no longer serving
its original purpose, and we can drop the usage of the trait and use the
types exposed from `winch-codegen` directly instead.

Even though this change drops the `FuncEnv` trait, it still keeps
a `FuncEnv` struct, which is used during code generation.
saulecabrera added a commit to saulecabrera/wasmtime that referenced this pull request May 24, 2023
This commit is a small cleanup to drop the usage of the `FuncEnv` trait.

In bytecodealliance#6358, we agreed on
making `winch-codegen` directly depend on `wasmtime-environ`.

Introducing a direct relatioship between `winch-codegen` and
`wasmtime-environ` means that the `FuncEnv` trait is no longer serving
its original purpose, and we can drop the usage of the trait and use the
types exposed from `winch-codegen` directly instead.

Even though this change drops the `FuncEnv` trait, it still keeps
a `FuncEnv` struct, which is used during code generation.
saulecabrera added a commit to saulecabrera/wasmtime that referenced this pull request May 24, 2023
This commit is a small cleanup to drop the usage of the `FuncEnv` trait.

In bytecodealliance#6358, we agreed on
making `winch-codegen` directly depend on `wasmtime-environ`.

Introducing a direct relatioship between `winch-codegen` and
`wasmtime-environ` means that the `FuncEnv` trait is no longer serving
its original purpose, and we can drop the usage of the trait and use the
types exposed from `winch-codegen` directly instead.

Even though this change drops the `FuncEnv` trait, it still keeps
a `FuncEnv` struct, which is used during code generation.
saulecabrera added a commit that referenced this pull request May 24, 2023
This commit is a small cleanup to drop the usage of the `FuncEnv` trait.

In #6358, we agreed on
making `winch-codegen` directly depend on `wasmtime-environ`.

Introducing a direct relatioship between `winch-codegen` and
`wasmtime-environ` means that the `FuncEnv` trait is no longer serving
its original purpose, and we can drop the usage of the trait and use the
types exposed from `winch-codegen` directly instead.

Even though this change drops the `FuncEnv` trait, it still keeps
a `FuncEnv` struct, which is used during code generation.
salewski pushed a commit to salewski/wasmtime that referenced this pull request Jun 30, 2023
…6400)

This change is a follow-up to bytecodealliance#6358

This change implements the necessary stores of SP, FP and return address
for fast stack walking.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
winch Winch issues or pull requests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants