/src/capstonev5/arch/WASM/WASMMapping.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Capstone Disassembly Engine */ |
2 | | /* By Spike, xwings 2019 */ |
3 | | |
4 | | #ifdef CAPSTONE_HAS_WASM |
5 | | |
6 | | #include <string.h> |
7 | | |
8 | | #include "../../cs_priv.h" |
9 | | #include "../../utils.h" |
10 | | |
11 | | #include "WASMMapping.h" |
12 | | |
13 | | // fill in details |
14 | | void WASM_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id) |
15 | 353k | { |
16 | 353k | insn->id = id; |
17 | 353k | } |
18 | | |
19 | | #ifndef CAPSTONE_DIET |
20 | | static const name_map insn_name_maps[256] = { |
21 | | { WASM_INS_UNREACHABLE, "unreachable" }, |
22 | | { WASM_INS_NOP, "nop" }, |
23 | | { WASM_INS_BLOCK, "block" }, |
24 | | { WASM_INS_LOOP, "loop" }, |
25 | | { WASM_INS_IF, "if" }, |
26 | | { WASM_INS_ELSE, "else" }, |
27 | | { WASM_INS_INVALID, NULL }, |
28 | | { WASM_INS_INVALID, NULL }, |
29 | | { WASM_INS_INVALID, NULL }, |
30 | | { WASM_INS_INVALID, NULL }, |
31 | | { WASM_INS_INVALID, NULL }, |
32 | | { WASM_INS_END, "end" }, |
33 | | { WASM_INS_BR, "br" }, |
34 | | { WASM_INS_BR_IF, "br_if" }, |
35 | | { WASM_INS_BR_TABLE, "br_table" }, |
36 | | { WASM_INS_RETURN, "return" }, |
37 | | { WASM_INS_CALL, "call" }, |
38 | | { WASM_INS_CALL_INDIRECT, "call_indirect" }, |
39 | | { WASM_INS_INVALID, NULL }, |
40 | | { WASM_INS_INVALID, NULL }, |
41 | | { WASM_INS_INVALID, NULL }, |
42 | | { WASM_INS_INVALID, NULL }, |
43 | | { WASM_INS_INVALID, NULL }, |
44 | | { WASM_INS_INVALID, NULL }, |
45 | | { WASM_INS_INVALID, NULL }, |
46 | | { WASM_INS_INVALID, NULL }, |
47 | | { WASM_INS_DROP, "drop" }, |
48 | | { WASM_INS_SELECT, "select" }, |
49 | | { WASM_INS_INVALID, NULL }, |
50 | | { WASM_INS_INVALID, NULL }, |
51 | | { WASM_INS_INVALID, NULL }, |
52 | | { WASM_INS_INVALID, NULL }, |
53 | | { WASM_INS_GET_LOCAL, "get_local" }, |
54 | | { WASM_INS_SET_LOCAL, "set_local" }, |
55 | | { WASM_INS_TEE_LOCAL, "tee_local" }, |
56 | | { WASM_INS_GET_GLOBAL, "get_global" }, |
57 | | { WASM_INS_SET_GLOBAL, "set_global" }, |
58 | | { WASM_INS_INVALID, NULL }, |
59 | | { WASM_INS_INVALID, NULL }, |
60 | | { WASM_INS_INVALID, NULL }, |
61 | | { WASM_INS_I32_LOAD, "i32.load" }, |
62 | | { WASM_INS_I64_LOAD, "i64.load" }, |
63 | | { WASM_INS_F32_LOAD, "f32.load" }, |
64 | | { WASM_INS_F64_LOAD, "f64.load" }, |
65 | | { WASM_INS_I32_LOAD8_S, "i32.load8_s" }, |
66 | | { WASM_INS_I32_LOAD8_U, "i32.load8_u" }, |
67 | | { WASM_INS_I32_LOAD16_S, "i32.load16_s" }, |
68 | | { WASM_INS_I32_LOAD16_U, "i32.load16_u" }, |
69 | | { WASM_INS_I64_LOAD8_S, "i64.load8_s" }, |
70 | | { WASM_INS_I64_LOAD8_U, "i64.load8_u" }, |
71 | | { WASM_INS_I64_LOAD16_S, "i64.load16_s" }, |
72 | | { WASM_INS_I64_LOAD16_U, "i64.load16_u"}, |
73 | | { WASM_INS_I64_LOAD32_S, "i64.load32_s"}, |
74 | | { WASM_INS_I64_LOAD32_U, "i64.load32_u" }, |
75 | | { WASM_INS_I32_STORE, "i32.store" }, |
76 | | { WASM_INS_I64_STORE, "i64.store" }, |
77 | | { WASM_INS_F32_STORE, "f32.store" }, |
78 | | { WASM_INS_F64_STORE, "f64.store" }, |
79 | | { WASM_INS_I32_STORE8, "i32.store8" }, |
80 | | { WASM_INS_I32_STORE16, "i32.store16" }, |
81 | | { WASM_INS_I64_STORE8, "i64.store8" }, |
82 | | { WASM_INS_I64_STORE16, "i64.store16" }, |
83 | | { WASM_INS_I64_STORE32, "i64.store32" }, |
84 | | { WASM_INS_CURRENT_MEMORY, "current_memory" }, |
85 | | { WASM_INS_GROW_MEMORY, "grow_memory" }, |
86 | | { WASM_INS_I32_CONST, "i32.const" }, |
87 | | { WASM_INS_I64_CONST, "i64.const" }, |
88 | | { WASM_INS_F32_CONST, "f32.const" }, |
89 | | { WASM_INS_F64_CONST, "f64.const" }, |
90 | | { WASM_INS_I32_EQZ, "i32.eqz" }, |
91 | | { WASM_INS_I32_EQ, "i32.eq" }, |
92 | | { WASM_INS_I32_NE, "i32.ne" }, |
93 | | { WASM_INS_I32_LT_S, "i32.lt_s" }, |
94 | | { WASM_INS_I32_LT_U, "i32.lt_u" }, |
95 | | { WASM_INS_I32_GT_S, "i32.gt_s" }, |
96 | | { WASM_INS_I32_GT_U, "i32.gt_u" }, |
97 | | { WASM_INS_I32_LE_S, "i32.le_s" }, |
98 | | { WASM_INS_I32_LE_U, "i32.le_u" }, |
99 | | { WASM_INS_I32_GE_S, "i32.ge_s" }, |
100 | | { WASM_INS_I32_GE_U, "i32.ge_u" }, |
101 | | { WASM_INS_I64_EQZ, "i64.eqz" }, |
102 | | { WASM_INS_I64_EQ, "i64.eq" }, |
103 | | { WASM_INS_I64_NE, "i64.ne" }, |
104 | | { WASM_INS_I64_LT_S, "i64.lt_s" }, |
105 | | { WASM_INS_I64_LT_U, "i64.lt_u" }, |
106 | | { WASN_INS_I64_GT_S, "i64.gt_s" }, |
107 | | { WASM_INS_I64_GT_U, "i64.gt_u" }, |
108 | | { WASM_INS_I64_LE_S, "i64.le_s" }, |
109 | | { WASM_INS_I64_LE_U, "i64.le_u" }, |
110 | | { WASM_INS_I64_GE_S, "i64.ge_s" }, |
111 | | { WASM_INS_I64_GE_U, "i64.ge_u" }, |
112 | | { WASM_INS_F32_EQ, "f32.eq" }, |
113 | | { WASM_INS_F32_NE, "f32.ne" }, |
114 | | { WASM_INS_F32_LT, "f32.lt" }, |
115 | | { WASM_INS_F32_GT, "f32.gt" }, |
116 | | { WASM_INS_F32_LE, "f32.le" }, |
117 | | { WASM_INS_F32_GE, "f32.ge" }, |
118 | | { WASM_INS_F64_EQ, "f64.eq" }, |
119 | | { WASM_INS_F64_NE, "f64.ne" }, |
120 | | { WASM_INS_F64_LT, "f64.lt" }, |
121 | | { WASM_INS_F64_GT, "f64.gt" }, |
122 | | { WASM_INS_F64_LE, "f64.le" }, |
123 | | { WASM_INS_F64_GE, "f64.ge" }, |
124 | | { WASM_INS_I32_CLZ, "i32.clz" }, |
125 | | { WASM_INS_I32_CTZ, "i32.ctz" }, |
126 | | { WASM_INS_I32_POPCNT, "i32.popcnt" }, |
127 | | { WASM_INS_I32_ADD, "i32.add" }, |
128 | | { WASM_INS_I32_SUB, "i32.sub" }, |
129 | | { WASM_INS_I32_MUL, "i32.mul" }, |
130 | | { WASM_INS_I32_DIV_S, "i32.div_s" }, |
131 | | { WASM_INS_I32_DIV_U, "i32.div_u" }, |
132 | | { WASM_INS_I32_REM_S, "i32.rem_s" }, |
133 | | { WASM_INS_I32_REM_U, "i32.rem_u" }, |
134 | | { WASM_INS_I32_AND, "i32.and" }, |
135 | | { WASM_INS_I32_OR, "i32.or" }, |
136 | | { WASM_INS_I32_XOR, "i32.xor" }, |
137 | | { WASM_INS_I32_SHL, "i32.shl" }, |
138 | | { WASM_INS_I32_SHR_S, "i32.shr_s" }, |
139 | | { WASM_INS_I32_SHR_U, "i32.shr_u" }, |
140 | | { WASM_INS_I32_ROTL, "i32.rotl" }, |
141 | | { WASM_INS_I32_ROTR, "i32.rotr" }, |
142 | | { WASM_INS_I64_CLZ, "i64.clz" }, |
143 | | { WASM_INS_I64_CTZ, "i64.ctz" }, |
144 | | { WASM_INS_I64_POPCNT, "i64.popcnt" }, |
145 | | { WASM_INS_I64_ADD, "i64.add" }, |
146 | | { WASM_INS_I64_SUB, "i64.sub" }, |
147 | | { WASM_INS_I64_MUL, "i64.mul" }, |
148 | | { WASM_INS_I64_DIV_S, "i64.div_s" }, |
149 | | { WASM_INS_I64_DIV_U, "i64.div_u" }, |
150 | | { WASM_INS_I64_REM_S, "i64.rem_s" }, |
151 | | { WASM_INS_I64_REM_U, "i64.rem_u" }, |
152 | | { WASM_INS_I64_AND, "i64.and" }, |
153 | | { WASM_INS_I64_OR, "i64.or" }, |
154 | | { WASM_INS_I64_XOR, "i64.xor" }, |
155 | | { WASM_INS_I64_SHL, "i64.shl" }, |
156 | | { WASM_INS_I64_SHR_S, "i64.shr_s" }, |
157 | | { WASM_INS_I64_SHR_U, "i64.shr_u" }, |
158 | | { WASM_INS_I64_ROTL, "i64.rotl" }, |
159 | | { WASM_INS_I64_ROTR, "i64.rotr" }, |
160 | | { WASM_INS_F32_ABS, "f32.abs" }, |
161 | | { WASM_INS_F32_NEG, "f32.neg" }, |
162 | | { WASM_INS_F32_CEIL, "f32.ceil" }, |
163 | | { WASM_INS_F32_FLOOR, "f32.floor" }, |
164 | | { WASM_INS_F32_TRUNC, "f32.trunc" }, |
165 | | { WASM_INS_F32_NEAREST, "f32.nearest" }, |
166 | | { WASM_INS_F32_SQRT, "f32.sqrt" }, |
167 | | { WASM_INS_F32_ADD, "f32.add" }, |
168 | | { WASM_INS_F32_SUB, "f32.sub" }, |
169 | | { WASM_INS_F32_MUL, "f32.mul" }, |
170 | | { WASM_INS_F32_DIV, "f32.div" }, |
171 | | { WASM_INS_F32_MIN, "f32.min" }, |
172 | | { WASM_INS_F32_MAX, "f32.max" }, |
173 | | { WASM_INS_F32_COPYSIGN, "f32.copysign" }, |
174 | | { WASM_INS_F64_ABS, "f64.abs" }, |
175 | | { WASM_INS_F64_NEG, "f64.neg" }, |
176 | | { WASM_INS_F64_CEIL, "f64.ceil" }, |
177 | | { WASM_INS_F64_FLOOR, "f64.floor" }, |
178 | | { WASM_INS_F64_TRUNC, "f64.trunc" }, |
179 | | { WASM_INS_F64_NEAREST, "f64.nearest" }, |
180 | | { WASM_INS_F64_SQRT, "f64.sqrt" }, |
181 | | { WASM_INS_F64_ADD, "f64.add" }, |
182 | | { WASM_INS_F64_SUB, "f64.sub" }, |
183 | | { WASM_INS_F64_MUL, "f64.mul" }, |
184 | | { WASM_INS_F64_DIV, "f64.div" }, |
185 | | { WASM_INS_F64_MIN, "f64.min" }, |
186 | | { WASM_INS_F64_MAX, "f64.max" }, |
187 | | { WASM_INS_F64_COPYSIGN, "f64.copysign" }, |
188 | | { WASM_INS_I32_WARP_I64, "i32.warp/i64" }, |
189 | | { WASP_INS_I32_TRUNC_S_F32, "i32.trunc_s/f32" }, |
190 | | { WASM_INS_I32_TRUNC_U_F32, "i32.trunc_u/f32" }, |
191 | | { WASM_INS_I32_TRUNC_S_F64, "i32/trunc_s/f64" }, |
192 | | { WASM_INS_I32_TRUNC_U_F64, "i32/trunc_u/f64" }, |
193 | | { WASM_INS_I64_EXTEND_S_I32, "i64/extend_s/i32" }, |
194 | | { WASM_INS_I64_EXTEND_U_I32, "i64/extend_u/i32" }, |
195 | | { WASM_INS_I64_TRUNC_S_F32, "i64.trunc_s/f32" }, |
196 | | { WASM_INS_I64_TRUNC_U_F32, "i64.trunc_u/f32" }, |
197 | | { WASM_INS_I64_TRUNC_S_F64, "f64.trunc_s/f64" }, |
198 | | { WASM_INS_I64_TRUNC_U_F64, "f64.trunc_u/f64" }, |
199 | | { WASM_INS_F32_CONVERT_S_I32, "f32.convert_s/i32" }, |
200 | | { WASM_INS_F32_CONVERT_U_I32, "f32.convert_u/i32" }, |
201 | | { WASM_INS_F32_CONVERT_S_I64, "f32.convert_s/i64" }, |
202 | | { WASM_INS_F32_CONVERT_U_I64, "f32.convert_u/i64" }, |
203 | | { WASM_INS_F32_DEMOTE_F64, "f32.demote/f64" }, |
204 | | { WASM_INS_F64_CONVERT_S_I32, "f64.convert_s/i32" }, |
205 | | { WASM_INS_F64_CONVERT_U_I32, "f64.convert_u/i32" }, |
206 | | { WASM_INS_F64_CONVERT_S_I64, "f64.convert_s/i64" }, |
207 | | { WASM_INS_F64_CONVERT_U_I64, "f64.convert_u/i64" }, |
208 | | { WASM_INS_F64_PROMOTE_F32, "f64.promote/f32" }, |
209 | | { WASM_INS_I32_REINTERPRET_F32, "i32.reinterpret/f32" }, |
210 | | { WASM_INS_I64_REINTERPRET_F64, "i64.reinterpret/f64" }, |
211 | | { WASM_INS_F32_REINTERPRET_I32, "f32.reinterpret/i32" }, |
212 | | { WASM_INS_F64_REINTERPRET_I64, "f64.reinterpret/i64" }, |
213 | | { WASM_INS_INVALID, NULL }, |
214 | | { WASM_INS_INVALID, NULL }, |
215 | | { WASM_INS_INVALID, NULL }, |
216 | | { WASM_INS_INVALID, NULL }, |
217 | | { WASM_INS_INVALID, NULL }, |
218 | | { WASM_INS_INVALID, NULL }, |
219 | | { WASM_INS_INVALID, NULL }, |
220 | | { WASM_INS_INVALID, NULL }, |
221 | | { WASM_INS_INVALID, NULL }, |
222 | | { WASM_INS_INVALID, NULL }, |
223 | | { WASM_INS_INVALID, NULL }, |
224 | | { WASM_INS_INVALID, NULL }, |
225 | | { WASM_INS_INVALID, NULL }, |
226 | | { WASM_INS_INVALID, NULL }, |
227 | | { WASM_INS_INVALID, NULL }, |
228 | | { WASM_INS_INVALID, NULL }, |
229 | | { WASM_INS_INVALID, NULL }, |
230 | | { WASM_INS_INVALID, NULL }, |
231 | | { WASM_INS_INVALID, NULL }, |
232 | | { WASM_INS_INVALID, NULL }, |
233 | | { WASM_INS_INVALID, NULL }, |
234 | | { WASM_INS_INVALID, NULL }, |
235 | | { WASM_INS_INVALID, NULL }, |
236 | | { WASM_INS_INVALID, NULL }, |
237 | | { WASM_INS_INVALID, NULL }, |
238 | | { WASM_INS_INVALID, NULL }, |
239 | | { WASM_INS_INVALID, NULL }, |
240 | | { WASM_INS_INVALID, NULL }, |
241 | | { WASM_INS_INVALID, NULL }, |
242 | | { WASM_INS_INVALID, NULL }, |
243 | | { WASM_INS_INVALID, NULL }, |
244 | | { WASM_INS_INVALID, NULL }, |
245 | | { WASM_INS_INVALID, NULL }, |
246 | | { WASM_INS_INVALID, NULL }, |
247 | | { WASM_INS_INVALID, NULL }, |
248 | | { WASM_INS_INVALID, NULL }, |
249 | | { WASM_INS_INVALID, NULL }, |
250 | | { WASM_INS_INVALID, NULL }, |
251 | | { WASM_INS_INVALID, NULL }, |
252 | | { WASM_INS_INVALID, NULL }, |
253 | | { WASM_INS_INVALID, NULL }, |
254 | | { WASM_INS_INVALID, NULL }, |
255 | | { WASM_INS_INVALID, NULL }, |
256 | | { WASM_INS_INVALID, NULL }, |
257 | | { WASM_INS_INVALID, NULL }, |
258 | | { WASM_INS_INVALID, NULL }, |
259 | | { WASM_INS_INVALID, NULL }, |
260 | | { WASM_INS_INVALID, NULL }, |
261 | | { WASM_INS_INVALID, NULL }, |
262 | | { WASM_INS_INVALID, NULL }, |
263 | | { WASM_INS_INVALID, NULL }, |
264 | | { WASM_INS_INVALID, NULL }, |
265 | | { WASM_INS_INVALID, NULL }, |
266 | | { WASM_INS_INVALID, NULL }, |
267 | | { WASM_INS_INVALID, NULL }, |
268 | | { WASM_INS_INVALID, NULL }, |
269 | | { WASM_INS_INVALID, NULL }, |
270 | | { WASM_INS_INVALID, NULL }, |
271 | | { WASM_INS_INVALID, NULL }, |
272 | | { WASM_INS_INVALID, NULL }, |
273 | | { WASM_INS_INVALID, NULL }, |
274 | | { WASM_INS_INVALID, NULL }, |
275 | | { WASM_INS_INVALID, NULL }, |
276 | | { WASM_INS_INVALID, NULL }, |
277 | | }; |
278 | | #endif |
279 | | |
280 | | const char *WASM_insn_name(csh handle, unsigned int id) |
281 | 352k | { |
282 | 352k | #ifndef CAPSTONE_DIET |
283 | 352k | if (id >= ARR_SIZE(insn_name_maps)) |
284 | 0 | return NULL; |
285 | 352k | else |
286 | 352k | return insn_name_maps[id].name; |
287 | | #else |
288 | | return NULL; |
289 | | #endif |
290 | 352k | } |
291 | | |
292 | | #ifndef CAPSTONE_DIET |
293 | | static const name_map group_name_maps[] = { |
294 | | // generic groups |
295 | | { WASM_GRP_INVALID, NULL }, |
296 | | // special groups |
297 | | { WASM_GRP_NUMBERIC, "numberic"}, |
298 | | { WASM_GRP_PARAMETRIC, "parametric"}, |
299 | | { WASM_GRP_VARIABLE, "variable"}, |
300 | | { WASM_GRP_MEMORY, "memory"}, |
301 | | { WASM_GRP_CONTROL, "control"}, |
302 | | }; |
303 | | #endif |
304 | | |
305 | | #ifndef CAPSTONE_DIET |
306 | | static const name_map kind_name_maps[] = { |
307 | | { WASM_OP_INVALID, "Invalid" }, |
308 | | { WASM_OP_NONE, "None" }, |
309 | | { WASM_OP_INT7, "uint7" }, |
310 | | { WASM_OP_VARUINT32, "varuint32" }, |
311 | | { WASM_OP_VARUINT64, "varuint64" }, |
312 | | { WASM_OP_UINT32, "uint32" }, |
313 | | { WASM_OP_UINT64, "uint64" }, |
314 | | }; |
315 | | #endif |
316 | | |
317 | 0 | const char *WASM_kind_name(unsigned int id){ |
318 | 0 | #ifndef CAPSTONE_DIET |
319 | 0 | return id2name(kind_name_maps, ARR_SIZE(kind_name_maps), id); |
320 | | #else |
321 | | return NULL; |
322 | | #endif |
323 | 0 | } |
324 | | |
325 | | const char *WASM_group_name(csh handle, unsigned int id) |
326 | 176k | { |
327 | 176k | #ifndef CAPSTONE_DIET |
328 | 176k | return id2name(group_name_maps, ARR_SIZE(group_name_maps), id); |
329 | | #else |
330 | | return NULL; |
331 | | #endif |
332 | 176k | } |
333 | | #endif |