Skip to content

Commit ab9ab1f

Browse files
author
Zoltan Herczeg
committed
Implement GC opcodes
1 parent 097046d commit ab9ab1f

Some content is hidden

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

44 files changed

+4376
-1442
lines changed

include/wabt/binary-reader-logging.h

Lines changed: 18 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 OnArrayCopy(Index dst_type_index, Index src_type_index) override;
169+
Result OnArrayFill(Index type_index) override;
170+
Result OnArrayGet(Opcode opcode, Index type_index) override;
171+
Result OnArrayInitData(Index type_index, Index data_index) override;
172+
Result OnArrayInitElem(Index type_index, Index elem_index) override;
173+
Result OnArrayNew(Index type_index) override;
174+
Result OnArrayNewData(Index type_index, Index data_index) override;
175+
Result OnArrayNewDefault(Index type_index) override;
176+
Result OnArrayNewElem(Index type_index, Index elem_index) override;
177+
Result OnArrayNewFixed(Index type_index, Index count) override;
178+
Result OnArraySet(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;
@@ -246,6 +258,12 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
246258
Index memidx,
247259
Address alignment_log2,
248260
Address offset) override;
261+
Result OnStructGet(Opcode opcode,
262+
Index type_index,
263+
Index field_index) override;
264+
Result OnStructNew(Index type_index) override;
265+
Result OnStructNewDefault(Index type_index) override;
266+
Result OnStructSet(Index type_index, Index field_index) override;
249267
Result OnThrowExpr(Index tag_index) override;
250268
Result OnThrowRefExpr() override;
251269
Result OnTryExpr(Type sig_type) override;

include/wabt/binary-reader-nop.h

Lines changed: 34 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 OnArrayCopy(Index dst_type_index, Index src_type_index) override {
223+
return Result::Ok;
224+
}
225+
Result OnArrayFill(Index type_index) override { return Result::Ok; }
226+
Result OnArrayGet(Opcode opcode, Index type_index) override {
227+
return Result::Ok;
228+
}
229+
Result OnArrayInitData(Index type_index, Index data_index) override {
230+
return Result::Ok;
231+
}
232+
Result OnArrayInitElem(Index type_index, Index elem_index) override {
233+
return Result::Ok;
234+
}
235+
Result OnArrayNew(Index type_index) override { return Result::Ok; }
236+
Result OnArrayNewData(Index type_index, Index data_index) override {
237+
return Result::Ok;
238+
}
239+
Result OnArrayNewDefault(Index type_index) override { return Result::Ok; }
240+
Result OnArrayNewElem(Index type_index, Index elem_index) override {
241+
return Result::Ok;
242+
}
243+
Result OnArrayNewFixed(Index type_index, Index count) override {
244+
return Result::Ok;
245+
}
246+
Result OnArraySet(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; }
@@ -335,6 +361,14 @@ class BinaryReaderNop : public BinaryReaderDelegate {
335361
Address offset) override {
336362
return Result::Ok;
337363
}
364+
Result OnStructGet(Opcode opcode,
365+
Index type_index,
366+
Index field_index) override {
367+
return Result::Ok;
368+
}
369+
Result OnStructNew(Index type_index) override { return Result::Ok; }
370+
Result OnStructNewDefault(Index type_index) override { return Result::Ok; }
371+
Result OnStructSet(Index type_index, Index field_index) override { return Result::Ok; }
338372
Result OnThrowExpr(Index depth) override { return Result::Ok; }
339373
Result OnThrowRefExpr() override { return Result::Ok; }
340374
Result OnTryExpr(Type sig_type) override { return Result::Ok; }

include/wabt/binary-reader.h

