Skip to content

Commit 2840be2

Browse files
committed
Implement GC opcodes
1 parent a79322c commit 2840be2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+5273
-1505
lines changed

include/wabt/binary-reader-logging.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,17 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
165165
Result OnOpcodeV128(v128 value) override;
166166
Result OnOpcodeBlockSig(Type sig_type) override;
167167
Result OnOpcodeType(Type type) override;
168+
Result OnArrayCopyExpr(Index dst_type_index, Index src_type_index) override;
169+
Result OnArrayFillExpr(Index type_index) override;
170+
Result OnArrayGetExpr(Opcode opcode, Index type_index) override;
171+
Result OnArrayInitDataExpr(Index type_index, Index data_index) override;
172+
Result OnArrayInitElemExpr(Index type_index, Index elem_index) override;
173+
Result OnArrayNewExpr(Index type_index) override;
174+
Result OnArrayNewDataExpr(Index type_index, Index data_index) override;
175+
Result OnArrayNewDefaultExpr(Index type_index) override;
176+
Result OnArrayNewElemExpr(Index type_index, Index elem_index) override;
177+
Result OnArrayNewFixedExpr(Index type_index, Index count) override;
178+
Result OnArraySetExpr(Index type_index) override;
168179
Result OnAtomicLoadExpr(Opcode opcode,
169180
Index memidx,
170181
Address alignment_log2,
@@ -204,6 +215,7 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
204215
Result OnF32ConstExpr(uint32_t value_bits) override;
205216
Result OnF64ConstExpr(uint64_t value_bits) override;
206217
Result OnV128ConstExpr(v128 value_bits) override;
218+
Result OnGCUnaryExpr(Opcode opcode) override;
207219
Result OnGlobalGetExpr(Index global_index) override;
208220
Result OnGlobalSetExpr(Index global_index) override;
209221
Result OnI32ConstExpr(uint32_t value) override;
@@ -232,9 +244,11 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
232244
Result OnTableSizeExpr(Index table) override;
233245
Result OnTableFillExpr(Index table) override;
234246
Result OnRefAsNonNullExpr() override;
247+
Result OnRefCastExpr(Type type) override;
235248
Result OnRefFuncExpr(Index index) override;
236249
Result OnRefNullExpr(Type type) override;
237250
Result OnRefIsNullExpr() override;
251+
Result OnRefTestExpr(Type type) override;
238252
Result OnNopExpr() override;
239253
Result OnRethrowExpr(Index depth) override;
240254
Result OnReturnCallExpr(Index func_index) override;
@@ -246,6 +260,12 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
246260
Index memidx,
247261
Address alignment_log2,
248262
Address offset) override;
263+
Result OnStructGetExpr(Opcode opcode,
264+
Index type_index,
265+
Index field_index) override;
266+
Result OnStructNewExpr(Index type_index) override;
267+
Result OnStructNewDefaultExpr(Index type_index) override;
268+
Result OnStructSetExpr(Index type_index, Index field_index) override;
249269
Result OnThrowExpr(Index tag_index) override;
250270
Result OnThrowRefExpr() override;
251271
Result OnTryExpr(Type sig_type) override;

