Skip to content

Commit 9fe79b8

Browse files
authored
Add support for reftypes in InstrumentLocals pass (#2375)
This adds support for anyref and exnref types in InstrumentLocals pass.
1 parent 1582c52 commit 9fe79b8

File tree

4 files changed

+116
-14
lines changed

4 files changed

+116
-14
lines changed

scripts/wasm2js.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,14 @@ var asmLibraryArg = {
130130
console.log('get_f64 ' + [loc, index, value]);
131131
return value;
132132
},
133+
get_anyref: function(loc, index, value) {
134+
console.log('get_anyref ' + [loc, index, value]);
135+
return value;
136+
},
137+
get_exnref: function(loc, index, value) {
138+
console.log('get_exnref ' + [loc, index, value]);
139+
return value;
140+
},
133141
set_i32: function(loc, index, value) {
134142
console.log('set_i32 ' + [loc, index, value]);
135143
return value;
@@ -147,6 +155,14 @@ var asmLibraryArg = {
147155
console.log('set_f64 ' + [loc, index, value]);
148156
return value;
149157
},
158+
set_anyref: function(loc, index, value) {
159+
console.log('set_anyref ' + [loc, index, value]);
160+
return value;
161+
},
162+
set_exnref: function(loc, index, value) {
163+
console.log('set_exnref ' + [loc, index, value]);
164+
return value;
165+
},
150166
load_ptr: function(loc, bytes, offset, ptr) {
151167
console.log('load_ptr ' + [loc, bytes, offset, ptr]);
152168
return ptr;

src/passes/InstrumentLocals.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,15 @@ Name get_i32("get_i32");
5757
Name get_i64("get_i64");
5858
Name get_f32("get_f32");
5959
Name get_f64("get_f64");
60+
Name get_anyref("get_anyref");
61+
Name get_exnref("get_exnref");
6062

6163
Name set_i32("set_i32");
6264
Name set_i64("set_i64");
6365
Name set_f32("set_f32");
6466
Name set_f64("set_f64");
67+
Name set_anyref("set_anyref");
68+
Name set_exnref("set_exnref");
6569

6670
struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
6771
void visitLocalGet(LocalGet* curr) {
@@ -82,9 +86,11 @@ struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
8286
case v128:
8387
assert(false && "v128 not implemented yet");
8488
case anyref:
85-
assert(false && "anyref not implemented yet");
89+
import = get_anyref;
90+
break;
8691
case exnref:
87-
assert(false && "exnref not implemented yet");
92+
import = get_exnref;
93+
break;
8894
case none:
8995
WASM_UNREACHABLE();
9096
case unreachable:
@@ -116,9 +122,11 @@ struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
116122
case v128:
117123
assert(false && "v128 not implemented yet");
118124
case anyref:
119-
assert(false && "anyref not implemented yet");
125+
import = set_anyref;
126+
break;
120127
case exnref:
121-
assert(false && "exnref not implemented yet");
128+
import = set_exnref;
129+
break;
122130
case unreachable:
123131
return; // nothing to do here
124132
case none:
@@ -137,10 +145,14 @@ struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
137145
addImport(curr, get_i64, "jiij");
138146
addImport(curr, get_f32, "fiif");
139147
addImport(curr, get_f64, "diid");
148+
addImport(curr, get_anyref, "aiia");
149+
addImport(curr, get_exnref, "eiie");
140150
addImport(curr, set_i32, "iiii");
141151
addImport(curr, set_i64, "jiij");
142152
addImport(curr, set_f32, "fiif");
143153
addImport(curr, set_f64, "diid");
154+
addImport(curr, set_anyref, "aiia");
155+
addImport(curr, set_exnref, "eiie");
144156
}
145157

146158
private:

test/passes/instrument-locals.txt renamed to test/passes/instrument-locals_all-features.txt

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,27 @@
44
(type $FUNCSIG$jiij (func (param i32 i32 i64) (result i64)))
55
(type $FUNCSIG$fiif (func (param i32 i32 f32) (result f32)))
66
(type $FUNCSIG$diid (func (param i32 i32 f64) (result f64)))
7+
(type $FUNCSIG$aiia (func (param i32 i32 anyref) (result anyref)))
8+
(type $FUNCSIG$eiie (func (param i32 i32 exnref) (result exnref)))
79
(import "env" "get_i32" (func $get_i32 (param i32 i32 i32) (result i32)))
810
(import "env" "get_i64" (func $get_i64 (param i32 i32 i64) (result i64)))
911
(import "env" "get_f32" (func $get_f32 (param i32 i32 f32) (result f32)))
1012
(import "env" "get_f64" (func $get_f64 (param i32 i32 f64) (result f64)))
13+
(import "env" "get_anyref" (func $get_anyref (param i32 i32 anyref) (result anyref)))
14+
(import "env" "get_exnref" (func $get_exnref (param i32 i32 exnref) (result exnref)))
1115
(import "env" "set_i32" (func $set_i32 (param i32 i32 i32) (result i32)))
1216
(import "env" "set_i64" (func $set_i64 (param i32 i32 i64) (result i64)))
1317
(import "env" "set_f32" (func $set_f32 (param i32 i32 f32) (result f32)))
1418
(import "env" "set_f64" (func $set_f64 (param i32 i32 f64) (result f64)))
15-
(func $A (; 8 ;) (type $FUNCSIG$v)
19+
(import "env" "set_anyref" (func $set_anyref (param i32 i32 anyref) (result anyref)))
20+
(import "env" "set_exnref" (func $set_exnref (param i32 i32 exnref) (result exnref)))
21+
(func $A (; 12 ;) (type $FUNCSIG$v)
1622
(local $x i32)
1723
(local $y i64)
1824
(local $z f32)
1925
(local $w f64)
26+
(local $a anyref)
27+
(local $e exnref)
2028
(drop
2129
(call $get_i32
2230
(i32.const 0)
@@ -42,8 +50,22 @@
4250
)
4351
)
4452
(drop
45-
(call $get_i32
53+
(call $get_anyref
4654
(i32.const 3)
55+
(i32.const 4)
56+
(local.get $a)
57+
)
58+
)
59+
(drop
60+
(call $get_exnref
61+
(i32.const 4)
62+
(i32.const 5)
63+
(local.get $e)
64+
)
65+
)
66+
(drop
67+
(call $get_i32
68+
(i32.const 5)
4769
(i32.const 0)
4870
(local.get $x)
4971
)
@@ -53,21 +75,35 @@
5375
)
5476
(drop
5577
(call $get_f32
56-
(i32.const 4)
78+
(i32.const 6)
5779
(i32.const 2)
5880
(local.get $z)
5981
)
6082
)
6183
(drop
6284
(call $get_f64
63-
(i32.const 5)
85+
(i32.const 7)
6486
(i32.const 3)
6587
(local.get $w)
6688
)
6789
)
90+
(drop
91+
(call $get_anyref
92+
(i32.const 8)
93+
(i32.const 4)
94+
(local.get $a)
95+
)
96+
)
97+
(drop
98+
(call $get_exnref
99+
(i32.const 9)
100+
(i32.const 5)
101+
(local.get $e)
102+
)
103+
)
68104
(local.set $x
69105
(call $set_i32
70-
(i32.const 6)
106+
(i32.const 10)
71107
(i32.const 0)
72108
(i32.const 1)
73109
)
@@ -77,21 +113,35 @@
77113
)
78114
(local.set $z
79115
(call $set_f32
80-
(i32.const 7)
116+
(i32.const 11)
81117
(i32.const 2)
82118
(f32.const 3.2100000381469727)
83119
)
84120
)
85121
(local.set $w
86122
(call $set_f64
87-
(i32.const 8)
123+
(i32.const 12)
88124
(i32.const 3)
89125
(f64.const 4.321)
90126
)
91127
)
128+
(local.set $a
129+
(call $set_anyref
130+
(i32.const 13)
131+
(i32.const 4)
132+
(anyref.pop)
133+
)
134+
)
135+
(local.set $e
136+
(call $set_exnref
137+
(i32.const 14)
138+
(i32.const 5)
139+
(exnref.pop)
140+
)
141+
)
92142
(local.set $x
93143
(call $set_i32
94-
(i32.const 9)
144+
(i32.const 15)
95145
(i32.const 0)
96146
(i32.const 11)
97147
)
@@ -101,17 +151,31 @@
101151
)
102152
(local.set $z
103153
(call $set_f32
104-
(i32.const 10)
154+
(i32.const 16)
105155
(i32.const 2)
106156
(f32.const 33.209999084472656)
107157
)
108158
)
109159
(local.set $w
110160
(call $set_f64
111-
(i32.const 11)
161+
(i32.const 17)
112162
(i32.const 3)
113163
(f64.const 44.321)
114164
)
115165
)
166+
(local.set $a
167+
(call $set_anyref
168+
(i32.const 18)
169+
(i32.const 4)
170+
(anyref.pop)
171+
)
172+
)
173+
(local.set $e
174+
(call $set_exnref
175+
(i32.const 19)
176+
(i32.const 5)
177+
(exnref.pop)
178+
)
179+
)
116180
)
117181
)

test/passes/instrument-locals.wast renamed to test/passes/instrument-locals_all-features.wast

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,36 @@
44
(local $y i64)
55
(local $z f32)
66
(local $w f64)
7+
(local $a anyref)
8+
(local $e exnref)
79

810
(drop (local.get $x))
911
(drop (local.get $y))
1012
(drop (local.get $z))
1113
(drop (local.get $w))
14+
(drop (local.get $a))
15+
(drop (local.get $e))
1216

1317
(drop (local.get $x))
1418
(drop (local.get $y))
1519
(drop (local.get $z))
1620
(drop (local.get $w))
21+
(drop (local.get $a))
22+
(drop (local.get $e))
1723

1824
(local.set $x (i32.const 1))
1925
(local.set $y (i64.const 2))
2026
(local.set $z (f32.const 3.21))
2127
(local.set $w (f64.const 4.321))
28+
(local.set $a (anyref.pop))
29+
(local.set $e (exnref.pop))
2230

2331
(local.set $x (i32.const 11))
2432
(local.set $y (i64.const 22))
2533
(local.set $z (f32.const 33.21))
2634
(local.set $w (f64.const 44.321))
35+
(local.set $a (anyref.pop))
36+
(local.set $e (exnref.pop))
2737
)
2838
)
2939

0 commit comments

Comments
 (0)