| ;; Test the data section | |
| ;; Syntax | |
| (module | |
| (memory $m 1) | |
| (data (i32.const 0)) | |
| (data (i32.const 1) "a" "" "bcd") | |
| (data (offset (i32.const 0))) | |
| (data (offset (i32.const 0)) "" "a" "bc" "") | |
| (data (memory 0) (i32.const 0)) | |
| (data (memory 0x0) (i32.const 1) "a" "" "bcd") | |
| (data (memory 0x000) (offset (i32.const 0))) | |
| (data (memory 0) (offset (i32.const 0)) "" "a" "bc" "") | |
| (data (memory $m) (i32.const 0)) | |
| (data (memory $m) (i32.const 1) "a" "" "bcd") | |
| (data (memory $m) (offset (i32.const 0))) | |
| (data (memory $m) (offset (i32.const 0)) "" "a" "bc" "") | |
| (data $d1 (i32.const 0)) | |
| (data $d2 (i32.const 1) "a" "" "bcd") | |
| (data $d3 (offset (i32.const 0))) | |
| (data $d4 (offset (i32.const 0)) "" "a" "bc" "") | |
| (data $d5 (memory 0) (i32.const 0)) | |
| (data $d6 (memory 0x0) (i32.const 1) "a" "" "bcd") | |
| (data $d7 (memory 0x000) (offset (i32.const 0))) | |
| (data $d8 (memory 0) (offset (i32.const 0)) "" "a" "bc" "") | |
| (data $d9 (memory $m) (i32.const 0)) | |
| (data $d10 (memory $m) (i32.const 1) "a" "" "bcd") | |
| (data $d11 (memory $m) (offset (i32.const 0))) | |
| (data $d12 (memory $m) (offset (i32.const 0)) "" "a" "bc" "") | |
| ) | |
| ;; Basic use | |
| (module | |
| (memory 1) | |
| (data (i32.const 0) "a") | |
| ) | |
| (module | |
| (import "spectest" "memory" (memory 1)) | |
| (data (i32.const 0) "a") | |
| ) | |
| (module | |
| (memory 1) | |
| (data (i32.const 0) "a") | |
| (data (i32.const 3) "b") | |
| (data (i32.const 100) "cde") | |
| (data (i32.const 5) "x") | |
| (data (i32.const 3) "c") | |
| ) | |
| (module | |
| (import "spectest" "memory" (memory 1)) | |
| (data (i32.const 0) "a") | |
| (data (i32.const 1) "b") | |
| (data (i32.const 2) "cde") | |
| (data (i32.const 3) "f") | |
| (data (i32.const 2) "g") | |
| (data (i32.const 1) "h") | |
| ) | |
| (module | |
| (global (import "spectest" "global_i32") i32) | |
| (memory 1) | |
| (data (global.get 0) "a") | |
| ) | |
| (module | |
| (global (import "spectest" "global_i32") i32) | |
| (import "spectest" "memory" (memory 1)) | |
| (data (global.get 0) "a") | |
| ) | |
| (module | |
| (global $g (import "spectest" "global_i32") i32) | |
| (memory 1) | |
| (data (global.get $g) "a") | |
| ) | |
| (module | |
| (global $g (import "spectest" "global_i32") i32) | |
| (import "spectest" "memory" (memory 1)) | |
| (data (global.get $g) "a") | |
| ) | |
| ;; Use of internal globals in constant expressions is not allowed in MVP. | |
| ;; (module (memory 1) (data (global.get 0) "a") (global i32 (i32.const 0))) | |
| ;; (module (memory 1) (data (global.get $g) "a") (global $g i32 (i32.const 0))) | |
| ;; Corner cases | |
| (module | |
| (memory 1) | |
| (data (i32.const 0) "a") | |
| (data (i32.const 0xffff) "b") | |
| ) | |
| (module | |
| (import "spectest" "memory" (memory 1)) | |
| (data (i32.const 0) "a") | |
| (data (i32.const 0xffff) "b") | |
| ) | |
| (module | |
| (memory 2) | |
| (data (i32.const 0x1_ffff) "a") | |
| ) | |
| (module | |
| (memory 0) | |
| (data (i32.const 0)) | |
| ) | |
| (module | |
| (import "spectest" "memory" (memory 0)) | |
| (data (i32.const 0)) | |
| ) | |
| (module | |
| (memory 0 0) | |
| (data (i32.const 0)) | |
| ) | |
| (module | |
| (memory 1) | |
| (data (i32.const 0x1_0000) "") | |
| ) | |
| (module | |
| (memory 0) | |
| (data (i32.const 0) "" "") | |
| ) | |
| (module | |
| (import "spectest" "memory" (memory 0)) | |
| (data (i32.const 0) "" "") | |
| ) | |
| (module | |
| (memory 0 0) | |
| (data (i32.const 0) "" "") | |
| ) | |
| ;; (module | |
| ;; (import "spectest" "memory" (memory 0)) | |
| ;; (data (i32.const 0) "a") | |
| ;; ) | |
| ;; (module | |
| ;; (import "spectest" "memory" (memory 0 3)) | |
| ;; (data (i32.const 0) "a") | |
| ;; ) | |
| ;; (module | |
| ;; (global (import "spectest" "global_i32") i32) | |
| ;; (import "spectest" "memory" (memory 0)) | |
| ;; (data (global.get 0) "a") | |
| ;; ) | |
| ;; (module | |
| ;; (global (import "spectest" "global_i32") i32) | |
| ;; (import "spectest" "memory" (memory 0 3)) | |
| ;; (data (global.get 0) "a") | |
| ;; ) | |
| ;; (module | |
| ;; (import "spectest" "memory" (memory 0)) | |
| ;; (data (i32.const 1) "a") | |
| ;; ) | |
| ;; (module | |
| ;; (import "spectest" "memory" (memory 0 3)) | |
| ;; (data (i32.const 1) "a") | |
| ;; ) | |
| ;; Invalid bounds for data | |
| (assert_trap | |
| (module | |
| (memory 0) | |
| (data (i32.const 0) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 0 0) | |
| (data (i32.const 0) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 0 1) | |
| (data (i32.const 0) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 0) | |
| (data (i32.const 1)) | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 0 1) | |
| (data (i32.const 1)) | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| ;; This seems to cause a time-out on Travis. | |
| (;assert_unlinkable | |
| (module | |
| (memory 0x10000) | |
| (data (i32.const 0xffffffff) "ab") | |
| ) | |
| "" ;; either out of memory or out of bounds | |
| ;) | |
| (assert_trap | |
| (module | |
| (global (import "spectest" "global_i32") i32) | |
| (memory 0) | |
| (data (global.get 0) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 1 2) | |
| (data (i32.const 0x1_0000) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (import "spectest" "memory" (memory 1)) | |
| (data (i32.const 0x1_0000) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 2) | |
| (data (i32.const 0x2_0000) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 2 3) | |
| (data (i32.const 0x2_0000) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 1) | |
| (data (i32.const -1) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (import "spectest" "memory" (memory 1)) | |
| (data (i32.const -1) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (memory 2) | |
| (data (i32.const -100) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| (assert_trap | |
| (module | |
| (import "spectest" "memory" (memory 1)) | |
| (data (i32.const -100) "a") | |
| ) | |
| "out of bounds memory access" | |
| ) | |
| ;; Data without memory | |
| (assert_invalid | |
| (module | |
| (data (i32.const 0) "") | |
| ) | |
| "unknown memory" | |
| ) | |
| ;; Data segment with memory index 1 (only memory 0 available) | |
| (assert_invalid | |
| (module binary | |
| "\00asm" "\01\00\00\00" | |
| "\05\03\01" ;; memory section | |
| "\00\00" ;; memory 0 | |
| "\0b\07\01" ;; data section | |
| "\02\01\41\00\0b" ;; active data segment 0 for memory 1 | |
| "\00" ;; empty vec(byte) | |
| ) | |
| "unknown memory 1" | |
| ) | |
| ;; Data segment with memory index 0 (no memory section) | |
| (assert_invalid | |
| (module binary | |
| "\00asm" "\01\00\00\00" | |
| "\0b\06\01" ;; data section | |
| "\00\41\00\0b" ;; active data segment 0 for memory 0 | |
| "\00" ;; empty vec(byte) | |
| ) | |
| "unknown memory 0" | |
| ) | |
| ;; Data segment with memory index 1 (no memory section) | |
| (assert_invalid | |
| (module binary | |
| "\00asm" "\01\00\00\00" | |
| "\0b\07\01" ;; data section | |
| "\02\01\41\00\0b" ;; active data segment 0 for memory 1 | |
| "\00" ;; empty vec(byte) | |
| ) | |
| "unknown memory 1" | |
| ) | |
| ;; Data segment with memory index 1 and vec(byte) as above, | |
| ;; only memory 0 available. | |
| (assert_invalid | |
| (module binary | |
| "\00asm" "\01\00\00\00" | |
| "\05\03\01" ;; memory section | |
| "\00\00" ;; memory 0 | |
| "\0b\45\01" ;; data section | |
| "\02" ;; active segment | |
| "\01" ;; memory index | |
| "\41\00\0b" ;; offset constant expression | |
| "\3e" ;; vec(byte) length | |
| "\00\01\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f" | |
| "\10\11\12\13\14\15\16\17\18\19\1a\1b\1c\1d\1e\1f" | |
| "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f" | |
| "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d" | |
| ) | |
| "unknown memory 1" | |
| ) | |
| ;; Data segment with memory index 1 and specially crafted vec(byte) after. | |
| ;; This is to detect incorrect validation where memory index is interpreted | |
| ;; as a flag followed by "\41" interpreted as the size of vec(byte) | |
| ;; with the expected number of bytes following. | |
| (assert_invalid | |
| (module binary | |
| "\00asm" "\01\00\00\00" | |
| "\0b\45\01" ;; data section | |
| "\02" ;; active segment | |
| "\01" ;; memory index | |
| "\41\00\0b" ;; offset constant expression | |
| "\3e" ;; vec(byte) length | |
| "\00\01\02\03\04\05\06\07\08\09\0a\0b\0c\0d\0e\0f" | |
| "\10\11\12\13\14\15\16\17\18\19\1a\1b\1c\1d\1e\1f" | |
| "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f" | |
| "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d" | |
| ) | |
| "unknown memory 1" | |
| ) | |
| ;; Invalid offsets | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (i64.const 0)) | |
| ) | |
| "type mismatch" | |
| ) | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (offset (;empty instruction sequence;))) | |
| ) | |
| "type mismatch" | |
| ) | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (offset (i32.const 0) (i32.const 0))) | |
| ) | |
| "type mismatch" | |
| ) | |
| (assert_invalid | |
| (module | |
| (global (import "test" "global-i32") i32) | |
| (memory 1) | |
| (data (offset (global.get 0) (global.get 0))) | |
| ) | |
| "type mismatch" | |
| ) | |
| (assert_invalid | |
| (module | |
| (global (import "test" "global-i32") i32) | |
| (memory 1) | |
| (data (offset (global.get 0) (i32.const 0))) | |
| ) | |
| "type mismatch" | |
| ) | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (i32.ctz (i32.const 0))) | |
| ) | |
| "constant expression required" | |
| ) | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (nop)) | |
| ) | |
| "constant expression required" | |
| ) | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (offset (nop) (i32.const 0))) | |
| ) | |
| "constant expression required" | |
| ) | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (offset (i32.const 0) (nop))) | |
| ) | |
| "constant expression required" | |
| ) | |
| ;; Use of internal globals in constant expressions is not allowed in MVP. | |
| ;; (assert_invalid | |
| ;; (module (memory 1) (data (global.get $g)) (global $g (mut i32) (i32.const 0))) | |
| ;; "constant expression required" | |
| ;; ) | |
| (assert_invalid | |
| (module | |
| (memory 1) | |
| (data (global.get 0)) | |
| ) | |
| "unknown global 0" | |
| ) | |
| (assert_invalid | |
| (module | |
| (global (import "test" "global-i32") i32) | |
| (memory 1) | |
| (data (global.get 1)) | |
| ) | |
| "unknown global 1" | |
| ) | |
| (assert_invalid | |
| (module | |
| (global (import "test" "global-mut-i32") (mut i32)) | |
| (memory 1) | |
| (data (global.get 0)) | |
| ) | |
| "constant expression required" | |
| ) |