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 /** 19 * Expression simplification pattern. 20 */ 21 22 #pragma once 23 24 #include <libevmasm/Instruction.h> 25 #include <libsolutil/CommonData.h> 26 #include <functional> 27 28 namespace solidity::evmasm 29 { 30 31 /** 32 * Rule that contains a pattern, an action that can be applied 33 * after the pattern has matched and optional condition to check if the 34 * action should be applied. 35 */ 36 template <class Pattern> 37 struct SimplificationRule 38 { 39 SimplificationRule( 40 Pattern _pattern, 41 std::function<Pattern()> _action, 42 std::function<bool()> _feasible = {} 43 ): patternSimplificationRule44 pattern(std::move(_pattern)), 45 action(std::move(_action)), 46 feasible(std::move(_feasible)) 47 {} 48 49 Pattern pattern; 50 std::function<Pattern()> action; 51 std::function<bool()> feasible; 52 }; 53 54 template <typename Pattern> 55 struct EVMBuiltins 56 { 57 using InstrType = Instruction; 58 59 template<Instruction inst> 60 struct PatternGenerator 61 { operatorEVMBuiltins::PatternGenerator62 template<typename... Args> constexpr Pattern operator()(Args&&... _args) const 63 { 64 return {inst, {std::forward<Args>(_args)...}}; 65 } 66 }; 67 68 struct PatternGeneratorInstance 69 { 70 Instruction instruction; operatorEVMBuiltins::PatternGeneratorInstance71 template<typename... Args> constexpr Pattern operator()(Args&&... _args) const 72 { 73 return {instruction, {std::forward<Args>(_args)...}}; 74 } 75 }; 76 77 78 static auto constexpr STOP = PatternGenerator<Instruction::STOP>{}; 79 static auto constexpr ADD = PatternGenerator<Instruction::ADD>{}; 80 static auto constexpr SUB = PatternGenerator<Instruction::SUB>{}; 81 static auto constexpr MUL = PatternGenerator<Instruction::MUL>{}; 82 static auto constexpr DIV = PatternGenerator<Instruction::DIV>{}; 83 static auto constexpr SDIV = PatternGenerator<Instruction::SDIV>{}; 84 static auto constexpr MOD = PatternGenerator<Instruction::MOD>{}; 85 static auto constexpr SMOD = PatternGenerator<Instruction::SMOD>{}; 86 static auto constexpr EXP = PatternGenerator<Instruction::EXP>{}; 87 static auto constexpr NOT = PatternGenerator<Instruction::NOT>{}; 88 static auto constexpr LT = PatternGenerator<Instruction::LT>{}; 89 static auto constexpr GT = PatternGenerator<Instruction::GT>{}; 90 static auto constexpr SLT = PatternGenerator<Instruction::SLT>{}; 91 static auto constexpr SGT = PatternGenerator<Instruction::SGT>{}; 92 static auto constexpr EQ = PatternGenerator<Instruction::EQ>{}; 93 static auto constexpr ISZERO = PatternGenerator<Instruction::ISZERO>{}; 94 static auto constexpr AND = PatternGenerator<Instruction::AND>{}; 95 static auto constexpr OR = PatternGenerator<Instruction::OR>{}; 96 static auto constexpr XOR = PatternGenerator<Instruction::XOR>{}; 97 static auto constexpr BYTE = PatternGenerator<Instruction::BYTE>{}; 98 static auto constexpr SHL = PatternGenerator<Instruction::SHL>{}; 99 static auto constexpr SHR = PatternGenerator<Instruction::SHR>{}; 100 static auto constexpr SAR = PatternGenerator<Instruction::SAR>{}; 101 static auto constexpr ADDMOD = PatternGenerator<Instruction::ADDMOD>{}; 102 static auto constexpr MULMOD = PatternGenerator<Instruction::MULMOD>{}; 103 static auto constexpr SIGNEXTEND = PatternGenerator<Instruction::SIGNEXTEND>{}; 104 static auto constexpr KECCAK256 = PatternGenerator<Instruction::KECCAK256>{}; 105 static auto constexpr ADDRESS = PatternGenerator<Instruction::ADDRESS>{}; 106 static auto constexpr BALANCE = PatternGenerator<Instruction::BALANCE>{}; 107 static auto constexpr ORIGIN = PatternGenerator<Instruction::ORIGIN>{}; 108 static auto constexpr CALLER = PatternGenerator<Instruction::CALLER>{}; 109 static auto constexpr CALLVALUE = PatternGenerator<Instruction::CALLVALUE>{}; 110 static auto constexpr CALLDATALOAD = PatternGenerator<Instruction::CALLDATALOAD>{}; 111 static auto constexpr CALLDATASIZE = PatternGenerator<Instruction::CALLDATASIZE>{}; 112 static auto constexpr CALLDATACOPY = PatternGenerator<Instruction::CALLDATACOPY>{}; 113 static auto constexpr CODESIZE = PatternGenerator<Instruction::CODESIZE>{}; 114 static auto constexpr CODECOPY = PatternGenerator<Instruction::CODECOPY>{}; 115 static auto constexpr GASPRICE = PatternGenerator<Instruction::GASPRICE>{}; 116 static auto constexpr EXTCODESIZE = PatternGenerator<Instruction::EXTCODESIZE>{}; 117 static auto constexpr EXTCODECOPY = PatternGenerator<Instruction::EXTCODECOPY>{}; 118 static auto constexpr RETURNDATASIZE = PatternGenerator<Instruction::RETURNDATASIZE>{}; 119 static auto constexpr RETURNDATACOPY = PatternGenerator<Instruction::RETURNDATACOPY>{}; 120 static auto constexpr EXTCODEHASH = PatternGenerator<Instruction::EXTCODEHASH>{}; 121 static auto constexpr BLOCKHASH = PatternGenerator<Instruction::BLOCKHASH>{}; 122 static auto constexpr COINBASE = PatternGenerator<Instruction::COINBASE>{}; 123 static auto constexpr TIMESTAMP = PatternGenerator<Instruction::TIMESTAMP>{}; 124 static auto constexpr NUMBER = PatternGenerator<Instruction::NUMBER>{}; 125 static auto constexpr DIFFICULTY = PatternGenerator<Instruction::DIFFICULTY>{}; 126 static auto constexpr GASLIMIT = PatternGenerator<Instruction::GASLIMIT>{}; 127 static auto constexpr CHAINID = PatternGenerator<Instruction::CHAINID>{}; 128 static auto constexpr SELFBALANCE = PatternGenerator<Instruction::SELFBALANCE>{}; 129 static auto constexpr BASEFEE = PatternGenerator<Instruction::BASEFEE>{}; 130 static auto constexpr POP = PatternGenerator<Instruction::POP>{}; 131 static auto constexpr MLOAD = PatternGenerator<Instruction::MLOAD>{}; 132 static auto constexpr MSTORE = PatternGenerator<Instruction::MSTORE>{}; 133 static auto constexpr MSTORE8 = PatternGenerator<Instruction::MSTORE8>{}; 134 static auto constexpr SLOAD = PatternGenerator<Instruction::SLOAD>{}; 135 static auto constexpr SSTORE = PatternGenerator<Instruction::SSTORE>{}; 136 static auto constexpr PC = PatternGenerator<Instruction::PC>{}; 137 static auto constexpr MSIZE = PatternGenerator<Instruction::MSIZE>{}; 138 static auto constexpr GAS = PatternGenerator<Instruction::GAS>{}; 139 static auto constexpr LOG0 = PatternGenerator<Instruction::LOG0>{}; 140 static auto constexpr LOG1 = PatternGenerator<Instruction::LOG1>{}; 141 static auto constexpr LOG2 = PatternGenerator<Instruction::LOG2>{}; 142 static auto constexpr LOG3 = PatternGenerator<Instruction::LOG3>{}; 143 static auto constexpr LOG4 = PatternGenerator<Instruction::LOG4>{}; 144 static auto constexpr CREATE = PatternGenerator<Instruction::CREATE>{}; 145 static auto constexpr CALL = PatternGenerator<Instruction::CALL>{}; 146 static auto constexpr CALLCODE = PatternGenerator<Instruction::CALLCODE>{}; 147 static auto constexpr STATICCALL = PatternGenerator<Instruction::STATICCALL>{}; 148 static auto constexpr RETURN = PatternGenerator<Instruction::RETURN>{}; 149 static auto constexpr DELEGATECALL = PatternGenerator<Instruction::DELEGATECALL>{}; 150 static auto constexpr CREATE2 = PatternGenerator<Instruction::CREATE2>{}; 151 static auto constexpr REVERT = PatternGenerator<Instruction::REVERT>{}; 152 static auto constexpr INVALID = PatternGenerator<Instruction::INVALID>{}; 153 static auto constexpr SELFDESTRUCT = PatternGenerator<Instruction::SELFDESTRUCT>{}; 154 }; 155 156 } 157