Coverage Report

Created: 2023-09-25 06:24

/src/keystone/llvm/keystone/EVMMapping.cpp
Line
Count
Source (jump to first uncovered line)
1
/* Capstone Disassembly Engine */
2
/* By Nguyen Anh Quynh, 2018 */
3
4
#include <string.h>
5
6
#include "EVMMapping.h"
7
#include "evm.h"
8
9
0
#define ARR_SIZE(a) (sizeof(a)/sizeof(a[0]))
10
11
// map id to string
12
typedef struct name_map {
13
    unsigned short id;
14
    const char *name;
15
} name_map;
16
17
static name_map insn_name_maps[] = {
18
    { EVM_INS_STOP, "stop" },
19
    { EVM_INS_ADD, "add" },
20
    { EVM_INS_MUL, "mul" },
21
    { EVM_INS_SUB, "sub" },
22
    { EVM_INS_DIV, "div" },
23
    { EVM_INS_SDIV, "sdiv" },
24
    { EVM_INS_MOD, "mod" },
25
    { EVM_INS_SMOD, "smod" },
26
    { EVM_INS_ADDMOD, "addmod" },
27
    { EVM_INS_MULMOD, "mulmod" },
28
    { EVM_INS_EXP, "exp" },
29
    { EVM_INS_SIGNEXTEND, "signextend" },
30
    { EVM_INS_INVALID, NULL },
31
    { EVM_INS_INVALID, NULL },
32
    { EVM_INS_INVALID, NULL },
33
    { EVM_INS_INVALID, NULL },
34
    { EVM_INS_LT, "lt" },
35
    { EVM_INS_GT, "gt" },
36
    { EVM_INS_SLT, "slt" },
37
    { EVM_INS_SGT, "sgt" },
38
    { EVM_INS_EQ, "eq" },
39
    { EVM_INS_ISZERO, "iszero" },
40
    { EVM_INS_AND, "and" },
41
    { EVM_INS_OR, "or" },
42
    { EVM_INS_XOR, "xor" },
43
    { EVM_INS_NOT, "not" },
44
    { EVM_INS_BYTE, "byte" },
45
    { EVM_INS_INVALID, NULL },
46
    { EVM_INS_INVALID, NULL },
47
    { EVM_INS_INVALID, NULL },
48
    { EVM_INS_INVALID, NULL },
49
    { EVM_INS_INVALID, NULL },
50
    { EVM_INS_SHA3, "sha3" },
51
    { EVM_INS_INVALID, NULL },
52
    { EVM_INS_INVALID, NULL },
53
    { EVM_INS_INVALID, NULL },
54
    { EVM_INS_INVALID, NULL },
55
    { EVM_INS_INVALID, NULL },
56
    { EVM_INS_INVALID, NULL },
57
    { EVM_INS_INVALID, NULL },
58
    { EVM_INS_INVALID, NULL },
59
    { EVM_INS_INVALID, NULL },
60
    { EVM_INS_INVALID, NULL },
61
    { EVM_INS_INVALID, NULL },
62
    { EVM_INS_INVALID, NULL },
63
    { EVM_INS_INVALID, NULL },
64
    { EVM_INS_INVALID, NULL },
65
    { EVM_INS_INVALID, NULL },
66
    { EVM_INS_ADDRESS, "address" },
67
    { EVM_INS_BALANCE, "balance" },
68
    { EVM_INS_ORIGIN, "origin" },
69
    { EVM_INS_CALLER, "caller" },
70
    { EVM_INS_CALLVALUE, "callvalue" },
71
    { EVM_INS_CALLDATALOAD, "calldataload" },
72
    { EVM_INS_CALLDATASIZE, "calldatasize" },
73
    { EVM_INS_CALLDATACOPY, "calldatacopy" },
74
    { EVM_INS_CODESIZE, "codesize" },
75
    { EVM_INS_CODECOPY, "codecopy" },
76
    { EVM_INS_GASPRICE, "gasprice" },
77
    { EVM_INS_EXTCODESIZE, "extcodesize" },
78
    { EVM_INS_EXTCODECOPY, "extcodecopy" },
79
    { EVM_INS_RETURNDATASIZE, "returndatasize" },
80
    { EVM_INS_RETURNDATACOPY, "returndatacopy" },
81
    { EVM_INS_INVALID, NULL },
82
    { EVM_INS_BLOCKHASH, "blockhash" },
83
    { EVM_INS_COINBASE, "coinbase" },
84
    { EVM_INS_TIMESTAMP, "timestamp" },
85
    { EVM_INS_NUMBER, "number" },
86
    { EVM_INS_DIFFICULTY, "difficulty" },
87
    { EVM_INS_GASLIMIT, "gaslimit" },
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_POP, "pop" },
99
    { EVM_INS_MLOAD, "mload" },
