Coverage Report

Created: 2025-07-01 07:03

/src/capstonenext/arch/EVM/EVMMapping.c
Line
Count
Source (jump to first uncovered line)
1
/* Capstone Disassembly Engine */
2
/* By Nguyen Anh Quynh, 2018 */
3
/* By Andelf, 2025 */
4
5
#ifdef CAPSTONE_HAS_EVM
6
7
#include <string.h>
8
9
#include "../../cs_priv.h"
10
#include "../../Mapping.h"
11
#include "../../utils.h"
12
13
#include "EVMMapping.h"
14
15
#ifndef CAPSTONE_DIET
16
static const cs_evm insns[256] = {
17
#include "EVMMappingInsn.inc"
18
};
19
20
// look for @id in @insns, given its size in @max.
21
// return -1 if not found
22
static int evm_insn_find(const cs_evm *insns, unsigned int max, unsigned int id)
23
64.4k
{
24
64.4k
  if (id >= max)
25
0
    return -1;
26
27
64.4k
  if (insns[id].fee == 0xffffffff)
28
    // unused opcode
29
0
    return -1;
30
31
64.4k
  return (int)id;
32
64.4k
}
33
#endif
34
35
// fill in details
36
void EVM_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
37
64.4k
{
38
64.4k
  insn->id = id;
39
64.4k
#ifndef CAPSTONE_DIET
40
64.4k
  if (evm_insn_find(insns, ARR_SIZE(insns), id) > 0) {
41
56.8k
    if (h->detail_opt) {
42
56.8k
      memcpy(&insn->detail->evm, &insns[id], sizeof(insns[id]));
43
56.8k
    }
44
56.8k
  }
45
64.4k
#endif
46
64.4k
}
47
48
#ifndef CAPSTONE_DIET
49
static const name_map insn_name_maps[256] = {
50
  { EVM_INS_STOP, "stop" },
51
  { EVM_INS_ADD, "add" },
52
  { EVM_INS_MUL, "mul" },
53
  { EVM_INS_SUB, "sub" },
54
  { EVM_INS_DIV, "div" },
55
  { EVM_INS_SDIV, "sdiv" },
56
  { EVM_INS_MOD, "mod" },
57
  { EVM_INS_SMOD, "smod" },
58
  { EVM_INS_ADDMOD, "addmod" },
59
  { EVM_INS_MULMOD, "mulmod" },
60
  { EVM_INS_EXP, "exp" },
61
  { EVM_INS_SIGNEXTEND, "signextend" },
62
  { EVM_INS_INVALID, NULL },
63
  { EVM_INS_INVALID, NULL },
64
  { EVM_INS_INVALID, NULL },
65
  { EVM_INS_INVALID, NULL },
66
  { EVM_INS_LT, "lt" },
67
  { EVM_INS_GT, "gt" },
68
  { EVM_INS_SLT, "slt" },
69
  { EVM_INS_SGT, "sgt" },
70
  { EVM_INS_EQ, "eq" },
71
  { EVM_INS_ISZERO, "iszero" },
72
  { EVM_INS_AND, "and" },
73
  { EVM_INS_OR, "or" },
74
  { EVM_INS_XOR, "xor" },
75
  { EVM_INS_NOT, "not" },
76
  { EVM_INS_BYTE, "byte" },
77
  { EVM_INS_SHL, "shl" },
78
  { EVM_INS_SHR, "shr" },
79
  { EVM_INS_SAR, "sar" },
80
  { EVM_INS_INVALID, NULL },
81
  { EVM_INS_INVALID, NULL },
82
  { EVM_INS_SHA3, "sha3" },
83
  { EVM_INS_INVALID, NULL },
84
  { EVM_INS_INVALID, NULL },
85
  { EVM_INS_INVALID, NULL },
86
  { EVM_INS_INVALID, NULL },
87
  { EVM_INS_INVALID, NULL },
88
  { EVM_INS_INVALID, NULL },
89
  { EVM_INS_INVALID, NULL },
90
  { EVM_INS_INVALID, NULL },
91
  { EVM_INS_INVALID, NULL },
92
  { EVM_INS_INVALID, NULL },
93
  { EVM_INS_INVALID, NULL },
94
  { EVM_INS_INVALID, NULL },
95
  { EVM_INS_INVALID, NULL },
96
  { EVM_INS_INVALID, NULL },
97
  { EVM_INS_INVALID, NULL },
98
  { EVM_INS_ADDRESS, "address" },
99
  { EVM_INS_BALANCE, "balance" },
100
  { EVM_INS_ORIGIN, "origin" },
101
  { EVM_INS_CALLER, "caller" },
102
  { EVM_INS_CALLVALUE, "callvalue" },
103
  { EVM_INS_CALLDATALOAD, "calldataload" },
104
  { EVM_INS_CALLDATASIZE, "calldatasize" },
105
  { EVM_INS_CALLDATACOPY, "calldatacopy" },
106
  { EVM_INS_CODESIZE, "codesize" },
107
  { EVM_INS_CODECOPY, "codecopy" },
108
  { EVM_INS_GASPRICE, "gasprice" },
109
  { EVM_INS_EXTCODESIZE, "extcodesize" },
110
  { EVM_INS_EXTCODECOPY, "extcodecopy" },
111
  { EVM_INS_RETURNDATASIZE, "returndatasize" },
112
  { EVM_INS_RETURNDATACOPY, "returndatacopy" },
113
  { EVM_INS_INVALID, NULL },
114
  { EVM_INS_BLOCKHASH, "blockhash" },
115
  { EVM_INS_COINBASE, "coinbase" },
116
  { EVM_INS_TIMESTAMP, "timestamp" },
117
  { EVM_INS_NUMBER, "number" },
118
  { EVM_INS_DIFFICULTY, "difficulty" },
119
  { EVM_INS_GASLIMIT, "gaslimit" },
120
  { EVM_INS_CHAINID, "chainid" },
121
  { EVM_INS_SELFBALANCE, "selfbalance" },
122
  { EVM_INS_BASEFEE, "basefee" },
123
  { EVM_INS_BLOBHASH, "blobhash" },
124
  { EVM_INS_BLOBBASEFEE, "blobbasefee" },
125
  { EVM_INS_INVALID, NULL },
126
  { EVM_INS_INVALID, NULL },
127
  { EVM_INS_INVALID, NULL },
128
  { EVM_INS_INVALID, NULL },
129
  { EVM_INS_INVALID, NULL },
130
  { EVM_INS_POP, "pop" },
131
  { EVM_INS_MLOAD, "mload" },
132
  { EVM_INS_MSTORE, "mstore" },
133
  { EVM_INS_MSTORE8, "mstore8" },
134
  { EVM_INS_SLOAD, "sload" },
135
  { EVM_INS_SSTORE, "sstore" },
136
  { EVM_INS_JUMP, "jump" },
137
  { EVM_INS_JUMPI, "jumpi" },
138
  { EVM_INS_PC, "pc" },
139
  { EVM_INS_MSIZE, "msize" },
140
  { EVM_INS_GAS, "gas" },
141
  { EVM_INS_JUMPDEST, "jumpdest" },
142
  { EVM_INS_TLOAD, "tload" },
143
  { EVM_INS_TSTORE, "tstore" },
144
  { EVM_INS_MCOPY, "mcopy" },
145
  { EVM_INS_PUSH0, "push0" },
146
  { EVM_INS_PUSH1, "push1" },
147
  { EVM_INS_PUSH2, "push2" },
148
  { EVM_INS_PUSH3, "push3" },
149
  { EVM_INS_PUSH4, "push4" },
150
  { EVM_INS_PUSH5, "push5" },
151
  { EVM_INS_PUSH6, "push6" },
152
  { EVM_INS_PUSH7, "push7" },
153
  { EVM_INS_PUSH8, "push8" },
154
  { EVM_INS_PUSH9, "push9" },
155
  { EVM_INS_PUSH10, "push10" },
156
  { EVM_INS_PUSH11, "push11" },
157
  { EVM_INS_PUSH12, "push12" },
158
  { EVM_INS_PUSH13, "push13" },
159
  { EVM_INS_PUSH14, "push14" },
160
  { EVM_INS_PUSH15, "push15" },
161
  { EVM_INS_PUSH16, "push16" },
162
  { EVM_INS_PUSH17, "push17" },
163
  { EVM_INS_PUSH18, "push18" },
164
  { EVM_INS_PUSH19, "push19" },
165
  { EVM_INS_PUSH20, "push20" },
166
  { EVM_INS_PUSH21, "push21" },
167
  { EVM_INS_PUSH22, "push22" },
168
  { EVM_INS_PUSH23, "push23" },
169
  { EVM_INS_PUSH24, "push24" },
170
  { EVM_INS_PUSH25, "push25" },
171
  { EVM_INS_PUSH26, "push26" },
172
  { EVM_INS_PUSH27, "push27" },
173
  { EVM_INS_PUSH28, "push28" },
174
  { EVM_INS_PUSH29, "push29" },
175
  { EVM_INS_PUSH30, "push30" },
176
  { EVM_INS_PUSH31, "push31" },
177
  { EVM_INS_PUSH32, "push32" },
178
  { EVM_INS_DUP1, "dup1" },
179
  { EVM_INS_DUP2, "dup2" },
180
  { EVM_INS_DUP3, "dup3" },
181
  { EVM_INS_DUP4, "dup4" },
182
  { EVM_INS_DUP5, "dup5" },
183
  { EVM_INS_DUP6, "dup6" },
184
  { EVM_INS_DUP7, "dup7" },
185
  { EVM_INS_DUP8, "dup8" },
186
  { EVM_INS_DUP9, "dup9" },
187
  { EVM_INS_DUP10, "dup10" },
188
  { EVM_INS_DUP11, "dup11" },
189
  { EVM_INS_DUP12, "dup12" },
190
  { EVM_INS_DUP13, "dup13" },
191
  { EVM_INS_DUP14, "dup14" },
192
  { EVM_INS_DUP15, "dup15" },
193
  { EVM_INS_DUP16, "dup16" },
194
  { EVM_INS_SWAP1, "swap1" },
195
  { EVM_INS_SWAP2, "swap2" },
196
  { EVM_INS_SWAP3, "swap3" },
197
  { EVM_INS_SWAP4, "swap4" },
198
  { EVM_INS_SWAP5, "swap5" },
199
  { EVM_INS_SWAP6, "swap6" },
200
  { EVM_INS_SWAP7, "swap7" },
201
  { EVM_INS_SWAP8, "swap8" },
202
  { EVM_INS_SWAP9, "swap9" },
203
  { EVM_INS_SWAP10, "swap10" },
204
  { EVM_INS_SWAP11, "swap11" },
205
  { EVM_INS_SWAP12, "swap12" },
206
  { EVM_INS_SWAP13, "swap13" },
207
  { EVM_INS_SWAP14, "swap14" },
208
  { EVM_INS_SWAP15, "swap15" },
209
  { EVM_INS_SWAP16, "swap16" },
210
  { EVM_INS_LOG0, "log0" },
211
  { EVM_INS_LOG1, "log1" },
212
  { EVM_INS_LOG2, "log2" },
213
  { EVM_INS_LOG3, "log3" },
214
  { EVM_INS_LOG4, "log4" },
215
  { EVM_INS_INVALID, NULL },
216
  { EVM_INS_INVALID, NULL },
217
  { EVM_INS_INVALID, NULL },
218
  { EVM_INS_INVALID, NULL },
219
  { EVM_INS_INVALID, NULL },
220
  { EVM_INS_INVALID, NULL },
221
  { EVM_INS_INVALID, NULL },
222
  { EVM_INS_INVALID, NULL },
223
  { EVM_INS_INVALID, NULL },
224
  { EVM_INS_INVALID, NULL },
225
  { EVM_INS_INVALID, NULL },
226
  { EVM_INS_INVALID, NULL },
227
  { EVM_INS_INVALID, NULL },
228
  { EVM_INS_INVALID, NULL },
229
  { EVM_INS_INVALID, NULL },
230
  { EVM_INS_INVALID, NULL },
231
  { EVM_INS_INVALID, NULL },
232
  { EVM_INS_INVALID, NULL },
233
  { EVM_INS_INVALID, NULL },
234
  { EVM_INS_INVALID, NULL },
235
  { EVM_INS_INVALID, NULL },
236
  { EVM_INS_INVALID, NULL },
237
  { EVM_INS_INVALID, NULL },
238
  { EVM_INS_INVALID, NULL },
239
  { EVM_INS_INVALID, NULL },
240
  { EVM_INS_INVALID, NULL },
241
  { EVM_INS_INVALID, NULL },
242
  { EVM_INS_INVALID, NULL },
243
  { EVM_INS_INVALID, NULL },
244
  { EVM_INS_INVALID, NULL },
245
  { EVM_INS_INVALID, NULL },
246
  { EVM_INS_INVALID, NULL },
247
  { EVM_INS_INVALID, NULL },
248
  { EVM_INS_INVALID, NULL },
249
  { EVM_INS_INVALID, NULL },
250
  { EVM_INS_INVALID, NULL },
251
  { EVM_INS_INVALID, NULL },
252
  { EVM_INS_INVALID, NULL },
253
  { EVM_INS_INVALID, NULL },
254
  { EVM_INS_INVALID, NULL },
255
  { EVM_INS_INVALID, NULL },
256
  { EVM_INS_INVALID, NULL },
257
  { EVM_INS_INVALID, NULL },
258
  { EVM_INS_INVALID, NULL },
259
  { EVM_INS_INVALID, NULL },
260
  { EVM_INS_INVALID, NULL },
261
  { EVM_INS_INVALID, NULL },
262
  { EVM_INS_INVALID, NULL },
263
  { EVM_INS_INVALID, NULL },
264
  { EVM_INS_INVALID, NULL },
265
  { EVM_INS_INVALID, NULL },
266
  { EVM_INS_INVALID, NULL },
267
  { EVM_INS_INVALID, NULL },
268
  { EVM_INS_INVALID, NULL },
269
  { EVM_INS_INVALID, NULL },
270
  { EVM_INS_INVALID, NULL },
271
  { EVM_INS_INVALID, NULL },
272
  { EVM_INS_INVALID, NULL },
273
  { EVM_INS_INVALID, NULL },
274
  { EVM_INS_INVALID, NULL },
275
  { EVM_INS_INVALID, NULL },
276
  { EVM_INS_INVALID, NULL },
277
  { EVM_INS_INVALID, NULL },
278
  { EVM_INS_INVALID, NULL },
279
  { EVM_INS_INVALID, NULL },
280
  { EVM_INS_INVALID, NULL },
281
  { EVM_INS_INVALID, NULL },
282
  { EVM_INS_INVALID, NULL },
283
  { EVM_INS_INVALID, NULL },
284
  { EVM_INS_INVALID, NULL },
285
  { EVM_INS_INVALID, NULL },
286
  { EVM_INS_INVALID, NULL },
287
  { EVM_INS_INVALID, NULL },
288
  { EVM_INS_INVALID, NULL },
289
  { EVM_INS_INVALID, NULL },
290
  { EVM_INS_CREATE, "create" },
291
  { EVM_INS_CALL, "call" },
292
  { EVM_INS_CALLCODE, "callcode" },
293
  { EVM_INS_RETURN, "return" },
294
  { EVM_INS_DELEGATECALL, "delegatecall" },
295
  { EVM_INS_CREATE2, "create2" },
296
  { EVM_INS_INVALID, NULL },
297
  { EVM_INS_INVALID, NULL },
298
  { EVM_INS_INVALID, NULL },
299
  { EVM_INS_INVALID, NULL },
300
  { EVM_INS_STATICCALL, "staticcall" },
301
  { EVM_INS_INVALID, NULL },
302
  { EVM_INS_INVALID, NULL },
303
  { EVM_INS_REVERT, "revert" },
304
  { EVM_INS_INVALID, NULL },
305
  { EVM_INS_SELFDESTRUCT, "selfdestruct" },
306
};
307
#endif
308
309
const char *EVM_insn_name(csh handle, unsigned int id)
310
64.4k
{
311
64.4k
#ifndef CAPSTONE_DIET
312
64.4k
  if (id >= ARR_SIZE(insn_name_maps))
313
0
    return NULL;
314
64.4k
  else
315
64.4k
    return insn_name_maps[id].name;
316
#else
317
  return NULL;
318
#endif
319
64.4k
}
320
321
#ifndef CAPSTONE_DIET
322
static const name_map group_name_maps[] = {
323
  // generic groups
324
  { EVM_GRP_INVALID, NULL },
325
  { EVM_GRP_JUMP, "jump" },
326
  // special groups
327
  { EVM_GRP_MATH, "math" },
328
  { EVM_GRP_STACK_WRITE, "stack_write" },
329
  { EVM_GRP_STACK_READ, "stack_read" },
330
  { EVM_GRP_MEM_WRITE, "mem_write" },
331
  { EVM_GRP_MEM_READ, "mem_read" },
332
  { EVM_GRP_STORE_WRITE, "store_write" },
333
  { EVM_GRP_STORE_READ, "store_read" },
334
  { EVM_GRP_HALT, "halt" },
335
};
336
#endif
337
338
const char *EVM_group_name(csh handle, unsigned int id)
339
75.3k
{
340
75.3k
#ifndef CAPSTONE_DIET
341
75.3k
  return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);
342
#else
343
  return NULL;
344
#endif
345
75.3k
}
346
#endif