Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
wasm_sysio_validation.hpp
Go to the documentation of this file.
1#pragma once
2
7#include <functional>
8#include <vector>
9#include <iostream>
10#include "IR/Module.h"
11#include "IR/Operators.h"
12#include "WASM/WASM.h"
13
14namespace sysio { namespace chain { namespace wasm_validations {
15
16 // module validators
17 // effectively do nothing and pass
19 static void validate( const IR::Module& m );
20 };
21
23 static void validate( const IR::Module& m );
24 };
25
27 static void validate( const IR::Module& m );
28 };
29
31 static void validate( const IR::Module& m );
32 };
33
35 static void validate( const IR::Module& m );
36 };
37
39 static void validate( const IR::Module& m );
40 };
41
43 static void validate( const IR::Module& m );
44 };
45
46 using wasm_validate_func = std::function<void(IR::Module&)>;
47
48
49 // just pass
51 static void validate( const IR::Module& m ) {}
52 };
53
54 // instruction validators
55 // simple mutator that doesn't actually mutate anything
56 // used to verify that a given instruction is valid for execution on our platform
57 // for validators set kills to true, this eliminates the extraneous building
58 // of new code that is going to get thrown away any way
60 static constexpr bool kills = true;
61 static constexpr bool post = false;
62 static void accept( wasm_ops::instr* inst, wasm_ops::visitor_arg& arg ) {
63 // just pass
64 }
65 };
66
67 template <typename T>
69 static constexpr bool kills = true;
70 static constexpr bool post = false;
71 static void accept( wasm_ops::instr* inst, wasm_ops::visitor_arg& arg ) {
72 // cast to a type that has a memarg field
73 T* memarg_instr = reinterpret_cast<T*>(inst);
74 if(memarg_instr->field.o >= wasm_constraints::maximum_linear_memory)
75 FC_THROW_EXCEPTION(wasm_execution_error, "Smart contract used an invalid large memory store/load offset");
76 }
77
78 };
79
81 static constexpr bool kills = false;
82 static constexpr bool post = false;
83 static void init() {}
84 static void accept( wasm_ops::instr* inst, wasm_ops::visitor_arg& arg ) {
85 std::cout << "INSTRUCTION : " << inst->to_string() << "\n";
86 }
87 };
88
89
93
95 static constexpr bool kills = true;
96 static constexpr bool post = false;
97 static void accept( wasm_ops::instr* inst, wasm_ops::visitor_arg& arg ) {
98 FC_THROW_EXCEPTION(wasm_execution_error, "Error, blacklisted opcode ${op} ",
99 ("op", inst->to_string()));
100 }
101 };
102
104 static constexpr bool kills = false;
105 static constexpr bool post = false;
106 static bool disabled;
108 static void init(bool disable) { disabled = disable; depth = 0; }
109 static void accept( wasm_ops::instr* inst, wasm_ops::visitor_arg& arg ) {
110 if (!disabled) {
111 if ( inst->get_code() == wasm_ops::end_code && depth > 0 ) {
112 depth--;
113 return;
114 }
115 depth++;
116 SYS_ASSERT(depth < 1024, wasm_execution_error, "Nested depth exceeded");
117 }
118 }
119 };
120
121 // add opcode specific constraints here
122 // so far we only black list
123 struct op_constrainers : wasm_ops::op_types<blacklist_validator> {
124 using block_t = wasm_ops::block <whitelist_validator, nested_validator>;
125 using loop_t = wasm_ops::loop <whitelist_validator, nested_validator>;
126 using if__t = wasm_ops::if_ <whitelist_validator, nested_validator>;
127 using else__t = wasm_ops::else_ <whitelist_validator, nested_validator>;
128
129 using end_t = wasm_ops::end <whitelist_validator, nested_validator>;
130 using unreachable_t = wasm_ops::unreachable <whitelist_validator>;
131 using br_t = wasm_ops::br <whitelist_validator>;
132 using br_if_t = wasm_ops::br_if <whitelist_validator>;
133 using br_table_t = wasm_ops::br_table <whitelist_validator>;
134 using return__t = wasm_ops::return_ <whitelist_validator>;
135 using call_t = wasm_ops::call <whitelist_validator>;
136 using call_indirect_t = wasm_ops::call_indirect <whitelist_validator>;
137 using drop_t = wasm_ops::drop <whitelist_validator>;
138 using select_t = wasm_ops::select <whitelist_validator>;
139
140 using get_local_t = wasm_ops::get_local <whitelist_validator>;
141 using set_local_t = wasm_ops::set_local <whitelist_validator>;
142 using tee_local_t = wasm_ops::tee_local <whitelist_validator>;
143 using get_global_t = wasm_ops::get_global <whitelist_validator>;
144 using set_global_t = wasm_ops::set_global <whitelist_validator>;
145
146 using grow_memory_t = wasm_ops::grow_memory <whitelist_validator>;
147 using current_memory_t = wasm_ops::current_memory <whitelist_validator>;
148
149 using nop_t = wasm_ops::nop <whitelist_validator>;
150 using i32_load_t = wasm_ops::i32_load <large_offset_validator<wasm_ops::op_types<>::i32_load_t>, whitelist_validator>;
151 using i64_load_t = wasm_ops::i64_load <large_offset_validator<wasm_ops::op_types<>::i64_load_t>, whitelist_validator>;
152 using f32_load_t = wasm_ops::f32_load <large_offset_validator<wasm_ops::op_types<>::f32_load_t>, whitelist_validator>;
153 using f64_load_t = wasm_ops::f64_load <large_offset_validator<wasm_ops::op_types<>::f64_load_t>, whitelist_validator>;
154 using i32_load8_s_t = wasm_ops::i32_load8_s <large_offset_validator<wasm_ops::op_types<>::i32_load8_s_t>, whitelist_validator>;
155 using i32_load8_u_t = wasm_ops::i32_load8_u <large_offset_validator<wasm_ops::op_types<>::i32_load8_u_t>, whitelist_validator>;
156 using i32_load16_s_t = wasm_ops::i32_load16_s <large_offset_validator<wasm_ops::op_types<>::i32_load16_s_t>, whitelist_validator>;
157 using i32_load16_u_t = wasm_ops::i32_load16_u <large_offset_validator<wasm_ops::op_types<>::i32_load16_u_t>, whitelist_validator>;
158 using i64_load8_s_t = wasm_ops::i64_load8_s <large_offset_validator<wasm_ops::op_types<>::i64_load8_s_t>, whitelist_validator>;
159 using i64_load8_u_t = wasm_ops::i64_load8_u <large_offset_validator<wasm_ops::op_types<>::i64_load8_u_t>, whitelist_validator>;
160 using i64_load16_s_t = wasm_ops::i64_load16_s <large_offset_validator<wasm_ops::op_types<>::i64_load16_s_t>, whitelist_validator>;
161 using i64_load16_u_t = wasm_ops::i64_load16_u <large_offset_validator<wasm_ops::op_types<>::i64_load16_u_t>, whitelist_validator>;
162 using i64_load32_s_t = wasm_ops::i64_load32_s <large_offset_validator<wasm_ops::op_types<>::i64_load32_s_t>, whitelist_validator>;
163 using i64_load32_u_t = wasm_ops::i64_load32_u <large_offset_validator<wasm_ops::op_types<>::i64_load32_u_t>, whitelist_validator>;
164 using i32_store_t = wasm_ops::i32_store <large_offset_validator<wasm_ops::op_types<>::i32_store_t>, whitelist_validator>;
165 using i64_store_t = wasm_ops::i64_store <large_offset_validator<wasm_ops::op_types<>::i64_store_t>, whitelist_validator>;
166 using f32_store_t = wasm_ops::f32_store <large_offset_validator<wasm_ops::op_types<>::f32_store_t>, whitelist_validator>;
167 using f64_store_t = wasm_ops::f64_store <large_offset_validator<wasm_ops::op_types<>::f64_store_t>, whitelist_validator>;
168 using i32_store8_t = wasm_ops::i32_store8 <large_offset_validator<wasm_ops::op_types<>::i32_store8_t>, whitelist_validator>;
169 using i32_store16_t = wasm_ops::i32_store16 <large_offset_validator<wasm_ops::op_types<>::i32_store16_t>, whitelist_validator>;
170 using i64_store8_t = wasm_ops::i64_store8 <large_offset_validator<wasm_ops::op_types<>::i64_store8_t>, whitelist_validator>;
171 using i64_store16_t = wasm_ops::i64_store16 <large_offset_validator<wasm_ops::op_types<>::i64_store16_t>, whitelist_validator>;
172 using i64_store32_t = wasm_ops::i64_store32 <large_offset_validator<wasm_ops::op_types<>::i64_store32_t>, whitelist_validator>;
173
174 using i32_const_t = wasm_ops::i32_const <whitelist_validator>;
175 using i64_const_t = wasm_ops::i64_const <whitelist_validator>;
176 using f32_const_t = wasm_ops::f32_const <whitelist_validator>;
177 using f64_const_t = wasm_ops::f64_const <whitelist_validator>;
178
179 using i32_eqz_t = wasm_ops::i32_eqz <whitelist_validator>;
180 using i32_eq_t = wasm_ops::i32_eq <whitelist_validator>;
181 using i32_ne_t = wasm_ops::i32_ne <whitelist_validator>;
182 using i32_lt_s_t = wasm_ops::i32_lt_s <whitelist_validator>;
183 using i32_lt_u_t = wasm_ops::i32_lt_u <whitelist_validator>;
184 using i32_gt_s_t = wasm_ops::i32_gt_s <whitelist_validator>;
185 using i32_gt_u_t = wasm_ops::i32_gt_u <whitelist_validator>;
186 using i32_le_s_t = wasm_ops::i32_le_s <whitelist_validator>;
187 using i32_le_u_t = wasm_ops::i32_le_u <whitelist_validator>;
188 using i32_ge_s_t = wasm_ops::i32_ge_s <whitelist_validator>;
189 using i32_ge_u_t = wasm_ops::i32_ge_u <whitelist_validator>;
190
191 using i32_clz_t = wasm_ops::i32_clz <whitelist_validator>;
192 using i32_ctz_t = wasm_ops::i32_ctz <whitelist_validator>;
193 using i32_popcnt_t = wasm_ops::i32_popcnt <whitelist_validator>;
194
195 using i32_add_t = wasm_ops::i32_add <whitelist_validator>;
196 using i32_sub_t = wasm_ops::i32_sub <whitelist_validator>;
197 using i32_mul_t = wasm_ops::i32_mul <whitelist_validator>;
198 using i32_div_s_t = wasm_ops::i32_div_s <whitelist_validator>;
199 using i32_div_u_t = wasm_ops::i32_div_u <whitelist_validator>;
200 using i32_rem_s_t = wasm_ops::i32_rem_s <whitelist_validator>;
201 using i32_rem_u_t = wasm_ops::i32_rem_u <whitelist_validator>;
202 using i32_and_t = wasm_ops::i32_and <whitelist_validator>;
203 using i32_or_t = wasm_ops::i32_or <whitelist_validator>;
204 using i32_xor_t = wasm_ops::i32_xor <whitelist_validator>;
205 using i32_shl_t = wasm_ops::i32_shl <whitelist_validator>;
206 using i32_shr_s_t = wasm_ops::i32_shr_s <whitelist_validator>;
207 using i32_shr_u_t = wasm_ops::i32_shr_u <whitelist_validator>;
208 using i32_rotl_t = wasm_ops::i32_rotl <whitelist_validator>;
209 using i32_rotr_t = wasm_ops::i32_rotr <whitelist_validator>;
210
211 using i64_eqz_t = wasm_ops::i64_eqz <whitelist_validator>;
212 using i64_eq_t = wasm_ops::i64_eq <whitelist_validator>;
213 using i64_ne_t = wasm_ops::i64_ne <whitelist_validator>;
214 using i64_lt_s_t = wasm_ops::i64_lt_s <whitelist_validator>;
215 using i64_lt_u_t = wasm_ops::i64_lt_u <whitelist_validator>;
216 using i64_gt_s_t = wasm_ops::i64_gt_s <whitelist_validator>;
217 using i64_gt_u_t = wasm_ops::i64_gt_u <whitelist_validator>;
218 using i64_le_s_t = wasm_ops::i64_le_s <whitelist_validator>;
219 using i64_le_u_t = wasm_ops::i64_le_u <whitelist_validator>;
220 using i64_ge_s_t = wasm_ops::i64_ge_s <whitelist_validator>;
221 using i64_ge_u_t = wasm_ops::i64_ge_u <whitelist_validator>;
222
223 using i64_clz_t = wasm_ops::i64_clz <whitelist_validator>;
224 using i64_ctz_t = wasm_ops::i64_ctz <whitelist_validator>;
225 using i64_popcnt_t = wasm_ops::i64_popcnt <whitelist_validator>;
226
227 using i64_add_t = wasm_ops::i64_add <whitelist_validator>;
228 using i64_sub_t = wasm_ops::i64_sub <whitelist_validator>;
229 using i64_mul_t = wasm_ops::i64_mul <whitelist_validator>;
230 using i64_div_s_t = wasm_ops::i64_div_s <whitelist_validator>;
231 using i64_div_u_t = wasm_ops::i64_div_u <whitelist_validator>;
232 using i64_rem_s_t = wasm_ops::i64_rem_s <whitelist_validator>;
233 using i64_rem_u_t = wasm_ops::i64_rem_u <whitelist_validator>;
234 using i64_and_t = wasm_ops::i64_and <whitelist_validator>;
235 using i64_or_t = wasm_ops::i64_or <whitelist_validator>;
236 using i64_xor_t = wasm_ops::i64_xor <whitelist_validator>;
237 using i64_shl_t = wasm_ops::i64_shl <whitelist_validator>;
238 using i64_shr_s_t = wasm_ops::i64_shr_s <whitelist_validator>;
239 using i64_shr_u_t = wasm_ops::i64_shr_u <whitelist_validator>;
240 using i64_rotl_t = wasm_ops::i64_rotl <whitelist_validator>;
241 using i64_rotr_t = wasm_ops::i64_rotr <whitelist_validator>;
242
243 using f32_eq_t = wasm_ops::f32_eq <whitelist_validator>;
244 using f32_ne_t = wasm_ops::f32_ne <whitelist_validator>;
245 using f32_lt_t = wasm_ops::f32_lt <whitelist_validator>;
246 using f32_gt_t = wasm_ops::f32_gt <whitelist_validator>;
247 using f32_le_t = wasm_ops::f32_le <whitelist_validator>;
248 using f32_ge_t = wasm_ops::f32_ge <whitelist_validator>;
249 using f64_eq_t = wasm_ops::f64_eq <whitelist_validator>;
250 using f64_ne_t = wasm_ops::f64_ne <whitelist_validator>;
251 using f64_lt_t = wasm_ops::f64_lt <whitelist_validator>;
252 using f64_gt_t = wasm_ops::f64_gt <whitelist_validator>;
253 using f64_le_t = wasm_ops::f64_le <whitelist_validator>;
254 using f64_ge_t = wasm_ops::f64_ge <whitelist_validator>;
255 using f32_abs_t = wasm_ops::f32_abs <whitelist_validator>;
256 using f32_neg_t = wasm_ops::f32_neg <whitelist_validator>;
257 using f32_ceil_t = wasm_ops::f32_ceil <whitelist_validator>;
258 using f32_floor_t = wasm_ops::f32_floor <whitelist_validator>;
259 using f32_trunc_t = wasm_ops::f32_trunc <whitelist_validator>;
260 using f32_nearest_t = wasm_ops::f32_nearest <whitelist_validator>;
261 using f32_sqrt_t = wasm_ops::f32_sqrt <whitelist_validator>;
262 using f32_add_t = wasm_ops::f32_add <whitelist_validator>;
263 using f32_sub_t = wasm_ops::f32_sub <whitelist_validator>;
264 using f32_mul_t = wasm_ops::f32_mul <whitelist_validator>;
265 using f32_div_t = wasm_ops::f32_div <whitelist_validator>;
266 using f32_min_t = wasm_ops::f32_min <whitelist_validator>;
267 using f32_max_t = wasm_ops::f32_max <whitelist_validator>;
268 using f32_copysign_t = wasm_ops::f32_copysign <whitelist_validator>;
269 using f64_abs_t = wasm_ops::f64_abs <whitelist_validator>;
270 using f64_neg_t = wasm_ops::f64_neg <whitelist_validator>;
271 using f64_ceil_t = wasm_ops::f64_ceil <whitelist_validator>;
272 using f64_floor_t = wasm_ops::f64_floor <whitelist_validator>;
273 using f64_trunc_t = wasm_ops::f64_trunc <whitelist_validator>;
274 using f64_nearest_t = wasm_ops::f64_nearest <whitelist_validator>;
275 using f64_sqrt_t = wasm_ops::f64_sqrt <whitelist_validator>;
276 using f64_add_t = wasm_ops::f64_add <whitelist_validator>;
277 using f64_sub_t = wasm_ops::f64_sub <whitelist_validator>;
278 using f64_mul_t = wasm_ops::f64_mul <whitelist_validator>;
279 using f64_div_t = wasm_ops::f64_div <whitelist_validator>;
280 using f64_min_t = wasm_ops::f64_min <whitelist_validator>;
281 using f64_max_t = wasm_ops::f64_max <whitelist_validator>;
282 using f64_copysign_t = wasm_ops::f64_copysign <whitelist_validator>;
283
284 using i32_trunc_s_f32_t = wasm_ops::i32_trunc_s_f32 <whitelist_validator>;
285 using i32_trunc_u_f32_t = wasm_ops::i32_trunc_u_f32 <whitelist_validator>;
286 using i32_trunc_s_f64_t = wasm_ops::i32_trunc_s_f64 <whitelist_validator>;
287 using i32_trunc_u_f64_t = wasm_ops::i32_trunc_u_f64 <whitelist_validator>;
288 using i64_trunc_s_f32_t = wasm_ops::i64_trunc_s_f32 <whitelist_validator>;
289 using i64_trunc_u_f32_t = wasm_ops::i64_trunc_u_f32 <whitelist_validator>;
290 using i64_trunc_s_f64_t = wasm_ops::i64_trunc_s_f64 <whitelist_validator>;
291 using i64_trunc_u_f64_t = wasm_ops::i64_trunc_u_f64 <whitelist_validator>;
292 using f32_convert_s_i32_t = wasm_ops::f32_convert_s_i32 <whitelist_validator>;
293 using f32_convert_u_i32_t = wasm_ops::f32_convert_u_i32 <whitelist_validator>;
294 using f32_convert_s_i64_t = wasm_ops::f32_convert_s_i64 <whitelist_validator>;
295 using f32_convert_u_i64_t = wasm_ops::f32_convert_u_i64 <whitelist_validator>;
296 using f32_demote_f64_t = wasm_ops::f32_demote_f64 <whitelist_validator>;
297 using f64_convert_s_i32_t = wasm_ops::f64_convert_s_i32 <whitelist_validator>;
298 using f64_convert_u_i32_t = wasm_ops::f64_convert_u_i32 <whitelist_validator>;
299 using f64_convert_s_i64_t = wasm_ops::f64_convert_s_i64 <whitelist_validator>;
300 using f64_convert_u_i64_t = wasm_ops::f64_convert_u_i64 <whitelist_validator>;
301 using f64_promote_f32_t = wasm_ops::f64_promote_f32 <whitelist_validator>;
302
303 using i32_wrap_i64_t = wasm_ops::i32_wrap_i64 <whitelist_validator>;
304 using i64_extend_s_i32_t = wasm_ops::i64_extend_s_i32 <whitelist_validator>;
305 using i64_extend_u_i32_t = wasm_ops::i64_extend_u_i32 <whitelist_validator>;
306 // TODO, make sure these are just pointer reinterprets
307 using i32_reinterpret_f32_t = wasm_ops::i32_reinterpret_f32 <whitelist_validator>;
308 using f32_reinterpret_i32_t = wasm_ops::f32_reinterpret_i32 <whitelist_validator>;
309 using i64_reinterpret_f64_t = wasm_ops::i64_reinterpret_f64 <whitelist_validator>;
310 using f64_reinterpret_i64_t = wasm_ops::f64_reinterpret_i64 <whitelist_validator>;
311
312 }; // op_constrainers
313
314
315
316 template <typename ... Visitors>
318 static void validate( const IR::Module& m ) {
319 for ( auto validator : { Visitors::validate... } )
320 validator( m );
321 }
322 };
323
324 // inherit from this class and define your own validators
332 public:
333 wasm_binary_validation( const sysio::chain::controller& control, IR::Module& mod ) : _module( &mod ) {
334 // initialize validators here
336 }
337
338 void validate() {
339 _module_validators.validate( *_module );
340 for ( auto& fd : _module->functions.defs ) {
342 while ( decoder ) {
344 auto op = decoder.decodeOp();
345 op->visit( { _module, &new_code, &fd, decoder.index() } );
346 }
347 }
348 }
349 private:
350 IR::Module* _module;
351 static standard_module_constraints_validators _module_validators;
352 };
353
354}}} // namespace wasm_constraints, chain, sysio
#define SYS_ASSERT(expr, exc_type, FORMAT,...)
Definition exceptions.hpp:7
bool is_producing_block() const
wasm_binary_validation(const sysio::chain::controller &control, IR::Module &mod)
Defines exception's used by fc.
#define FC_THROW_EXCEPTION(EXCEPTION, FORMAT,...)
std::function< void(IR::Module &)> wasm_validate_func
#define T(meth, val, expected)
unsigned short uint16_t
Definition stdint.h:125
IndexSpace< FunctionDef, IndexedFunctionType > functions
Definition Module.h:133
virtual uint16_t get_code()=0
static void accept(wasm_ops::instr *inst, wasm_ops::visitor_arg &arg)
static void accept(wasm_ops::instr *inst, wasm_ops::visitor_arg &arg)
static void accept(wasm_ops::instr *inst, wasm_ops::visitor_arg &arg)
static void accept(wasm_ops::instr *inst, wasm_ops::visitor_arg &arg)
wasm_ops::i64_lt_u< whitelist_validator > i64_lt_u_t
wasm_ops::i64_or< whitelist_validator > i64_or_t
wasm_ops::f32_le< whitelist_validator > f32_le_t
wasm_ops::i32_trunc_u_f64< whitelist_validator > i32_trunc_u_f64_t
wasm_ops::i32_gt_s< whitelist_validator > i32_gt_s_t
wasm_ops::i64_sub< whitelist_validator > i64_sub_t
wasm_ops::f32_lt< whitelist_validator > f32_lt_t
wasm_ops::f64_eq< whitelist_validator > f64_eq_t
wasm_ops::f64_le< whitelist_validator > f64_le_t
wasm_ops::f64_convert_u_i64< whitelist_validator > f64_convert_u_i64_t
wasm_ops::current_memory< whitelist_validator > current_memory_t
wasm_ops::i64_rem_s< whitelist_validator > i64_rem_s_t
wasm_ops::i64_rotl< whitelist_validator > i64_rotl_t
wasm_ops::tee_local< whitelist_validator > tee_local_t
wasm_ops::i64_const< whitelist_validator > i64_const_t
wasm_ops::i32_mul< whitelist_validator > i32_mul_t
wasm_ops::f32_convert_s_i32< whitelist_validator > f32_convert_s_i32_t
wasm_ops::f32_store< large_offset_validator< wasm_ops::op_types<>::f32_store_t >, whitelist_validator > f32_store_t
wasm_ops::else_< whitelist_validator, nested_validator > else__t
wasm_ops::i32_load8_s< large_offset_validator< wasm_ops::op_types<>::i32_load8_s_t >, whitelist_validator > i32_load8_s_t
wasm_ops::f32_copysign< whitelist_validator > f32_copysign_t
wasm_ops::i32_le_s< whitelist_validator > i32_le_s_t
wasm_ops::f32_max< whitelist_validator > f32_max_t
wasm_ops::if_< whitelist_validator, nested_validator > if__t
wasm_ops::i32_load16_u< large_offset_validator< wasm_ops::op_types<>::i32_load16_u_t >, whitelist_validator > i32_load16_u_t
wasm_ops::f32_neg< whitelist_validator > f32_neg_t
wasm_ops::i64_load8_s< large_offset_validator< wasm_ops::op_types<>::i64_load8_s_t >, whitelist_validator > i64_load8_s_t
wasm_ops::i64_load16_s< large_offset_validator< wasm_ops::op_types<>::i64_load16_s_t >, whitelist_validator > i64_load16_s_t
wasm_ops::f32_ge< whitelist_validator > f32_ge_t
wasm_ops::i64_add< whitelist_validator > i64_add_t
wasm_ops::f32_reinterpret_i32< whitelist_validator > f32_reinterpret_i32_t
wasm_ops::i64_rotr< whitelist_validator > i64_rotr_t
wasm_ops::i32_or< whitelist_validator > i32_or_t
wasm_ops::f64_max< whitelist_validator > f64_max_t
wasm_ops::i64_le_s< whitelist_validator > i64_le_s_t
wasm_ops::f64_ceil< whitelist_validator > f64_ceil_t
wasm_ops::i64_ge_s< whitelist_validator > i64_ge_s_t
wasm_ops::i32_sub< whitelist_validator > i32_sub_t
wasm_ops::f32_abs< whitelist_validator > f32_abs_t
wasm_ops::f32_demote_f64< whitelist_validator > f32_demote_f64_t
wasm_ops::i32_ne< whitelist_validator > i32_ne_t
wasm_ops::i64_ne< whitelist_validator > i64_ne_t
wasm_ops::block< whitelist_validator, nested_validator > block_t
wasm_ops::set_local< whitelist_validator > set_local_t
wasm_ops::f64_convert_s_i32< whitelist_validator > f64_convert_s_i32_t
wasm_ops::i64_store< large_offset_validator< wasm_ops::op_types<>::i64_store_t >, whitelist_validator > i64_store_t
wasm_ops::i64_load8_u< large_offset_validator< wasm_ops::op_types<>::i64_load8_u_t >, whitelist_validator > i64_load8_u_t
wasm_ops::i64_load32_u< large_offset_validator< wasm_ops::op_types<>::i64_load32_u_t >, whitelist_validator > i64_load32_u_t
wasm_ops::i32_trunc_s_f32< whitelist_validator > i32_trunc_s_f32_t
wasm_ops::set_global< whitelist_validator > set_global_t
wasm_ops::i32_eq< whitelist_validator > i32_eq_t
wasm_ops::f64_mul< whitelist_validator > f64_mul_t
wasm_ops::i64_trunc_s_f32< whitelist_validator > i64_trunc_s_f32_t
wasm_ops::get_local< whitelist_validator > get_local_t
wasm_ops::f64_ge< whitelist_validator > f64_ge_t
wasm_ops::i32_load8_u< large_offset_validator< wasm_ops::op_types<>::i32_load8_u_t >, whitelist_validator > i32_load8_u_t
wasm_ops::i64_load16_u< large_offset_validator< wasm_ops::op_types<>::i64_load16_u_t >, whitelist_validator > i64_load16_u_t
wasm_ops::loop< whitelist_validator, nested_validator > loop_t
wasm_ops::f32_const< whitelist_validator > f32_const_t
wasm_ops::f64_abs< whitelist_validator > f64_abs_t
wasm_ops::i32_popcnt< whitelist_validator > i32_popcnt_t
wasm_ops::i64_trunc_s_f64< whitelist_validator > i64_trunc_s_f64_t
wasm_ops::f64_const< whitelist_validator > f64_const_t
wasm_ops::i64_div_u< whitelist_validator > i64_div_u_t
wasm_ops::i32_ctz< whitelist_validator > i32_ctz_t
wasm_ops::i64_mul< whitelist_validator > i64_mul_t
wasm_ops::br_if< whitelist_validator > br_if_t
wasm_ops::i64_reinterpret_f64< whitelist_validator > i64_reinterpret_f64_t
wasm_ops::f32_convert_u_i64< whitelist_validator > f32_convert_u_i64_t
wasm_ops::i32_rotl< whitelist_validator > i32_rotl_t
wasm_ops::get_global< whitelist_validator > get_global_t
wasm_ops::f32_ceil< whitelist_validator > f32_ceil_t
wasm_ops::i32_ge_u< whitelist_validator > i32_ge_u_t
wasm_ops::f32_mul< whitelist_validator > f32_mul_t
wasm_ops::i32_trunc_u_f32< whitelist_validator > i32_trunc_u_f32_t
wasm_ops::i32_rem_u< whitelist_validator > i32_rem_u_t
wasm_ops::f64_reinterpret_i64< whitelist_validator > f64_reinterpret_i64_t
wasm_ops::f32_add< whitelist_validator > f32_add_t
wasm_ops::i64_clz< whitelist_validator > i64_clz_t
wasm_ops::f32_gt< whitelist_validator > f32_gt_t
wasm_ops::call_indirect< whitelist_validator > call_indirect_t
wasm_ops::f64_convert_u_i32< whitelist_validator > f64_convert_u_i32_t
wasm_ops::i64_eq< whitelist_validator > i64_eq_t
wasm_ops::i64_xor< whitelist_validator > i64_xor_t
wasm_ops::f32_sqrt< whitelist_validator > f32_sqrt_t
wasm_ops::i32_eqz< whitelist_validator > i32_eqz_t
wasm_ops::i32_shr_u< whitelist_validator > i32_shr_u_t
wasm_ops::i32_add< whitelist_validator > i32_add_t
wasm_ops::i64_load< large_offset_validator< wasm_ops::op_types<>::i64_load_t >, whitelist_validator > i64_load_t
wasm_ops::f32_div< whitelist_validator > f32_div_t
wasm_ops::i64_trunc_u_f32< whitelist_validator > i64_trunc_u_f32_t
wasm_ops::i64_and< whitelist_validator > i64_and_t
wasm_ops::f64_ne< whitelist_validator > f64_ne_t
wasm_ops::f64_neg< whitelist_validator > f64_neg_t
wasm_ops::i64_shr_u< whitelist_validator > i64_shr_u_t
wasm_ops::f64_load< large_offset_validator< wasm_ops::op_types<>::f64_load_t >, whitelist_validator > f64_load_t
wasm_ops::f64_trunc< whitelist_validator > f64_trunc_t
wasm_ops::i64_rem_u< whitelist_validator > i64_rem_u_t
wasm_ops::i64_shl< whitelist_validator > i64_shl_t
wasm_ops::f32_trunc< whitelist_validator > f32_trunc_t
wasm_ops::i64_shr_s< whitelist_validator > i64_shr_s_t
wasm_ops::i32_ge_s< whitelist_validator > i32_ge_s_t
wasm_ops::i64_trunc_u_f64< whitelist_validator > i64_trunc_u_f64_t
wasm_ops::i32_div_u< whitelist_validator > i32_div_u_t
wasm_ops::f64_convert_s_i64< whitelist_validator > f64_convert_s_i64_t
wasm_ops::i32_wrap_i64< whitelist_validator > i32_wrap_i64_t
wasm_ops::i64_ctz< whitelist_validator > i64_ctz_t
wasm_ops::i32_store8< large_offset_validator< wasm_ops::op_types<>::i32_store8_t >, whitelist_validator > i32_store8_t
wasm_ops::i64_gt_s< whitelist_validator > i64_gt_s_t
wasm_ops::grow_memory< whitelist_validator > grow_memory_t
wasm_ops::i32_xor< whitelist_validator > i32_xor_t
wasm_ops::i32_div_s< whitelist_validator > i32_div_s_t
wasm_ops::f64_promote_f32< whitelist_validator > f64_promote_f32_t
wasm_ops::i32_reinterpret_f32< whitelist_validator > i32_reinterpret_f32_t
wasm_ops::f64_floor< whitelist_validator > f64_floor_t
wasm_ops::f32_sub< whitelist_validator > f32_sub_t
wasm_ops::i32_shl< whitelist_validator > i32_shl_t
wasm_ops::f64_sqrt< whitelist_validator > f64_sqrt_t
wasm_ops::i32_load16_s< large_offset_validator< wasm_ops::op_types<>::i32_load16_s_t >, whitelist_validator > i32_load16_s_t
wasm_ops::i64_store16< large_offset_validator< wasm_ops::op_types<>::i64_store16_t >, whitelist_validator > i64_store16_t
wasm_ops::i64_popcnt< whitelist_validator > i64_popcnt_t
wasm_ops::i32_trunc_s_f64< whitelist_validator > i32_trunc_s_f64_t
wasm_ops::i32_const< whitelist_validator > i32_const_t
wasm_ops::i64_store8< large_offset_validator< wasm_ops::op_types<>::i64_store8_t >, whitelist_validator > i64_store8_t
wasm_ops::i32_load< large_offset_validator< wasm_ops::op_types<>::i32_load_t >, whitelist_validator > i32_load_t
wasm_ops::end< whitelist_validator, nested_validator > end_t
wasm_ops::i32_lt_s< whitelist_validator > i32_lt_s_t
wasm_ops::i64_extend_s_i32< whitelist_validator > i64_extend_s_i32_t
wasm_ops::f32_floor< whitelist_validator > f32_floor_t
wasm_ops::unreachable< whitelist_validator > unreachable_t
wasm_ops::i32_store16< large_offset_validator< wasm_ops::op_types<>::i32_store16_t >, whitelist_validator > i32_store16_t
wasm_ops::i32_store< large_offset_validator< wasm_ops::op_types<>::i32_store_t >, whitelist_validator > i32_store_t
wasm_ops::f64_nearest< whitelist_validator > f64_nearest_t
wasm_ops::f64_gt< whitelist_validator > f64_gt_t
wasm_ops::select< whitelist_validator > select_t
wasm_ops::f64_min< whitelist_validator > f64_min_t
wasm_ops::i32_gt_u< whitelist_validator > i32_gt_u_t
wasm_ops::f32_ne< whitelist_validator > f32_ne_t
wasm_ops::i32_rotr< whitelist_validator > i32_rotr_t
wasm_ops::i64_extend_u_i32< whitelist_validator > i64_extend_u_i32_t
wasm_ops::f32_nearest< whitelist_validator > f32_nearest_t
wasm_ops::i64_gt_u< whitelist_validator > i64_gt_u_t
wasm_ops::f32_min< whitelist_validator > f32_min_t
wasm_ops::f32_convert_s_i64< whitelist_validator > f32_convert_s_i64_t
wasm_ops::i64_lt_s< whitelist_validator > i64_lt_s_t
wasm_ops::br_table< whitelist_validator > br_table_t
wasm_ops::i32_le_u< whitelist_validator > i32_le_u_t
wasm_ops::i64_store32< large_offset_validator< wasm_ops::op_types<>::i64_store32_t >, whitelist_validator > i64_store32_t
wasm_ops::f32_eq< whitelist_validator > f32_eq_t
wasm_ops::return_< whitelist_validator > return__t
wasm_ops::f64_store< large_offset_validator< wasm_ops::op_types<>::f64_store_t >, whitelist_validator > f64_store_t
wasm_ops::i64_load32_s< large_offset_validator< wasm_ops::op_types<>::i64_load32_s_t >, whitelist_validator > i64_load32_s_t
wasm_ops::f64_sub< whitelist_validator > f64_sub_t
wasm_ops::f32_convert_u_i32< whitelist_validator > f32_convert_u_i32_t
wasm_ops::i64_eqz< whitelist_validator > i64_eqz_t
wasm_ops::i64_div_s< whitelist_validator > i64_div_s_t
wasm_ops::i32_and< whitelist_validator > i32_and_t
wasm_ops::i32_clz< whitelist_validator > i32_clz_t
wasm_ops::f64_add< whitelist_validator > f64_add_t
wasm_ops::f64_lt< whitelist_validator > f64_lt_t
wasm_ops::i64_le_u< whitelist_validator > i64_le_u_t
wasm_ops::f64_div< whitelist_validator > f64_div_t
wasm_ops::i32_shr_s< whitelist_validator > i32_shr_s_t
wasm_ops::i32_rem_s< whitelist_validator > i32_rem_s_t
wasm_ops::i64_ge_u< whitelist_validator > i64_ge_u_t
wasm_ops::f64_copysign< whitelist_validator > f64_copysign_t
wasm_ops::i32_lt_u< whitelist_validator > i32_lt_u_t
wasm_ops::f32_load< large_offset_validator< wasm_ops::op_types<>::f32_load_t >, whitelist_validator > f32_load_t
static void accept(wasm_ops::instr *inst, wasm_ops::visitor_arg &arg)