Coverage Report

Created: 2022-08-24 06:38

/src/solidity/libevmasm/Instruction.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
  This file is part of solidity.
3
4
  solidity is free software: you can redistribute it and/or modify
5
  it under the terms of the GNU General Public License as published by
6
  the Free Software Foundation, either version 3 of the License, or
7
  (at your option) any later version.
8
9
  solidity is distributed in the hope that it will be useful,
10
  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
  GNU General Public License for more details.
13
14
  You should have received a copy of the GNU General Public License
15
  along with solidity.  If not, see <http://www.gnu.org/licenses/>.
16
*/
17
// SPDX-License-Identifier: GPL-3.0
18
/** @file Instruction.cpp
19
 * @author Gav Wood <i@gavwood.com>
20
 * @date 2014
21
 */
22
23
#include <libevmasm/Instruction.h>
24
25
using namespace std;
26
using namespace solidity;
27
using namespace solidity::util;
28
using namespace solidity::evmasm;
29
30
std::map<std::string, Instruction> const solidity::evmasm::c_instructions =
31
{
32
  { "STOP", Instruction::STOP },
33
  { "ADD", Instruction::ADD },
34
  { "SUB", Instruction::SUB },
35
  { "MUL", Instruction::MUL },
36
  { "DIV", Instruction::DIV },
37
  { "SDIV", Instruction::SDIV },
38
  { "MOD", Instruction::MOD },
39
  { "SMOD", Instruction::SMOD },
40
  { "EXP", Instruction::EXP },
41
  { "NOT", Instruction::NOT },
42
  { "LT", Instruction::LT },
43
  { "GT", Instruction::GT },
44
  { "SLT", Instruction::SLT },
45
  { "SGT", Instruction::SGT },
46
  { "EQ", Instruction::EQ },
47
  { "ISZERO", Instruction::ISZERO },
48
  { "AND", Instruction::AND },
49
  { "OR", Instruction::OR },
50
  { "XOR", Instruction::XOR },
51
  { "BYTE", Instruction::BYTE },
52
  { "SHL", Instruction::SHL },
53
  { "SHR", Instruction::SHR },
54
  { "SAR", Instruction::SAR },
55
  { "ADDMOD", Instruction::ADDMOD },
56
  { "MULMOD", Instruction::MULMOD },
57
  { "SIGNEXTEND", Instruction::SIGNEXTEND },
58
  { "KECCAK256", Instruction::KECCAK256 },
59
  { "ADDRESS", Instruction::ADDRESS },
60
  { "BALANCE", Instruction::BALANCE },
61
  { "ORIGIN", Instruction::ORIGIN },
62
  { "CALLER", Instruction::CALLER },
63
  { "CALLVALUE", Instruction::CALLVALUE },
64
  { "CALLDATALOAD", Instruction::CALLDATALOAD },
65
  { "CALLDATASIZE", Instruction::CALLDATASIZE },
66
  { "CALLDATACOPY", Instruction::CALLDATACOPY },
67
  { "CODESIZE", Instruction::CODESIZE },
68
  { "CODECOPY", Instruction::CODECOPY },
69
  { "GASPRICE", Instruction::GASPRICE },
70
  { "EXTCODESIZE", Instruction::EXTCODESIZE },
71
  { "EXTCODECOPY", Instruction::EXTCODECOPY },
72
  { "RETURNDATASIZE", Instruction::RETURNDATASIZE },
73
  { "RETURNDATACOPY", Instruction::RETURNDATACOPY },
74
  { "EXTCODEHASH", Instruction::EXTCODEHASH },
75
  { "BLOCKHASH", Instruction::BLOCKHASH },
76
  { "COINBASE", Instruction::COINBASE },
77
  { "TIMESTAMP", Instruction::TIMESTAMP },
78
  { "NUMBER", Instruction::NUMBER },
79
  { "DIFFICULTY", Instruction::DIFFICULTY },
80
  { "GASLIMIT", Instruction::GASLIMIT },
81
  { "CHAINID", Instruction::CHAINID },
82
  { "SELFBALANCE", Instruction::SELFBALANCE },
83
  { "BASEFEE", Instruction::BASEFEE },
84
  { "POP", Instruction::POP },
85
  { "MLOAD", Instruction::MLOAD },
86
  { "MSTORE", Instruction::MSTORE },
87
  { "MSTORE8", Instruction::MSTORE8 },
88
  { "SLOAD", Instruction::SLOAD },
89
  { "SSTORE", Instruction::SSTORE },
90
  { "JUMP", Instruction::JUMP },
91
  { "JUMPI", Instruction::JUMPI },
92
  { "PC", Instruction::PC },
93
  { "MSIZE", Instruction::MSIZE },
94
  { "GAS", Instruction::GAS },
95
  { "JUMPDEST", Instruction::JUMPDEST },
96
  { "PUSH1", Instruction::PUSH1 },
97
  { "PUSH2", Instruction::PUSH2 },
98
  { "PUSH3", Instruction::PUSH3 },
99
  { "PUSH4", Instruction::PUSH4 },
100
  { "PUSH5", Instruction::PUSH5 },
101
  { "PUSH6", Instruction::PUSH6 },
102
  { "PUSH7", Instruction::PUSH7 },
103
  { "PUSH8", Instruction::PUSH8 },
104
  { "PUSH9", Instruction::PUSH9 },
105
  { "PUSH10", Instruction::PUSH10 },
106
  { "PUSH11", Instruction::PUSH11 },
107
  { "PUSH12", Instruction::PUSH12 },
108
  { "PUSH13", Instruction::PUSH13 },
109
  { "PUSH14", Instruction::PUSH14 },
110
  { "PUSH15", Instruction::PUSH15 },
111
  { "PUSH16", Instruction::PUSH16 },
112
  { "PUSH17", Instruction::PUSH17 },
113
  { "PUSH18", Instruction::PUSH18 },
114
  { "PUSH19", Instruction::PUSH19 },
115
  { "PUSH20", Instruction::PUSH20 },
116
  { "PUSH21", Instruction::PUSH21 },
117
  { "PUSH22", Instruction::PUSH22 },
118
  { "PUSH23", Instruction::PUSH23 },
119
  { "PUSH24", Instruction::PUSH24 },
120
  { "PUSH25", Instruction::PUSH25 },
121
  { "PUSH26", Instruction::PUSH26 },
122
  { "PUSH27", Instruction::PUSH27 },
123
  { "PUSH28", Instruction::PUSH28 },
124
  { "PUSH29", Instruction::PUSH29 },
125
  { "PUSH30", Instruction::PUSH30 },
126
  { "PUSH31", Instruction::PUSH31 },
127
  { "PUSH32", Instruction::PUSH32 },
128
  { "DUP1", Instruction::DUP1 },
129
  { "DUP2", Instruction::DUP2 },
130
  { "DUP3", Instruction::DUP3 },
131
  { "DUP4", Instruction::DUP4 },
132
  { "DUP5", Instruction::DUP5 },
133
  { "DUP6", Instruction::DUP6 },
134
  { "DUP7", Instruction::DUP7 },
135
  { "DUP8", Instruction::DUP8 },
136
  { "DUP9", Instruction::DUP9 },
137
  { "DUP10", Instruction::DUP10 },
138
  { "DUP11", Instruction::DUP11 },
139
  { "DUP12", Instruction::DUP12 },
140
  { "DUP13", Instruction::DUP13 },
141
  { "DUP14", Instruction::DUP14 },
142
  { "DUP15", Instruction::DUP15 },
143
  { "DUP16", Instruction::DUP16 },
144
  { "SWAP1", Instruction::SWAP1 },
145
  { "SWAP2", Instruction::SWAP2 },
146
  { "SWAP3", Instruction::SWAP3 },
147
  { "SWAP4", Instruction::SWAP4 },
148
  { "SWAP5", Instruction::SWAP5 },
149
  { "SWAP6", Instruction::SWAP6 },
150
  { "SWAP7", Instruction::SWAP7 },
151
  { "SWAP8", Instruction::SWAP8 },
152
  { "SWAP9", Instruction::SWAP9 },
153
  { "SWAP10", Instruction::SWAP10 },
154
  { "SWAP11", Instruction::SWAP11 },
155
  { "SWAP12", Instruction::SWAP12 },
156
  { "SWAP13", Instruction::SWAP13 },
157
  { "SWAP14", Instruction::SWAP14 },
158
  { "SWAP15", Instruction::SWAP15 },
159
  { "SWAP16", Instruction::SWAP16 },
160
  { "LOG0", Instruction::LOG0 },
161
  { "LOG1", Instruction::LOG1 },
162
  { "LOG2", Instruction::LOG2 },
163
  { "LOG3", Instruction::LOG3 },
164
  { "LOG4", Instruction::LOG4 },
165
  { "CREATE", Instruction::CREATE },
166
  { "CALL", Instruction::CALL },
167
  { "CALLCODE", Instruction::CALLCODE },
168
  { "STATICCALL", Instruction::STATICCALL },
169
  { "RETURN", Instruction::RETURN },
170
  { "DELEGATECALL", Instruction::DELEGATECALL },
171
  { "CREATE2", Instruction::CREATE2 },
172
  { "REVERT", Instruction::REVERT },
173
  { "INVALID", Instruction::INVALID },
174
  { "SELFDESTRUCT", Instruction::SELFDESTRUCT }
175
};
176
177
static std::map<Instruction, InstructionInfo> const c_instructionInfo =
178
{ //                        Add, Args, Ret, SideEffects, GasPriceTier
179
  { Instruction::STOP,    { "STOP",     0, 0, 0, true,  Tier::Zero } },
180
  { Instruction::ADD,     { "ADD",      0, 2, 1, false, Tier::VeryLow } },
181
  { Instruction::SUB,     { "SUB",      0, 2, 1, false, Tier::VeryLow } },
182
  { Instruction::MUL,     { "MUL",      0, 2, 1, false, Tier::Low } },
183
  { Instruction::DIV,     { "DIV",      0, 2, 1, false, Tier::Low } },
184
  { Instruction::SDIV,    { "SDIV",     0, 2, 1, false, Tier::Low } },
185
  { Instruction::MOD,     { "MOD",      0, 2, 1, false, Tier::Low } },
186
  { Instruction::SMOD,    { "SMOD",     0, 2, 1, false, Tier::Low } },
187
  { Instruction::EXP,     { "EXP",      0, 2, 1, false, Tier::Special } },
188
  { Instruction::NOT,     { "NOT",      0, 1, 1, false, Tier::VeryLow } },
189
  { Instruction::LT,      { "LT",       0, 2, 1, false, Tier::VeryLow } },
190
  { Instruction::GT,      { "GT",       0, 2, 1, false, Tier::VeryLow } },
191
  { Instruction::SLT,     { "SLT",      0, 2, 1, false, Tier::VeryLow } },
192
  { Instruction::SGT,     { "SGT",      0, 2, 1, false, Tier::VeryLow } },
193
  { Instruction::EQ,      { "EQ",       0, 2, 1, false, Tier::VeryLow } },
194
  { Instruction::ISZERO,    { "ISZERO",     0, 1, 1, false, Tier::VeryLow } },
195
  { Instruction::AND,     { "AND",      0, 2, 1, false, Tier::VeryLow } },
196
  { Instruction::OR,      { "OR",       0, 2, 1, false, Tier::VeryLow } },
197
  { Instruction::XOR,     { "XOR",      0, 2, 1, false, Tier::VeryLow } },
198
  { Instruction::BYTE,    { "BYTE",     0, 2, 1, false, Tier::VeryLow } },
199
  { Instruction::SHL,   { "SHL",      0, 2, 1, false, Tier::VeryLow } },
200
  { Instruction::SHR,   { "SHR",      0, 2, 1, false, Tier::VeryLow } },
201
  { Instruction::SAR,   { "SAR",      0, 2, 1, false, Tier::VeryLow } },
202
  { Instruction::ADDMOD,    { "ADDMOD",     0, 3, 1, false, Tier::Mid } },
203
  { Instruction::MULMOD,    { "MULMOD",     0, 3, 1, false, Tier::Mid } },
204
  { Instruction::SIGNEXTEND,  { "SIGNEXTEND",   0, 2, 1, false, Tier::Low } },
205
  { Instruction::KECCAK256, { "KECCAK256",      0, 2, 1, true, Tier::Special } },
206
  { Instruction::ADDRESS,   { "ADDRESS",    0, 0, 1, false, Tier::Base } },
207
  { Instruction::BALANCE,   { "BALANCE",    0, 1, 1, false, Tier::Balance } },
208
  { Instruction::ORIGIN,    { "ORIGIN",     0, 0, 1, false, Tier::Base } },
209
  { Instruction::CALLER,    { "CALLER",     0, 0, 1, false, Tier::Base } },
210
  { Instruction::CALLVALUE, { "CALLVALUE",    0, 0, 1, false, Tier::Base } },
211
  { Instruction::CALLDATALOAD,{ "CALLDATALOAD", 0, 1, 1, false, Tier::VeryLow } },
212
  { Instruction::CALLDATASIZE,{ "CALLDATASIZE", 0, 0, 1, false, Tier::Base } },
213
  { Instruction::CALLDATACOPY,{ "CALLDATACOPY", 0, 3, 0, true, Tier::VeryLow } },
214
  { Instruction::CODESIZE,  { "CODESIZE",   0, 0, 1, false, Tier::Base } },
215
  { Instruction::CODECOPY,  { "CODECOPY",   0, 3, 0, true, Tier::VeryLow } },
216
  { Instruction::GASPRICE,  { "GASPRICE",   0, 0, 1, false, Tier::Base } },
217
  { Instruction::EXTCODESIZE, { "EXTCODESIZE",  0, 1, 1, false, Tier::ExtCode } },
218
  { Instruction::EXTCODECOPY, { "EXTCODECOPY",  0, 4, 0, true, Tier::ExtCode } },
219
  { Instruction::RETURNDATASIZE,  {"RETURNDATASIZE",  0, 0, 1, false, Tier::Base } },
220
  { Instruction::RETURNDATACOPY,  {"RETURNDATACOPY",  0, 3, 0, true, Tier::VeryLow } },
221
  { Instruction::EXTCODEHASH, { "EXTCODEHASH",  0, 1, 1, false, Tier::Balance } },
222
  { Instruction::BLOCKHASH, { "BLOCKHASH",    0, 1, 1, false, Tier::Ext } },
223
  { Instruction::COINBASE,  { "COINBASE",   0, 0, 1, false, Tier::Base } },
224
  { Instruction::TIMESTAMP, { "TIMESTAMP",    0, 0, 1, false, Tier::Base } },
225
  { Instruction::NUMBER,    { "NUMBER",     0, 0, 1, false, Tier::Base } },
226
  { Instruction::DIFFICULTY,  { "DIFFICULTY",   0, 0, 1, false, Tier::Base } },
227
  { Instruction::GASLIMIT,  { "GASLIMIT",   0, 0, 1, false, Tier::Base } },
228
  { Instruction::CHAINID,   { "CHAINID",    0, 0, 1, false, Tier::Base } },
229
  { Instruction::SELFBALANCE, { "SELFBALANCE",  0, 0, 1, false, Tier::Low } },
230
  { Instruction::BASEFEE,     { "BASEFEE",        0, 0, 1, false, Tier::Base } },
231
  { Instruction::POP,     { "POP",      0, 1, 0, false, Tier::Base } },
232
  { Instruction::MLOAD,   { "MLOAD",      0, 1, 1, true, Tier::VeryLow } },
233
  { Instruction::MSTORE,    { "MSTORE",     0, 2, 0, true, Tier::VeryLow } },
234
  { Instruction::MSTORE8,   { "MSTORE8",    0, 2, 0, true, Tier::VeryLow } },
235
  { Instruction::SLOAD,   { "SLOAD",      0, 1, 1, false, Tier::Special } },
236
  { Instruction::SSTORE,    { "SSTORE",     0, 2, 0, true, Tier::Special } },
237
  { Instruction::JUMP,    { "JUMP",     0, 1, 0, true, Tier::Mid } },
238
  { Instruction::JUMPI,   { "JUMPI",      0, 2, 0, true, Tier::High } },
239
  { Instruction::PC,      { "PC",       0, 0, 1, false, Tier::Base } },
240
  { Instruction::MSIZE,   { "MSIZE",      0, 0, 1, false, Tier::Base } },
241
  { Instruction::GAS,     { "GAS",      0, 0, 1, false, Tier::Base } },
242
  { Instruction::JUMPDEST,  { "JUMPDEST",   0, 0, 0, true, Tier::Special } },
243
  { Instruction::PUSH1,   { "PUSH1",      1, 0, 1, false, Tier::VeryLow } },
244
  { Instruction::PUSH2,   { "PUSH2",      2, 0, 1, false, Tier::VeryLow } },
245
  { Instruction::PUSH3,   { "PUSH3",      3, 0, 1, false, Tier::VeryLow } },
246
  { Instruction::PUSH4,   { "PUSH4",      4, 0, 1, false, Tier::VeryLow } },
247
  { Instruction::PUSH5,   { "PUSH5",      5, 0, 1, false, Tier::VeryLow } },
248
  { Instruction::PUSH6,   { "PUSH6",      6, 0, 1, false, Tier::VeryLow } },
249
  { Instruction::PUSH7,   { "PUSH7",      7, 0, 1, false, Tier::VeryLow } },
250
  { Instruction::PUSH8,   { "PUSH8",      8, 0, 1, false, Tier::VeryLow } },
251
  { Instruction::PUSH9,   { "PUSH9",      9, 0, 1, false, Tier::VeryLow } },
252
  { Instruction::PUSH10,    { "PUSH10",     10, 0, 1, false, Tier::VeryLow } },
253
  { Instruction::PUSH11,    { "PUSH11",     11, 0, 1, false, Tier::VeryLow } },
254
  { Instruction::PUSH12,    { "PUSH12",     12, 0, 1, false, Tier::VeryLow } },
255
  { Instruction::PUSH13,    { "PUSH13",     13, 0, 1, false, Tier::VeryLow } },
256
  { Instruction::PUSH14,    { "PUSH14",     14, 0, 1, false, Tier::VeryLow } },
257
  { Instruction::PUSH15,    { "PUSH15",     15, 0, 1, false, Tier::VeryLow } },
258
  { Instruction::PUSH16,    { "PUSH16",     16, 0, 1, false, Tier::VeryLow } },
259
  { Instruction::PUSH17,    { "PUSH17",     17, 0, 1, false, Tier::VeryLow } },
260
  { Instruction::PUSH18,    { "PUSH18",     18, 0, 1, false, Tier::VeryLow } },
261
  { Instruction::PUSH19,    { "PUSH19",     19, 0, 1, false, Tier::VeryLow } },
262
  { Instruction::PUSH20,    { "PUSH20",     20, 0, 1, false, Tier::VeryLow } },
263
  { Instruction::PUSH21,    { "PUSH21",     21, 0, 1, false, Tier::VeryLow } },
264
  { Instruction::PUSH22,    { "PUSH22",     22, 0, 1, false, Tier::VeryLow } },
265
  { Instruction::PUSH23,    { "PUSH23",     23, 0, 1, false, Tier::VeryLow } },
266
  { Instruction::PUSH24,    { "PUSH24",     24, 0, 1, false, Tier::VeryLow } },
267
  { Instruction::PUSH25,    { "PUSH25",     25, 0, 1, false, Tier::VeryLow } },
268
  { Instruction::PUSH26,    { "PUSH26",     26, 0, 1, false, Tier::VeryLow } },
269
  { Instruction::PUSH27,    { "PUSH27",     27, 0, 1, false, Tier::VeryLow } },
270
  { Instruction::PUSH28,    { "PUSH28",     28, 0, 1, false, Tier::VeryLow } },
271
  { Instruction::PUSH29,    { "PUSH29",     29, 0, 1, false, Tier::VeryLow } },
272
  { Instruction::PUSH30,    { "PUSH30",     30, 0, 1, false, Tier::VeryLow } },
273
  { Instruction::PUSH31,    { "PUSH31",     31, 0, 1, false, Tier::VeryLow } },
274
  { Instruction::PUSH32,    { "PUSH32",     32, 0, 1, false, Tier::VeryLow } },
275
  { Instruction::DUP1,    { "DUP1",     0, 1, 2, false, Tier::VeryLow } },
276
  { Instruction::DUP2,    { "DUP2",     0, 2, 3, false, Tier::VeryLow } },
277
  { Instruction::DUP3,    { "DUP3",     0, 3, 4, false, Tier::VeryLow } },
278
  { Instruction::DUP4,    { "DUP4",     0, 4, 5, false, Tier::VeryLow } },
279
  { Instruction::DUP5,    { "DUP5",     0, 5, 6, false, Tier::VeryLow } },
280
  { Instruction::DUP6,    { "DUP6",     0, 6, 7, false, Tier::VeryLow } },
281
  { Instruction::DUP7,    { "DUP7",     0, 7, 8, false, Tier::VeryLow } },
282
  { Instruction::DUP8,    { "DUP8",     0, 8, 9, false, Tier::VeryLow } },
283
  { Instruction::DUP9,    { "DUP9",     0, 9, 10, false, Tier::VeryLow } },
284
  { Instruction::DUP10,   { "DUP10",      0, 10, 11, false, Tier::VeryLow } },
285
  { Instruction::DUP11,   { "DUP11",      0, 11, 12, false, Tier::VeryLow } },
286
  { Instruction::DUP12,   { "DUP12",      0, 12, 13, false, Tier::VeryLow } },
287
  { Instruction::DUP13,   { "DUP13",      0, 13, 14, false, Tier::VeryLow } },
288
  { Instruction::DUP14,   { "DUP14",      0, 14, 15, false, Tier::VeryLow } },
289
  { Instruction::DUP15,   { "DUP15",      0, 15, 16, false, Tier::VeryLow } },
290
  { Instruction::DUP16,   { "DUP16",      0, 16, 17, false, Tier::VeryLow } },
291
  { Instruction::SWAP1,   { "SWAP1",      0, 2, 2, false, Tier::VeryLow } },
292
  { Instruction::SWAP2,   { "SWAP2",      0, 3, 3, false, Tier::VeryLow } },
293
  { Instruction::SWAP3,   { "SWAP3",      0, 4, 4, false, Tier::VeryLow } },
294
  { Instruction::SWAP4,   { "SWAP4",      0, 5, 5, false, Tier::VeryLow } },
295
  { Instruction::SWAP5,   { "SWAP5",      0, 6, 6, false, Tier::VeryLow } },
296
  { Instruction::SWAP6,   { "SWAP6",      0, 7, 7, false, Tier::VeryLow } },
297
  { Instruction::SWAP7,   { "SWAP7",      0, 8, 8, false, Tier::VeryLow } },
298
  { Instruction::SWAP8,   { "SWAP8",      0, 9, 9, false, Tier::VeryLow } },
299
  { Instruction::SWAP9,   { "SWAP9",      0, 10, 10, false, Tier::VeryLow } },
300
  { Instruction::SWAP10,    { "SWAP10",     0, 11, 11, false, Tier::VeryLow } },
301
  { Instruction::SWAP11,    { "SWAP11",     0, 12, 12, false, Tier::VeryLow } },
302
  { Instruction::SWAP12,    { "SWAP12",     0, 13, 13, false, Tier::VeryLow } },
303
  { Instruction::SWAP13,    { "SWAP13",     0, 14, 14, false, Tier::VeryLow } },
304
  { Instruction::SWAP14,    { "SWAP14",     0, 15, 15, false, Tier::VeryLow } },
305
  { Instruction::SWAP15,    { "SWAP15",     0, 16, 16, false, Tier::VeryLow } },
306
  { Instruction::SWAP16,    { "SWAP16",     0, 17, 17, false, Tier::VeryLow } },
307
  { Instruction::LOG0,    { "LOG0",     0, 2, 0, true, Tier::Special } },
308
  { Instruction::LOG1,    { "LOG1",     0, 3, 0, true, Tier::Special } },
309
  { Instruction::LOG2,    { "LOG2",     0, 4, 0, true, Tier::Special } },
310
  { Instruction::LOG3,    { "LOG3",     0, 5, 0, true, Tier::Special } },
311
  { Instruction::LOG4,    { "LOG4",     0, 6, 0, true, Tier::Special } },
312
  { Instruction::CREATE,    { "CREATE",     0, 3, 1, true, Tier::Special } },
313
  { Instruction::CALL,    { "CALL",     0, 7, 1, true, Tier::Special } },
314
  { Instruction::CALLCODE,  { "CALLCODE",   0, 7, 1, true, Tier::Special } },
315
  { Instruction::RETURN,    { "RETURN",     0, 2, 0, true, Tier::Zero } },
316
  { Instruction::DELEGATECALL,  { "DELEGATECALL", 0, 6, 1, true, Tier::Special } },
317
  { Instruction::STATICCALL,  { "STATICCALL",   0, 6, 1, true, Tier::Special } },
318
  { Instruction::CREATE2,   { "CREATE2",    0, 4, 1, true, Tier::Special } },
319
  { Instruction::REVERT,    { "REVERT",   0, 2, 0, true, Tier::Zero } },
320
  { Instruction::INVALID,   { "INVALID",    0, 0, 0, true, Tier::Zero } },
321
  { Instruction::SELFDESTRUCT,  { "SELFDESTRUCT",   0, 1, 0, true, Tier::Special } }
322
};
323
324
InstructionInfo solidity::evmasm::instructionInfo(Instruction _inst)
325
12.5M
{
326
12.5M
  try
327
12.5M
  {
328
12.5M
    return c_instructionInfo.at(_inst);
329
12.5M
  }
330
12.5M
  catch (...)
331
12.5M
  {
332
0
    return InstructionInfo({"<INVALID_INSTRUCTION: " + to_string(static_cast<unsigned>(_inst)) + ">", 0, 0, 0, false, Tier::Invalid});
333
0
  }
334
12.5M
}
335
336
bool solidity::evmasm::isValidInstruction(Instruction _inst)
337
0
{
338
0
  return !!c_instructionInfo.count(_inst);
339
0
}