100
    { EVM_INS_MSTORE, "mstore" },
101
    { EVM_INS_MSTORE8, "mstore8" },
102
    { EVM_INS_SLOAD, "sload" },
103
    { EVM_INS_SSTORE, "sstore" },
104
    { EVM_INS_JUMP, "jump" },
105
    { EVM_INS_JUMPI, "jumpi" },
106
    { EVM_INS_PC, "pc" },
107
    { EVM_INS_MSIZE, "msize" },
108
    { EVM_INS_GAS, "gas" },
109
    { EVM_INS_JUMPDEST, "jumpdest" },
110
    { EVM_INS_INVALID, NULL },
111
    { EVM_INS_INVALID, NULL },
112
    { EVM_INS_INVALID, NULL },
113
    { EVM_INS_INVALID, NULL },
114
    { EVM_INS_PUSH1, "push1" },
115
    { EVM_INS_PUSH2, "push2" },
116
    { EVM_INS_PUSH3, "push3" },
117
    { EVM_INS_PUSH4, "push4" },
118
    { EVM_INS_PUSH5, "push5" },
119
    { EVM_INS_PUSH6, "push6" },
120
    { EVM_INS_PUSH7, "push7" },
121
    { EVM_INS_PUSH8, "push8" },
122
    { EVM_INS_PUSH9, "push9" },
123
    { EVM_INS_PUSH10, "push10" },
124
    { EVM_INS_PUSH11, "push11" },
125
    { EVM_INS_PUSH12, "push12" },
126
    { EVM_INS_PUSH13, "push13" },
127
    { EVM_INS_PUSH14, "push14" },
128
    { EVM_INS_PUSH15, "push15" },
129
    { EVM_INS_PUSH16, "push16" },
130
    { EVM_INS_PUSH17, "push17" },
131
    { EVM_INS_PUSH18, "push18" },
132
    { EVM_INS_PUSH19, "push19" },
133
    { EVM_INS_PUSH20, "push20" },
134
    { EVM_INS_PUSH21, "push21" },
135
    { EVM_INS_PUSH22, "push22" },
136
    { EVM_INS_PUSH23, "push23" },
137
    { EVM_INS_PUSH24, "push24" },
138
    { EVM_INS_PUSH25, "push25" },
139
    { EVM_INS_PUSH26, "push26" },
140
    { EVM_INS_PUSH27, "push27" },
141
    { EVM_INS_PUSH28, "push28" },
142
    { EVM_INS_PUSH29, "push29" },
143
    { EVM_INS_PUSH30, "push30" },
144
    { EVM_INS_PUSH31, "push31" },
145
    { EVM_INS_PUSH32, "push32" },
146
    { EVM_INS_DUP1, "dup1" },
147
    { EVM_INS_DUP2, "dup2" },
148
    { EVM_INS_DUP3, "dup3" },
149
    { EVM_INS_DUP4, "dup4" },
150
    { EVM_INS_DUP5, "dup5" },
151
    { EVM_INS_DUP6, "dup6" },
152
    { EVM_INS_DUP7, "dup7" },
153
    { EVM_INS_DUP8, "dup8" },
154
    { EVM_INS_DUP9, "dup9" },
155
    { EVM_INS_DUP10, "dup10" },
156
    { EVM_INS_DUP11, "dup11" },
157
    { EVM_INS_DUP12, "dup12" },
158
    { EVM_INS_DUP13, "dup13" },
159
    { EVM_INS_DUP14, "dup14" },
160
    { EVM_INS_DUP15, "dup15" },
161
    { EVM_INS_DUP16, "dup16" },
162
    { EVM_INS_SWAP1, "swap1" },
163
    { EVM_INS_SWAP2, "swap2" },
164
    { EVM_INS_SWAP3, "swap3" },
165
    { EVM_INS_SWAP4, "swap4" },
