summaryrefslogtreecommitdiff
path: root/test/spec/data.wast
diff options
context:
space:
mode:
Diffstat (limited to 'test/spec/data.wast')
-rw-r--r--test/spec/data.wast335
1 files changed, 335 insertions, 0 deletions
diff --git a/test/spec/data.wast b/test/spec/data.wast
new file mode 100644
index 000000000..7d6945417
--- /dev/null
+++ b/test/spec/data.wast
@@ -0,0 +1,335 @@
+;; 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 0 (i32.const 0))
+ (data 0x0 (i32.const 1) "a" "" "bcd")
+ (data 0x000 (offset (i32.const 0)))
+ (data 0 (offset (i32.const 0)) "" "a" "bc" "")
+ (data $m (i32.const 0))
+ (data $m (i32.const 1) "a" "" "bcd")
+ (data $m (offset (i32.const 0)))
+ (data $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_unlinkable
+ (module
+ (memory 0)
+ (data (i32.const 0) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 0 0)
+ (data (i32.const 0) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 0 1)
+ (data (i32.const 0) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 0)
+ (data (i32.const 1))
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 0 1)
+ (data (i32.const 1))
+ )
+ "data segment does not fit"
+)
+
+;; This seems to cause a time-out on Travis.
+(;assert_unlinkable
+ (module
+ (memory 0x10000)
+ (data (i32.const 0xffffffff) "ab")
+ )
+ "" ;; either out of memory or segment does not fit
+;)
+
+(assert_unlinkable
+ (module
+ (global (import "spectest" "global_i32") i32)
+ (memory 0)
+ (data (global.get 0) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 1 2)
+ (data (i32.const 0x1_0000) "a")
+ )
+ "data segment does not fit"
+)
+(assert_unlinkable
+ (module
+ (import "spectest" "memory" (memory 1))
+ (data (i32.const 0x1_0000) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 2)
+ (data (i32.const 0x2_0000) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 2 3)
+ (data (i32.const 0x2_0000) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 1)
+ (data (i32.const -1) "a")
+ )
+ "data segment does not fit"
+)
+(assert_unlinkable
+ (module
+ (import "spectest" "memory" (memory 1))
+ (data (i32.const -1) "a")
+ )
+ "data segment does not fit"
+)
+
+(assert_unlinkable
+ (module
+ (memory 2)
+ (data (i32.const -100) "a")
+ )
+ "data segment does not fit"
+)
+(assert_unlinkable
+ (module
+ (import "spectest" "memory" (memory 1))
+ (data (i32.const -100) "a")
+ )
+ "data segment does not fit"
+)
+
+;; Data without memory
+
+(assert_invalid
+ (module
+ (data (i32.const 0) "")
+ )
+ "unknown memory"
+)
+
+;; Invalid offsets
+
+(assert_invalid
+ (module
+ (memory 1)
+ (data (i64.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"
+;; )