include/wabt/binary-reader-nop.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,31 @@ class BinaryReaderNop : public BinaryReaderDelegate {
219219
Result OnOpcodeV128(v128 value) override { return Result::Ok; }
220220
Result OnOpcodeBlockSig(Type sig_type) override { return Result::Ok; }
221221
Result OnOpcodeType(Type type) override { return Result::Ok; }
222+
Result OnArrayCopyExpr(Index dst_type_index, Index src_type_index) override {
223+
return Result::Ok;
224+
}
225+
Result OnArrayFillExpr(Index type_index) override { return Result::Ok; }
226+
Result OnArrayGetExpr(Opcode opcode, Index type_index) override {
227+
return Result::Ok;
228+
}
229+
Result OnArrayInitDataExpr(Index type_index, Index data_index) override {
230+
return Result::Ok;
231+
}
232+
Result OnArrayInitElemExpr(Index type_index, Index elem_index) override {
233+
return Result::Ok;
234+
}
235+
Result OnArrayNewExpr(Index type_index) override { return Result::Ok; }
236+
Result OnArrayNewDataExpr(Index type_index, Index data_index) override {
237+
return Result::Ok;
238+
}
239+
Result OnArrayNewDefaultExpr(Index type_index) override { return Result::Ok; }
240+
Result OnArrayNewElemExpr(Index type_index, Index elem_index) override {
241+
return Result::Ok;
242+
}
243+
Result OnArrayNewFixedExpr(Index type_index, Index count) override {
244+
return Result::Ok;
245+
}
246+
Result OnArraySetExpr(Index type_index) override { return Result::Ok; }
222247
Result OnAtomicLoadExpr(Opcode opcode,
223248
Index memidx,
224249
Address alignment_log2,
@@ -277,6 +302,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
277302
Result OnF32ConstExpr(uint32_t value_bits) override { return Result::Ok; }
278303
Result OnF64ConstExpr(uint64_t value_bits) override { return Result::Ok; }
279304
Result OnV128ConstExpr(v128 value_bits) override { return Result::Ok; }
305+
Result OnGCUnaryExpr(Opcode opcode) override { return Result::Ok; }
280306
Result OnGlobalGetExpr(Index global_index) override { return Result::Ok; }
281307
Result OnGlobalSetExpr(Index global_index) override { return Result::Ok; }
282308
Result OnI32ConstExpr(uint32_t value) override { return Result::Ok; }
@@ -315,9 +341,11 @@ class BinaryReaderNop : public BinaryReaderDelegate {
315341
Result OnTableSizeExpr(Index table_index) override { return Result::Ok; }
316342
Result OnTableFillExpr(Index table_index) override { return Result::Ok; }
317343
Result OnRefAsNonNullExpr() override { return Result::Ok; }
344+
Result OnRefCastExpr(Type type) override { return Result::Ok; }
318345
Result OnRefFuncExpr(Index func_index) override { return Result::Ok; }
319346
Result OnRefNullExpr(Type type) override { return Result::Ok; }
320347
Result OnRefIsNullExpr() override { return Result::Ok; }
348+
Result OnRefTestExpr(Type type) override { return Result::Ok; }
321349
Result OnNopExpr() override { return Result::Ok; }
322350
Result OnRethrowExpr(Index depth) override { return Result::Ok; }
323351
Result OnReturnCallExpr(Index sig_index) override { return Result::Ok; }
@@ -335,6 +363,18 @@ class BinaryReaderNop : public BinaryReaderDelegate {
335363
Address offset) override {
336364
return Result::Ok;
337365
}
366+
Result OnStructGetExpr(Opcode opcode,
367+
Index type_index,
368+
Index field_index) override {
369+
return Result::Ok;
370+
}
371+
Result OnStructNewExpr(Index type_index) override { return Result::Ok; }
372+
Result OnStructNewDefaultExpr(Index type_index) override {
373+
return Result::Ok;
374+
}
375+
Result OnStructSetExpr(Index type_index, Index field_index) override {
376+
return Result::Ok;
377+
}
338378
Result OnThrowExpr(Index depth) override { return Result::Ok; }
339379
Result OnThrowRefExpr() override { return Result::Ok; }
340380
Result OnTryExpr(Type sig_type) override { return Result::Ok; }

include/wabt/binary-reader.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,17 @@ class BinaryReaderDelegate {
237237
virtual Result OnOpcodeV128(v128 value) = 0;
238238
virtual Result OnOpcodeBlockSig(Type sig_type) = 0;
239239
virtual Result OnOpcodeType(Type type) = 0;
240+
virtual Result OnArrayCopyExpr(Index dst_type_index, Index src_type_index) = 0;
241+
virtual Result OnArrayFillExpr(Index type_index) = 0;
242+
virtual Result OnArrayGetExpr(Opcode opcode, Index type_index) = 0;
243+
virtual Result OnArrayInitDataExpr(Index type_index, Index data_index) = 0;
244+
virtual Result OnArrayInitElemExpr(Index type_index, Index elem_index) = 0;
245+
virtual Result OnArrayNewExpr(Index type_index) = 0;
246+
virtual Result OnArrayNewDataExpr(Index type_index, Index data_index) = 0;
247+
virtual Result OnArrayNewDefaultExpr(Index type_index) = 0;
248+
virtual Result OnArrayNewElemExpr(Index type_index, Index elem_index) = 0;
249+
virtual Result OnArrayNewFixedExpr(Index type_index, Index count) = 0;
250+
virtual Result OnArraySetExpr(Index type_index) = 0;
240251
virtual Result OnAtomicLoadExpr(Opcode opcode,
241252
Index memidx,
242253
Address alignment_log2,
@@ -285,6 +296,7 @@ class BinaryReaderDelegate {
285296
virtual Result OnF32ConstExpr(uint32_t value_bits) = 0;
286297
virtual Result OnF64ConstExpr(uint64_t value_bits) = 0;
287298
virtual Result OnV128ConstExpr(v128 value_bits) = 0;
299+
virtual Result OnGCUnaryExpr(Opcode opcode) = 0;
288300
virtual Result OnGlobalGetExpr(Index global_index) = 0;
289301
virtual Result OnGlobalSetExpr(Index global_index) = 0;
290302
virtual Result OnI32ConstExpr(uint32_t value) = 0;
@@ -313,9 +325,11 @@ class BinaryReaderDelegate {
313325
virtual Result OnTableSizeExpr(Index table_index) = 0;
314326
virtual Result OnTableFillExpr(Index table_index) = 0;
315327
virtual Result OnRefAsNonNullExpr() = 0;
328+
virtual Result OnRefCastExpr(Type type) = 0;
316329
virtual Result OnRefFuncExpr(Index func_index) = 0;
317330
virtual Result OnRefNullExpr(Type type) = 0;
318331
virtual Result OnRefIsNullExpr() = 0;
332+
virtual Result OnRefTestExpr(Type type) = 0;
319333
virtual Result OnNopExpr() = 0;
320334
virtual Result OnRethrowExpr(Index depth) = 0;
321335
virtual Result OnReturnExpr() = 0;
@@ -328,6 +342,12 @@ class BinaryReaderDelegate {
328342
Index memidx,
329343
Address alignment_log2,
330344
Address offset) = 0;
345+
virtual Result OnStructGetExpr(Opcode opcode,
346+
Index type_index,
347+
Index field_index) = 0;
348+
virtual Result OnStructNewExpr(Index type_index) = 0;
349+
virtual Result OnStructNewDefaultExpr(Index type_index) = 0;
350+
virtual Result OnStructSetExpr(Index type_index, Index field_index) = 0;
331351
virtual Result OnThrowExpr(Index tag_index) = 0;
332352
virtual Result OnThrowRefExpr() = 0;
333353
virtual Result OnTryExpr(Type sig_type) = 0;

include/wabt/expr-visitor.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,24 @@ class ExprVisitor::Delegate {
145145
virtual Result OnSimdShuffleOpExpr(SimdShuffleOpExpr*) = 0;
146146
virtual Result OnLoadSplatExpr(LoadSplatExpr*) = 0;
147147
virtual Result OnLoadZeroExpr(LoadZeroExpr*) = 0;
148+
virtual Result OnArrayCopyExpr(ArrayCopyExpr*) = 0;
149+
virtual Result OnArrayFillExpr(ArrayFillExpr*) = 0;
150+
virtual Result OnArrayGetExpr(ArrayGetExpr*) = 0;
151+
virtual Result OnArrayInitDataExpr(ArrayInitDataExpr*) = 0;
152+
virtual Result OnArrayInitElemExpr(ArrayInitElemExpr*) = 0;
153+
virtual Result OnArrayNewExpr(ArrayNewExpr*) = 0;
154+
virtual Result OnArrayNewDataExpr(ArrayNewDataExpr*) = 0;
155+
virtual Result OnArrayNewDefaultExpr(ArrayNewDefaultExpr*) = 0;
156+
virtual Result OnArrayNewElemExpr(ArrayNewElemExpr*) = 0;
157+
virtual Result OnArrayNewFixedExpr(ArrayNewFixedExpr*) = 0;
158+
virtual Result OnArraySetExpr(ArraySetExpr*) = 0;
159+
virtual Result OnGCUnaryExpr(GCUnaryExpr*) = 0;
160+
virtual Result OnRefCastExpr(RefCastExpr*) = 0;
161+
virtual Result OnRefTestExpr(RefTestExpr*) = 0;
162+
virtual Result OnStructGetExpr(StructGetExpr*) = 0;
163+
virtual Result OnStructNewExpr(StructNewExpr*) = 0;
164+
virtual Result OnStructNewDefaultExpr(StructNewDefaultExpr*) = 0;
165+
virtual Result OnStructSetExpr(StructSetExpr*) = 0;
148166
};
149167

150168
class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
@@ -230,6 +248,28 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
230248
Result OnSimdShuffleOpExpr(SimdShuffleOpExpr*) override { return Result::Ok; }
231249
Result OnLoadSplatExpr(LoadSplatExpr*) override { return Result::Ok; }
232250
Result OnLoadZeroExpr(LoadZeroExpr*) override { return Result::Ok; }
251+
Result OnArrayCopyExpr(ArrayCopyExpr*) override { return Result::Ok; }
252+
Result OnArrayFillExpr(ArrayFillExpr*) override { return Result::Ok; }
253+
Result OnArrayGetExpr(ArrayGetExpr*) override { return Result::Ok; }
254+
Result OnArrayInitDataExpr(ArrayInitDataExpr*) override { return Result::Ok; }
255+
Result OnArrayInitElemExpr(ArrayInitElemExpr*) override { return Result::Ok; }
256+
Result OnArrayNewExpr(ArrayNewExpr*) override { return Result::Ok; }
257+
Result OnArrayNewDataExpr(ArrayNewDataExpr*) override { return Result::Ok; }
258+
Result OnArrayNewDefaultExpr(ArrayNewDefaultExpr*) override {
259+
return Result::Ok;
260+
}
261+
Result OnArrayNewElemExpr(ArrayNewElemExpr*) override { return Result::Ok; }
262+
Result OnArrayNewFixedExpr(ArrayNewFixedExpr*) override { return Result::Ok; }
263+
Result OnArraySetExpr(ArraySetExpr*) override { return Result::Ok; }
264+
Result OnGCUnaryExpr(GCUnaryExpr*) override { return Result::Ok; }
265+
Result OnRefCastExpr(RefCastExpr*) override { return Result::Ok; }
266+
Result OnRefTestExpr(RefTestExpr*) override { return Result::Ok; }
267+
Result OnStructGetExpr(StructGetExpr*) override { return Result::Ok; }
268+
Result OnStructNewExpr(StructNewExpr*) override { return Result::Ok; }
269+
Result OnStructNewDefaultExpr(StructNewDefaultExpr*) override {
270+
return Result::Ok;
271+
}
272+
Result OnStructSetExpr(StructSetExpr*) override { return Result::Ok; }
233273
};
234274

235275
} // namespace wabt

include/wabt/interp/interp-inl.h

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,45 @@ inline bool operator!=(Ref lhs, Ref rhs) {
3232
return lhs.index != rhs.index;
3333
}
3434

35+
// static
36+
inline Ref Ref::CreateI31(size_t value) {
37+
assert((value & 0x7fffffff) < kI31Value);
38+
return Ref((value & 0x7fffffff) | kI31Value);
39+
}
40+
41+
// static
42+
inline Ref Ref::CreateExtern(size_t value) {
43+
assert(value < kExternValue);
44+
return Ref(value | kExternValue);
45+
}
46+
47+
inline bool Ref::IsI31() const {
48+
return (index & kI31Value) != 0;
49+
}
50+
51+
inline bool Ref::IsExtern() const {
52+
return (index & (kI31Value | kExternValue)) == kExternValue;
53+
}
54+
55+
inline bool Ref::IsI31OrExtern() const {
56+
return (index & (kI31Value | kExternValue)) != 0;
57+
}
58+
59+
inline u32 Ref::GetS32Value() const {
60+
assert(IsI31());
61+
return static_cast<s32>(static_cast<u32>(index) << 1) >> 1;
62+
}
63+
64+
inline u32 Ref::GetU32Value() const {
65+
assert(IsI31());
66+
return static_cast<u32>(index & 0x7fffffff);
67+
}
68+
69+
inline size_t Ref::GetExternValue() const {
70+
assert(IsExtern());
71+
return index ^ kExternValue;
72+
}
73+
3574
//// ExternType ////
3675
inline ExternType::ExternType(ExternKind kind) : kind(kind) {}
3776

@@ -165,6 +204,7 @@ inline Frame::Frame(Ref func,
165204
//// FreeList ////
166205
template <>
167206
inline bool FreeList<Ref>::IsUsed(Index index) const {
207+
assert(index < list_.size());
168208
return (list_[index].index & refFreeBit) == 0;
169209
}
170210

@@ -201,6 +241,7 @@ inline void FreeList<Ref>::Delete(Index index) {
201241

202242
template <typename T>
203243
bool FreeList<T>::IsUsed(Index index) const {
244+
assert(index < list_.size());
204245
return (reinterpret_cast<uintptr_t>(list_[index]) & ptrFreeBit) == 0;
205246
}
206247

@@ -497,12 +538,13 @@ template <> inline void WABT_VECTORCALL Value::Set<Ref>(Ref val) { ref_ = val; S
497538

498539
//// Store ////
499540
inline bool Store::IsValid(Ref ref) const {
500-
return objects_.IsUsed(ref.index) && objects_.Get(ref.index);
541+
return ref.index >= Ref::kExternValue || objects_.IsUsed(ref.index);
501542
}
502543

503544
template <typename T>
504545
bool Store::Is(Ref ref) const {
505-
return objects_.IsUsed(ref.index) && isa<T>(objects_.Get(ref.index));
546+
return ref.index < Ref::kExternValue && objects_.IsUsed(ref.index) &&
547+
isa<T>(objects_.Get(ref.index));
506548
}
507549

508550
template <typename T>
@@ -902,6 +944,73 @@ inline const TagType& Tag::type() const {
902944
return type_;
903945
}
904946

947+
//// Array ////
948+
// static
949+
inline bool Array::classof(const Object* obj) {
950+
return obj->kind() == skind;
951+
}
952+
953+
inline Array::Ptr Array::New(Store& store,
954+
u32 size,
955+
Index type_index,
956+
Module* mod) {
957+
return store.Alloc<Array>(store, size, type_index, mod);
958+
}
959+
960+
inline Index Array::Size() const {
961+
return static_cast<Index>(items_.size());
962+
}
963+
964+
inline Value Array::GetItem(Index idx) const {
965+
return items_[idx];
966+
}
967+
968+
inline void Array::SetItem(Index idx, Value value) {
969+
items_[idx] = value;
970+
}
971+
972+
inline Values& Array::GetItems() {
973+
return items_;
974+
}
975+
976+
inline Index Array::GetTypeIndex() const {
977+
return type_index_;
978+
}
979+
980+
inline Ref Array::GetModule() const {
981+
return module_;
982+
}
983+
984+
//// Struct ////
985+
// static
986+
inline bool Struct::classof(const Object* obj) {
987+
return obj->kind() == skind;
988+
}
989+
990+
inline Struct::Ptr Struct::New(Store& store, Index type_index, Module* mod) {
991+
return store.Alloc<Struct>(store, type_index, mod);
992+
}
993+
994+
inline Index Struct::Size() const {
995+
return static_cast<Index>(fields_.size());
996+
}
997+
998+
inline Value Struct::GetField(Index idx) const {
999+
return fields_[idx];
1000+
}
1001+
1002+
inline void Struct::SetField(Index idx, Value value) {
1003+
fields_[idx] = value;
1004+
}
1005+
1006+
inline Index Struct::GetTypeIndex() const {
1007+
return type_index_;
1008+
}
1009+
1010+
inline Ref Struct::GetModule() const {
1011+
return module_;
1012+
}
1013+
9051014
//// ElemSegment ////
9061015
inline void ElemSegment::Drop() {
9071016
elements_.clear();

0 commit comments

Comments
 (0)