166
    { EVM_INS_SWAP5, "swap5" },
167
    { EVM_INS_SWAP6, "swap6" },
168
    { EVM_INS_SWAP7, "swap7" },
169
    { EVM_INS_SWAP8, "swap8" },
170
    { EVM_INS_SWAP9, "swap9" },
171
    { EVM_INS_SWAP10, "swap10" },
172
    { EVM_INS_SWAP11, "swap11" },
173
    { EVM_INS_SWAP12, "swap12" },
174
    { EVM_INS_SWAP13, "swap13" },
175
    { EVM_INS_SWAP14, "swap14" },
176
    { EVM_INS_SWAP15, "swap15" },
177
    { EVM_INS_SWAP16, "swap16" },
178
    { EVM_INS_LOG0, "log0" },
179
    { EVM_INS_LOG1, "log1" },
180
    { EVM_INS_LOG2, "log2" },
181
    { EVM_INS_LOG3, "log3" },
182
    { EVM_INS_LOG4, "log4" },
183
    { EVM_INS_INVALID, NULL },
184
    { EVM_INS_INVALID, NULL },
185
    { EVM_INS_INVALID, NULL },
186
    { EVM_INS_INVALID, NULL },
187
    { EVM_INS_INVALID, NULL },
188
    { EVM_INS_INVALID, NULL },
189
    { EVM_INS_INVALID, NULL },
190
    { EVM_INS_INVALID, NULL },
191
    { EVM_INS_INVALID, NULL },
192
    { EVM_INS_INVALID, NULL },
193
    { EVM_INS_INVALID, NULL },
194
    { EVM_INS_INVALID, NULL },
195
    { EVM_INS_INVALID, NULL },
196
    { EVM_INS_INVALID, NULL },
197
    { EVM_INS_INVALID, NULL },
198
    { EVM_INS_INVALID, NULL },
199
    { EVM_INS_INVALID, NULL },
200
    { EVM_INS_INVALID, NULL },
201
    { EVM_INS_INVALID, NULL },
202
    { EVM_INS_INVALID, NULL },
203
    { EVM_INS_INVALID, NULL },
204
    { EVM_INS_INVALID, NULL },
205
    { EVM_INS_INVALID, NULL },
206
    { EVM_INS_INVALID, NULL },
207
    { EVM_INS_INVALID, NULL },
208
    { EVM_INS_INVALID, NULL },
209
    { EVM_INS_INVALID, NULL },
210
    { EVM_INS_INVALID, NULL },
211
    { EVM_INS_INVALID, NULL },
212
    { EVM_INS_INVALID, NULL },
213
    { EVM_INS_INVALID, NULL },
214
    { EVM_INS_INVALID, NULL },
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_CREATE, "create" },
259
    { EVM_INS_CALL, "call" },
260
    { EVM_INS_CALLCODE, "callcode" },
261
    { EVM_INS_RETURN, "return" },
262
    { EVM_INS_DELEGATECALL, "delegatecall" },
263
    { EVM_INS_CALLBLACKBOX, "callblackbox" },
264
    { EVM_INS_INVALID, NULL },
265
    { EVM_INS_INVALID, NULL },
266
    { EVM_INS_INVALID, NULL },
267
    { EVM_INS_INVALID, NULL },
268
    { EVM_INS_STATICCALL, "staticcall" },
269
    { EVM_INS_INVALID, NULL },
270
    { EVM_INS_INVALID, NULL },
271
    { EVM_INS_REVERT, "revert" },
272
    { EVM_INS_INVALID, NULL },
273
    { EVM_INS_SUICIDE, "suicide" },
274
};
275
276
#if defined(_WIN32) || defined(_WIN64)
277
#define strcasecmp _stricmp
278
#endif
279
280
#include <stdio.h>
281
282
// find opcode of this mnemonic, or return -1 on failure
283
unsigned short EVM_opcode(const char *mnemonic)
284
0
{
285
0
    unsigned int i;
286
287
0
    for(i = 0; i < ARR_SIZE(insn_name_maps); i++) {
288
0
        if (insn_name_maps[i].name && !strcasecmp(insn_name_maps[i].name, mnemonic)) {
289
0
            return (unsigned short)insn_name_maps[i].id;
290
0
        }
291
0
    }
292
293
0
    return (unsigned short)-1;
294
0
}