alexcrichton requested abrown for a review on PR #9651.
alexcrichton opened PR #9651 from alexcrichton:backend-intrinsics
to bytecodealliance:main
:
This commit is an initial stab at implementing interpreter-to-host communication in Pulley. The basic problem is that Pulley needs the ability to call back into Wasmtime to implement tasks such as
memory.grow
, imported functions, etc. For native platforms this is a simplecall_indirect
operation in Cranelift but the story for Pulley must be different because it's effectively switching from interpreted code to native code.The solution I've ended up settling on looks pretty similar to native platforms but with a few important tweaks:
- A new
call_indirect_host
opcode is added to Pulley.
- Function signatures that can be called from Pulley bytecode are statically enumerated at build-time.
- This enables the implementation of
call_indirect_host
to take an immediate of which signature is being used and cast the function pointer to the right type.- A new "backend intrinsic" concept is added to Cranelift.
- This is a new variant of
ExternalName
.- The intention is that this has backend-specific meaning.
- For Pulley, this means that the Nth function signature is being called.
- Code generation for Pulley in
wasmtime-cranelift
now has Pulley-specific handling of the wasm-to-host transition where all previouscall_indirect
instructions are replaced with a call to a "backend intrinsic" which gets lowered to acall_indirect_host
.Note that most of this still isn't hooked up everywhere in Wasmtime. That means that the testing here is pretty light at this time. It'll require a fair bit more work to get everything fully integrated from Wasmtime in Pulley. This is expected to be one of the significant remaining chunks of work and should help unblock future testing (or make those diffs smaller ideally).
<!--
Please make sure you include the following information:
If this work has been discussed elsewhere, please include a link to that
conversation. If it was discussed in an issue, just mention "issue #...".Explain why this change is needed. If the details are in an issue already,
this can be brief.Our development process is documented in the Wasmtime book:
https://docs.wasmtime.dev/contributing-development-process.htmlPlease ensure all communication follows the code of conduct:
https://github.com/bytecodealliance/wasmtime/blob/main/CODE_OF_CONDUCT.md
-->
alexcrichton requested wasmtime-compiler-reviewers for a review on PR #9651.
alexcrichton requested pchickey for a review on PR #9651.
alexcrichton requested wasmtime-core-reviewers for a review on PR #9651.
alexcrichton requested wasmtime-default-reviewers for a review on PR #9651.
alexcrichton updated PR #9651.
alexcrichton commented on PR #9651:
cc @cfallin as you're also no doubt interested in this as well
cfallin submitted PR review:
LGTM on the Cranelift bits -- happy to dive deeper into the Pulley and Wasmtime bits too if you'd like but I'm not as deep into that context at the moment.
cfallin created PR review comment:
tiny preference nit but could we call this
intrinsic{i}
?backend{i}
makes me think it's the name of a backend or something like that
cfallin created PR review comment:
s/are use to/are used to/
alexcrichton updated PR #9651.
github-actions[bot] commented on PR #9651:
Subscribe to Label Action
cc @fitzgen
<details>
This issue or pull request has been labeled: "cranelift", "cranelift:module", "pulley"Thus the following users have been cc'd because of the following labels:
- fitzgen: pulley
To subscribe or unsubscribe from this label, edit the <code>.github/subscribe-to-label.json</code> configuration file.
Learn more.
</details>
Instead of adding a whole new instruction, would it be possible to use a UserExternalName with a reserved namespace like
u32::MAX
? Or the Pulley interpreter could have a set of UserExternalName for which to call the specified host function without reserving any namespace.
Last updated: Nov 22 2024 at 16:03 UTC