Lines changed: 18 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 OnArrayCopy(Index dst_type_index, Index src_type_index) = 0;
241+
virtual Result OnArrayFill(Index type_index) = 0;
242+
virtual Result OnArrayGet(Opcode opcode, Index type_index) = 0;
243+
virtual Result OnArrayInitData(Index type_index, Index data_index) = 0;
244+
virtual Result OnArrayInitElem(Index type_index, Index elem_index) = 0;
245+
virtual Result OnArrayNew(Index type_index) = 0;
246+
virtual Result OnArrayNewData(Index type_index, Index data_index) = 0;
247+
virtual Result OnArrayNewDefault(Index type_index) = 0;
248+
virtual Result OnArrayNewElem(Index type_index, Index elem_index) = 0;
249+
virtual Result OnArrayNewFixed(Index type_index, Index count) = 0;
250+
virtual Result OnArraySet(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;
@@ -328,6 +340,12 @@ class BinaryReaderDelegate {
328340
Index memidx,
329341
Address alignment_log2,
330342
Address offset) = 0;
343+
virtual Result OnStructGet(Opcode opcode,
344+
Index type_index,
345+
Index field_index) = 0;
346+
virtual Result OnStructNew(Index type_index) = 0;
347+
virtual Result OnStructNewDefault(Index type_index) = 0;
348+
virtual Result OnStructSet(Index type_index, Index field_index) = 0;
331349
virtual Result OnThrowExpr(Index tag_index) = 0;
332350
virtual Result OnThrowRefExpr() = 0;
333351
virtual Result OnTryExpr(Type sig_type) = 0;

include/wabt/expr-visitor.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,22 @@ 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 OnStructGetExpr(StructGetExpr*) = 0;
161+
virtual Result OnStructNewExpr(StructNewExpr*) = 0;
162+
virtual Result OnStructNewDefaultExpr(StructNewDefaultExpr*) = 0;
163+
virtual Result OnStructSetExpr(StructSetExpr*) = 0;
148164
};
149165

150166
class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
@@ -230,6 +246,26 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
230246
Result OnSimdShuffleOpExpr(SimdShuffleOpExpr*) override { return Result::Ok; }
231247
Result OnLoadSplatExpr(LoadSplatExpr*) override { return Result::Ok; }
232248
Result OnLoadZeroExpr(LoadZeroExpr*) override { return Result::Ok; }
249+
Result OnArrayCopyExpr(ArrayCopyExpr*) override { return Result::Ok; }
250+
Result OnArrayFillExpr(ArrayFillExpr*) override { return Result::Ok; }
251+
Result OnArrayGetExpr(ArrayGetExpr*) override { return Result::Ok; }
252+
Result OnArrayInitDataExpr(ArrayInitDataExpr*) override { return Result::Ok; }
253+
Result OnArrayInitElemExpr(ArrayInitElemExpr*) override { return Result::Ok; }
254+
Result OnArrayNewExpr(ArrayNewExpr*) override { return Result::Ok; }
255+
Result OnArrayNewDataExpr(ArrayNewDataExpr*) override { return Result::Ok; }
256+
Result OnArrayNewDefaultExpr(ArrayNewDefaultExpr*) override {
257+
return Result::Ok;
258+
}
259+
Result OnArrayNewElemExpr(ArrayNewElemExpr*) override { return Result::Ok; }
260+
Result OnArrayNewFixedExpr(ArrayNewFixedExpr*) override { return Result::Ok; }
261+
Result OnArraySetExpr(ArraySetExpr*) override { return Result::Ok; }
262+
Result OnGCUnaryExpr(GCUnaryExpr*) override { return Result::Ok; }
263+
Result OnStructGetExpr(StructGetExpr*) override { return Result::Ok; }
264+
Result OnStructNewExpr(StructNewExpr*) override { return Result::Ok; }
265+
Result OnStructNewDefaultExpr(StructNewDefaultExpr*) override {
266+
return Result::Ok;
267+
}
268+
Result OnStructSetExpr(StructSetExpr*) override { return Result::Ok; }
233269
};
234270

235271
} // namespace wabt

include/wabt/interp/interp-inl.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,57 @@ inline const TagType& Tag::type() const {
902902
return type_;
903903
}
904904

