160fc557cSAlex Crichton;;! gc = true
2*e50d897bSAlex Crichton;;! bulk_memory = true
360fc557cSAlex Crichton
4ec3b2d22SNick Fitzgerald(module
5ec3b2d22SNick Fitzgerald  (type $arr (array (mut i8)))
6ec3b2d22SNick Fitzgerald
7ec3b2d22SNick Fitzgerald  (data $d "abcd")
8ec3b2d22SNick Fitzgerald
9ec3b2d22SNick Fitzgerald  (func (export "array-init-data") (param $arr_len i32)
10ec3b2d22SNick Fitzgerald                                   (param $dst i32)
11ec3b2d22SNick Fitzgerald                                   (param $src i32)
12ec3b2d22SNick Fitzgerald                                   (param $data_len i32) (result (ref $arr))
13ec3b2d22SNick Fitzgerald    (local $a (ref $arr))
14ec3b2d22SNick Fitzgerald    (local.set $a (array.new_default $arr (local.get $arr_len)))
15ec3b2d22SNick Fitzgerald    (array.init_data $arr $d (local.get $a) (local.get $dst) (local.get $src) (local.get $data_len))
16ec3b2d22SNick Fitzgerald    (local.get $a)
17ec3b2d22SNick Fitzgerald  )
18ec3b2d22SNick Fitzgerald)
19ec3b2d22SNick Fitzgerald
20ec3b2d22SNick Fitzgerald;; In bounds.
21ec3b2d22SNick Fitzgerald(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 0) (i32.const 0)) (ref.array))
22ec3b2d22SNick Fitzgerald(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 0) (i32.const 4)) (ref.array))
23ec3b2d22SNick Fitzgerald(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 1) (i32.const 2)) (ref.array))
24ec3b2d22SNick Fitzgerald(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 4) (i32.const 0)) (ref.array))
25ec3b2d22SNick Fitzgerald
26ec3b2d22SNick Fitzgerald;; Out-of-bounds data segment accesses.
27ec3b2d22SNick Fitzgerald(assert_trap
28ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 5) (i32.const 0) (i32.const 0) (i32.const 5))
29ec3b2d22SNick Fitzgerald  "out of bounds memory access")
30ec3b2d22SNick Fitzgerald(assert_trap
31ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 5) (i32.const 0))
32ec3b2d22SNick Fitzgerald  "out of bounds memory access")
33ec3b2d22SNick Fitzgerald(assert_trap
34ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 1) (i32.const 4))
35ec3b2d22SNick Fitzgerald  "out of bounds memory access")
36ec3b2d22SNick Fitzgerald(assert_trap
37ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 4) (i32.const 1))
38ec3b2d22SNick Fitzgerald  "out of bounds memory access")
39ec3b2d22SNick Fitzgerald
40ec3b2d22SNick Fitzgerald;; Out-of-bounds array accesses.
41ec3b2d22SNick Fitzgerald(assert_trap
42ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 3) (i32.const 0) (i32.const 0) (i32.const 4))
43ec3b2d22SNick Fitzgerald  "out of bounds array access")
44ec3b2d22SNick Fitzgerald(assert_trap
45ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 3) (i32.const 1) (i32.const 0) (i32.const 3))
46ec3b2d22SNick Fitzgerald  "out of bounds array access")
47ec3b2d22SNick Fitzgerald(assert_trap
48ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 3) (i32.const 3) (i32.const 0) (i32.const 1))
49ec3b2d22SNick Fitzgerald  "out of bounds array access")
50ec3b2d22SNick Fitzgerald(assert_trap
51ec3b2d22SNick Fitzgerald  (invoke "array-init-data" (i32.const 3) (i32.const 4) (i32.const 0) (i32.const 0))
52ec3b2d22SNick Fitzgerald  "out of bounds array access")
53ec3b2d22SNick Fitzgerald
54ec3b2d22SNick Fitzgerald(module
55ec3b2d22SNick Fitzgerald  (type $arr (array (mut i8)))
56ec3b2d22SNick Fitzgerald
57ec3b2d22SNick Fitzgerald  (data $d "\aa\bb\cc\dd")
58ec3b2d22SNick Fitzgerald
59ec3b2d22SNick Fitzgerald  (func (export "array-init-data-contents") (result i32 i32)
60ec3b2d22SNick Fitzgerald    (local (ref $arr))
61ec3b2d22SNick Fitzgerald    (local.set 0 (array.new_default $arr (i32.const 4)))
62ec3b2d22SNick Fitzgerald    (array.init_data $arr $d (local.get 0) (i32.const 0) (i32.const 1) (i32.const 2))
63ec3b2d22SNick Fitzgerald    (array.get_u $arr (local.get 0) (i32.const 0))
64ec3b2d22SNick Fitzgerald    (array.get_u $arr (local.get 0) (i32.const 1))
65ec3b2d22SNick Fitzgerald  )
66ec3b2d22SNick Fitzgerald)
67ec3b2d22SNick Fitzgerald
68ec3b2d22SNick Fitzgerald;; Array is initialized with the correct contents.
69ec3b2d22SNick Fitzgerald(assert_return (invoke "array-init-data-contents") (i32.const 0xbb) (i32.const 0xcc))
70ec3b2d22SNick Fitzgerald
71ec3b2d22SNick Fitzgerald(module
72ec3b2d22SNick Fitzgerald  (type $arr (array (mut i32)))
73ec3b2d22SNick Fitzgerald
74ec3b2d22SNick Fitzgerald  (data $d "\aa\bb\cc\dd")
75ec3b2d22SNick Fitzgerald
76ec3b2d22SNick Fitzgerald  (func (export "array-init-data-little-endian") (result i32)
77ec3b2d22SNick Fitzgerald    (local (ref $arr))
78ec3b2d22SNick Fitzgerald    (local.set 0 (array.new_default $arr (i32.const 1)))
79ec3b2d22SNick Fitzgerald    (array.init_data $arr $d (local.get 0) (i32.const 0) (i32.const 0) (i32.const 1))
80ec3b2d22SNick Fitzgerald    (array.get $arr (local.get 0) (i32.const 0))
81ec3b2d22SNick Fitzgerald  )
82ec3b2d22SNick Fitzgerald)
83ec3b2d22SNick Fitzgerald
84ec3b2d22SNick Fitzgerald;; Data segments are interpreted as little-endian.
85ec3b2d22SNick Fitzgerald(assert_return (invoke "array-init-data-little-endian") (i32.const 0xddccbbaa))
86ec3b2d22SNick Fitzgerald
87ec3b2d22SNick Fitzgerald(module
88ec3b2d22SNick Fitzgerald  (type $arr (array (mut i16)))
89ec3b2d22SNick Fitzgerald
90ec3b2d22SNick Fitzgerald  (data $d "\00\11\22")
91ec3b2d22SNick Fitzgerald
92ec3b2d22SNick Fitzgerald  (func (export "array-init-data-unaligned") (result i32)
93ec3b2d22SNick Fitzgerald    (local (ref $arr))
94ec3b2d22SNick Fitzgerald    (local.set 0 (array.new_default $arr (i32.const 1)))
95ec3b2d22SNick Fitzgerald    (array.init_data $arr $d (local.get 0) (i32.const 0) (i32.const 1) (i32.const 1))
96ec3b2d22SNick Fitzgerald    (array.get_u $arr (local.get 0) (i32.const 0))
97ec3b2d22SNick Fitzgerald  )
98ec3b2d22SNick Fitzgerald)
99ec3b2d22SNick Fitzgerald
100ec3b2d22SNick Fitzgerald;; Data inside the segment doesn't need to be aligned to the element size.
101ec3b2d22SNick Fitzgerald(assert_return (invoke "array-init-data-unaligned") (i32.const 0x2211))
102