diff options
author | Alon Zakai <azakai@google.com> | 2022-01-31 08:37:38 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-31 08:37:38 -0800 |
commit | c28f6cc1c93b282d1497e1e184ffba5efb782025 (patch) | |
tree | 288fc2da2d58cd11ae32c1a8d40e50d1c6064377 /test | |
parent | 098e02abadefe0e227c3c88a36e93d083ce004a8 (diff) | |
download | binaryen-c28f6cc1c93b282d1497e1e184ffba5efb782025.tar.gz binaryen-c28f6cc1c93b282d1497e1e184ffba5efb782025.tar.bz2 binaryen-c28f6cc1c93b282d1497e1e184ffba5efb782025.zip |
Interpreter: Remove GlobalManager (#4486)
GlobalManager is another class that added complexity in the interpreter logic,
and did not help. In fact it hurts extensibility, as when one wants to extend the
interpreter one has another class to customize, and it is templated on the main
runner, so again as #4479 we end up with annoying template cycles.
This simply removes that class. That makes the interpreter code strictly
simpler. Applying that change to wasm-ctor-eval also ends up fixing a
pre-existing bug, so this PR gets testing through that.
The ctor-eval issue was that we did not extend the GlobalManager properly
in the past: we checked for accesses on imported globals there, but not in
the main class, i.e., not on global.get operations. Needing to do things in
two places is an example of the previous complexity. The fix is simply to
implement visitGlobalGet in one place, and remove all the GlobalManager
logic added in ctor-eval, which then gets a lot simpler as well.
The new imported-global-2.wast checks for that bug (a global.get of an
import should stop us from evalling). Existing tests cover the other cases,
like it being ok to read a non-imported global, etc. The existing test
indirect-call3.wast required a slight change: There was a global.get of
an imported global, which was ignored in the place it happened (an init
of an elem segment); the new code checks all global.gets, so it now
catches that.
Diffstat (limited to 'test')
-rw-r--r-- | test/ctor-eval/imported-global-2.wast | 31 | ||||
-rw-r--r-- | test/ctor-eval/imported-global-2.wast.ctors | 1 | ||||
-rw-r--r-- | test/ctor-eval/imported-global-2.wast.out | 26 | ||||
-rw-r--r-- | test/ctor-eval/imported-global.wast | 1 | ||||
-rw-r--r-- | test/ctor-eval/indirect-call3.wast | 3 | ||||
-rw-r--r-- | test/ctor-eval/indirect-call3.wast.out | 1 |
6 files changed, 59 insertions, 4 deletions
diff --git a/test/ctor-eval/imported-global-2.wast b/test/ctor-eval/imported-global-2.wast new file mode 100644 index 000000000..e10dc7080 --- /dev/null +++ b/test/ctor-eval/imported-global-2.wast @@ -0,0 +1,31 @@ +(module + (memory 256 256) + + ;; imports must not be used + (import "env" "imported" (global $imported i32)) + + (func "test1" (result i32) + (local $temp i32) + + ;; this errors, and we never get to evalling the store after it + (local.set $temp + (global.get $imported) + ) + + (i32.store8 + (i32.const 13) + (i32.const 115) + ) + + (local.get $temp) + ) + + (func "keepalive" (result i32) + (drop + (i32.load + (i32.const 13) + ) + ) + (global.get $imported) + ) +) diff --git a/test/ctor-eval/imported-global-2.wast.ctors b/test/ctor-eval/imported-global-2.wast.ctors new file mode 100644 index 000000000..a5bce3fd2 --- /dev/null +++ b/test/ctor-eval/imported-global-2.wast.ctors @@ -0,0 +1 @@ +test1 diff --git a/test/ctor-eval/imported-global-2.wast.out b/test/ctor-eval/imported-global-2.wast.out new file mode 100644 index 000000000..ff71672a9 --- /dev/null +++ b/test/ctor-eval/imported-global-2.wast.out @@ -0,0 +1,26 @@ +(module + (type $none_=>_i32 (func (result i32))) + (import "env" "imported" (global $imported i32)) + (memory $0 256 256) + (export "test1" (func $0)) + (export "keepalive" (func $1)) + (func $0 (result i32) + (local $temp i32) + (local.set $temp + (global.get $imported) + ) + (i32.store8 + (i32.const 13) + (i32.const 115) + ) + (local.get $temp) + ) + (func $1 (result i32) + (drop + (i32.load + (i32.const 13) + ) + ) + (global.get $imported) + ) +) diff --git a/test/ctor-eval/imported-global.wast b/test/ctor-eval/imported-global.wast index 92fda3fa0..20e56d2d1 100644 --- a/test/ctor-eval/imported-global.wast +++ b/test/ctor-eval/imported-global.wast @@ -6,7 +6,6 @@ (export "test1" $test1) (global $mine (mut i32) (global.get $tempDoublePtr)) ;; BAD, if used (func $test1 - (drop (global.get $mine)) (i32.store8 (i32.const 13) (i32.const 115)) ;; we never get here. ) ) diff --git a/test/ctor-eval/indirect-call3.wast b/test/ctor-eval/indirect-call3.wast index 974ae7216..9c88e0f78 100644 --- a/test/ctor-eval/indirect-call3.wast +++ b/test/ctor-eval/indirect-call3.wast @@ -2,10 +2,9 @@ (type $v (func)) (memory 256 256) (data (i32.const 10) "waka waka waka waka waka") - (import "env" "tableBase" (global $tableBase i32)) (import "env" "_abort" (func $_abort)) (table 2 2 funcref) - (elem (global.get $tableBase) $_abort $call-indirect) + (elem (i32.const 0) $_abort $call-indirect) (export "test1" $test1) (func $test1 (call_indirect (type $v) (i32.const 1)) ;; safe to call diff --git a/test/ctor-eval/indirect-call3.wast.out b/test/ctor-eval/indirect-call3.wast.out index 10914bca7..1c98857a6 100644 --- a/test/ctor-eval/indirect-call3.wast.out +++ b/test/ctor-eval/indirect-call3.wast.out @@ -1,6 +1,5 @@ (module (type $v (func)) - (import "env" "tableBase" (global $tableBase i32)) (import "env" "_abort" (func $_abort)) (memory $0 256 256) (data (i32.const 10) "waka waka xaka waka waka\00\00\00\00\00\00C") |