905+
//// Array ////
906+
// static
907+
inline bool Array::classof(const Object* obj) {
908+
return obj->kind() == skind;
909+
}
910+
911+
inline Array::Ptr Array::New(Store& store,
912+
u32 size,
913+
Index type_index,
914+
Module* mod) {
915+
return store.Alloc<Array>(store, size, type_index, mod);
916+
}
917+
918+
inline Index Array::Size() const {
919+
return static_cast<Index>(items_.size());
920+
}
921+
922+
inline Value Array::GetItem(Index idx) const {
923+
return items_[idx];
924+
}
925+
926+
inline void Array::SetItem(Index idx, Value value) {
927+
items_[idx] = value;
928+
}
929+
930+
inline Values& Array::GetItems() {
931+
return items_;
932+
}
933+
934+
//// Struct ////
935+
// static
936+
inline bool Struct::classof(const Object* obj) {
937+
return obj->kind() == skind;
938+
}
939+
940+
inline Struct::Ptr Struct::New(Store& store, Index type_index, Module* mod) {
941+
return store.Alloc<Struct>(store, type_index, mod);
942+
}
943+
944+
inline Index Struct::Size() const {
945+
return static_cast<Index>(fields_.size());
946+
}
947+
948+
inline Value Struct::GetField(Index idx) const {
949+
return fields_[idx];
950+
}
951+
952+
inline void Struct::SetField(Index idx, Value value) {
953+
fields_[idx] = value;
954+
}
955+
905956
//// ElemSegment ////
906957
inline void ElemSegment::Drop() {
907958
elements_.clear();

include/wabt/interp/interp.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ enum class ObjectKind {
8989
Memory,
9090
Global,
9191
Tag,
92+
Array,
93+
Struct,
9294
Module,
9395
Instance,
9496

@@ -999,6 +1001,55 @@ class Tag : public Extern {
9991001
TagType type_;
10001002
};
10011003

1004+
class Array : public Object {
1005+
public:
1006+
static bool classof(const Object* obj);
1007+
static const ObjectKind skind = ObjectKind::Array;
1008+
static const char* GetTypeName() { return "Array"; }
1009+
using Ptr = RefPtr<Array>;
1010+
1011+
static Array::Ptr New(Store&, u32 size, Index type_index, Module* mod);
1012+
1013+
bool IsValidRange(u64 offset, u64 size) const;
1014+
1015+
Index Size() const;
1016+
Value GetItem(Index idx) const;
1017+
void SetItem(Index idx, Value value);
1018+
Values& GetItems();
1019+
1020+
private:
1021+
friend Store;
1022+
explicit Array(Store&, u32 size, Index type_index, Module* mod);
1023+
void Mark(Store&) override;
1024+
1025+
Ref module_;
1026+
Index type_index_;
1027+
Values items_;
1028+
};
1029+
1030+
class Struct : public Object {
1031+
public:
1032+
static bool classof(const Object* obj);
1033+
static const ObjectKind skind = ObjectKind::Struct;
1034+
static const char* GetTypeName() { return "Struct"; }
1035+
using Ptr = RefPtr<Struct>;
1036+
1037+
static Struct::Ptr New(Store&, Index type_index, Module* mod);
1038+
1039+
Index Size() const;
1040+
Value GetField(Index idx) const;
1041+
void SetField(Index idx, Value value);
1042+
1043+
private:
1044+
friend Store;
1045+
explicit Struct(Store&, Index type_index, Module* mod);
1046+
void Mark(Store&) override;
1047+
1048+
Ref module_;
1049+
Index type_index_;
1050+
Values fields_;
1051+
};
1052+
10021053
class ElemSegment {
10031054
public:
10041055
explicit ElemSegment(Store& store, const ElemDesc*, RefPtr<Instance>&);

include/wabt/interp/istream.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,20 @@ enum class InstrKind {
4747
Imm_0_Op_1, // i32.eqz
4848
Imm_0_Op_2, // i32.add
4949
Imm_0_Op_3, // select
50+
Imm_0_Op_4, // array.fill
51+
Imm_0_Op_5, // array.copy
5052
Imm_Jump_Op_0, // br
5153
Imm_Jump_Op_1, // br_if
5254
Imm_Index_Op_0, // global.get
5355
Imm_Index_Op_1, // global.set
5456
Imm_Index_Op_2, // table.set
5557
Imm_Index_Op_3, // memory.fill
58+
Imm_Index_Op_4, // array.init_elem
5659
Imm_Index_Op_N, // call
60+
Imm_Index_Index_Op_1, // struct.get_s
61+
Imm_Index_Index_Op_2, // array.new_data
5762
Imm_Index_Index_Op_3, // memory.init
63+
Imm_Index_Index_Op_4, // array.init_data
5864
Imm_Index_Index_Op_N, // call_indirect
5965
Imm_Index_Offset_Op_1, // i32.load
6066
Imm_Index_Offset_Op_2, // i32.store

0 commit comments

Comments
 (0)