Stream: git-wasmtime

Topic: wasmtime / PR #5029 Cherry-pick to 2.0 release branch: "F...


view this post on Zulip Wasmtime GitHub notifications bot (Oct 07 2022 at 00:17):

cfallin requested elliottt for a review on PR #5029.

view this post on Zulip Wasmtime GitHub notifications bot (Oct 07 2022 at 00:17):

cfallin opened PR #5029 from cherrypick-2.0.0-pr5023 to release-2.0.0:

The legalization of StructReturn was causing issues in the new call-handling code: the StructReturn ret was included in the SigData as if it were an actual CLIF-level return value, but it is not.

Prior to using regalloc constraints for return values, we unconditionally included rax (or the architecture's usual return register) as a def, so it would be properly handled as "clobbered" by the regalloc. With the new scheme, we include defs on the call only for CLIF-level outputs. Callees with StructReturn args were thus not known to clobber the return-value register, and values might be corrupted.

This PR updates the code to include a StructReturn ret as a clobber rather than a returned value in the relevant spots. I observed it causing saves/restores of rax in some CLIF that @bjorn3 provided me, but I was having difficulty minimizing this into a test-case that I would be comfortable including as a precise-output case (including the whole thing verbatim would lock down a bunch of other irrelevant details and cause test-update noise later). If we can find a more minimized example I'm happy to include it as a filetest.

<!--

Please ensure that the following steps are all taken care of before submitting
the PR.

Please ensure all communication adheres to the code of conduct.
-->

view this post on Zulip Wasmtime GitHub notifications bot (Oct 07 2022 at 00:18):

cfallin edited PR #5029 from cherrypick-2.0.0-pr5023 to release-2.0.0:

The legalization of StructReturn was causing issues in the new call-handling code: the StructReturn ret was included in the SigData as if it were an actual CLIF-level return value, but it is not.

Prior to using regalloc constraints for return values, we unconditionally included rax (or the architecture's usual return register) as a def, so it would be properly handled as "clobbered" by the regalloc. With the new scheme, we include defs on the call only for CLIF-level outputs. Callees with StructReturn args were thus not known to clobber the return-value register, and values might be corrupted.

This PR updates the code to include a StructReturn ret as a clobber rather than a returned value in the relevant spots. I observed it causing saves/restores of rax in some CLIF that @bjorn3 provided me, but I was having difficulty minimizing this into a test-case that I would be comfortable including as a precise-output case (including the whole thing verbatim would lock down a bunch of other irrelevant details and cause test-update noise later). If we can find a more minimized example I'm happy to include it as a filetest.

<!--

Please ensure that the following steps are all taken care of before submitting
the PR.

Please ensure all communication adheres to the code of conduct.
-->

view this post on Zulip Wasmtime GitHub notifications bot (Oct 07 2022 at 00:21):

elliottt submitted PR review.

view this post on Zulip Wasmtime GitHub notifications bot (Oct 07 2022 at 02:41):

cfallin updated PR #5029 from cherrypick-2.0.0-pr5023 to release-2.0.0.

view this post on Zulip Wasmtime GitHub notifications bot (Oct 07 2022 at 04:37):

cfallin merged PR #5029.


Last updated: Dec 23 2024 at 12:05 UTC