Stream: git-wasmtime

Topic: wasmtime / PR #2763 Handle `srem` properly when `avoid_di...


view this post on Zulip Wasmtime GitHub notifications bot (Mar 25 2021 at 05:27):

cfallin opened PR #2763 from fix-srem-trap to main:

The codegen for div/rem ops has two modes, depending on the
avoid_div_traps flag: it can either do all checks for trapping
conditions explicitly, and use explicit trap instructions, then use a
hardware divide instruction that will not trap (avoid_div_traps == true); or it can run in a mode where a hardware FP fault on the divide
instruction implies a Wasm trap (avoid_div_traps == false). Wasmtime
uses the former while Lucet (for example) uses the latter.

It turns out that because we run all our spec tests run under Wasmtime,
we missed a spec corner case that fails in the latter: INT_MIN % -1 == 0
per the spec, but causes a trap with the x86 signed divide/remainder
instruction. Hence, in Lucet, this specific remainder computation would
incorrectly result in a Wasm trap.

This PR fixes the issue by just forcing use of the explicit-checks
implementation for srem even when avoid_div_traps is false.

<!--

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 (Mar 25 2021 at 05:27):

cfallin requested bnjbvr for a review on PR #2763.

view this post on Zulip Wasmtime GitHub notifications bot (Mar 25 2021 at 05:27):

cfallin edited PR #2763 from fix-srem-trap to main:

The codegen for div/rem ops has two modes, depending on the
avoid_div_traps flag: it can either do all checks for trapping
conditions explicitly, and use explicit trap instructions, then use a
hardware divide instruction that will not trap (avoid_div_traps == true);
or it can run in a mode where a hardware FP fault on the divide
instruction implies a Wasm trap (avoid_div_traps == false). Wasmtime
uses the former while Lucet (for example) uses the latter.

It turns out that because we run all our spec tests run under Wasmtime,
we missed a spec corner case that fails in the latter: INT_MIN % -1 == 0
per the spec, but causes a trap with the x86 signed divide/remainder
instruction. Hence, in Lucet, this specific remainder computation would
incorrectly result in a Wasm trap.

This PR fixes the issue by just forcing use of the explicit-checks
implementation for srem even when avoid_div_traps is false.

<!--

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 (Mar 25 2021 at 05:33):

cfallin updated PR #2763 from fix-srem-trap to main.

view this post on Zulip Wasmtime GitHub notifications bot (Mar 25 2021 at 06:42):

bnjbvr submitted PR Review.

view this post on Zulip Wasmtime GitHub notifications bot (Mar 25 2021 at 06:58):

cfallin merged PR #2763.


Last updated: Oct 23 2024 at 20:03 UTC