1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh, 2018 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi #include <string.h>
5*9a0e4156SSadaf Ebrahimi #include <stddef.h> // offsetof macro
6*9a0e4156SSadaf Ebrahimi // alternatively #include "../../utils.h" like everyone else
7*9a0e4156SSadaf Ebrahimi
8*9a0e4156SSadaf Ebrahimi #include "EVMDisassembler.h"
9*9a0e4156SSadaf Ebrahimi #include "EVMMapping.h"
10*9a0e4156SSadaf Ebrahimi
11*9a0e4156SSadaf Ebrahimi static short opcodes[256] = {
12*9a0e4156SSadaf Ebrahimi EVM_INS_STOP,
13*9a0e4156SSadaf Ebrahimi EVM_INS_ADD,
14*9a0e4156SSadaf Ebrahimi EVM_INS_MUL,
15*9a0e4156SSadaf Ebrahimi EVM_INS_SUB,
16*9a0e4156SSadaf Ebrahimi EVM_INS_DIV,
17*9a0e4156SSadaf Ebrahimi EVM_INS_SDIV,
18*9a0e4156SSadaf Ebrahimi EVM_INS_MOD,
19*9a0e4156SSadaf Ebrahimi EVM_INS_SMOD,
20*9a0e4156SSadaf Ebrahimi EVM_INS_ADDMOD,
21*9a0e4156SSadaf Ebrahimi EVM_INS_MULMOD,
22*9a0e4156SSadaf Ebrahimi EVM_INS_EXP,
23*9a0e4156SSadaf Ebrahimi EVM_INS_SIGNEXTEND,
24*9a0e4156SSadaf Ebrahimi -1,
25*9a0e4156SSadaf Ebrahimi -1,
26*9a0e4156SSadaf Ebrahimi -1,
27*9a0e4156SSadaf Ebrahimi -1,
28*9a0e4156SSadaf Ebrahimi EVM_INS_LT,
29*9a0e4156SSadaf Ebrahimi EVM_INS_GT,
30*9a0e4156SSadaf Ebrahimi EVM_INS_SLT,
31*9a0e4156SSadaf Ebrahimi EVM_INS_SGT,
32*9a0e4156SSadaf Ebrahimi EVM_INS_EQ,
33*9a0e4156SSadaf Ebrahimi EVM_INS_ISZERO,
34*9a0e4156SSadaf Ebrahimi EVM_INS_AND,
35*9a0e4156SSadaf Ebrahimi EVM_INS_OR,
36*9a0e4156SSadaf Ebrahimi EVM_INS_XOR,
37*9a0e4156SSadaf Ebrahimi EVM_INS_NOT,
38*9a0e4156SSadaf Ebrahimi EVM_INS_BYTE,
39*9a0e4156SSadaf Ebrahimi -1,
40*9a0e4156SSadaf Ebrahimi -1,
41*9a0e4156SSadaf Ebrahimi -1,
42*9a0e4156SSadaf Ebrahimi -1,
43*9a0e4156SSadaf Ebrahimi -1,
44*9a0e4156SSadaf Ebrahimi EVM_INS_SHA3,
45*9a0e4156SSadaf Ebrahimi -1,
46*9a0e4156SSadaf Ebrahimi -1,
47*9a0e4156SSadaf Ebrahimi -1,
48*9a0e4156SSadaf Ebrahimi -1,
49*9a0e4156SSadaf Ebrahimi -1,
50*9a0e4156SSadaf Ebrahimi -1,
51*9a0e4156SSadaf Ebrahimi -1,
52*9a0e4156SSadaf Ebrahimi -1,
53*9a0e4156SSadaf Ebrahimi -1,
54*9a0e4156SSadaf Ebrahimi -1,
55*9a0e4156SSadaf Ebrahimi -1,
56*9a0e4156SSadaf Ebrahimi -1,
57*9a0e4156SSadaf Ebrahimi -1,
58*9a0e4156SSadaf Ebrahimi -1,
59*9a0e4156SSadaf Ebrahimi -1,
60*9a0e4156SSadaf Ebrahimi EVM_INS_ADDRESS,
61*9a0e4156SSadaf Ebrahimi EVM_INS_BALANCE,
62*9a0e4156SSadaf Ebrahimi EVM_INS_ORIGIN,
63*9a0e4156SSadaf Ebrahimi EVM_INS_CALLER,
64*9a0e4156SSadaf Ebrahimi EVM_INS_CALLVALUE,
65*9a0e4156SSadaf Ebrahimi EVM_INS_CALLDATALOAD,
66*9a0e4156SSadaf Ebrahimi EVM_INS_CALLDATASIZE,
67*9a0e4156SSadaf Ebrahimi EVM_INS_CALLDATACOPY,
68*9a0e4156SSadaf Ebrahimi EVM_INS_CODESIZE,
69*9a0e4156SSadaf Ebrahimi EVM_INS_CODECOPY,
70*9a0e4156SSadaf Ebrahimi EVM_INS_GASPRICE,
71*9a0e4156SSadaf Ebrahimi EVM_INS_EXTCODESIZE,
72*9a0e4156SSadaf Ebrahimi EVM_INS_EXTCODECOPY,
73*9a0e4156SSadaf Ebrahimi EVM_INS_RETURNDATASIZE,
74*9a0e4156SSadaf Ebrahimi EVM_INS_RETURNDATACOPY,
75*9a0e4156SSadaf Ebrahimi -1,
76*9a0e4156SSadaf Ebrahimi EVM_INS_BLOCKHASH,
77*9a0e4156SSadaf Ebrahimi EVM_INS_COINBASE,
78*9a0e4156SSadaf Ebrahimi EVM_INS_TIMESTAMP,
79*9a0e4156SSadaf Ebrahimi EVM_INS_NUMBER,
80*9a0e4156SSadaf Ebrahimi EVM_INS_DIFFICULTY,
81*9a0e4156SSadaf Ebrahimi EVM_INS_GASLIMIT,
82*9a0e4156SSadaf Ebrahimi -1,
83*9a0e4156SSadaf Ebrahimi -1,
84*9a0e4156SSadaf Ebrahimi -1,
85*9a0e4156SSadaf Ebrahimi -1,
86*9a0e4156SSadaf Ebrahimi -1,
87*9a0e4156SSadaf Ebrahimi -1,
88*9a0e4156SSadaf Ebrahimi -1,
89*9a0e4156SSadaf Ebrahimi -1,
90*9a0e4156SSadaf Ebrahimi -1,
91*9a0e4156SSadaf Ebrahimi -1,
92*9a0e4156SSadaf Ebrahimi EVM_INS_POP,
93*9a0e4156SSadaf Ebrahimi EVM_INS_MLOAD,
94*9a0e4156SSadaf Ebrahimi EVM_INS_MSTORE,
95*9a0e4156SSadaf Ebrahimi EVM_INS_MSTORE8,
96*9a0e4156SSadaf Ebrahimi EVM_INS_SLOAD,
97*9a0e4156SSadaf Ebrahimi EVM_INS_SSTORE,
98*9a0e4156SSadaf Ebrahimi EVM_INS_JUMP,
99*9a0e4156SSadaf Ebrahimi EVM_INS_JUMPI,
100*9a0e4156SSadaf Ebrahimi EVM_INS_PC,
101*9a0e4156SSadaf Ebrahimi EVM_INS_MSIZE,
102*9a0e4156SSadaf Ebrahimi EVM_INS_GAS,
103*9a0e4156SSadaf Ebrahimi EVM_INS_JUMPDEST,
104*9a0e4156SSadaf Ebrahimi -1,
105*9a0e4156SSadaf Ebrahimi -1,
106*9a0e4156SSadaf Ebrahimi -1,
107*9a0e4156SSadaf Ebrahimi -1,
108*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH1,
109*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH2,
110*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH3,
111*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH4,
112*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH5,
113*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH6,
114*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH7,
115*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH8,
116*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH9,
117*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH10,
118*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH11,
119*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH12,
120*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH13,
121*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH14,
122*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH15,
123*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH16,
124*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH17,
125*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH18,
126*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH19,
127*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH20,
128*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH21,
129*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH22,
130*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH23,
131*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH24,
132*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH25,
133*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH26,
134*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH27,
135*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH28,
136*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH29,
137*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH30,
138*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH31,
139*9a0e4156SSadaf Ebrahimi EVM_INS_PUSH32,
140*9a0e4156SSadaf Ebrahimi EVM_INS_DUP1,
141*9a0e4156SSadaf Ebrahimi EVM_INS_DUP2,
142*9a0e4156SSadaf Ebrahimi EVM_INS_DUP3,
143*9a0e4156SSadaf Ebrahimi EVM_INS_DUP4,
144*9a0e4156SSadaf Ebrahimi EVM_INS_DUP5,
145*9a0e4156SSadaf Ebrahimi EVM_INS_DUP6,
146*9a0e4156SSadaf Ebrahimi EVM_INS_DUP7,
147*9a0e4156SSadaf Ebrahimi EVM_INS_DUP8,
148*9a0e4156SSadaf Ebrahimi EVM_INS_DUP9,
149*9a0e4156SSadaf Ebrahimi EVM_INS_DUP10,
150*9a0e4156SSadaf Ebrahimi EVM_INS_DUP11,
151*9a0e4156SSadaf Ebrahimi EVM_INS_DUP12,
152*9a0e4156SSadaf Ebrahimi EVM_INS_DUP13,
153*9a0e4156SSadaf Ebrahimi EVM_INS_DUP14,
154*9a0e4156SSadaf Ebrahimi EVM_INS_DUP15,
155*9a0e4156SSadaf Ebrahimi EVM_INS_DUP16,
156*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP1,
157*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP2,
158*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP3,
159*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP4,
160*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP5,
161*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP6,
162*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP7,
163*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP8,
164*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP9,
165*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP10,
166*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP11,
167*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP12,
168*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP13,
169*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP14,
170*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP15,
171*9a0e4156SSadaf Ebrahimi EVM_INS_SWAP16,
172*9a0e4156SSadaf Ebrahimi EVM_INS_LOG0,
173*9a0e4156SSadaf Ebrahimi EVM_INS_LOG1,
174*9a0e4156SSadaf Ebrahimi EVM_INS_LOG2,
175*9a0e4156SSadaf Ebrahimi EVM_INS_LOG3,
176*9a0e4156SSadaf Ebrahimi EVM_INS_LOG4,
177*9a0e4156SSadaf Ebrahimi -1,
178*9a0e4156SSadaf Ebrahimi -1,
179*9a0e4156SSadaf Ebrahimi -1,
180*9a0e4156SSadaf Ebrahimi -1,
181*9a0e4156SSadaf Ebrahimi -1,
182*9a0e4156SSadaf Ebrahimi -1,
183*9a0e4156SSadaf Ebrahimi -1,
184*9a0e4156SSadaf Ebrahimi -1,
185*9a0e4156SSadaf Ebrahimi -1,
186*9a0e4156SSadaf Ebrahimi -1,
187*9a0e4156SSadaf Ebrahimi -1,
188*9a0e4156SSadaf Ebrahimi -1,
189*9a0e4156SSadaf Ebrahimi -1,
190*9a0e4156SSadaf Ebrahimi -1,
191*9a0e4156SSadaf Ebrahimi -1,
192*9a0e4156SSadaf Ebrahimi -1,
193*9a0e4156SSadaf Ebrahimi -1,
194*9a0e4156SSadaf Ebrahimi -1,
195*9a0e4156SSadaf Ebrahimi -1,
196*9a0e4156SSadaf Ebrahimi -1,
197*9a0e4156SSadaf Ebrahimi -1,
198*9a0e4156SSadaf Ebrahimi -1,
199*9a0e4156SSadaf Ebrahimi -1,
200*9a0e4156SSadaf Ebrahimi -1,
201*9a0e4156SSadaf Ebrahimi -1,
202*9a0e4156SSadaf Ebrahimi -1,
203*9a0e4156SSadaf Ebrahimi -1,
204*9a0e4156SSadaf Ebrahimi -1,
205*9a0e4156SSadaf Ebrahimi -1,
206*9a0e4156SSadaf Ebrahimi -1,
207*9a0e4156SSadaf Ebrahimi -1,
208*9a0e4156SSadaf Ebrahimi -1,
209*9a0e4156SSadaf Ebrahimi -1,
210*9a0e4156SSadaf Ebrahimi -1,
211*9a0e4156SSadaf Ebrahimi -1,
212*9a0e4156SSadaf Ebrahimi -1,
213*9a0e4156SSadaf Ebrahimi -1,
214*9a0e4156SSadaf Ebrahimi -1,
215*9a0e4156SSadaf Ebrahimi -1,
216*9a0e4156SSadaf Ebrahimi -1,
217*9a0e4156SSadaf Ebrahimi -1,
218*9a0e4156SSadaf Ebrahimi -1,
219*9a0e4156SSadaf Ebrahimi -1,
220*9a0e4156SSadaf Ebrahimi -1,
221*9a0e4156SSadaf Ebrahimi -1,
222*9a0e4156SSadaf Ebrahimi -1,
223*9a0e4156SSadaf Ebrahimi -1,
224*9a0e4156SSadaf Ebrahimi -1,
225*9a0e4156SSadaf Ebrahimi -1,
226*9a0e4156SSadaf Ebrahimi -1,
227*9a0e4156SSadaf Ebrahimi -1,
228*9a0e4156SSadaf Ebrahimi -1,
229*9a0e4156SSadaf Ebrahimi -1,
230*9a0e4156SSadaf Ebrahimi -1,
231*9a0e4156SSadaf Ebrahimi -1,
232*9a0e4156SSadaf Ebrahimi -1,
233*9a0e4156SSadaf Ebrahimi -1,
234*9a0e4156SSadaf Ebrahimi -1,
235*9a0e4156SSadaf Ebrahimi -1,
236*9a0e4156SSadaf Ebrahimi -1,
237*9a0e4156SSadaf Ebrahimi -1,
238*9a0e4156SSadaf Ebrahimi -1,
239*9a0e4156SSadaf Ebrahimi -1,
240*9a0e4156SSadaf Ebrahimi -1,
241*9a0e4156SSadaf Ebrahimi -1,
242*9a0e4156SSadaf Ebrahimi -1,
243*9a0e4156SSadaf Ebrahimi -1,
244*9a0e4156SSadaf Ebrahimi -1,
245*9a0e4156SSadaf Ebrahimi -1,
246*9a0e4156SSadaf Ebrahimi -1,
247*9a0e4156SSadaf Ebrahimi -1,
248*9a0e4156SSadaf Ebrahimi -1,
249*9a0e4156SSadaf Ebrahimi -1,
250*9a0e4156SSadaf Ebrahimi -1,
251*9a0e4156SSadaf Ebrahimi -1,
252*9a0e4156SSadaf Ebrahimi EVM_INS_CREATE,
253*9a0e4156SSadaf Ebrahimi EVM_INS_CALL,
254*9a0e4156SSadaf Ebrahimi EVM_INS_CALLCODE,
255*9a0e4156SSadaf Ebrahimi EVM_INS_RETURN,
256*9a0e4156SSadaf Ebrahimi EVM_INS_DELEGATECALL,
257*9a0e4156SSadaf Ebrahimi EVM_INS_CALLBLACKBOX,
258*9a0e4156SSadaf Ebrahimi -1,
259*9a0e4156SSadaf Ebrahimi -1,
260*9a0e4156SSadaf Ebrahimi -1,
261*9a0e4156SSadaf Ebrahimi -1,
262*9a0e4156SSadaf Ebrahimi EVM_INS_STATICCALL,
263*9a0e4156SSadaf Ebrahimi -1,
264*9a0e4156SSadaf Ebrahimi -1,
265*9a0e4156SSadaf Ebrahimi EVM_INS_REVERT,
266*9a0e4156SSadaf Ebrahimi -1,
267*9a0e4156SSadaf Ebrahimi EVM_INS_SUICIDE,
268*9a0e4156SSadaf Ebrahimi };
269*9a0e4156SSadaf Ebrahimi
EVM_getInstruction(csh ud,const uint8_t * code,size_t code_len,MCInst * MI,uint16_t * size,uint64_t address,void * inst_info)270*9a0e4156SSadaf Ebrahimi bool EVM_getInstruction(csh ud, const uint8_t *code, size_t code_len,
271*9a0e4156SSadaf Ebrahimi MCInst *MI, uint16_t *size, uint64_t address, void *inst_info)
272*9a0e4156SSadaf Ebrahimi {
273*9a0e4156SSadaf Ebrahimi unsigned char opcode;
274*9a0e4156SSadaf Ebrahimi
275*9a0e4156SSadaf Ebrahimi if (code_len == 0)
276*9a0e4156SSadaf Ebrahimi return false;
277*9a0e4156SSadaf Ebrahimi
278*9a0e4156SSadaf Ebrahimi opcode = code[0];
279*9a0e4156SSadaf Ebrahimi if (opcodes[opcode] == -1) {
280*9a0e4156SSadaf Ebrahimi // invalid opcode
281*9a0e4156SSadaf Ebrahimi return false;
282*9a0e4156SSadaf Ebrahimi }
283*9a0e4156SSadaf Ebrahimi
284*9a0e4156SSadaf Ebrahimi // valid opcode
285*9a0e4156SSadaf Ebrahimi MI->address = address;
286*9a0e4156SSadaf Ebrahimi MI->OpcodePub = MI->Opcode = opcode;
287*9a0e4156SSadaf Ebrahimi
288*9a0e4156SSadaf Ebrahimi if (opcode >= EVM_INS_PUSH1 && opcode <= EVM_INS_PUSH32) {
289*9a0e4156SSadaf Ebrahimi unsigned char len = (opcode - EVM_INS_PUSH1 + 1);
290*9a0e4156SSadaf Ebrahimi if (code_len < 1 + len) {
291*9a0e4156SSadaf Ebrahimi // not enough data
292*9a0e4156SSadaf Ebrahimi return false;
293*9a0e4156SSadaf Ebrahimi }
294*9a0e4156SSadaf Ebrahimi
295*9a0e4156SSadaf Ebrahimi *size = 1 + len;
296*9a0e4156SSadaf Ebrahimi memcpy(MI->evm_data, code + 1, len);
297*9a0e4156SSadaf Ebrahimi } else
298*9a0e4156SSadaf Ebrahimi *size = 1;
299*9a0e4156SSadaf Ebrahimi
300*9a0e4156SSadaf Ebrahimi if (MI->flat_insn->detail) {
301*9a0e4156SSadaf Ebrahimi memset(MI->flat_insn->detail, 0, offsetof(cs_detail, evm)+sizeof(cs_evm));
302*9a0e4156SSadaf Ebrahimi EVM_get_insn_id((cs_struct *)ud, MI->flat_insn, opcode);
303*9a0e4156SSadaf Ebrahimi
304*9a0e4156SSadaf Ebrahimi if (MI->flat_insn->detail->evm.pop) {
305*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_STACK_READ;
306*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
307*9a0e4156SSadaf Ebrahimi }
308*9a0e4156SSadaf Ebrahimi
309*9a0e4156SSadaf Ebrahimi if (MI->flat_insn->detail->evm.push) {
310*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_STACK_WRITE;
311*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
312*9a0e4156SSadaf Ebrahimi }
313*9a0e4156SSadaf Ebrahimi
314*9a0e4156SSadaf Ebrahimi // setup groups
315*9a0e4156SSadaf Ebrahimi switch(opcode) {
316*9a0e4156SSadaf Ebrahimi default:
317*9a0e4156SSadaf Ebrahimi break;
318*9a0e4156SSadaf Ebrahimi case EVM_INS_ADD:
319*9a0e4156SSadaf Ebrahimi case EVM_INS_MUL:
320*9a0e4156SSadaf Ebrahimi case EVM_INS_SUB:
321*9a0e4156SSadaf Ebrahimi case EVM_INS_DIV:
322*9a0e4156SSadaf Ebrahimi case EVM_INS_SDIV:
323*9a0e4156SSadaf Ebrahimi case EVM_INS_MOD:
324*9a0e4156SSadaf Ebrahimi case EVM_INS_SMOD:
325*9a0e4156SSadaf Ebrahimi case EVM_INS_ADDMOD:
326*9a0e4156SSadaf Ebrahimi case EVM_INS_MULMOD:
327*9a0e4156SSadaf Ebrahimi case EVM_INS_EXP:
328*9a0e4156SSadaf Ebrahimi case EVM_INS_SIGNEXTEND:
329*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_MATH;
330*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
331*9a0e4156SSadaf Ebrahimi break;
332*9a0e4156SSadaf Ebrahimi
333*9a0e4156SSadaf Ebrahimi case EVM_INS_MSTORE:
334*9a0e4156SSadaf Ebrahimi case EVM_INS_MSTORE8:
335*9a0e4156SSadaf Ebrahimi case EVM_INS_CALLDATACOPY:
336*9a0e4156SSadaf Ebrahimi case EVM_INS_CODECOPY:
337*9a0e4156SSadaf Ebrahimi case EVM_INS_EXTCODECOPY:
338*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_MEM_WRITE;
339*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
340*9a0e4156SSadaf Ebrahimi break;
341*9a0e4156SSadaf Ebrahimi
342*9a0e4156SSadaf Ebrahimi case EVM_INS_MLOAD:
343*9a0e4156SSadaf Ebrahimi case EVM_INS_CREATE:
344*9a0e4156SSadaf Ebrahimi case EVM_INS_CALL:
345*9a0e4156SSadaf Ebrahimi case EVM_INS_CALLCODE:
346*9a0e4156SSadaf Ebrahimi case EVM_INS_RETURN:
347*9a0e4156SSadaf Ebrahimi case EVM_INS_DELEGATECALL:
348*9a0e4156SSadaf Ebrahimi case EVM_INS_REVERT:
349*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_MEM_READ;
350*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
351*9a0e4156SSadaf Ebrahimi break;
352*9a0e4156SSadaf Ebrahimi
353*9a0e4156SSadaf Ebrahimi case EVM_INS_SSTORE:
354*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_STORE_WRITE;
355*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
356*9a0e4156SSadaf Ebrahimi break;
357*9a0e4156SSadaf Ebrahimi
358*9a0e4156SSadaf Ebrahimi case EVM_INS_SLOAD:
359*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_STORE_READ;
360*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
361*9a0e4156SSadaf Ebrahimi break;
362*9a0e4156SSadaf Ebrahimi
363*9a0e4156SSadaf Ebrahimi case EVM_INS_JUMP:
364*9a0e4156SSadaf Ebrahimi case EVM_INS_JUMPI:
365*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_JUMP;
366*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
367*9a0e4156SSadaf Ebrahimi break;
368*9a0e4156SSadaf Ebrahimi
369*9a0e4156SSadaf Ebrahimi case EVM_INS_STOP:
370*9a0e4156SSadaf Ebrahimi case EVM_INS_SUICIDE:
371*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups[MI->flat_insn->detail->groups_count] = EVM_GRP_HALT;
372*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->groups_count++;
373*9a0e4156SSadaf Ebrahimi break;
374*9a0e4156SSadaf Ebrahimi
375*9a0e4156SSadaf Ebrahimi }
376*9a0e4156SSadaf Ebrahimi }
377*9a0e4156SSadaf Ebrahimi
378*9a0e4156SSadaf Ebrahimi return true;
379*9a0e4156SSadaf Ebrahimi }
380